MACHY / Program InfoPath Forms Server (Program InfoPath 2007) Rozbaľovací zoznam výkon

Ďalšie kategórie: Program InfoPath

Zhrnutie: Programu InfoPath 2007 forme nasadených MOSS server poskytuje rozbaľovací zoznam dodávateľov viazaná na vlastný zoznam MOSS. Pri výbere dodávateľa, pravidlá priradenie hodnoty poľa hrsť textové polia ako obchodný zástupca meno, adresa, mesto, štát, ZIP a telefón. Výkon je hrozné. Môžeme všimnúť, že výkon ešte horšie (v non-lineárne) pre každé ďalšie pole sme aktualizácie týmto spôsobom. T. j., keby sme jednoducho aktualizovať názov obchodný zástupca, to trvá [x] množstvo času. Ak sme aktualizácie obchodný zástupca, IKT1, address2, mesto, štát, ZIP, to trvá 10 krát dlhšie.

Roztok: Napíšte webovú službu (Ukážkový kód možno nájsť tu) prelietajúce meno dodávateľa a vracia údaje dodávateľa. Potom, priradiť polia týmto spôsobom. Hoci sa to zdá príliš pomalé, tam bol žiadne rozpoznateľné rozdiel vo výkone, keď sme priradili 1 pole verzus 8 polia. Ako pridaný bonus, Užívatelia si v pohode "kontaktovať server" Cylon efekt, kým čakajú na formulár na vyvolanie a konzumovať služby výsledky.

MACHY: Vyskytla sa výnimka. (S výnimkou HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

AKTUALIZÁCIA: Nikdy sme zistili príčinu tohto problému a to nikdy povrch znova.

Môžeme všimnúť počas realizácie vývoja webu, že zrazu, dvaja užívatelia sú schopní prístup ku kolekcii lokalít. Tieto účty môžu overiť na hlavnej stránke, ale pri pokuse o prístup k konkrétnu kolekciu lokalít, dostanú len prázdna obrazovka. Žiadne chyby zobrazí, len biele prázdna stránka.

Prihláste sa ako správca kolekcie lokalít a skúste pridať jeden z týchto užívateľov ako admin stránky a tentoraz, po stlačení "OK", sme si túto správu:

Vyskytla sa výnimka. (S výnimkou HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

Sme strávili nejaký čas skúmaním tohto a bohužiaľ, nemala prísť s niečím užitočným. Tam boli niektoré správy do denníka diagnostiky, ale bolo to ťažké presne korelovať s touto otázkou.

V závere, sme Odstránenie kolekcie lokalít a re-vytvoril a že to vyriešil.

Ak som sa zistiť, čo spôsobilo to v budúcnosti, Budem aktualizovať tento príspevok.

MACHY: Iterácia cez vlastné zoznamy a návrate filtrované údaje do programu InfoPath

Obchodné scenáre:

Poskytnúť metóda, ktorá umožňuje používateľom rýchlo zadať presné nákup rekvizície.

Obchodné problém:

Klient robí Biznis s niekoľko sto dodávateľov.

Predajcovia sú "typ" špecifické. To znamená, že dodávateľ predáva počítačového vybavenia (napr.. Dell) alebo kancelárske potreby (napr.. Sponky).

Ako môžeme umožniť koncovým používateľom, ktorí vytvárajú nákup rekvizície Vyberte platný dodávateľa?

Obchodné riešenia:

Rozlišovať dodávateľov v systéme cez "typ".

Umožniť používateľom vybrať typ"" výrobku a potom poskytnúť filtrovanej množiny vhodných dodávateľov.

Technické riešenie:

Formulár programu InfoPath bol navrhnutý tak, že umožňuje používateľom zadať online nákup rekvizície.

Oba zoznamy výberu programu InfoPath ovládať výber dodávateľa. Prvá, používateľ vyberie typ"nákup". To obmedzuje druhý zoznam výberu obsahujú len predajcovia, ktorí predávajú pre tento typ nákupného. Toto je klasický kaskádovými rozbaľovacej.

Predajcovia sú uložené v MOSS vlastný zoznam s vlastné stĺpce dodávateľa atribútov, ako napríklad názov, adresa a najmä "typ".

Implementovať webovej službe program InfoPath klienta konzumovať to opakuje prostredníctvom zoznamu vlastných dodávateľa, vracia len predajcovia zodpovedajúce dodáva "type".

Odvolávať na webovú službu cez formulár programu InfoPath.

Poučenie:

  • Prvá, to sa zdá byť potrebné ísť touto cestou. Radšej by som filtrovanie úplne programu InfoPath a nevytvára žiadne funkcie pre webové služby tu. Avšak, formy server neposkytuje požadované filtrovanie schopnosti. Môžeme dať pravidlo na "typ" Výber zoznamu vo formulári druh znovu otvoriť dotaz dodávateľa, ale nemôžeme dostať to fungovať. Preto, bolo potrebné zaviesť webovej služby.
  • Toto je klasický "kaskádové výber zoznam" problém v programe InfoPath formuláre servera svete a existuje mnoho príkladov, ktoré vysvetľujú, ako vyriešiť tento.
  • Prázdnu hodnotu pre stĺpec v zozname dodávateľov nevráti prázdny reťazec ak odkazuje takhle: initItem["Názov dodávateľa"]. Namiesto toho, Vráti hodnotu null.

Niektoré ďalšie poznámky:

  • Môžem vrátiť pole[] predajcovia pretože som mal nejaké problémy vracia Zoznam polí ArrayList. Program InfoPath bol sťažujú a nemal som čas ani chuť bojovať cez to. Toto, samozrejme, kladie umelé limit na celkový počet dodávateľov. To tiež nútení ma implementovať trim() metóda na poli, pretože neznášam myšlienku návratu späť 100 nulový dodávateľov. Program InfoPath sa nestará, ale obtěžovaný na mňa. (Znova, to bolo jednoduchšie, než program InfoPath bojujú ArrayLists).
  • Som vykonávaná GetSpecificVendorByName() funkciu aj, ktoré môžu byť poučný.

Kód:

pomocou Systém;
pomocou System.Web;
pomocou System.Web.Services;
pomocou System.Web.Services.Protocols;
pomocou Microsoft.SharePoint;
pomocou System.Configuration;

/// <Zhrnutie>
///
Predajca služieb: Poskytuje dodávateľa súvisiacich služieb, ktoré dnes sú spotrebované klient formulár programu infopath.
///
/// História:
/// ——–
/// 07/24/07: Počiatočné kódovanie, Paul J. Gavin Conchango.
///
/// </Zhrnutie>
[WebService(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
verejné trieda VendorService : System.Web.Services.WebService
{

/// <Zhrnutie>
/// Predstavuje dodávateľa z vlastného zoznamu spravované MSUSA.
/// </Zhrnutie>
verejné trieda Vendor
{
verejné Vendor() { }

verejné Vendor(SPItem initItem)
{
Ak (! (initItem["Názov dodávateľa"] == null)) NázovDodávateľa = initItem["Názov dodávateľa"].ToString();
Ak (! (initItem["Adresa 1"] == null)) VendorAddress1 = initItem["Adresa 1"].ToString();
Ak (! (initItem["Adresa 2"] == null)) VendorAddress2 = initItem["Adresa 2"].ToString();
Ak (! (initItem["City"] == null)) VendorCity = initItem["City"].ToString();
Ak (! (initItem["VendorPhone"] == null)) VendorPhone = initItem["VendorPhone"].ToString();
Ak (! (initItem["PurchaseType"] == null)) VendorType = initItem["PurchaseType"].ToString();
Ak (! (initItem["State"] == null)) VendorState = initItem["State"].ToString();
Ak (! (initItem["Zip"] == null)) VendorZip = initItem["Zip"].ToString();
Ak (!(initItem["Fax"] == null)) VendorFax = initItem["Fax"].ToString();
Ak (!(initItem["SalesRepName"] == null)) VendorSalesRepName = initItem["SalesRepName"].ToString();

VendorItemId = initItem.ID; // Jedinečný identifikátor udržiavané prostredníctvom MOSS.
}

verejné int VendorItemId;
verejné reťazec NázovDodávateľa;
verejné reťazec VendorAddress1;
verejné reťazec VendorAddress2;
verejné reťazec VendorCity;
verejné reťazec VendorState;
verejné reťazec VendorZip;
verejné reťazec VendorPhone;
verejné reťazec VendorType;
verejné reťazec VendorSalesRepName;
verejné reťazec VendorFax;
}

verejné VendorService () {

//Odkomentovat nasledujúci riadok, ak používate navrhnuté súčasti
//InitializeComponent();
}

súkromné Vendor[] GenerateTestVendors()
{
Vendor[] resultList;
resultList = nové Vendor[100];

Vendor v;
v = nové Vendor();
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 = nové Vendor();

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 = nové Vendor();
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;

return resultList;

}

[WebMethod]
verejné Vendor GetSpecificVendorById(int vendorId)
{
reťazec SpVendorSiteName; // Meno skutočného MOSS stránky, ktoré hostí vlastný zoznam predajcov.
reťazec SpVendorListName; // Meno skutočného MOSS zoznam obsahujúci dodávateľov.

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

pomocou (SPSite stránky = nové SPSite(SpVendorSiteName))
{

pomocou (SPWeb webové stránky =. OpenWeb())
{

SPList currentList = web. Zoznamy[SpVendorListName];

SPItem specificItem = currentList.Items[vendorId];

return nové Vendor(specificItem);

} // pomocou spweb web = site.openweb()
} // pomocou spsite stránky = nové spsite("http://localhost/mizuho")

}

[WebMethod]
// Predpokladá, že názov dodávateľa je jedinečný, z obchodného hľadiska
verejné Vendor GetSpecificVendorByVendorName(reťazec vendorName)
{
reťazec SpVendorSiteName; // Meno skutočného MOSS stránky, ktoré hostí vlastný zoznam predajcov.
reťazec SpVendorListName; // Meno skutočného MOSS zoznam obsahujúci dodávateľov.

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

pomocou (SPSite stránky = nové SPSite(SpVendorSiteName))
{
pomocou (SPWeb webové stránky =. OpenWeb())
{

SPList currentList = web. Zoznamy[SpVendorListName];

foreach (SPItem vendorItem v currentList.Items)
{
Ak (vendorItem["Názov dodávateľa"] == null) pokračovať;

Ak (vendorItem["Názov dodávateľa"].ToString().Equals(vendorName))
return nové Vendor(vendorItem);
}

Vendor v = nové Vendor();
v.VendorPhone = "nebol nájdený: " + vendorName;

return v;

return null;

} // pomocou spweb web = site.openweb()
} // pomocou spsite stránky = nové spsite("http://localhost/mizuho")

} // metóda

[WebMethod]
verejné Vendor[] GetVendorsOfType (reťazec filterType)
{

reťazec SpVendorSiteName; // Názov aktuálnej stránky MOSS, ktorý hosťuje t
on dodávateľa vlastného zoznamu.
reťazec SpVendorListName; // Meno skutočného MOSS zoznam obsahujúci dodávateľov.

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

Vendor[] resultList;
int vendorIndex = 0;
resultList = nové Vendor[1000];

// Inicializácia zoznamu s predvolené priateľská správa.
Vendor v = nové Vendor();
v.VendorName = "Vyberte typ dodávateľa pre naplniť tento zoznam.";
resultList[0] = v;

// Konvertovať filter na malé písmená pre ľahšie porovnanie reťazcov neskôr.
filterType = filterType.ToLower();

// Ak bude schválený typ filtra je "test", vytvárať niektoré jednoduché údaje.
#región Filter, typ filtra = "testovanie"
Ak (filterType.Equals("skúška"))
return GenerateTestVendors();
#endregion

Ak (pravda)
{
pomocou (SPSite stránky = nové SPSite(SpVendorSiteName))
{
pomocou (SPWeb webové stránky =. OpenWeb())
{

v = null;

SPList currentList = web. Zoznamy[SpVendorListName];

// Iteráciou cez všetky položky v zozname dodávateľov.
foreach (SPItem vendorItem v currentList.Items)
{

reťazec lowerVendorType;

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

Ak (lowerVendorType.Equals(filterType))
{
resultList[vendorIndex ] = nové Vendor(vendorItem);
}
} // Iterácia cez všetkých dodávateľov v zozname


return TrimVendorArray(vendorIndex, resultList);
// návrat resultList;

} // pomocou spweb web = site.openweb()
} // pomocou spsite stránky = nové spsite("http://localhost/mizuho")

} // Ak je to pravda

return null;
}

súkromné Vendor[] TrimVendorArray(int newsize, Vendor[] originalVendorArray)
{
Vendor[] trimmedArray;

Ak (newsize == 0) newsize = 1;
trimmedArray = nové Vendor[newsize];

int currentCounter = 0;

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

return trimmedArray;

}
}

MACHY: Pripomienky k programu InfoPath ladenie

Program InfoPath formulár server chybové hlásenia sú zavádzajúce.

Počas vývoja programu InfoPath, By to po MACHU server a prístup k formuláru. Forme začne načítať a potom generovať zavádzajúce chybové hlásenie mi ukázal Podrobnosti v denníku udalostí systému windows. v skutočnosti, žiadna správa bola napísaná v denníku udalostí systému windows. Skôr, Správa bola odoslaná na diagnostický denník MOSS ascii. Môžete sledovať to cez centrálne služby správy.

Musíte byť rýchly na nohy. MOSS rád písať do súboru denníka, často a podrobn├╜. To môže byť upravený, ale predvolený protokol písanie správanie je "všetko čo najrýchlejšie".

MACHY: Aktualizovanie vlastného zoznamu

Existuje mnoho dobrých príkladov aktualizácie vlastných zoznamov pomocou súpravy SDK. Tu je ďalší.

Obchodné problém: Formulár programu InfoPath bol navrhnutý tak, že umožňuje používateľom zadať online nákup rekvizície. PO požiadaviek čísla by mala byť tradičné postupnosti založené celočíselné hodnoty a vypočítať automaticky.

Obchodné riešenia: Vytvorenie vlastného zoznamu MOSS obsahujúce dva stĺpce: "ControlField" a "ControlValue". Hodnota stĺpca obsahuje ďalšie číslo nákupnej žiadanky. Všimnite si, že generic "ovládanie" konvencia poskytuje pre budúce kontroly polia, ktoré môžu byť použité podľa potreby.

Technické riešenie: Vytvorenie webovej služby prístupné klientovi programu InfoPath. Webová služba vráti späť ďalšie číslo nákupnej žiadanky a aktualizuje hodnotu zoznamu.

Poučenie:

  • Pri pridávaní túto webovú službu ako zdroj údajov pre formulár programu InfoPath, Som zistil, že je potrebné previesť ju MDT a uložte ho do knižnice pripojenia údajov.
  • Som tiež zistil, že potrebné skriptovania cez domény cez centrálne služby správy // Správa aplikácií // formulár servera.
  • Prvýkrát forme sa snažil získať prístup k webovej službe, chvíľu to trvá a príležitostne, to by časový limit uplynul. Som si pohrávala s nastavením v konfigurácii servera formulár rozširovať nastavenia časového limitu a ktoré zrejme pomôcť.

Kód:

pomocou Systém;
pomocou System.Web;
pomocou System.Web.Services;
pomocou System.Web.Services.Protocols;
pomocou Microsoft.SharePoint;
pomocou System.Configuration;

[WebService(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
verejné trieda PoService : System.Web.Services.WebService
{
verejné PoService () {

//Odkomentovat nasledujúci riadok, ak používate navrhnuté súčasti
//InitializeComponent();
}

/// <Zhrnutie>
/// Získať ďalšie PO číslo zo zoznamu lokality sharepoint po číslo kontroly.
/// Prírastok číslo nákupnej objednávky v tomto zozname.
/// </Zhrnutie>
/// <Vráti></Vráti>
[WebMethod]
verejné reťazec GetNextPoNumber()
{
reťazec SpPoControlSiteName; // Názov aktuálnej stránky MOSS, ktorá je hostiteľom zoznamu PO.
reťazec SpPoControlListName; // Meno skutočného MOSS zoznam obsahujúci Po kontrole.

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

reťazec nextPoReqNumber = "xyzzy minového";

pomocou (SPSite stránky = nové SPSite(SpPoControlSiteName))
{
pomocou (SPWeb webové stránky =. OpenWeb())
{

SPList currentList = web. Zoznamy[SpPoControlListName];

foreach (SPItem controlItem v currentList.Items)
{

Ak (((reťazec)controlItem["ControlField"]).Equals("NextPoNumber"))
{
nextPoReqNumber = (reťazec)controlItem["ControlValue"];

int int_nextPoReqNumber;
int_nextPoReqNumber = Previesť.ToInt32(nextPoReqNumber);

int_nextPoReqNumber ;

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

} // Umiestnenie, čítanie a aktualizácia číslo nákupnej objednávky v zozname.


} // pomocou spweb web = site.openweb()
} // pomocou spsite stránky = nové spsite("http://localhost/mizuho")

return nextPoReqNumber;

}
}