MECH / Aplikace InfoPath Forms Server (Aplikace InfoPath 2007) Rozevírací seznam výkon

Další kategorie: Aplikace InfoPath

Shrnutí: Aplikace InfoPath 2007 formuláře na MOSS server nabízí rozevírací seznam dodavatelů k vlastní seznam MOSS. Při výběru dodavatele, pravidla pole hodnoty přiřadit několik textových polí, například jméno obchodního zástupce, adresa, město, stát, zip a telefon. Výkon je hrozné. Všimněte si, že jsme horší výkon (v non-lineárně) pro každé další pole budeme aktualizovat tímto způsobem. Tj, kdybychom prostě aktualizovat název obchodního zástupce, to trvá [x] množství času. Pokud budeme aktualizovat obchodní zástupce, Address1, adresa2, město, stát, zip, to trvá 10 krát delší.

Řešení: Psát webové služby (Ukázkový kód lze nalézt Tady) To je předán název dodavatele a vrátí zpět detaily dodavatele. Pak, přiřadit pole tak. Ačkoliv se to zdá příliš pomalu, neexistoval viditelnému rozdíl ve výkonu, když jsme přiřadili 1 pole versus 8 pole. Jako bonus, Uživatelé si cool "kontaktování serveru" Cylon účinek, zatímco oni čekají na formuláři pro vyvolání a konzumovat služby výsledky.

MECH: Došlo k výjimce.. (Výjimka z HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

AKTUALIZOVAT: Nikdy jsme znovu určit příčinu tohoto problému a to nikdy povrchu.

Jsme si tak náhle během zavádění vývoj webu, dva uživatelé nebudou moci získat přístup kolekci webů. Tyto účty lze ověřit na hlavní stránku, Ale při pokusu o přístup k určité webů kolekce, dostanou jen prázdná obrazovka. Žádné chyby, jen bílý prázdná stránka.

Jsme se přihlásit jako správce kolekce webů a pokusíte se přidat jeden z těchto uživatelů jako správce webu a tentokrát, po stisknutí "OK", dostaneme zprávu:

Došlo k výjimce.. (Výjimka z HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

Jsme strávili nějaký čas to zkoumá a bohužel, Nechtěl přijít s něčím užitečné. Tam byly nějaké zprávy v protokolu diagnostiky, Ale bylo to těžké přesně sladit je s tímto problémem.

Na konci, jsme odstraněním kolekce webů a znovu a to, že to vyřešili.

Pokud jsem přijít na to, co způsobilo to v budoucnosti, Budu aktualizovat tento post.

MECH: Iterace vlastní seznamy a vrácení filtrovaná data do aplikace InfoPath

Obchodní scénář:

Zadejte metodu, která umožňuje uživatelům rychle zadat přesné nákupních.

Obchodní problém:

Klient obchoduje s několika stovek dodavatelů.

Dodavatelé jsou "typ" konkrétní. To znamená, že dodavatel prodává počítačové vybavení (např.. Společnost Dell) nebo kancelářské potřeby (např.. Svorky).

Jak jsme mohli koncoví uživatelé, kteří vytvořit nákupní žádanky vybrat platný dodavatele?

Obchodní řešení:

Rozlišovat dodavatele v systému přes "type".

Umožnit uživatelům vybrat typ"" výrobku a pak poskytují filtrovanou sadu vhodných dodavatelů.

Technické řešení:

Formulář aplikace InfoPath je navrženo, že umožňuje uživatelům zadávat on-line nákupní žádanky.

Dva seznamy výběru aplikace InfoPath kontrolovat výběr dodavatele. První, uživatel vybere "typ nákupu". To omezuje druhý výběrový seznam obsahovat pouze prodejců, kteří prodávají za tento typ nákupu. To je klasický CSS drop-down.

Dodavatelé jsou uloženy v seznamu vlastní MOSS s vlastní sloupce pro dodavatele atributy jako například jméno, adresa a zejména "typ".

Implementace webové služby pro klienta InfoPath konzumovat, který projde seznam vlastních dodavatelů, vrací pouze dodavatele odpovídající zadané "typ".

Vyvolání webové služby prostřednictvím formuláře aplikace InfoPath.

Poučení:

  • První, Zdá se, že je třeba jít touto cestou. Já bych si raději udělat filtrování výhradně v rámci aplikace InfoPath a nelze vytvořit žádné funkce webové služby zde. Avšak, formy server neposkytuje požadované funkce pro filtrování. Můžeme dát pravidlo na typ"" výběrový seznam v podobě jakési znovu otevřít dotaz dodavatele, ale nemůžeme si to fungovat správně. Proto, bylo třeba zavést webovou službu.
  • To je klasický "kaskádové výběrový seznam" problém v aplikace InfoPath formuláře serveru svět a existuje mnoho dobrých příkladů, které vysvětlují, jak na to.
  • Prázdná hodnota pro sloupec v seznamu dodavatelů se nevrací prázdný řetězec při odkazování na takhle: initItem["Název dodavatele"]. Místo toho, Vrátí hodnotu null.

Některé další poznámky:

  • Jsem vrátit matici[] dodavatelů, protože jsem měl nějaké potíže vracejí ArrayList. Aplikace InfoPath stěžoval a neměla jsem čas ani chuť to bojem. Toto, Samozřejmě, Vloží umělá omezení celkového počtu dodavatelů. To také mě přimělo k provedení čalounění() metodu na poli, protože nesnáším myšlenku na návrat zpět 100 null dodavatelů. Aplikace InfoPath se nestará, naléhala na mě, ale. (Znovu, to bylo jednodušší, než bojovat InfoPath nad ArrayLists).
  • Jsem implementoval GetSpecificVendorByName() funkce také, což může být poučné.

Kód:

použití Systém;
použití System.Web;
použití System.Web.Services;
použití System.Web.Services.Protocols;
použití Microsoft.SharePoint;
použití System.Configuration;

/// <Shrnutí>
///
Služba dodavatele: Poskytuje dodavatele související služby, které dnes spotřebuje klientské formuláře aplikace infopath.
///
/// Historie:
/// ——–
/// 07/24/07: Výchozí kódování, Paul J. Gavin Conchango.
///
/// </Shrnutí>
[WebService(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
veřejné Třída VendorService : System.Web.Services.WebService
{

/// <Shrnutí>
/// Představuje dodavatele ze seznamu vlastní sharepoint udržovaný MSUSA.
/// </Shrnutí>
veřejné Třída Dodavatel
{
veřejné Dodavatel() { }

veřejné Dodavatel(SPItem initItem)
{
Pokud (! (initItem["Název dodavatele"] == null)) Poznámky: = initItem["Název dodavatele"].ToString();
Pokud (! (initItem["Adresa 1"] == null)) VendorAddress1 = initItem["Adresa 1"].ToString();
Pokud (! (initItem["Adresa 2"] == null)) VendorAddress2 = initItem["Adresa 2"].ToString();
Pokud (! (initItem["Město"] == null)) VendorCity = initItem["Město"].ToString();
Pokud (! (initItem["VendorPhone"] == null)) VendorPhone = initItem["VendorPhone"].ToString();
Pokud (! (initItem["PurchaseType"] == null)) VendorType = initItem["PurchaseType"].ToString();
Pokud (! (initItem["Stát"] == null)) VendorState = initItem["Stát"].ToString();
Pokud (! (initItem["Zip"] == null)) VendorZip = initItem["Zip"].ToString();
Pokud (!(initItem["Fax"] == null)) VendorFax = initItem["Fax"].ToString();
Pokud (!(initItem["SalesRepName"] == null)) VendorSalesRepName = initItem["SalesRepName"].ToString();

VendorItemId = initItem.ID; // Jedinečné ID maintained přes MOSS.
}

veřejné int VendorItemId;
veřejné řetězec Poznámky:;
veřejné řetězec VendorAddress1;
veřejné řetězec VendorAddress2;
veřejné řetězec VendorCity;
veřejné řetězec VendorState;
veřejné řetězec VendorZip;
veřejné řetězec VendorPhone;
veřejné řetězec VendorType;
veřejné řetězec VendorSalesRepName;
veřejné řetězec VendorFax;
}

veřejné VendorService () {

//Odkomentujte následující řádek, pokud používáte určené součásti
//InitializeComponent();
}

soukromé Dodavatel[] GenerateTestVendors()
{
Dodavatel[] resultList;
resultList = nové Dodavatel[100];

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

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é Dodavatel();
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;

návrat resultList;

}

[WebMethod]
veřejné Dodavatel GetSpecificVendorById(int vendorId)
{
řetězec SpVendorSiteName; // Název skutečné webu MOSS, který hostí vlastní seznam dodavatelů.
řetězec SpVendorListName; // Název skutečné MOSS seznam obsahující dodavatelů.

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

použití (SPSite místo = nové SPSite(SpVendorSiteName))
{

použití (SPWeb webové stránky =. OpenWeb())
{

SPList.Update() currentList = www. Seznamy[SpVendorListName];

SPItem specificItem = currentList.Items[vendorId];

návrat nové Dodavatel(specificItem);

} // použití webu spweb = site.openweb()
} // pomocí webů spsite = nové spsite("http://localhost/mizuho")

}

[WebMethod]
// Předpokládá, že název dodavatele je jedinečný, z obchodního hlediska
veřejné Dodavatel GetSpecificVendorByVendorName(řetězec být)
{
řetězec SpVendorSiteName; // Název skutečné webu MOSS, který hostí vlastní seznam dodavatelů.
řetězec SpVendorListName; // Název skutečné MOSS seznam obsahující dodavatelů.

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

použití (SPSite místo = nové SPSite(SpVendorSiteName))
{
použití (SPWeb webové stránky =. OpenWeb())
{

SPList.Update() currentList = www. Seznamy[SpVendorListName];

foreach (SPItem vendorItem v currentList.Items)
{
Pokud (vendorItem["Název dodavatele"] == null) «««;

Pokud (vendorItem["Název dodavatele"].ToString().Rovná se(být))
návrat nové Dodavatel(vendorItem);
}

Dodavatel v = nové Dodavatel();
v.VendorPhone = "nebyl nalezen.: " + být;

návrat v;

návrat null;

} // použití webu spweb = site.openweb()
} // pomocí webů spsite = nové spsite("http://localhost/mizuho")

} // Metoda

[WebMethod]
veřejné Dodavatel[] GetVendorsOfType (řetězec filterType)
{

řetězec SpVendorSiteName; // Název skutečné MOSS webu, který hostuje t
On vlastní seznam dodavatelů.
řetězec SpVendorListName; // Název skutečné MOSS seznam obsahující dodavatelů.

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

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

// Inicializace seznamu s výchozí přátelský vzkaz.
Dodavatel v = nové Dodavatel();
v.VendorName = "Vyberte typ dodavatele k naplnění tohoto seznamu.";
resultList[0] = v;

// Převést na malá písmena pro snazší porovnání řetězců později filtr.
filterType = filterType.ToLower();

// Je-li typ filtru je "test", některé jednoduché údaje.
#region Typ filtru = "test"
Pokud (filterType. rovná se("test"))
návrat GenerateTestVendors();
#endregion

Pokud (pravda)
{
použití (SPSite místo = nové SPSite(SpVendorSiteName))
{
použití (SPWeb webové stránky =. OpenWeb())
{

v = null;

SPList.Update() currentList = www. Seznamy[SpVendorListName];

// Iterovat všechny položky v seznamu dodavatelů.
foreach (SPItem vendorItem v currentList.Items)
{

řetězec lowerVendorType;

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

Pokud (rovná se lowerVendorType.(filterType))
{
resultList[vendorIndex ] = nové Dodavatel(vendorItem);
}
} // Iterace přes všechny dodavatele v seznamu


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

} // použití webu spweb = site.openweb()
} // pomocí webů spsite = nové spsite("http://localhost/mizuho")

} // je-li to pravda,

návrat null;
}

soukromé Dodavatel[] TrimVendorArray(int newSize, Dodavatel[] originalVendorArray)
{
Dodavatel[] trimmedArray;

Pokud (newSize == 0) newSize = 1;
trimmedArray = nové Dodavatel[newSize];

int currentCounter = 0;

pro (currentCounter = 0; currentCounter < newSize; currentCounter )
{
trimmedArray[currentCounter] = originalVendorArray[currentCounter];
}

návrat trimmedArray;

}
}

MECH: Pozorování o ladění aplikace InfoPath

Aplikace InfoPath form server chybové zprávy jsou zavádějící.

Během vývoje formuláře aplikace InfoPath, Já bych ji vystavit na serveru MOSS a přistupovat k formuláři. Formulář by začít nahrát a pak vygenerovat zavádějící chybová zpráva ukazuje mě na podrobnosti v protokolu událostí systému windows. Vlastně, žádná zpráva byla zapsána do protokolu událostí systému windows. Spíše, zpráva byla odeslána do diagnostického protokolu MOSS ascii. To lze vystopovat přes centrální služby správy.

Potřebujete se rychle na nohy. MECH se rád zapisovat do souboru protokolu, často a podrobná. To může být oříznuta, ale výchozí protokol psaní chování je "vše co nejrychleji".

MECH: Aktualizace vlastního seznamu

Existuje mnoho dobrých příkladů aktualizace vlastních seznamů pomocí sady SDK. Tady je ještě další.

Obchodní problém: Formulář aplikace InfoPath je navrženo, že umožňuje uživatelům zadávat on-line nákupní žádanky. PO požadavku čísla by měla být tradiční sekvence založené celočíselné hodnoty a vypočítá automaticky.

Obchodní řešení: Vytvořit vlastní MOSS seznam obsahuje dva sloupce: "ControlField" a "ControlValue". Hodnota sloupec obsahuje další číslo nákupního požadavku. Všimněte si, že obecný "kontrolovat" pojmenování poskytuje pro budoucí kontrolní pole, které mohou být použity podle potřeby.

Technické řešení: Vytvořit webovou službu přístup klienta aplikace InfoPath. Webová služba vrátí zpět další číslo požadavku nákupní a aktualizuje hodnotu seznamu.

Poučení:

  • Při přidání této webové služby jako zdroj dat do formuláře aplikace InfoPath, Jsem zjistil, že je nutné jej převést udc a uložit jej do knihovny datových připojení.
  • Jsem také zjistil, že je nutné povolit skriptování mezi doménami prostřednictvím ústředních útvarů správy // Správa aplikací // formulář konfigurace serveru.
  • Poprvé podobě se pokusil o přístup webové službě, to chvíli trvá a příležitostně, To by časový limit. Jsem si pohrávala s nastavením v konfiguraci formuláře serveru rozbalte nastavení časového limitu a zdálo se, že pomoci.

Kód:

použití Systém;
použití System.Web;
použití System.Web.Services;
použití System.Web.Services.Protocols;
použití Microsoft.SharePoint;
použití System.Configuration;

[WebService(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
veřejné Třída PoService : System.Web.Services.WebService
{
veřejné PoService () {

//Odkomentujte následující řádek, pokud používáte určené součásti
//InitializeComponent();
}

/// <Shrnutí>
/// Získat další číslo objednávky ze seznamu serveru sharepoint po číslo kontroly.
/// Zvýšit číslo objednávky v tomto seznamu.
/// </Shrnutí>
/// <Vrátí></Vrátí>
[WebMethod]
veřejné řetězec GetNextPoNumber()
{
řetězec SpPoControlSiteName; // Název skutečné MOSS webu, který je hostitelem seznamu PO.
řetězec SpPoControlListName; // Název seznamu skutečných MOSS, obsahující ovládací prvek Po.

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

řetězec nextPoReqNumber = "xyzzy";

použití (SPSite místo = nové SPSite(SpPoControlSiteName))
{
použití (SPWeb webové stránky =. OpenWeb())
{

SPList.Update() currentList = www. Seznamy[SpPoControlListName];

foreach (SPItem controlItem v currentList.Items)
{

Pokud (((řetězec)controlItem["ControlField"]).Rovná se("NextPoNumber"))
{
nextPoReqNumber = (řetězec)controlItem["ControlValue"];

int int_nextPoReqNumber;
int_nextPoReqNumber = Převést.ToInt32(nextPoReqNumber);

int_nextPoReqNumber ;

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

} // Hledání, čtení a aktualizace číslo objednávky v seznamu.


} // použití webu spweb = site.openweb()
} // pomocí webů spsite = nové spsite("http://localhost/mizuho")

návrat nextPoReqNumber;

}
}