Мос / InfoPath формуларите Сервер (InfoPath 2007) паѓачката листа перформанси

Дополнителни категорија: InfoPath

Резиме: На InfoPath 2007 формираат распоредени на сервер Мос обезбедува паѓачката листа на продавачите врзани за сопствени Мос листа. По изборот на продавачот, правила додели полето вредности на неколку текст полиња, како што се трговски претставник име, адреса, градот, држава, zip и телефон. Перформанси е грозно. Ќе забележиме дека перформансите се влошува (во не-линеарен начин) за секоја дополнителна поле ние ажурирање на овој начин. Односно, ако ние само се ажурира на трговски претставник име, што е потребно [x] износ на времето. Ако ние ажурирање трговски претставник, address1, address2, градот, држава, zip, што е потребно 10 пати подолго.

Решение: Напиши веб сервис (примерок код може да се најде тука) кој е донесен во името на продавачот и се враќа назад на продавачот детали. Потоа, додели на полиња овој начин. Иако тоа исто така чини бавен, немало видлива разлика во перформанси кога ние доделен 1 поле наспроти 8 полиња. Како дополнителен бонус, users get a cool "contacting the server" Cylon ефект додека тие чекаат за формата да се повика и консумираат услугата резултати.

Мос: Исклучок се случи. (Исклучок од HRESULT: 0x80020009 (DISP_E_EXCEPTION))

Ажурирање: Ние никогаш не се утврди коренот на овој проблем и тоа никогаш површината повторно.

Ќе забележиме за време на спроведувањето на развој сајт дека одеднаш, две корисниците се во можност да имаат пристап до сајт за собирање. Тие сметки може да се идентификувате на главната страница, но кога се обидуваат да пристапите одреден сајт збирка, тие само се добие празен екран. Нема грешки прикажани, само бело празна страница.

Ние се најавите како сајт за собирање админ и да се обидат да го додадете една од оние корисници, како место администраторот и овој пат, upon pressing "OK", ние се добие оваа порака:

Исклучок се случи. (Исклучок од HRESULT: 0x80020009 (DISP_E_EXCEPTION))

Ние поминав некое време проучувајќи ова и за жал, не излезе со нешто корисно. Имаше некои пораки во дијагностички најавите, но тоа е тешко да се точно да ги поврзе со ова прашање.

На крајот, ние бришење на сајт за собирање и тоа повторно креиран и тоа е тоа решено.

Ако јас дознаам што го предизвика ова во иднина, Јас ќе се ажурира овој пост.

Мос: Процесирањето преку сопствени листи и враќање филтрирани податоци за InfoPath

Бизнис сценарио:

Обезбеди метод кој им овозможува на корисниците да влезат точни купување требувањата брзо.

Бизнис проблем:

На клиентот прави бизнис со неколку стотици продавачи.

Vendors are "type" специфични. Ова значи дека продавачот продава компјутерска опрема (e.g. Dell) или канцелариски материјали (e.g. Стејплс).

Како ние да им овозможи на крајните корисници кои создаваат купување требувањата изберете валидна продавач?

Бизнис решенија:

Differentiate vendors in the system via "type".

Enable users to select the "type" на производот, а потоа се обезбеди филтрирана сет на соодветни добавувачи.

Техничко решение:

На InfoPath формулар е дизајниран која им овозможува на корисниците да влезат во онлајн купување требувањата.

Две InfoPath селекција листи за контрола продавач избор. Прва, the user selects a "purchase type". This limits a second selection list to contain only vendors that sell for that purchase type. This is a classic cascading drop-down.

Продавачите се чуваат во Мос обичај листа со сопствени колони за продавачот атрибути како што се името, address and especially "type".

Имплементира веб сервис за InfoPath клиентот да консумираат дека iterates преку сопствени продавач листа, returning only vendors matching a supplied "type".

Повика на веб сервис преку InfoPath формулар.

Научени лекции:

  • Прва, се чини неопходно да одат овој пат. Јас би преферирал да го стори филтрирање целосно во рамките InfoPath и не се создаде било кој веб-сервис функционалност овде. Сепак, форми серверот не ги обезбеди потребните филтрирање способност. We can put a rule onto a the "type" избор листа во форма за сортирање на повторно отворање на продавачот пребарување, но не можеме да се добие тоа да работи правилно. Затоа, тоа беше неопходно за спроведување на веб сервис.
  • This is a classic "cascading selection list" проблем во InfoPath формуларите сервер светот и има многу добри примери од таму, кои се објасни како да се реши овој.
  • А празно вредност за колона во продавач на листата не се врати празен стринг, кога референцирани вака: initItem["Vendor Name"]. Наместо, го враќа е нулти.

Некои други белешки:

  • Јас се врати низа[] на продавачите, бидејќи имав некои потешкотии враќање на ArrayList. InfoPath беше жалат за тоа и јас не имаат време или склоност да се борат над неа. Овој, се разбира, става вештачка граница на вкупниот број на продавачи. Таа, исто така ме принуди да се спроведе трим() method on the array because I hate the idea of returning back 100’s of null vendors. InfoPath не се грижи, но тоа гушен во мене. (Повторно, ова беше полесно отколку борат InfoPath над ArrayLists).
  • Јас спроведува GetSpecificVendorByName() функција, како и, која може да биде поучно.

Го кодот:

користење на Систем;
користење на System.Web;
користење на System.Web.Services;
користење на System.Web.Services.Protocols;
користење на Microsoft.SharePoint;
користење на System.Configuration;

/// <резиме>
///
Vendor Service: Provides vendor related services which today are consumed by an infopath client form.
///
/// History:
/// ——–
/// 07/24/07: Initial coding, Paul J. Gavin of Conchango.
///
/// </резиме>
[WebService(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
јавноста класа VendorService : System.Web.Services.WebService
{

/// <резиме>
/// Represents a vendor from a custom sharepoint list maintained by MSUSA.
/// </резиме>
јавноста класа Продавач
{
јавноста Продавач() { }

јавноста Продавач(Плукаат initItem)
{
ако (! (initItem["Vendor Name"] == нула)) VendorName = initItem["Vendor Name"].ToString();
ако (! (initItem["Address 1"] == нула)) VendorAddress1 = initItem["Address 1"].ToString();
ако (! (initItem["Address 2"] == нула)) VendorAddress2 = initItem["Address 2"].ToString();
ако (! (initItem["City"] == нула)) VendorCity = initItem["City"].ToString();
ако (! (initItem["VendorPhone"] == нула)) VendorPhone = initItem["VendorPhone"].ToString();
ако (! (initItem["PurchaseType"] == нула)) VendorType = initItem["PurchaseType"].ToString();
ако (! (initItem["State"] == нула)) VendorState = initItem["State"].ToString();
ако (! (initItem["Zip"] == нула)) VendorZip = initItem["Zip"].ToString();
ако (!(initItem["Fax"] == нула)) VendorFax = initItem["Fax"].ToString();
ако (!(initItem["SalesRepName"] == нула)) VendorSalesRepName = initItem["SalesRepName"].ToString();

VendorItemId = initItem.ID; // Unique ID maintained via MOSS.
}

јавноста int VendorItemId;
јавноста низа VendorName;
јавноста низа VendorAddress1;
јавноста низа VendorAddress2;
јавноста низа VendorCity;
јавноста низа VendorState;
јавноста низа VendorZip;
јавноста низа VendorPhone;
јавноста низа VendorType;
јавноста низа VendorSalesRepName;
јавноста низа VendorFax;
}

јавноста VendorService () {

//Uncomment the following line if using designed components
//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; // Name of the actual MOSS site that hosts the vendor custom list.
низа SpVendorListName; // Name of the actual MOSS list containing vendors.

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

користење на (SPSite site = нови SPSite(SpVendorSiteName))
{

користење на (SPWeb web = site.OpenWeb())
{

SPList currentList = web.Lists[SpVendorListName];

Плукаат specificItem = currentList.Items[vendorId];

се врати нови Продавач(specificItem);

} // using spweb web = site.openweb()
} // using spsite site = new spsite("http://localhost/mizuho")

}

[WebMethod]
// Assumes that the vendor name is unique, from a business perspective
јавноста Продавач GetSpecificVendorByVendorName(низа vendorName)
{
низа SpVendorSiteName; // Name of the actual MOSS site that hosts the vendor custom list.
низа SpVendorListName; // Name of the actual MOSS list containing vendors.

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

користење на (SPSite site = нови SPSite(SpVendorSiteName))
{
користење на (SPWeb web = site.OpenWeb())
{

SPList currentList = web.Lists[SpVendorListName];

foreach (Плукаат vendorItem во currentList.Items)
{
ако (vendorItem["Vendor Name"] == нула) продолжи;

ако (vendorItem["Vendor Name"].ToString().Еднакво(vendorName))
се врати нови Продавач(vendorItem);
}

Продавач v = нови Продавач();
v.VendorPhone = "not found: " + vendorName;

се врати v;

се врати нула;

} // using spweb web = site.openweb()
} // using spsite site = new spsite("http://localhost/mizuho")

} // метод

[WebMethod]
јавноста Продавач[] GetVendorsOfType (низа FilterType)
{

низа SpVendorSiteName; // Name of the actual MOSS site that hosts t
he vendor custom list.
низа SpVendorListName; // Name of the actual MOSS list containing vendors.

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

Продавач[] resultList;
int vendorIndex = 0;
resultList = нови Продавач[1000];

// Initialize the list with a default friendly message.
Продавач v = нови Продавач();
v.VendorName = "Select a vendor type to populate this list.";
resultList[0] = v;

// Convert the filter to lower case for easier string comparison later.
filterType = filterType.ToLower();

// If the filter type passed is "test", generate some simple data.
#регионот Filter type = "test"
ако (filterType.Equals("test"))
се врати GenerateTestVendors();
#endregion

ако (вистина)
{
користење на (SPSite site = нови SPSite(SpVendorSiteName))
{
користење на (SPWeb web = site.OpenWeb())
{

v = нула;

SPList currentList = web.Lists[SpVendorListName];

// Iterate through all the items in the vendor list.
foreach (Плукаат vendorItem во currentList.Items)
{

низа lowerVendorType;

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

ако (lowerVendorType.Equals(FilterType))
{
resultList[vendorIndex ] = нови Продавач(vendorItem);
}
} // iterating thru all the vendors in the list


се врати TrimVendorArray(vendorIndex, resultList);
// return resultList;

} // using spweb web = site.openweb()
} // using spsite site = new spsite("http://localhost/mizuho")

} // if true

се врати нула;
}

приватни Продавач[] 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 најавите. А, Пораката била испратена до Мос ASCII дијагностички најавите. Можете да ги пратите дека надолу преку централниот услуги администрација.

Што треба да биде брз и на нозете. Мос сака да се напише на log датотеката, често и verbosely. This can be trimmed but the default log writing behavior is "everything as quickly as possible".

Мос: Ажурирање на сопствени листа

Постојат многу добри примери за ажурирање на сопствени листи преку пакети. Тука е уште еден.

Бизнис проблем: InfoPath формулар е дизајниран која им овозможува на корисниците да влезат во онлајн купување требувањата. PO официјално барање броеви треба да биде традиционален низа базирани целобројни вредности и се пресметуваат автоматски.

Бизнис решенија: Креирате сопствени Мос листа ги содржи две колони: "ControlField" and "ControlValue". Вредноста колона го содржи следно купување реквизиција број. Note that the generic "control" именување на конвенцијата обезбедува за идните контрола области во кои можат да се користат колку што е потребно.

Техничко решение: Создаде веб сервис посетена од страна на InfoPath клиент. На веб сервис се враќа назад на следно купување реквизиција број и надградби на вредноста на листа.

Научени лекции:

  • Кога додавање на овој веб сервис како извор на податоци на InfoPath формулар, Најдов дека е неопходно да го конвертирате во УДЦ и чувајте го во податочна врска библиотека.
  • Јас исто така, утврди дека е неопходно да им се овозможи крстот домен скриптирање преку централниот услуги администрација // апликација за управување со // форма сервер.
  • Прв пат во форма Пробавте да пристапите до веб сервис, тоа трае некое време и по повод, тоа ќе Time Out. Јас си свиркавме со поставки во форма сервер да се прошири на истек на време поставки и што се чинеше да им помогне на.

Го кодот:

користење на Систем;
користење на System.Web;
користење на System.Web.Services;
користење на System.Web.Services.Protocols;
користење на Microsoft.SharePoint;
користење на System.Configuration;

[WebService(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
јавноста класа PoService : System.Web.Services.WebService
{
јавноста PoService () {

//Uncomment the following line if using designed components
//InitializeComponent();
}

/// <резиме>
/// Obtain the next PO number from the sharepoint po number control list.
/// Increment the PO number in that list.
/// </резиме>
/// <се враќа></се враќа>
[WebMethod]
јавноста низа GetNextPoNumber()
{
низа SpPoControlSiteName; // Name of the actual MOSS site that hosts the PO Control list.
низа SpPoControlListName; // Name of the actual MOSS list containing the Po control.

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

низа nextPoReqNumber = "xyzzy";

користење на (SPSite site = нови SPSite(SpPoControlSiteName))
{
користење на (SPWeb web = site.OpenWeb())
{

SPList currentList = web.Lists[SpPoControlListName];

foreach (Плукаат controlItem во currentList.Items)
{

ако (((низа)controlItem["ControlField"]).Еднакво("NextPoNumber"))
{
nextPoReqNumber = (низа)controlItem["ControlValue"];

int int_nextPoReqNumber;
int_nextPoReqNumber = Конвертирате.ToInt32(nextPoReqNumber);

int_nextPoReqNumber ;

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

} // Locating, reading and updating the PO number in the list.


} // using spweb web = site.openweb()
} // using spsite site = new spsite("http://localhost/mizuho")

се врати nextPoReqNumber;

}
}