모스 / InfoPath 양식 서버 (InfoPath 2007) 드롭-다운 목록 성능

추가 범주: InfoPath

요약: InfoPath 2007 모스 서버에 배포 하는 양식 사용자 지정 모스 목록에 연결 하는 공급 업체의 드롭 다운 목록을 제공 합니다.. 공급 업체를 선택할 때, 영업 담당자 이름과 같은 텍스트 필드의 소수에 필드 값을 할당 하는 규칙, 주소, 도시, 상태, 우편 및 전화. 성능 끔 찍 하다. 우리는 성능을 악화 주의 (비 선형) 이 이런식으로 각 추가 필드에 대 한 업데이트. 즉, 만약 우리가 단지 영업 담당자 이름 업데이트, 그것은 걸립니다. [x] 시간. 우리 영업 담당자를 업데이 트 하는 경우, address1, 주소 2, 도시, 상태, 우편 번호, 그것은 걸립니다. 10 배 이상.

솔루션: 웹 서비스 작성 (샘플 코드를 찾을 수 있습니다. 여기) 그 공급 업체의 이름으로 전달 되 고 다시 공급 업체 세부 정보 반환. 다음, 이 방법으로 필드를 할당. 이 너무 보인다 비록 느린, 우리가 할당 하는 경우 성능에 뚜렷한 차이가 없었다 1 대 분야 8 필드. 추가한 상 여로, 사용자가 "서버에 게 연락 하는 멋진" 사일런 호출 하 고 서비스 결과 소비 형태를 기다리는 동안 효과.

모스: 예외가 발생 했습니다.. (HRESULT에서 예외가: 0x 80020009 (DISP_E_EXCEPTION))

업데이트: 우리가 결코 다시이 문제와 결코 표면 그것의 근본 원인을 결정.

우리는 갑자기 개발 사이트의 구현 시 통지, 두 사용자가 사이트 모음에 액세스할 수 없는. 해당 계정의 주요 사이트에 인증할 수 있습니다., 그러나 특정 사이트 모음에 액세스 하려고 할 때, 그들은 단지 텅 빈 스크린을 얻을. 오류 표시, 그냥 하얀 빈 페이지.

우리는 사이트 컬렉션 관리자로 로그인 하 고 사이트 관리자 및이 시간으로 이러한 사용자 중 하나를 추가 하려고, "확인"을 누르면 시, 우리는이 메시지를 받을:

예외가 발생 했습니다.. (HRESULT에서 예외가: 0x 80020009 (DISP_E_EXCEPTION))

우리가이 연구 시간을 할애 하 고 불행 하 게도, 유용한 아무것도 오지 않 았 어. 진단 로그에 일부 메시지가 있었습니다., 하지만 그것은 정확 하 게이 문제와 상관 힘 들었다.

끝에서, 사이트 모음을 삭제 하 고 다시 그 우리는 그것을 해결.

무슨 미래에이 그림 밖으로 하는 경우 발생, 이 게시물을 업데이 트 거 야.

모스: 사용자 지정 목록을 통해 반복 하 고 InfoPath에 필터링 된 데이터를 반환

비즈니스 시나리오:

사용자가 정확한 구매 요청을 신속 하 게 입력할 수 있도록 하는 방법을 제공합니다.

비즈니스 문제:

클라이언트 몇 백 공급 업체와 비즈니스를 않습니다..

공급 업체는 "유형" 특정. 즉, 공급 업체 컴퓨터 장비 판매 (예를 들어. Dell) 또는 사무 용품 (예를 들어. 스테이플).

어떻게 만든 구매 요청 선택 유효한 공급 업체는 최종 사용자를 활성화 우리가?

비즈니스 솔루션:

"유형"를 통해 시스템 공급 업체 차별화.

사용자가 "유형 선택" 제품의 적절 한 공급 업체의 필터링된 된 집합 제공.

기술 솔루션:

InfoPath 양식을 설계 되었습니다 수 있습니다 사용자가 온라인 입력 요청 구매.

두 개의 InfoPath 선택 목록 제어 공급 업체 선정. 첫 번째, 사용자가 선택 "구매 유형". 이 구매 형식에 대 한 판매 하는 공급 업체를 포함 하는 두 번째 선택 목록 제한. 이것은 고전적인 계단식 드롭다운.

공급 업체 이름 같은 공급 업체 특성에 대 한 사용자 지정 열으로 모스 사용자 지정 목록에 저장 됩니다., 주소와 특히 "유형".

사용자 지정 공급 업체 목록을 반복 구현 InfoPath 클라이언트는 소비에 대 한 웹 서비스, 제공 된 "유형" 일치 하는 공급 업체만 반환.

InfoPath 양식을 웹 서비스를 호출.

교훈:

  • 첫 번째, 이 경로 이동 하는 데 필요한 것 같다. 난 여기 모든 웹 서비스 기능을 만들지를 InfoPath 내에서 필터링 할 선호 하는 것. 그러나, 폼 서버 필요한 필터링 기능을 제공 하지 않습니다.. 우리는 규칙에 넣을 수 있습니다 있는 "형식" 일종의 공급 업체 쿼리를 다시 열고 형태로 선택 목록, 그러나 우리가 제대로 작동 하기 위하여 그것을 얻을 수 없다. 따라서, 그것은 웹 서비스를 구현 하는 데 필요한.
  • 이것은 고전적인 "계단식 선택 목록" InfoPath에서 문제 서버 세계를 형성 하 고 많은 좋은 보기가 있다 거기 밖으로이 문제를 해결 하는 방법을 설명 하는.
  • 공급 업체 목록에서 열에 대해 빈 값이 참조 될 때 빈 문자열을 반환 하지 않는: initItem["공급 업체 이름"]. 대신, null을 반환 합니다..

기타 참고 사항:

  • 배열 반환[] 공급 업체의 몇 가지 어려움을 ArrayList를 반환 했기 때문에. InfoPath는 그것에 대해 불평 하 고 시간이 나 위에 싸 우기 위하여 경사 하지 않았다. 이, 물론, 공급 업체의 총 수에 인공 한계를 박 았. 그것은 또한 트림 구현 하 라고 강요() 메서드는 배열에 반환의 아이디어를 싫어 하기 때문에 다시 100의 null 공급 업체. InfoPath 상관 하지 않습니다., 하지만 그것은 내게 잔소리. (다시, 이것은 InfoPath 저장 싸움 보다 쉽게).
  • 나는 GetSpecificVendorByName을 구현() 기능 뿐만, 유익한 될 수 있습니다..

코드:

사용 하 여 시스템;
사용 하 여 System.Web;
사용 하 여 System.Web.Services;
사용 하 여 System.Web.Services.Protocols;
사용 하 여 Microsoft.SharePoint;
사용 하 여 System.Configuration;

/// <요약>
///
공급 업체 서비스: 관련 공급 업체는 오늘 infopath 클라이언트 양식을 소비 하는 서비스를 제공 합니다..
///
/// 역사:
/// ——–
/// 07/24/07: 초기 코딩, Paul J. Conchango의 개 빈.
///
/// </요약>
[웹 서비스(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
공용 클래스 VendorService : System.Web.Services.웹 서비스
{

/// <요약>
/// MSUSA에 의해 유지 하는 사용자 지정 sharepoint 목록에서 공급 업체를 나타냅니다..
/// </요약>
공용 클래스 공급 업체
{
공용 공급 업체() { }

공용 공급 업체(SPItem initItem)
{
만약 (! (initItem["공급 업체 이름"] == null)) VendorName = initItem["공급 업체 이름"].ToString();
만약 (! (initItem["1 주소"] == null)) VendorAddress1 = initItem["1 주소"].ToString();
만약 (! (initItem["주소 2"] == null)) VendorAddress2 = initItem["주소 2"].ToString();
만약 (! (initItem["도시"] == null)) VendorCity = initItem["도시"].ToString();
만약 (! (initItem["VendorPhone"] == null)) VendorPhone = initItem["VendorPhone"].ToString();
만약 (! (initItem["PurchaseType"] == null)) VendorType = initItem["PurchaseType"].ToString();
만약 (! (initItem["상태"] == null)) VendorState = initItem["상태"].ToString();
만약 (! (initItem["우편 번호"] == null)) VendorZip = initItem["우편 번호"].ToString();
만약 (!(initItem["팩스"] == null)) VendorFax = initItem["팩스"].ToString();
만약 (!(initItem["SalesRepName"] == null)) VendorSalesRepName = initItem["SalesRepName"].ToString();

VendorItemId = initItem.ID; // 이끼를 통해 유지 하는 고유 ID.
}

공용 int VendorItemId;
공용 문자열 VendorName;
공용 문자열 VendorAddress1;
공용 문자열 VendorAddress2;
공용 문자열 VendorCity;
공용 문자열 VendorState;
공용 문자열 VendorZip;
공용 문자열 VendorPhone;
공용 문자열 VendorType;
공용 문자열 VendorSalesRepName;
공용 문자열 VendorFax;
}

공용 VendorService () {

//다음 줄 사용 하는 경우 디자인 구성 요소 주석
//InitializeComponent();
}

개인 공급 업체[] GenerateTestVendors()
{
공급 업체[] resultList;
resultList = 새로운 내용 공급 업체[100];

공급 업체 v;
v = 새로운 내용 공급 업체();
v.VendorAddress1 = "v1_address1";
v.VendorAddress2 = "v1_address2";
v.VendorCity = "v1_city";
v.VendorName = "v1_vendorname";
v.VendorPhone = "v1_vendorphone";
v.VendorState = "v1_st";
v.VendorType = "v1_type";
v.VendorZip = "v1_zip";

resultList[0] = v;

v = 새로운 내용 공급 업체();

v.VendorAddress1 = "v2_address1";
v.VendorAddress2 = "v2_address2";
v.VendorCity = "v2_city";
v.VendorName = "v2_vendorname";
v.VendorPhone = "v2_vendorphone";
v.VendorState = "v2_st";
v.VendorType = "v2_type";
v.VendorZip = "v2_zip";

resultList[1] = v;

v = 새로운 내용 공급 업체();
v.VendorAddress1 = "v3_address1";
v.VendorAddress2 = "v3_address2";
v.VendorCity = "v3_city";
v.VendorName = "v3_vendorname";
v.VendorPhone = "v3_vendorphone";
v.VendorState = "v3_st";
v.VendorType = "v3_type";
v.VendorZip = "v3_zip";

resultList[2] = v;

반환 resultList;

}

[WebMethod]
공용 공급 업체 GetSpecificVendorById(int vendorId)
{
문자열 SpVendorSiteName; // 공급 업체의 사용자 지정 목록을 호스팅하는 실제 MOSS 사이트의 이름.
문자열 SpVendorListName; // 공급 업체를 포함 하는 실제 모스 목록 이름.

SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();

사용 하 여 (SPSite 사이트 = 새로운 내용 SPSite(SpVendorSiteName))
{

사용 하 여 (SPWeb 웹 사이트를 =. OpenWeb())
{

SPList currentList = 웹. 목록[SpVendorListName];

SPItem specificItem = currentList.Items[vendorId];

반환 새로운 내용 공급 업체(specificItem);

} // spweb 웹을 사용 하 여 site.openweb =()
} // spsite 사이트를 사용 하 여 새로운 spsite =("http://localhost/미즈호 ")

}

[WebMethod]
// 공급 업체 이름이 고유 하다는 것을 가정합니다, 비즈니스 관점에서
공용 공급 업체 GetSpecificVendorByVendorName(문자열 수)
{
문자열 SpVendorSiteName; // 공급 업체의 사용자 지정 목록을 호스팅하는 실제 MOSS 사이트의 이름.
문자열 SpVendorListName; // 공급 업체를 포함 하는 실제 모스 목록 이름.

SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();

사용 하 여 (SPSite 사이트 = 새로운 내용 SPSite(SpVendorSiteName))
{
사용 하 여 (SPWeb 웹 사이트를 =. OpenWeb())
{

SPList currentList = 웹. 목록[SpVendorListName];

foreach (SPItem vendorItem 에서 currentList.Items)
{
만약 (vendorItem["공급 업체 이름"] == null) «««;

만약 (vendorItem["공급 업체 이름"].ToString().같음(수))
반환 새로운 내용 공급 업체(vendorItem);
}

공급 업체 v = 새로운 내용 공급 업체();
v.VendorPhone = "찾을 수 없습니다: " + 수;

반환 v;

반환 null;

} // spweb 웹을 사용 하 여 site.openweb =()
} // spsite 사이트를 사용 하 여 새로운 spsite =("http://localhost/미즈호 ")

} // 메서드

[WebMethod]
공용 공급 업체[] GetVendorsOfType (문자열 filterType)
{

문자열 SpVendorSiteName; // T를 호스팅하는 실제 MOSS 사이트의 이름
그는 공급 업체의 사용자 지정 목록.
문자열 SpVendorListName; // 공급 업체를 포함 하는 실제 모스 목록 이름.

SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();

공급 업체[] resultList;
int vendorIndex = 0;
resultList = 새로운 내용 공급 업체[1000];

// 기본 친절 한 메시지와 함께 목록 초기화.
공급 업체 v = 새로운 내용 공급 업체();
v.VendorName = "이이 목록을 채우는 공급 업체 유형을 선택 합니다.";
resultList[0] = v;

// 필터를 나중에 쉽게 문자열 비교에 대 한 소문자로 변환.
filterType = filterType.ToLower();

// 필터 형식이 전달 하는 경우는 "테스트", 몇 가지 간단한 데이터 생성.
#지역 필터 유형 = "테스트"
만약 (filterType입니다. 같음("테스트"))
반환 GenerateTestVendors();
#endregion

만약 (true)
{
사용 하 여 (SPSite 사이트 = 새로운 내용 SPSite(SpVendorSiteName))
{
사용 하 여 (SPWeb 웹 사이트를 =. OpenWeb())
{

v = null;

SPList currentList = 웹. 목록[SpVendorListName];

// 공급 업체 목록에서 모든 항목을 반복.
foreach (SPItem vendorItem 에서 currentList.Items)
{

문자열 lowerVendorType;

lowerVendorType = vendorItem["PurchaseType"].ToString().ToLower();
lowerVendorType = lowerVendorType.Substring(3);

만약 (lowerVendorType입니다. 같음(filterType))
{
resultList[vendorIndex ] = 새로운 내용 공급 업체(vendorItem);
}
} // 목록에서 모든 공급 업체를 통해 반복


반환 TrimVendorArray(vendorIndex, resultList);
// resultList를 반환;

} // spweb 웹을 사용 하 여 site.openweb =()
} // spsite 사이트를 사용 하 여 새로운 spsite =("http://localhost/미즈호 ")

} // true 인 경우

반환 null;
}

개인 공급 업체[] TrimVendorArray(int newsize, 공급 업체[] originalVendorArray)
{
공급 업체[] trimmedArray;

만약 (newsize = = 0) newsize = 1;
trimmedArray = 새로운 내용 공급 업체[newsize];

int currentCounter = 0;

에 대 한 (currentCounter = 0; currentCounter < newsize; currentCounter )
{
trimmedArray[currentCounter] originalVendorArray =[currentCounter];
}

반환 trimmedArray;

}
}

모스: InfoPath 디버깅에 대 한 관찰

InfoPath 양식 서버 오류 메시지는 잘못 된.

InfoPath 양식 개발 중, 모스 서버에 게시물을 폼에 액세스. 폼 로드 하 고 나 대 한 자세한 내용은 windows 이벤트 로그를 가리키는 잘못 된 오류 메시지를 생성을 시작할 것. 사실, 없음 메시지가 windows 이벤트 로그에 기록 된. 오히려, 이끼 ascii 진단 로그에 메시지를 보낸. 중앙 서비스 관리를 통해 그을 추적할 수 있습니다..

당신은 당신의 발에 빨리 해야. 로그 파일에 쓰는 데 좋아하는 모스, 자주 하 고 자세하게. 이 정돈 될 수 있지만 동작을 작성 하는 기본 로그는 "모든 가능한 한 빨리".

모스: 사용자 지정 목록 업데이트

SDK 통해 사용자 지정 목록을 업데이 트의 많은 좋은 예입니다.. 여기는 또 다른.

비즈니스 문제: InfoPath 양식을 설계 되었습니다 수 있습니다 사용자가 온라인 입력 요청 구매. 포 징 발 번호 전통적인 순서 이어야 한다 정수 값을 기반으로 하 고 자동으로 계산.

비즈니스 솔루션: 두 개의 열이 포함 된 사용자 정의 이끼 목록 만들기: "ControlField" 그리고 "과". 값 열에 다음 구매 요청 서 번호 포함. Note는 일반 "제어" 필요에 따라 사용할 수 있는 미래의 컨트롤 필드에 대 한 명명 규칙을 제공 합니다..

기술 솔루션: InfoPath 클라이언트에 의해 액세스 하는 웹 서비스 만들기. 웹 서비스 반환 합니다 다시 다음 구매 요청 서 번호 및 목록의 값을 업데이트.

교훈:

  • InfoPath 양식으로이 웹 서비스를 데이터 소스로 추가 하는 경우, 나는 udc를 변환 하 고 데이터 연결 라이브러리에 저장 하는 데 필요한 발견.
  • 나 또한 중앙 서비스 관리를 통해 교차 도메인 스크립팅을 사용 하도록 설정 하는 데 필요한 발견 // 응용 프로그램 관리 // 폼 서버 구성.
  • 처음으로 양식을 웹 서비스에 액세스 하 려, 그것은 걸립니다 그리고 때때로, 그것은 시간을 것입니다.. 시간 제한 설정에 폼 서버 구성에서 설정 fiddled 고 그 도움을 보 였.

코드:

사용 하 여 시스템;
사용 하 여 System.Web;
사용 하 여 System.Web.Services;
사용 하 여 System.Web.Services.Protocols;
사용 하 여 Microsoft.SharePoint;
사용 하 여 System.Configuration;

[웹 서비스(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
공용 클래스 PoService : System.Web.Services.웹 서비스
{
공용 PoService () {

//다음 줄 사용 하는 경우 디자인 구성 요소 주석
//InitializeComponent();
}

/// <요약>
/// Sharepoint가 번호 컨트롤 목록에서 다음 사서함 번호를 가져올.
/// 그 목록에서 주문서 번호를 증가.
/// </요약>
/// <반환></반환>
[WebMethod]
공용 문자열 GetNextPoNumber()
{
문자열 SpPoControlSiteName; // 포 제어 목록을 호스팅하는 실제 MOSS 사이트의 이름.
문자열 SpPoControlListName; // 포 컨트롤을 포함 하는 실제 모스 목록 이름.

SpPoControlSiteName = ConfigurationSettings.AppSettings["PoControlListHostingSite"].ToString();
SpPoControlListName = ConfigurationSettings.AppSettings["PoControlList"].ToString();

문자열 nextPoReqNumber = "xyzzy";

사용 하 여 (SPSite 사이트 = 새로운 내용 SPSite(SpPoControlSiteName))
{
사용 하 여 (SPWeb 웹 사이트를 =. OpenWeb())
{

SPList currentList = 웹. 목록[SpPoControlListName];

foreach (SPItem controlItem 에서 currentList.Items)
{

만약 (((문자열)controlItem["ControlField"]).같음("NextPoNumber"))
{
nextPoReqNumber = (문자열)controlItem["과"];

int int_nextPoReqNumber;
int_nextPoReqNumber = 변환.ToInt32(nextPoReqNumber);

int_nextPoReqNumber ;

controlItem["과"] int_nextPoReqNumber =;
controlItem.Update();
}

} // 찾기, 읽기 및 업데이트 목록에서 주문서 번호.


} // spweb 웹을 사용 하 여 site.openweb =()
} // spsite 사이트를 사용 하 여 새로운 spsite =("http://localhost/미즈호 ")

반환 nextPoReqNumber;

}
}