RÊU / Hệ phục vụ các hình thức InfoPath (InfoPath 2007) hiệu suất danh sách thả-xuống

Thêm thể loại: InfoPath

Tóm tắt: Một InfoPath 2007 hình thức được bố trí đến một máy chủ MOSS cung cấp một danh sách thả xuống của các nhà cung cấp gắn với một danh sách tùy chỉnh MOSS. Khi lựa chọn một nhà cung cấp, quy tắc chỉ định giá trị trường cho một số lĩnh vực văn bản ví dụ như đại diện bán hàng tên, địa chỉ, thành phố, nhà nước, Zip và điện thoại. Hiệu suất là khủng khiếp. Chúng tôi nhận thấy rằng hiệu suất bị nặng hơn (trong một thời trang phi tuyến tính) cho mỗi lĩnh vực bổ sung chúng tôi Cập Nhật theo cách này. Tức là, Nếu chúng ta chỉ cần Cập Nhật tên đại diện bán hàng, phải mất [x] số lượng thời gian. Nếu chúng tôi Cập Nhật đại diện bán hàng, address1, address2, thành phố, nhà nước, Số Zip, phải mất 10 thời gian dài hơn.

Giải pháp: Viết một dịch vụ web (mã mẫu có thể được tìm thấy Ở đây) đó là thông qua trong tên của một nhà cung cấp và nó sẽ trả lại các chi tiết nhà cung cấp. Sau đó, chỉ định các lĩnh vực theo cách này. Mặc dù điều này có vẻ quá chậm, đã có không có sự khác biệt discernable tại hiệu suất trong khi chúng tôi chỉ định 1 các lĩnh vực so với 8 lĩnh vực. Là một tiền thưởng thêm, người dùng nhận được một mát "liên hệ với hệ phục vụ" Cylon có hiệu lực trong khi họ chờ đợi cho các hình thức để gọi và tiêu thụ các kết quả dịch vụ.

RÊU: Xảy ra ngoại lệ. (Ngoại lệ từ HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

CẬP NHẬT: Chúng tôi không bao giờ xác định nguyên nhân gốc của vấn đề này và nó bề mặt không bao giờ một lần nữa.

Chúng tôi nhận thấy trong thời gian thực hiện của một trang web phát triển đó đột nhiên, hai người dùng không thể truy cập vào một bộ sưu tập trang web. Các tài khoản có thể xác thực để các trang web chính, nhưng khi cố gắng để truy cập vào một bộ sưu tập trang web cụ thể, họ chỉ nhận được một màn hình trống. Không có lỗi hiển thị, chỉ là một trang trống màu trắng.

Chúng tôi đăng nhập như một quản trị viên bộ sưu tập trang web và cố gắng thêm một trong những người dùng là một trang web quản trị và thời gian này, sau khi nhấn "OK", chúng tôi nhận được tin nhắn này:

Xảy ra ngoại lệ. (Ngoại lệ từ HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

Chúng tôi đã dành một số thời gian nghiên cứu này và không may, đã không đưa ra bất cứ điều gì hữu ích. Đã có một số thông điệp trong Nhật ký chuẩn đoán, nhưng nó đã được khó khăn để chính xác tương quan họ với vấn đề này.

Cuối cùng, chúng tôi xóa bộ sưu tập trang web và tái tạo nó và rằng đã giải quyết nó.

Nếu tôi tìm ra những gì gây ra điều này trong tương lai, Tôi sẽ cập nhật các bài đăng này.

RÊU: Iterating thông qua danh sách tùy chỉnh và trả về dữ liệu lọc để InfoPath

Kinh doanh kịch bản:

Cung cấp một phương thức mà cho phép người dùng nhập chính xác mua nhiều một cách nhanh chóng.

Vấn đề kinh doanh:

Khách hàng nào kinh doanh với một số nhà cung cấp hàng trăm.

Nhà cung cấp là "loại" cụ thể. Điều này có nghĩa rằng một nhà cung cấp bán thiết bị máy tính (Ví dụ như. Dell) hoặc thiết bị văn phòng (Ví dụ như. Lương thực).

Làm thế nào để chúng tôi có thể kích hoạt cuối cùng người sử dụng tạo ra mua nhiều lựa chọn một nhà cung cấp hợp lệ?

Giải pháp kinh doanh:

Phân biệt các nhà cung cấp trong hệ thống thông qua "loại".

Cho phép người dùng để chọn kiểu"" của sản phẩm và sau đó cung cấp một bộ lọc nhà cung cấp thích hợp.

Giải pháp kỹ thuật:

Một hình thức InfoPath đã được thiết kế cho phép người dùng để nhập trực tuyến mua nhiều.

Kiểm soát hai InfoPath lựa chọn danh sách lựa chọn nhà cung cấp. Đầu tiên, người dùng chọn một "mua loại". Điều này giới hạn một danh sách lựa chọn thứ hai để chứa chỉ là nhà cung cấp bán cho mua loại. Đây là một cổ điển tầng thả xuống.

Nhà cung cấp được lưu trữ trong một danh sách tùy chỉnh MOSS với tuỳ chỉnh cột cho các nhà cung cấp thuộc tính ví dụ như tên, địa chỉ và đặc biệt là "loại".

Thực hiện một dịch vụ web cho một khách hàng InfoPath tiêu thụ mà iterates thông qua danh sách tùy chỉnh nhà cung cấp, trở về nhà cung cấp chỉ phù hợp với một cung cấp "loại".

Gọi Dịch vụ web thông qua hình thức InfoPath.

Bài học:

  • Đầu tiên, có vẻ như cần thiết để đi con đường này. Tôi đã có thể ưa thích để làm việc lọc hoàn toàn trong InfoPath và không tạo ra bất kỳ chức năng dịch vụ web ở đây. Tuy nhiên, hình thức máy chủ không cung cấp khả năng lọc cần thiết. Chúng tôi có thể đặt một quy tắc vào một loại"" danh sách chọn trong các hình thức để loại mở lại các truy vấn người bán hàng, nhưng chúng tôi không thể làm cho nó hoạt động đúng. Do đó, nó là cần thiết để thực hiện các dịch vụ web.
  • Đây là một cổ điển "tầng lựa chọn danh sách" Các vấn đề trong InfoPath hình thức thế giới máy chủ và có rất nhiều ví dụ trên mạng tốt mà giải thích làm thế nào để giải quyết điều này.
  • Một giá trị trống cho một cột trong danh sách nhà cung cấp không trả lại một chuỗi sản phẩm nào khi tham chiếu như thế này: initItem["Nhà cung cấp tên"]. Thay vào đó, nó trả về một null.

Một số ghi chú khác:

  • Tôi trở lại một mảng[] của nhà cung cấp bởi vì tôi đã có một số khó khăn trở về một ArrayList. InfoPath đã phàn nàn về nó và tôi không có thời gian hoặc độ nghiêng để chiến đấu trên nó. Điều này, Tất nhiên, Đặt một giới hạn nhân tạo trên tổng số của nhà cung cấp. Nó cũng bắt buộc tôi để thực hiện một trim() Các phương pháp trên bởi vì tôi ghét ý tưởng trở lại trở lại 100 nhà cung cấp vô. InfoPath không quan tâm, nhưng nó nagged tôi. (Một lần nữa, Điều này đã dễ dàng hơn so với chiến đấu InfoPath trên ArrayLists).
  • Tôi thực hiện một GetSpecificVendorByName() chức năng là tốt, mà có thể được instructive.

:

bằng cách sử dụng Hệ thống;
bằng cách sử dụng System.Web;
bằng cách sử dụng System.Web.Services;
bằng cách sử dụng System.Web.Services.Protocols;
bằng cách sử dụng Microsoft.SharePoint;
bằng cách sử dụng System.Configuration;

/// <tóm tắt>
///
Nhà cung cấp dịch vụ: Cung cấp các nhà cung cấp liên quan đến dịch vụ mà ngày nay được tiêu thụ của một hình thức khách hàng infopath.
///
/// Lịch sử:
/// ——–
/// 07/24/07: Ban đầu mã hóa, Paul J. Gavin của Conchango.
///
/// </tóm tắt>
[WebService(Không gian tên = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
công cộng lớp học VendorService : System.Web.Services.WebService
{

/// <tóm tắt>
/// Đại diện cho một nhà cung cấp từ một danh sách tùy chỉnh sharepoint duy trì bởi MSUSA.
/// </tóm tắt>
công cộng lớp học Nhà cung cấp
{
công cộng Nhà cung cấp() { }

công cộng Nhà cung cấp(SPItem initItem)
{
Nếu (! (initItem["Nhà cung cấp tên"] == null)) VendorName = initItem["Nhà cung cấp tên"].ToString();
Nếu (! (initItem["Địa chỉ 1"] == null)) VendorAddress1 = initItem["Địa chỉ 1"].ToString();
Nếu (! (initItem["Địa chỉ 2"] == null)) VendorAddress2 = initItem["Địa chỉ 2"].ToString();
Nếu (! (initItem["Thành phố"] == null)) VendorCity = initItem["Thành phố"].ToString();
Nếu (! (initItem["VendorPhone"] == null)) VendorPhone = initItem["VendorPhone"].ToString();
Nếu (! (initItem["PurchaseType"] == null)) VendorType = initItem["PurchaseType"].ToString();
Nếu (! (initItem["Nhà nước"] == null)) VendorState = initItem["Nhà nước"].ToString();
Nếu (! (initItem["Zip"] == null)) VendorZip = initItem["Zip"].ToString();
Nếu (!(initItem["Fax"] == null)) VendorFax = initItem["Fax"].ToString();
Nếu (!(initItem["SalesRepName"] == null)) VendorSalesRepName = initItem["SalesRepName"].ToString();

VendorItemId = initItem.ID; // ID duy nhất duy trì thông qua MOSS.
}

công cộng int VendorItemId;
công cộng chuỗi VendorName;
công cộng chuỗi VendorAddress1;
công cộng chuỗi VendorAddress2;
công cộng chuỗi VendorCity;
công cộng chuỗi VendorState;
công cộng chuỗi VendorZip;
công cộng chuỗi VendorPhone;
công cộng chuỗi VendorType;
công cộng chuỗi VendorSalesRepName;
công cộng chuỗi VendorFax;
}

công cộng VendorService () {

//Bỏ ghi chú dòng sau nếu sử dụng thiết kế thành phần
//InitializeComponent();
}

tư nhân Nhà cung cấp[] GenerateTestVendors()
{
Nhà cung cấp[] resultList;
resultList = mới Nhà cung cấp[100];

Nhà cung cấp v;
v = mới Nhà cung cấp();
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 = mới Nhà cung cấp();

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 = mới Nhà cung cấp();
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;

trở lại resultList;

}

[WebMethod]
công cộng Nhà cung cấp GetSpecificVendorById(int vendorId)
{
chuỗi SpVendorSiteName; // Tên của trang web thực tế của MOSS lưu trữ danh sách tùy chỉnh nhà cung cấp.
chuỗi SpVendorListName; // Tên danh sách MOSS thực tế có nhà cung cấp.

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

bằng cách sử dụng (SPSite Trang web = mới SPSite(SpVendorSiteName))
{

bằng cách sử dụng (SPWeb web = trang web. OpenWeb())
{

Splist.Update() currentList = trang web. Danh sách[SpVendorListName];

SPItem specificItem = currentList.Items[vendorId];

trở lại mới Nhà cung cấp(specificItem);

} // bằng cách sử dụng spweb web = site.openweb()
} // bằng cách sử dụng trang web spsite = mới spsite("http://localhost/mizuho")

}

[WebMethod]
// Giả định rằng nhà cung cấp tên là duy nhất, từ góc độ kinh doanh
công cộng Nhà cung cấp GetSpecificVendorByVendorName(chuỗi được)
{
chuỗi SpVendorSiteName; // Tên của trang web thực tế của MOSS lưu trữ danh sách tùy chỉnh nhà cung cấp.
chuỗi SpVendorListName; // Tên danh sách MOSS thực tế có nhà cung cấp.

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

bằng cách sử dụng (SPSite Trang web = mới SPSite(SpVendorSiteName))
{
bằng cách sử dụng (SPWeb web = trang web. OpenWeb())
{

Splist.Update() currentList = trang web. Danh sách[SpVendorListName];

foreach (SPItem vendorItem currentList.Items)
{
Nếu (vendorItem["Nhà cung cấp tên"] == null) «««;

Nếu (vendorItem["Nhà cung cấp tên"].ToString().Bằng(được))
trở lại mới Nhà cung cấp(vendorItem);
}

Nhà cung cấp v = mới Nhà cung cấp();
v.VendorPhone = "không tìm thấy: " + được;

trở lại v;

trở lại null;

} // bằng cách sử dụng spweb web = site.openweb()
} // bằng cách sử dụng trang web spsite = mới spsite("http://localhost/mizuho")

} // phương pháp

[WebMethod]
công cộng Nhà cung cấp[] GetVendorsOfType (chuỗi filterType)
{

chuỗi SpVendorSiteName; // Tên của trang web thực tế của MOSS lưu trữ t
ông nhà cung cấp danh sách tùy chỉnh.
chuỗi SpVendorListName; // Tên danh sách MOSS thực tế có nhà cung cấp.

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

Nhà cung cấp[] resultList;
int vendorIndex = 0;
resultList = mới Nhà cung cấp[1000];

// Khởi tạo danh sách với một thông điệp thân thiện mặc định.
Nhà cung cấp v = mới Nhà cung cấp();
v.VendorName = "Chọn loại nhà cung cấp để đưa danh sách này.";
resultList[0] = v;

// Chuyển đổi các bộ lọc để các trường hợp thấp hơn để so sánh chuỗi dễ dàng hơn sau này.
filterType = filterType.ToLower();

// Nếu loại bộ lọc thông qua là "kiểm tra", tạo ra một số dữ liệu đơn giản.
#khu vực Bộ lọc loại = "kiểm tra"
Nếu (Bằng filterType.("kiểm tra"))
trở lại GenerateTestVendors();
#endregion

Nếu (sự thật)
{
bằng cách sử dụng (SPSite Trang web = mới SPSite(SpVendorSiteName))
{
bằng cách sử dụng (SPWeb web = trang web. OpenWeb())
{

v = null;

Splist.Update() currentList = trang web. Danh sách[SpVendorListName];

// Iterate qua tất cả các mục trong danh sách nhà cung cấp.
foreach (SPItem vendorItem currentList.Items)
{

chuỗi lowerVendorType;

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

Nếu (Bằng lowerVendorType.(filterType))
{
resultList[vendorIndex ] = mới Nhà cung cấp(vendorItem);
}
} // iterating thông qua tất cả các nhà cung cấp trong danh sách


trở lại TrimVendorArray(vendorIndex, resultList);
// trở lại resultList;

} // bằng cách sử dụng spweb web = site.openweb()
} // bằng cách sử dụng trang web spsite = mới spsite("http://localhost/mizuho")

} // Nếu thật sự

trở lại null;
}

tư nhân Nhà cung cấp[] TrimVendorArray(int newsize, Nhà cung cấp[] originalVendorArray)
{
Nhà cung cấp[] trimmedArray;

Nếu (newsize == 0) newsize = 1;
trimmedArray = mới Nhà cung cấp[newsize];

int currentCounter = 0;

cho (currentCounter = 0; currentCounter < newsize; currentCounter )
{
trimmedArray[currentCounter] = originalVendorArray[currentCounter];
}

trở lại trimmedArray;

}
}

RÊU: Các quan sát trên InfoPath gỡ lỗi

Thông báo lỗi InfoPath hình thức máy chủ được gây hiểu lầm.

Trong quá trình phát triển của một hình thức InfoPath, Tôi sẽ đăng nó lên máy chủ MOSS và truy cập vào các hình thức. Các hình thức sẽ bắt đầu để tải và sau đó tạo ra một thông báo lỗi gây hiểu lầm, chỉ cho tôi vào sổ ghi sự kiện để biết chi tiết. Thực tế, không có thông báo được ghi vào sổ ghi sự kiện. Thay vào đó, thư được gửi đến Nhật ký chẩn đoán MOSS ascii. Bạn có thể theo dõi mà thông qua Trung tâm dịch vụ quản lý.

Bạn cần phải được nhanh chóng trên đôi chân của bạn. MOSS thích ghi vào tệp nhật ký, thường xuyên và verbosely. Điều này có thể được tỉa nhưng đăng nhập mặc định bằng văn bản hành vi là "tất cả mọi thứ một cách nhanh chóng càng tốt".

RÊU: Cập nhật danh sách tùy chỉnh

Có rất nhiều ví dụ điển hình của Cập nhật danh sách tùy chỉnh qua SDK. Đây là thêm một.

Vấn đề kinh doanh: InfoPath hình thức đã được thiết kế cho phép người dùng để nhập trực tuyến mua nhiều. Trưng dụng PO số nên là truyền thống tự dựa trên giá trị số nguyên và tính toán tự động.

Giải pháp kinh doanh: Tạo một danh sách MOSS tùy chỉnh có chứa hai cột: "ControlField" và "ControlValue". Giá trị cột có chứa số trưng dụng mua hàng tiếp theo. Lưu ý rằng chung "kiểm soát" quy ước đặt tên cung cấp cho các lĩnh vực kiểm soát tương lai có thể được sử dụng khi cần thiết.

Giải pháp kỹ thuật: Tạo ra một dịch vụ web truy cập bởi các khách hàng InfoPath. Dịch vụ web trả về trở lại trưng dụng số tiếp theo của mua và Cập Nhật giá trị của danh sách.

Bài học:

  • Khi thêm dịch vụ web này như là một nguồn dữ liệu mẫu InfoPath, Tôi tìm thấy nó cần thiết để chuyển nó sang một udc và lưu nó vào một thư viện kết nối dữ liệu.
  • Tôi cũng tìm thấy nó cần thiết để cho phép tên miền chéo kịch bản thông qua Trung tâm dịch vụ quản lý // quản lý ứng dụng // hình thức cấu hình máy chủ.
  • Lần đầu tiên các hình thức đã cố gắng để truy cập vào các dịch vụ web, phải mất một lúc và thỉnh thoảng, nó sẽ thời gian ra. Tôi fiddled với cài đặt trong hình thức cấu hình máy chủ để mở rộng các thiết lập thời gian chờ và điều đó dường như để giúp.

:

bằng cách sử dụng Hệ thống;
bằng cách sử dụng System.Web;
bằng cách sử dụng System.Web.Services;
bằng cách sử dụng System.Web.Services.Protocols;
bằng cách sử dụng Microsoft.SharePoint;
bằng cách sử dụng System.Configuration;

[WebService(Không gian tên = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
công cộng lớp học PoService : System.Web.Services.WebService
{
công cộng PoService () {

//Bỏ ghi chú dòng sau nếu sử dụng thiết kế thành phần
//InitializeComponent();
}

/// <tóm tắt>
/// Có được số PO tiếp theo từ danh sách kiểm soát số sharepoint po.
/// Tăng số PO trên danh sách đó.
/// </tóm tắt>
/// <trả về></trả về>
[WebMethod]
công cộng chuỗi GetNextPoNumber()
{
chuỗi SpPoControlSiteName; // Tên của trang web thực tế của MOSS lưu trữ danh sách điều khiển PO.
chuỗi SpPoControlListName; // Tên danh sách MOSS thực tế có Po control.

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

chuỗi nextPoReqNumber = "xyzzy";

bằng cách sử dụng (SPSite Trang web = mới SPSite(SpPoControlSiteName))
{
bằng cách sử dụng (SPWeb web = trang web. OpenWeb())
{

Splist.Update() currentList = trang web. Danh sách[SpPoControlListName];

foreach (SPItem controlItem currentList.Items)
{

Nếu (((chuỗi)controlItem["ControlField"]).Bằng("NextPoNumber"))
{
nextPoReqNumber = (chuỗi)controlItem["ControlValue"];

int int_nextPoReqNumber;
int_nextPoReqNumber = Chuyển đổi.ToInt32(nextPoReqNumber);

int_nextPoReqNumber ;

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

} // Vị trí, đọc và cập nhật số PO trong danh sách.


} // bằng cách sử dụng spweb web = site.openweb()
} // bằng cách sử dụng trang web spsite = mới spsite("http://localhost/mizuho")

trở lại nextPoReqNumber;

}
}