ЛИШАЙНИК / InfoPath формах серверу (InfoPath 2007) розкривний список продуктивності

Додаткові категорії: InfoPath

Резюме: В InfoPath 2007 форми, розгорнуті на сервері, ЛИШАЙНИК забезпечує розкривний список постачальників, зв'язали за настроюваним списком МОСС. При виборі продавця, правила призначити значення полів кілька текстових полів, таких як продаж респ ім'я, адреса, місто, держава, ZIP і phone. Продуктивність є потрапило. Ми помітили, що погіршується продуктивність (в нелінійній моди) для кожного додаткового поля ми оновлюємо таким чином. Тобто, Якщо ми просто оновити ім'я торгових представників, Він приймає [x] кількість часу. Якщо ми оновлюємо торгових представників, address1, address2, місто, держава, ZIP, Він приймає 10 разів довше.

Рішення: Написати веб-служби (зразок коду можна знайти Тут) що передається в ім'я постачальника і повертається назад постачальників деталей. Потім, призначити поля таким чином. Хоча це здається занадто повільний, не було ніякої помітною різниці в продуктивності, коли ми призначені 1 поле проти 8 поля. В якості додаткового бонусу, користувачі отримують прохолодно "зв'язатися з сервером" Сайлони ефект, доки вони чекають для форми посилатися і споживати результатами послуг.

ЛИШАЙНИК: Стався виняток. (Виключення з HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

ОНОВЛЕННЯ: Ми ніколи не визначено причиною цієї проблеми, і він ніколи не поверхні знову.

Ми помічаємо, що раптом під час виконання розробки сайту, два користувачі не в змозі отримати доступ до колекції сайтів. Ці облікові записи можуть автентифікувати головний сайт, але при спробі отримати доступ до певного сайту колекції, вони просто отримати порожній екран. Без помилок, відображається, всього білий пусту сторінку.

Ми увійти в систему як адміністратор сайту колекції і спробувати додати один з тих користувачів, як адміністратор сайту і на цей раз, після натискання "ОК", Ми отримуємо це повідомлення:

Стався виняток. (Виключення з HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

Ми провели деякий час дослідження це і, на жаль, не придумати щось корисне. Там були деякі повідомлення у журналі діагностичні, але це було важко точно співвіднести їх з цього питання.

Врешті-решт, Ми видалення колекції сайтів та заново створити його і що вирішили.

Якщо мені зрозуміти, що причиною цього в майбутньому, Я буду оновлювати цей пост.

ЛИШАЙНИК: Ітерації через настроювані списки і повернення відфільтрованих даних в InfoPath

Бізнес-сценарій:

Забезпечити метод, який дозволяє користувачам швидко ввести точні покупки заявки.

Бізнес-завдання:

Клієнт веде свій бізнес з декількох сотень постачальників.

Продавці є "тип" конкретні. Це означає, що продавця продає комп'ютерного обладнання (Наприклад. Dell) або канцелярське приладдя (Наприклад. Скоби).

Як ми дозволити кінцевих користувачів, які створюють покупки заявки виберіть припустимий постачальника?

Бізнес-рішення:

Диференціювати постачальників системи за допомогою "тип".

Надати користувачам можливість вибрати тип"" продукту і потім забезпечити відфільтрований набір відповідних постачальників.

Технічні рішення:

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

Два списки вибору InfoPath контролювати вибір постачальника. Перший, користувач вибирає "покупку типу". Це обмежує другий список вибору має містити лише постачальників, що продають для цього типу покупки. Це класичний каскадні спадне меню.

Постачальники зберігаються в MOSS настроюваним списком з користувацькі стовпці для постачальника атрибути, такі як ім'я, адреса і особливо "тип".

Реалізувати веб-служби, InfoPath клієнта до споживання, що повторюється через списку користувацьких постачальників, повернення лише постачальників відповідності поставляються "тип".

Виклику веб-служби за допомогою форм InfoPath.

Вивчені уроки:

  • Перший, здається, треба піти цей маршрут. Я волів би зробити фільтрації повністю в InfoPath, і не створювати будь-які web послуги функціональність тут. Однак, форми сервер не надає необхідні можливості фільтрації. Ми можемо покласти правило на на типу"" список вибору у формі до роду повторно відкрийте запит постачальника, але ми не можемо змусити його працювати належним чином. Тому, Це було необхідно реалізувати веб-служби.
  • Це класичний "каскадні вибір список" проблема в 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.
///
/// </резюме>
[Веб-служба(Простір імен = "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 () {

//Розкоментуйте наступний рядок, якщо за допомогою розроблений компонентів
//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 даних ідентифікатора)
{
рядок SpVendorSiteName; // Ім'я фактичні МОХОМ сайту, на якому настроюваного списку постачальників.
рядок SpVendorListName; // Ім'я фактичні МОХОМ список, який містить постачальників.

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

за допомогою (SPSite сайт = нові SPSite(SpVendorSiteName))
{

за допомогою (SPWeb Web = сайт. OpenWeb())
{

SPList currentList = web. Списки[SpVendorListName];

SPItem specificItem = currentList.Items[даних ідентифікатора];

повернення нові Постачальника(specificItem);

} // за допомогою spweb веб = 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 Web = сайт. OpenWeb())
{

SPList currentList = web. Списки[SpVendorListName];

foreach (SPItem vendorItem у currentList.Items)
{
Якщо (vendorItem[«Ім'я постачальника"] == Null) Продовжити;

Якщо (vendorItem[«Ім'я постачальника"].ToString().Дорівнює(бути))
повернення нові Постачальника(vendorItem);
}

Постачальника v = нові Постачальника();
v.VendorPhone = "не знайдено: " + бути;

повернення v;

повернення Null;

} // за допомогою spweb веб = 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 Web = сайт. OpenWeb())
{

v = Null;

SPList currentList = web. Списки[SpVendorListName];

// Перебирати всі елементи, у списку постачальників.
foreach (SPItem vendorItem у currentList.Items)
{

рядок lowerVendorType;

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

Якщо (Дорівнює lowerVendorType.(filterType))
{
resultList[vendorIndex ] = нові Постачальника(vendorItem);
}
} // ітерації thru всіх продавців у списку


повернення TrimVendorArray(vendorIndex, resultList);
// повернення resultList;

} // за допомогою spweb веб = 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 Надіcлати журнал. Ви можете відстежити що через Центральний служби адміністрування.

Ви повинні бути швидка на ноги. ЛИШАЙНИК любить писати лог-файл, часто і:. Це може бути урізаний, але за промовчанням журнал написання поведінка є "все якомога швидше".

ЛИШАЙНИК: Оновлення за настроюваним списком

Є багато добрих прикладів оновлення настроювані списки розсилки за допомогою SDK. Ось ще один.

Бізнес-завдання: Форма InfoPath був розроблений, що дозволяє користувачам вводити онлайн придбати заявки. PO реквізиції номери повинні бути традиційні послідовності на основі цілі числа та розраховується автоматично.

Бізнес-рішення: Створити Настроюваний список МОСС містить два стовпці: "ControlField" і "ControlValue". Стовпці «значення» містить на наступний номер заявки на придбання. Зверніть увагу, що видових "контроль" іменуванні забезпечує для майбутніх керуючих полів, які можуть бути використані в міру необхідності.

Технічні рішення: Створити веб-сервіс до програми InfoPath клієнта. Веб-служба повертає назад на наступний номер заявки на придбання та оновлює значення зі списку.

Вивчені уроки:

  • Під час додавання веб-служба як джерело даних для форми InfoPath, Я визнав за необхідне перетворити його на УДК і зберігати його в бібліотеці зв'язків даних.
  • Я також визнав за необхідне дозволити міждоменний сценарії через Центральний служби адміністрування // керування додатками // форми конфігурації сервера.
  • Вперше у формі намагалися отримати доступ до веб-служби, Це займе якийсь час і з нагоди, Це було б тайм-аут. Я грав на скрипці з настройками у вигляді сервер конфігурації розширити параметри часу очікування і які, здавалося, допомогти.

Код:

за допомогою Система;
за допомогою System. Web;
за допомогою System.Web.Services;
за допомогою System.Web.Services.Protocols;
за допомогою Microsoft.SharePoint;
за допомогою System.Configuration;

[Веб-служба(Простір імен = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
громадських клас PoService : System.Web.Services.Веб-служба
{
громадських PoService () {

//Розкоментуйте наступний рядок, якщо за допомогою розроблений компонентів
//InitializeComponent();
}

/// <резюме>
/// Отримати наступний PO номер від po номер керування списком sharepoint.
/// Приріст PO номер в цьому списку.
/// </резюме>
/// <Повертає></Повертає>
[WebMethod]
громадських рядок GetNextPoNumber()
{
рядок SpPoControlSiteName; // Ім'я фактичні МОХОМ сайту, на якому списку керування PO.
рядок SpPoControlListName; // Ім'я фактичні МОХОМ список, який містить керування Po.

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

рядок nextPoReqNumber = "xyzzy";

за допомогою (SPSite сайт = нові SPSite(SpPoControlSiteName))
{
за допомогою (SPWeb Web = сайт. OpenWeb())
{

SPList 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 веб = site.openweb()
} // за допомогою spsite сайту = новий spsite("http://Localhost/mizuho")

повернення nextPoReqNumber;

}
}