MOSS / InfoPath Forms Server (InfoPath 2007) У расчыняецца спісе прадукцыйнасці

Дадатковыя катэгорыі: InfoPath

Рэзюмэ: InfoPath 2007 ўтвараюць разгорнуты на сэрвэры MOSS дае расчыняецца спіс пастаўшчыкоў звязаныя з карыстацкага спісу MOSS. Пры выбары пастаўшчыка, правілы прысвойваюць значэнні палёў да жменькі тэкставыя палі, такія як імя гандлёвага прадстаўніка, адрас, горад, дзяржава, ZIP і тэлефоны. Прадукцыйнасць жудасна. Заўважым, што прадукцыйнасць пагаршаецца (ў нелінейна) для кожнага дадатковага поля мы абнаўляем гэты шлях. Гэта значыць, калі мы проста абнавіць імя гандлёвага прадстаўніка, ён прымае [X] колькасць часу. Калі пасля абнаўлення гандлёвы прадстаўнік, address1, address2, горад, дзяржава, зашпілька-маланка, ён прымае 10 раз даўжэй.

Рашэнне: Напісаць вэб-сэрвіс (Прыклад кода можна знайсці тут) , Якая перадаецца ў імя пастаўшчыка і яна вяртаецца назад пастаўшчыку больш падрабязна. Затым, Назначце поля такім чынам. Хоць гэта таксама здаецца павольным, не было ніякай прыкметнай розніцы ў прадукцыйнасці, калі мы прызначылі 1 поля ад 8 палёў. У якасці дадатковага бонуса, users get a cool "contacting the server" Сайланы Эфект пакуль яны чакаюць, каб выклікаць форму і выкарыстоўваць службу вынікаў.

MOSS: Выключэнне адбылося. (Выключэнне з HRESULT: 0x80020009 (DISP_E_EXCEPTION))

АБНАЎЛЕННЕ: Мы ніколі не вызначылі прычыну гэтай праблемы, і яно ніколі не з'яўляецца зноў.

Мы заўважаем, у ходзе рэалізацыі распрацоўкі сайта, які раптоўна, два карыстальнікі не могуць атрымаць доступ да сайта калекцыю. Гэтыя рахункі могуць праходзіць праверку сапраўднасці на асноўны сайт, але пры спробе доступу да пэўнай калекцыі сайта, яны проста атрымліваю пусты экран. Няма памылак адлюстроўваюцца, проста белы пустой старонкі.

Мы увайсці ў сістэму як Адміністратар сямейства сайтаў і паспрабуйце дадаць адно з тых карыстальнікаў, адміністратара сайта і на гэты раз, upon pressing "OK", Мы атрымалі гэта паведамленне:

Выключэнне адбылося. (Выключэнне з HRESULT: 0x80020009 (DISP_E_EXCEPTION))

Мы правялі некаторы час на вывучэнне гэтага і, на жаль, не прыдумалі нічога карыснага. Былі некаторыя паведамленні ў часопіс дыягностыкі, але гэта было цяжка дакладна суаднесці іх з гэтым пытаннем.

У рэшце рэшт, Мы выдаленне сямейства сайтаў і стварыць нанова, і што вырашыць яе.

Калі б я высветліць, што выклікала гэта ў будучыні, Я буду абнаўляць гэты пост.

MOSS: Перабор карыстацкіх спісаў і вяртанне адфільтраваць дадзеных у InfoPath

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

Стварэнне спосабу, які дазваляе карыстальнікам ўводзіць дакладныя заявак на закупкі хутка.

Бізнес-задачы:

Кліент вядзе бізнэс з некалькіх сотняў пастаўшчыкоў.

Vendors are "type" канкрэтны. Гэта азначае, што прадавец прадае камп'ютэрнае абсталяванне (e.g. Лагчына) або канцылярскіх прыладаў (e.g. Клямары).

Як мы дазваляюць канчатковым карыстальнікам, якія ствараюць заяўкі, увядзіце карэктнае пастаўшчыка?

Business Solution:

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.

Vendors are stored in a MOSS custom list with custom columns for vendor attributes such as name, address and especially "type".

Укараненне вэб-сэрвіс для кліента InfoPath спажываць, які ажыццяўляе перабор карыстацкі спіс пастаўшчыкоў, returning only vendors matching a supplied "type".

Выклік вэб-службы з дапамогай формаў InfoPath.

Урокі:

  • Першы, уяўляецца неабходным ісці па гэтым шляху. Я б аддаў перавагу, каб зрабіць фільтраванне цалкам у InfoPath і не ствараюць ніякіх функцыянальнасці вэб-сэрвісу тут. Аднак, Forms Server не забяспечвае неабходную фільтраванне. We can put a rule onto a the "type" Спіс выбару ў форме для сартавання зноў адкрыць запыт пастаўшчыку, але мы не можам прымусіць яго працаваць правільна. Таму, гэта было неабходна для ажыццяўлення вэб-сэрвіс.
  • This is a classic "cascading selection list" problem in the InfoPath forms server world and there are many good examples out there that explain how to solve this.
  • A blank value for a column in the vendor list does not return an empty string when referenced like this: initItem["Vendor Name"]. Замест, it returns a null.

Some other Notes:

  • I return an array[] of vendors because I had some difficulty returning an ArrayList. InfoPath was complaining about it and I didn’t have the time or the inclination to fight over it. Гэта, вядома, puts an artificial limit on the total number of vendors. It also compelled me to implement a trim() 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(радок Имя_вендора)
{
радок 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];

Еогеасп (Пляваць vendorItem ў currentList.Items)
{
калі (vendorItem["Vendor Name"] == нулявы) працягваць;

калі (vendorItem["Vendor Name"].ToString().Роўна(Имя_вендора))
вяртанне новы Прадавец(vendorItem);
}

Прадавец v = новы Прадавец();
v.VendorPhone = "not found: " + Имя_вендора;

вяртанне v;

вяртанне нулявы;

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

} // метад

[WebMethod]
грамадскасць Прадавец[] GetVendorsOfType (радок Тып фільтра)
{

радок 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.
Еогеасп (Пляваць vendorItem ў currentList.Items)
{

радок lowerVendorType;

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

калі (lowerVendorType.Equals(Тып фільтра))
{
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;

}
}

MOSS: Заўвагі па InfoPath адладкі

InfoPath формы паведамленняў пра памылкі сервера ўводзяць у зман.

Пры распрацоўцы формы InfoPath, Я б размясціць яго на сэрвэры MOSS і атрымаць доступ да форме. Форма будзе запускацца пры загрузцы, а затым генерыраваць у зман паведамленне пра памылку паказаў мне ў часопіс падзей Windows больш падрабязна. На самай справе, no message was written to the windows event log. Rather, the message was sent to the MOSS ascii diagnostic log. Вы можаце адсочваць, што ўніз праз цэнтральныя службы адміністрацыі.

Вы павінны быць лёгкія на ўздым. MOSS любіць пісаць у лог-файл, часта і шматслоўна. This can be trimmed but the default log writing behavior is "everything as quickly as possible".

MOSS: Абнаўленне карыстацкага спісу

Ёсць шмат добрых прыкладаў абнаўлення карыстацкіх спісаў з дапамогай SDK. Гэта яшчэ адзін.

Бізнес-задачы: InfoPath форма была распрацавана, што дазваляе карыстальнікам ўводзіць онлайн заявак на закупкі. PO нумары Заяўкі павінны быць традыцыйнымі на аснове паслядоўнасці цэлых значэнняў і разлічваецца аўтаматычна.

Business Solution: Стварэнне наладжвальнага спісу MOSS двума слупкамі: "ControlField" and "ControlValue". Значэнне слупок ўтрымлівае нумар наступнага рэквізіцыі куплі. Note that the generic "control" наймення падае для будучага поля кіравання, які можа быць выкарыстаны пры неабходнасці.

Тэхнічнае рашэнне: Стварэнне вэб-службы доступ кліента InfoPath. Вэб-служба вяртае назад Наступны нумар рэквізіцыі пакупкі і абнаўляе значэнне спісу.

Урокі:

  • Пры даданні гэтага вэб-сэрвісу ў якасці крыніцы дадзеных для формаў InfoPath, Я палічыў неабходным пераўтварыць яго ў УДК і захоўваць яго ў бібліятэцы падлучэнняў да дадзеных.
  • I also found it necessary to enable cross domain scripting via central services administration // application management // form server configuration.
  • The first time the form tried to access the web service, it takes a while and on occasion, it would time out. I fiddled with settings in form server configuration to expand the timeout settings and that seemed to help.

Код:

выкарыстанне Сістэма;
выкарыстанне 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.
/// </рэзюмэ>
/// <returns></returns>
[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];

Еогеасп (Пляваць 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;

}
}