MOSS / Server de formulare InfoPath (InfoPath 2007) drop-jos listă de performanţă

Categorie suplimentară: InfoPath

Rezumat: O InfoPath 2007 forma desfăşurate la un server de MOSS oferă un drop-jos listă de furnizori legat de o listă particularizată de MOSS. La selectarea un furnizor, reguli atribui valorile de câmp pentru un pumn de câmpuri de text, cum ar fi nume reprezentant de vânzări, Adresa, City, stat, zip şi telefon. Performanţa este oribil. Vom observa că performanţa se înrăutăţeşte (într-un mod non-liniar) pentru fiecare câmp suplimentar, vom actualiza acest fel. Adică, Dacă ne-am actualizare nume reprezentant de vânzări, este nevoie de [x] suma de timp. Dacă vom actualiza reprezentant de vânzări, address1, address2, City, stat, zip, este nevoie de 10 ori mai mult.

Soluție: Scrie un serviciu web (mostre de cod pot fi găsite aici) care este trecut numele un furnizor şi se întoarce înapoi detalii furnizor. Apoi, atribuiţi câmpurile în acest fel. Deşi acest lucru pare prea lent, nu a fost nici o diferenţă discernable în performanţă, când ne-am asociat 1 câmp comparativ cu 8 câmpuri. Ca un bonus, users a lua un cool "contactare server" Cylon efectul în timp ce ei aşteaptă pentru formularul pentru a invoca si consuma serviciul rezultate.

MOSS: Excepţie a avut loc. (Excepție de la HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

ACTUALIZARE: Am determinat niciodată cauza de această problemă şi it niciodată suprafaţă din nou.

Vom observa în timpul aplicării un site de dezvoltare că brusc, doi utilizatori sunt în imposibilitatea de a accesa o colecţie de site-ul. Aceste conturi pot autentifica la site-ul principal, dar atunci când încercarea de a accesa un anumit site de colectare, ei chiar a lua un ecran gol. Fără erori afişează, doar un gol pagină alb.

Am conectaţi-vă ca un admin site-ul de colectare şi încercaţi să adăugaţi unul dintre aceşti utilizatori ca un admin site-ul şi de această dată, la apăsarea "OK", ne-am lua acest mesaj:

Excepţie a avut loc. (Excepție de la HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

Am petrecut ceva timp cercetând acest lucru şi, din păcate,, nu au venit cu ceva util.. Au existat unele mesaje în Jurnalul de diagnosticare, dar a fost greu să coreleze-le exact cu această problemă.

În cele din urmă, putem şterge colecția de site-ul şi re-creat şi că rezolvat-o.

Dacă m-am gândit ce cauzat acest lucru în viitor, Voi actualiza acest post.

MOSS: Iterarea prin liste particularizate şi întoarcerea filtrate datelor în InfoPath

Scenariu de afaceri:

Oferă o metodă care permite utilizatorilor să introducă exacte cumpărare rechiziţiile rapid.

Problema de afaceri:

Clientul face afaceri cu vânzătorii câteva sute.

Vânzătorii sunt de tip"" specifice. Acest lucru înseamnă că un furnizor vinde echipamente informatice (ex. Dell) sau materiale de birou (ex. Capse).

Cum putem activa utilizatori finali care creează cumpărare rechiziţiile selectaţi un furnizor de valabil?

Soluţie de afaceri:

Diferenţia furnizori în sistem prin intermediul "tip".

Permite utilizatorilor să selectaţi tipul"" produsului şi apoi oferă un set filtrate de furnizori corespunzătoare.

Soluţii tehnice:

Un formular InfoPath a fost conceput, care permite utilizatorilor să intre online cumpăraţi rechiziţiile.

Două liste de selecţie InfoPath controla furnizor de selecţie. Prima, utilizatorul selectează un tip de"cumpărare". Aceasta limitează o a doua listă de selectare pentru a conţine numai vânzătorii care vând pentru acel tip de cumpărare. Acesta este un clasic cascading drop-down.

Vânzătorii sunt stocate într-o listă particularizată de MOSS cu coloane particularizate pentru furnizor atribute precum numele, Adresa şi mai ales de tip"".

Pună în aplicare un serviciu web pentru un client de InfoPath să consume care iterează prin listă particularizată furnizor, Revenind numai furnizori de potrivire un furnizat "tip".

Invoca serviciu web prin intermediul formularului InfoPath.

Lecţiile învăţate:

  • Prima, se pare că este necesar pentru a merge acest traseu. Aş fi preferat să faci filtrarea în întregime în InfoPath şi nu crea orice funcţionalitatea serviciu web aici. Cu toate acestea, forme server nu furnizează capacitatea de filtrare necesare. Putem pune o regulă pe un tip"" listă de selectare sub forma la fel de re-deschide interogarea de furnizor, dar nu putem ajunge să funcţioneze în mod corespunzător. Prin urmare, a fost necesar pentru implementarea de servicii web.
  • Acesta este un clasic "cascadă listă de selectare" problema în InfoPath formează server lume şi există multe exemple bune acolo care să explice cum să rezolve această.
  • O valoare necompletată pentru o coloană din listă furnizor nu se întoarce un şir gol, atunci când se face referire ca aceasta: initItem["Furnizor de nume"]. În schimb, Returnează un null.

Unele alte note:

  • Mă întorc o matrice[] de furnizori pentru că am avut unele dificultăţi revenind un ArrayList. InfoPath a fost plângându-se despre el şi nu am avut timp sau înclinaţia de a lupta peste ea. Acest lucru, desigur, pune o limită artificiale pe numărul total de furnizori. Ea, de asemenea, obligaţi să pună în aplicare un trim() metoda matricei pentru ca urasc ideea de a reveni înapoi 100 de furnizori de nul. InfoPath nu-i pasă, dar ea nagged la mine. (Din nou, Acest lucru a fost mai uşor decât lupta InfoPath peste ArrayLists).
  • Am implementat o GetSpecificVendorByName() funcţie, precum şi, care poate fi instructiv.

Codul:

folosind Sistem;
folosind System.Web;
folosind System.Web.Services;
folosind System.Web.Services.Protocols;
folosind Microsoft.SharePoint;
folosind System.Configuration;

/// <Rezumat>
///
Furnizor de servicii: Oferă furnizor legate de servicii care astăzi sunt consumate de un formular infopath cu un client.
///
/// Istorie:
/// ——–
/// 07/24/07: Iniţială de codificare, Paul J. Gavin a Conchango.
///
/// </Rezumat>
[WebService(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
publice Clasa VendorService : System.Web.Services.WebService
{

/// <Rezumat>
/// Reprezintă un furnizor dintr-o listă sharepoint personalizat de MSUSA.
/// </Rezumat>
publice Clasa Furnizor
{
publice Furnizor() { }

publice Furnizor(SPItem initItem)
{
Dacă (! (initItem["Furnizor de nume"] == nul)) VendorName = initItem["Furnizor de nume"].ToString();
Dacă (! (initItem["Adresa 1"] == nul)) VendorAddress1 = initItem["Adresa 1"].ToString();
Dacă (! (initItem["Adresa 2"] == nul)) VendorAddress2 = initItem["Adresa 2"].ToString();
Dacă (! (initItem["City"] == nul)) VendorCity = initItem["City"].ToString();
Dacă (! (initItem["VendorPhone"] == nul)) VendorPhone = initItem["VendorPhone"].ToString();
Dacă (! (initItem["PurchaseType"] == nul)) VendorType = initItem["PurchaseType"].ToString();
Dacă (! (initItem["Stat"] == nul)) VendorState = initItem["Stat"].ToString();
Dacă (! (initItem["Zip"] == nul)) VendorZip = initItem["Zip"].ToString();
Dacă (!(initItem["Fax"] == nul)) VendorFax = initItem["Fax"].ToString();
Dacă (!(initItem["SalesRepName"] == nul)) VendorSalesRepName = initItem["SalesRepName"].ToString();

VendorItemId = initItem.ID; // ID unic menţinută prin intermediul MOSS.
}

publice int VendorItemId;
publice şir VendorName;
publice şir VendorAddress1;
publice şir VendorAddress2;
publice şir VendorCity;
publice şir VendorState;
publice şir VendorZip;
publice şir VendorPhone;
publice şir VendorType;
publice şir VendorSalesRepName;
publice şir VendorFax;
}

publice VendorService () {

//Decomentaţi următoarea linie dacă utilizaţi componentele proiectate
//InitializeComponent();
}

privat Furnizor[] GenerateTestVendors()
{
Furnizor[] resultList;
resultList = noi Furnizor[100];

Furnizor v;
v = noi Furnizor();
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 = noi Furnizor();

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 = noi Furnizor();
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;

reveni resultList;

}

[WebMethod]
publice Furnizor GetSpecificVendorById(int vendorId)
{
şir SpVendorSiteName; // Numele site-ului MOSS reale care găzduieşte listă particularizată de furnizor.
şir SpVendorListName; // Numele din lista de MOSS actuale conținând furnizori.

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

folosind (SPSite site-ul = noi SPSite(SpVendorSiteName))
{

folosind (SPWeb web = site-ul. OpenWeb())
{

SPList.Update() currentList = web. Liste[SpVendorListName];

SPItem specificItem = currentList.Items[vendorId];

reveni noi Furnizor(specificItem);

} // folosind spweb web = site.openweb()
} // folosind site-ul spsite = nou spsite("http://localhost/mizuho")

}

[WebMethod]
// Presupune că numele de furnizor este unic, dintr-o perspectivă de afaceri
publice Furnizor GetSpecificVendorByVendorName(şir fi)
{
şir SpVendorSiteName; // Numele site-ului MOSS reale care găzduieşte listă particularizată de furnizor.
şir SpVendorListName; // Numele din lista de MOSS actuale conținând furnizori.

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

folosind (SPSite site-ul = noi SPSite(SpVendorSiteName))
{
folosind (SPWeb web = site-ul. OpenWeb())
{

SPList.Update() currentList = web. Liste[SpVendorListName];

foreach (SPItem vendorItem în currentList.Items)
{
Dacă (vendorItem["Furnizor de nume"] == nul) «««;

Dacă (vendorItem["Furnizor de nume"].ToString().Este egal cu(fi))
reveni noi Furnizor(vendorItem);
}

Furnizor v = noi Furnizor();
v.VendorPhone = "nu a fost găsit: " + fi;

reveni v;

reveni nul;

} // folosind spweb web = site.openweb()
} // folosind site-ul spsite = nou spsite("http://localhost/mizuho")

} // metoda

[WebMethod]
publice Furnizor[] GetVendorsOfType (şir filterType)
{

şir SpVendorSiteName; // Numele site-ului MOSS reale care găzduieşte t
El furnizor listă particularizată.
şir SpVendorListName; // Numele din lista de MOSS actuale conținând furnizori.

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

Furnizor[] resultList;
int vendorIndex = 0;
resultList = noi Furnizor[1000];

// Inițializarea listei cu un mesaj implicit prietenos.
Furnizor v = noi Furnizor();
v.VendorName = "Selectaţi un tip de furnizor pentru a popula această listă.";
resultList[0] = v;

// Converti filtrul la caz mai mici pentru comparaţie şir mai uşor mai târziu.
filterType = filterType.ToLower();

// În cazul în care tipul de filtru trecut este "test", genera unele date simple.
#regiune Filtru tip = "test"
Dacă (filterType. egal("test"))
reveni GenerateTestVendors();
#endregion

Dacă (adevărat)
{
folosind (SPSite site-ul = noi SPSite(SpVendorSiteName))
{
folosind (SPWeb web = site-ul. OpenWeb())
{

v = nul;

SPList.Update() currentList = web. Liste[SpVendorListName];

// Repeta prin toate elementele din lista de furnizori.
foreach (SPItem vendorItem în currentList.Items)
{

şir lowerVendorType;

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

Dacă (Egal lowerVendorType.(filterType))
{
resultList[vendorIndex ] = noi Furnizor(vendorItem);
}
} // iterarea prin toate furnizori în lista


reveni TrimVendorArray(vendorIndex, resultList);
// reveni resultList;

} // folosind spweb web = site.openweb()
} // folosind site-ul spsite = nou spsite("http://localhost/mizuho")

} // dacă este adevărat

reveni nul;
}

privat Furnizor[] TrimVendorArray(int newsize, Furnizor[] originalVendorArray)
{
Furnizor[] trimmedArray;

Dacă (newsize == 0) newsize = 1;
trimmedArray = noi Furnizor[newsize];

int currentCounter = 0;

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

reveni trimmedArray;

}
}

MOSS: Observaţii pe InfoPath depanare

Formular InfoPath server de mesaje de eroare sunt înşelătoare.

În timpul dezvoltării unui formular InfoPath, Aş post-l la server de muşchi şi de a accesa formularul de. Forma ar începe să se încarce şi apoi generează un mesaj de eroare înşelătoare pointing eu la Jurnalul de evenimente windows pentru detalii. de fapt, nici un mesaj a fost scris în Jurnalul de evenimente windows. Mai degrabă, mesajul a fost trimis la Jurnalul de diagnosticare MOSS ascii. Care puteţi urmări în jos prin intermediul serviciilor centrale administraţiei.

Trebuie sa fii rapid pe picioare. MOSS îi place să scrie la fişier jurnal, frecvent şi verbosely. Acest lucru poate fi tuns dar jurnal implicit scris comportamentul este "totul cât mai curând posibil".

MOSS: Actualizarea o listă particularizată

Există multe exemple bune liste particularizate prin intermediul SDK-ul de actualizare. Aici este încă un alt.

Problema de afaceri: Formular InfoPath a fost conceput, care permite utilizatorilor să intre online cumpăraţi rechiziţiile. PO aprovizionare numere ar trebui să fie secvenţă tradiţionale bazate pe valori şi calculează automat.

Soluţie de afaceri: Crea o listă personalizată de muşchi care conţine două coloane: "ControlField" şi "ControlValue". Coloana valoare conţine următorul număr de aprovizionare cumpărare. Reţineţi că generic "control" Convenţia prevede controlul viitoare câmpuri care pot fi utilizate după cum este necesar.

Soluţii tehnice: Creaţi un serviciu web accesate de catre client de InfoPath. Serviciul web se întoarce înapoi la următorul număr de aprovizionare de cumpărare şi actualizează valoarea de listă.

Lecţiile învăţate:

  • Când adăugaţi acest serviciu web ca o sursă de date formular InfoPath, L-am găsit necesar să convertizor it la spre un CZU şi stocaţi-o într-o bibliotecă de conexiuni de date.
  • Am găsit-o, de asemenea, necesare pentru a permite transdomeniu scripting prin intermediul serviciilor centrale administraţiei // management aplicație // formular de configurare a serverului.
  • Prima data încercat forma pentru a accesa serviciul web, este nevoie de o perioada de timp şi cu ocazia, ar fi timpul. Am gadila cu setările în formă de server de configurare pentru a extinde setările de expirare şi care părea să ajute.

Codul:

folosind Sistem;
folosind System.Web;
folosind System.Web.Services;
folosind System.Web.Services.Protocols;
folosind Microsoft.SharePoint;
folosind System.Configuration;

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

//Decomentaţi următoarea linie dacă utilizaţi componentele proiectate
//InitializeComponent();
}

/// <Rezumat>
/// Obţine următorul număr PO la po numărul de control listă sharepoint.
/// Incrementului PO numărul în listă.
/// </Rezumat>
/// <întoarce></întoarce>
[WebMethod]
publice şir GetNextPoNumber()
{
şir SpPoControlSiteName; // Numele site-ului MOSS reale care găzduieşte lista de PO Control.
şir SpPoControlListName; // Numele din lista de MOSS reale care conţine controlul Po.

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

şir nextPoReqNumber = "xyzzy";

folosind (SPSite site-ul = noi SPSite(SpPoControlSiteName))
{
folosind (SPWeb web = site-ul. OpenWeb())
{

SPList.Update() currentList = web. Liste[SpPoControlListName];

foreach (SPItem controlItem în currentList.Items)
{

Dacă (((şir)controlItem["ControlField"]).Este egal cu("NextPoNumber"))
{
nextPoReqNumber = (şir)controlItem["ControlValue"];

int int_nextPoReqNumber;
int_nextPoReqNumber = Conversia.ToInt32(nextPoReqNumber);

int_nextPoReqNumber ;

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

} // Localizarea, lectură şi actualizarea PO numărul din lista.


} // folosind spweb web = site.openweb()
} // folosind site-ul spsite = nou spsite("http://localhost/mizuho")

reveni nextPoReqNumber;

}
}