МОС / Сървър за формулярите на InfoPath (InfoPath 2007) падащ списък производителност

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

Резюме: InfoPath 2007 форма, разположени на Мос сървър предоставя капка-голо възвишение списък на доставчици, обвързани с мъх списък по избор. При избора на доставчик, правила присвоите стойности на полета на няколко текстови полета като име на отч., адрес, град, държава, ZIP и телефон. Изпълнението е ужасно. Ние забележите, че производителността се влошава (в нелинейни мода) за всяко допълнително поле ще се актуализира този начин. Т.е., Ако ние просто ще актуализира името на отч., отнема [x] период от време. Ако ние актуализира отч., информационните и комуникационни технологии1, Адрес2, град, държава, ZIP, отнема 10 пъти по-дълго.

Разтвор: Напишете уеб услуга (примерен код може да се намери Тук) която се предава в името на доставчика и се връща обратно детайли за доставчик. След това, Присвояване на полетата по този начин. Въпреки че това изглежда твърде бавно, не е никакъв забележим разлика в производителността, когато ние възложени 1 поле срещу 8 полета. Като допълнителен бонус, Потребителите получават готино "връзка със сървъра" Силоните ефект, докато чакат за формуляра, за да се позове и потребяват услугата резултати.

МОС: Възникна изключение. (Изключение от HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

АКТУАЛИЗИРАНЕ: Ние никога не определя отново основната причина за този проблем и тя никога повърхност.

Ние Забележете че изведнъж по време на изпълнението на сайт на развитие, двама потребители не могат да имат достъп до колекция със сайтове. Тези сметки да удостовери към основния сайт, но когато се опитва да получи достъп до сайт колекция, те просто да празен екран. Няма грешки показана, просто бял празна страница.

Ние Влезте като администратор на колекцията сайтове и се опитате да добавите един от тези потребители като администратор на сайта и този път, при натискане на "OK", Ние се това съобщение:

Възникна изключение. (Изключение от HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

Ние прекарва известно време, това изследване и за съжаление, не излезе с всичко полезно. Имаше някои съобщения в регистрационния файл на диагностика, но това е трудно да ги съпоставят точно с този проблем.

В края, Ние изтриването на колекцията със сайтове и отново го и че решават я.

Ако аз разбера какво това причинени в бъдеще, Ще актуализирам този пост.

МОС: Iterating чрез потребителски списъци, филтрирани данни право в InfoPath

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

Осигури метод, който позволява на потребителите да въвеждат точни покупка искания бързо.

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

Клиентът прави бизнес с няколко стотин доставчици.

Доставчици са "тип" специфични. Това означава, че даден доставчик продава компютърна техника (e.g. Dell) или офис консумативи (e.g. Скоби).

Как правя ние давам възможност на крайните потребители, които създават покупка искания изберете валиден доставчик?

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

Диференцират доставчици в системата чрез "тип".

Разреши на потребителите да изберете типа на"" на продукта и след това предоставят филтриран набор от подходящи доставчици.

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

Формуляр на InfoPath е проектиран, че позволява на потребителите да въведете онлайн покупка искания.

Две InfoPath избор списъци контрол производители на избора. Първо, потребителят избира тип"покупка". Това ограничава втората селекция списък да съдържа само доставчици, които продават за този тип на покупка. Това е класически каскадни падащото.

Доставчиците се съхраняват в Мос потребителски списък с колони по избор за доставчик атрибути като име, адрес и особено "тип".

Реализиране уеб услуга на InfoPath клиент да консумират това повтаря през потребителски доставчик списък, връщане само доставчици съвпадение на предоставения "тип".

Се позове на уеб услугата чрез формуляр на InfoPath.

Поуките:

  • Първо, изглежда необходимо да отида този път. Бих предпочел да направим за филтриране изцяло в InfoPath и не създават никакви уеб услуга функционалност тук. Въпреки това, формуляри сървър не предоставя необходимата възможност за филтриране. Можем да сложим правило върху "тип" избор списък във формуляра да сортиране на повторно отваряне заявка за доставчик, но не можем да го да работи правилно. Следователно, Това е необходимо за изпълнение на уеб услугата.
  • Това е класически "каскадни селекция списък" проблем в InfoPath формира свят и има много добри примери, там, които обясняват как да реши този.
  • Празна стойност за една колона в списъка на доставчиците не връща празен низ когато посочен като този: initItem["Име на доставчик"]. Вместо това, Връща null.

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

  • Аз върне масив[] на доставчиците, защото имах някои трудности при връщане ArrayList. InfoPath е оплакват от нея и не са имали време или склонност да се борят над него. Това, Разбира се, поставя една изкуствена граница на общия брой на доставчици. Тя също ме принудени да приложат отрежете() метод на масива защото аз мразя идеята за връщане обратно 100 на null доставчици. InfoPath не му пука, но той разпитва в мен. (Отново, Това е по-лесно, отколкото борбата InfoPath над ArrayLists).
  • Аз приложени 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.Уеб услугата
{

/// <Резюме>
/// Представлява доставчик от потребителски sharepoint списък, поддържан от MSUSA.
/// </Резюме>
обществени клас Доставчик
{
обществени Доставчик() { }

обществени Доставчик(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["Zip"] == Null)) VendorZip = initItem["Zip"].ToString();
Ако (!(initItem["Факс"] == Null)) VendorFax = initItem["Факс"].ToString();
Ако (!(initItem["SalesRepName"] == Null)) VendorSalesRepName = initItem["SalesRepName"].ToString();

VendorItemId = initItem.ID; // Уникален ИД, поддържани чрез Мос.
}

обществени INT VendorItemId;
обществени низ VendorName;
обществени низ VendorAddress1;
обществени низ VendorAddress2;
обществени низ VendorCity;
обществени низ VendorState;
обществени низ VendorZip;
обществени низ VendorPhone;
обществени низ VendorType;
обществени низ VendorSalesRepName;
обществени низ VendorFax;
}

обществени VendorService () {

//Uncomment определителен член последователи линия, ако използвате проектирани компоненти
//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; // Името на действителната Мос сайт, който подслонява доставчик списък.
низ SpVendorListName; // Името на списъка за действителната Мос, съдържащи доставчици.

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

използване на (SPSite сайт = нов SPSite(SpVendorSiteName))
{

използване на (SPWeb уеб = сайт. OpenWeb())
{

Splist.Update() currentList = web. Списъци[SpVendorListName];

SPItem specificItem = currentList.Items[vendorId];

връщане нов Доставчик(specificItem);

} // използване на spweb web = site.openweb()
} // използвайки spsite сайт = нови spsite("http://Localhost/mizuho")

}

[WebMethod]
// Предполага, че името на доставчика е уникален, от бизнес гледна точка
обществени Доставчик GetSpecificVendorByVendorName(низ бъде)
{
низ SpVendorSiteName; // Името на действителната Мос сайт, който подслонява доставчик списък.
низ SpVendorListName; // Името на списъка за действителната Мос, съдържащи доставчици.

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

използване на (SPSite сайт = нов SPSite(SpVendorSiteName))
{
използване на (SPWeb уеб = сайт. OpenWeb())
{

Splist.Update() currentList = web. Списъци[SpVendorListName];

foreach (SPItem vendorItem в currentList.Items)
{
Ако (vendorItem["Име на доставчик"] == Null) «««;

Ако (vendorItem["Име на доставчик"].ToString().Е равно(бъде))
връщане нов Доставчик(vendorItem);
}

Доставчик v = нов Доставчик();
v.VendorPhone = "не е намерен: " + бъде;

връщане v;

връщане Null;

} // използване на spweb web = site.openweb()
} // използвайки spsite сайт = нови spsite("http://Localhost/mizuho")

} // метод

[WebMethod]
обществени Доставчик[] GetVendorsOfType (низ filterType)
{

низ SpVendorSiteName; // Името на действителната Мос сайт, който подслонява t
Той доставчик потребителски списък.
низ 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

Ако (вярно)
{
използване на (SPSite сайт = нов SPSite(SpVendorSiteName))
{
използване на (SPWeb уеб = сайт. OpenWeb())
{

v = Null;

Splist.Update() currentList = web. Списъци[SpVendorListName];

// Обхождане на всички елементи в списъка с доставчици.
foreach (SPItem vendorItem в currentList.Items)
{

низ lowerVendorType;

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

Ако (е равно на lowerVendorType.(filterType))
{
resultList[vendorIndex ] = нов Доставчик(vendorItem);
}
} // iterating през всички доставчици в списъка


връщане TrimVendorArray(vendorIndex, resultList);
// връщане resultList;

} // използване на spweb web = site.openweb()
} // използвайки spsite сайт = нови spsite("http://Localhost/mizuho")

} // Ако е вярно

връщане 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 дневник с диагностика. Можете да проследите това чрез централните служби администрация.

Трябва да бъде бързо на краката си. Мос обича да пише в регистрационния файл, често и verbosely. Това може да се почиства, но по подразбиране log, писане на поведение е "всичко възможно най-бързо".

МОС: Актуализиране на списък по избор

Има много добри примери за актуализиране на списъци по избор чрез SDK. Ето още един.

Бизнес проблем: InfoPath формуляр е проектиран, че позволява на потребителите да въведете онлайн покупка искания. PO заявки номера трябва да бъде традиционно последователност базирани целочислени стойности и изчислява автоматично.

Бизнес решение: Създаване на потребителски списък на Мос, съдържащ две колони: "ControlField" и "ControlValue". Стойност на колоната съдържа следващия номер на заявка за покупка. Обърнете внимание, че родово "контрол" именуване конвенция предвижда бъдещи контрол полета, които могат да се използват, ако е необходимо.

Техническо решение: Създаване на уеб услуга, достъпна на 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 () {

//Uncomment определителен член последователи линия, ако използвате проектирани компоненти
//InitializeComponent();
}

/// <Резюме>
/// Получи следващия номер на поръчка от sharepoint po контрол от списъка номер на.
/// Нарастване PO номер в този списък.
/// </Резюме>
/// <Връща></Връща>
[WebMethod]
обществени низ GetNextPoNumber()
{
низ SpPoControlSiteName; // Името на действителната Мос сайт, който подслонява PO контролен списък.
низ SpPoControlListName; // Името на списъка за действителната Мос, съдържащ контролата Po.

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

низ nextPoReqNumber = "xyzzy";

използване на (SPSite сайт = нов SPSite(SpPoControlSiteName))
{
използване на (SPWeb уеб = сайт. OpenWeb())
{

Splist.Update() currentList = web. Списъци[SpPoControlListName];

foreach (SPItem controlItem в currentList.Items)
{

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

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

int_nextPoReqNumber ;

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

} // Намиране на, четене и актуализиране на PO номера в списъка.


} // използване на spweb web = site.openweb()
} // използвайки spsite сайт = нови spsite("http://Localhost/mizuho")

връщане nextPoReqNumber;

}
}