MOSS / InfoPath Forms Server (InfoPath 2007) Padajući popis performanse

Dodatna kategorija: InfoPath

Rezime: InfoPath 2007 formirati raspoređeni na poslužitelju Moss pruža padajući popis distributera vezanog za prilagođeni popis Moss. Nakon odabira dobavljača, pravila dodijeliti vrijednosti polja na nekoliko tekstualnih polja, kao što su prodajni predst ime, adresa, grad, država, zip i telefon. Predstava je strašno. Primjećujemo da se pogoršava performanse (u ne-linearno) za svaki dodatni području smo ažurirati na ovaj način. Odnosno,, ako mi samo ažurirati naziv prodajnog predstavnika, je potrebno [x] iznos od vrijeme. Ako ažurirati prodajnog predstavnika, address1, Adresa2, grad, država, zip, je potrebno 10 puta dulje.

Otopina: Napišite uslugu web (uzorak kod možete naći ovdje) koji je donesen u ime prodavatelja i vraća natrag dobavljača pojedinosti. Tada, dodijeliti polja na ovaj način. Iako je ovo previše izgleda sporo, nije bilo razaznati razlika u performansama kada dodjeljuje 1 polje u odnosu na 8 Polja. Kao bonus, users get a cool "contacting the server" Cylonski učinak, dok oni čekaju obliku pozvati i konzumirati usluge rezultate.

MOSS: Iznimka se dogodila. (Iznimka od HRESULT: 0x80020009 (DISP_E_EXCEPTION))

UPDATE: Mi nikada ne određuje uzrok ovog problema i nikada na površinu opet.

Uočavamo tijekom provedbe razvojne site koji iznenada, Dva su korisnici u mogućnosti pristupiti zbirke web-mjesta. Ti računi mogu ovjeriti na glavnu stranicu, ali kada pokušava pristupiti određenu zbirke web-mjesta, oni samo dobiti prazan ekran. Nema pogreške prikazane, samo bijela prazna stranica.

Mi se prijaviti kao administrator zbirke web-mjesta i pokušati dodati jedan od onih korisnika kao web-admin i ovaj put, upon pressing "OK", smo dobili ovu poruku:

Iznimka se dogodila. (Iznimka od HRESULT: 0x80020009 (DISP_E_EXCEPTION))

Proveli smo neko vrijeme istraživanja to i nažalost, nije došao gore sa ništa korisno. Postojale su neke poruke u log dijagnostičke, ali to je teško točno ih povezati s ovom problematikom.

Na kraju, smo brisanje zbirke web-mjesta i ponovno stvorio i to je riješeno.

Ako sam shvatiti što je uzrokovalo to u budućnosti, Ja ću ažurirati ovaj post.

MOSS: Ponavljanje kroz prilagođene popise i povratka filtriranih podataka u programu InfoPath

Poslovni Scenarij:

Navedite metodu koja omogućuje korisnicima da unesete točne kupnju obespravljivanja brzo.

Poslovni problem:

Klijent posluje s više stotina distributera.

Vendors are "type" specifičan. To znači da prodavatelj prodaje računalnu opremu (e.g. Šumovita dolina) ili uredski materijal (e.g. Staples).

Kako omogućiti krajnjim korisnicima koji stvaraju kupnju obespravljivanja odaberite valjanu dobavljaču?

Poslovno rješenje:

Differentiate vendors in the system via "type".

Enable users to select the "type" proizvoda, a zatim dati filtrirani skup odgovarajućih dobavljačima.

Tehničko rješenje:

InfoPath obrazac je osmišljen koji omogućava korisnicima da unesete online kupnju obespravljivanja.

Dva InfoPath popise kontrole dobavljača odabir. Prvi, 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.

Dobavljači su pohranjene na popisu Moss običaj s prilagođenim stupaca za dobavljača atributa kao što su ime, address and especially "type".

Provesti web servis za jedan InfoPath klijentom konzumirati da ponovi kroz prilagođeni dobavljaču popis, returning only vendors matching a supplied "type".

Pozvati na uslugu putem web obrasca InfoPath.

Lekcije naučene:

  • Prvi, čini se da je potrebno ići ovaj put. Ja bi radije učiniti filtriranje u cijelosti unutar programa InfoPath, a ne stvaraju nikakvu funkcionalnost web usluga ovdje. Međutim, oblici poslužitelj ne dati tražene mogućnost filtriranja. We can put a rule onto a the "type" izborna lista u obliku vrsta ponovno otvoriti prodavatelja upit, ali ne možemo dobiti Internet to funkcionirati ispravno. Stoga, bilo je potrebno provesti web servis.
  • This is a classic "cascading selection list" problem u server InfoPath obrazaca svijetu i postoji mnogo dobrih primjera vani da objašnjavaju kako riješiti ovaj.
  • Prazna vrijednost za stupac u popisu prodavatelja ne vrati prazan niz, kada spominje ovako: initItem["Vendor Name"]. Umjesto toga, se vraća null.

Neke druge napomene:

  • Vraćam se niz[] od prodavača jer sam imao neke poteškoće vraća se ArrayList. InfoPath je gunđanje o tome i nisam imao vremena ili volje za borbu protiv preko njega. To, naravno, stavlja umjetno ograničenje ukupnog broja dobavljača. Također mi je prisiljen provoditi trim() method on the array because I hate the idea of returning back 100’s of null vendors. InfoPath ne mari, ali nagged na mene. (Opet, to je lakše nego tijekom borbe InfoPath ArrayLists).
  • Sam provodi GetSpecificVendorByName() funkcija, kao i, što može biti poučna.

Kod:

pomoću Sustav;
pomoću System.Web;
pomoću System.Web.Services;
pomoću System.Web.Services.Protocols;
pomoću Microsoft.SharePoint;
pomoću System.Configuration;

/// <rezime>
///
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.
///
/// </rezime>
[WebService(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
javni klasa VendorService : System.Web.Services.WebService
{

/// <rezime>
/// Represents a vendor from a custom sharepoint list maintained by MSUSA.
/// </rezime>
javni klasa Prodavač
{
javni Prodavač() { }

javni Prodavač(SPItem initItem)
{
ako (! (initItem["Vendor Name"] == nula)) VendorName = initItem["Vendor Name"].ToString();
ako (! (initItem["Address 1"] == nula)) VendorAddress1 = initItem["Address 1"].ToString();
ako (! (initItem["Address 2"] == nula)) VendorAddress2 = initItem["Address 2"].ToString();
ako (! (initItem["City"] == nula)) VendorCity = initItem["City"].ToString();
ako (! (initItem["VendorPhone"] == nula)) VendorPhone = initItem["VendorPhone"].ToString();
ako (! (initItem["PurchaseType"] == nula)) VendorType = initItem["PurchaseType"].ToString();
ako (! (initItem["State"] == nula)) VendorState = initItem["State"].ToString();
ako (! (initItem["Zip"] == nula)) VendorZip = initItem["Zip"].ToString();
ako (!(initItem["Fax"] == nula)) VendorFax = initItem["Fax"].ToString();
ako (!(initItem["SalesRepName"] == nula)) VendorSalesRepName = initItem["SalesRepName"].ToString();

VendorItemId = initItem.ID; // Unique ID maintained via MOSS.
}

javni int VendorItemId;
javni niz VendorName;
javni niz VendorAddress1;
javni niz VendorAddress2;
javni niz VendorCity;
javni niz VendorState;
javni niz VendorZip;
javni niz VendorPhone;
javni niz VendorType;
javni niz VendorSalesRepName;
javni niz VendorFax;
}

javni VendorService () {

//Uncomment the following line if using designed components
//InitializeComponent();
}

privatni Prodavač[] GenerateTestVendors()
{
Prodavač[] resultList;
resultList = novi Prodavač[100];

Prodavač v;
v = novi Prodavač();
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 = novi Prodavač();

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 = novi Prodavač();
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;

povratak resultList;

}

[WebMethod]
javni Prodavač GetSpecificVendorById(int vendorId)
{
niz SpVendorSiteName; // Name of the actual MOSS site that hosts the vendor custom list.
niz SpVendorListName; // Name of the actual MOSS list containing vendors.

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

pomoću (SPSite site = novi SPSite(SpVendorSiteName))
{

pomoću (SPWeb web = site.OpenWeb())
{

SPList currentList = web.Lists[SpVendorListName];

SPItem specificItem = currentList.Items[vendorId];

povratak novi Prodavač(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
javni Prodavač GetSpecificVendorByVendorName(niz VendorName)
{
niz SpVendorSiteName; // Name of the actual MOSS site that hosts the vendor custom list.
niz SpVendorListName; // Name of the actual MOSS list containing vendors.

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

pomoću (SPSite site = novi SPSite(SpVendorSiteName))
{
pomoću (SPWeb web = site.OpenWeb())
{

SPList currentList = web.Lists[SpVendorListName];

foreach (SPItem vendorItem u currentList.Items)
{
ako (vendorItem["Vendor Name"] == nula) nastaviti;

ako (vendorItem["Vendor Name"].ToString().Jednako(VendorName))
povratak novi Prodavač(vendorItem);
}

Prodavač v = novi Prodavač();
v.VendorPhone = "not found: " + VendorName;

povratak v;

povratak nula;

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

} // način

[WebMethod]
javni Prodavač[] GetVendorsOfType (niz filterType)
{

niz SpVendorSiteName; // Name of the actual MOSS site that hosts t
he vendor custom list.
niz SpVendorListName; // Name of the actual MOSS list containing vendors.

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

Prodavač[] resultList;
int vendorIndex = 0;
resultList = novi Prodavač[1000];

// Initialize the list with a default friendly message.
Prodavač v = novi Prodavač();
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.
#regija Filter type = "test"
ako (filterType.Equals("test"))
povratak GenerateTestVendors();
#endregion

ako (pravi)
{
pomoću (SPSite site = novi SPSite(SpVendorSiteName))
{
pomoću (SPWeb web = site.OpenWeb())
{

v = nula;

SPList currentList = web.Lists[SpVendorListName];

// Iterate through all the items in the vendor list.
foreach (SPItem vendorItem u currentList.Items)
{

niz lowerVendorType;

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

ako (lowerVendorType.Equals(filterType))
{
resultList[vendorIndex ] = novi Prodavač(vendorItem);
}
} // iterating thru all the vendors in the list


povratak TrimVendorArray(vendorIndex, resultList);
// return resultList;

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

} // if true

povratak nula;
}

privatni Prodavač[] TrimVendorArray(int newsize, Prodavač[] originalVendorArray)
{
Prodavač[] trimmedArray;

ako (newsize == 0) newsize = 1;
trimmedArray = novi Prodavač[newsize];

int currentCounter = 0;

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

povratak trimmedArray;

}
}

MOSS: Promatranja na InfoPath debugging

InfoPath obrazaca poslužitelja poruka o pogrešci u zabludu.

Tijekom razvoju InfoPath obrasca, Ja bih to post Moss poslužitelj i pristup u obliku. Obrazac će početi za učitavanje, a zatim stvoriti pogrešnu poruku o pogrešci koja pokazuje mi u log Windows događaja za detalje. Zapravo, nema poruka je napisana u log Windows događaja. Prije, Poruka je poslana Moss ASCII dijagnostičkog dnevnika. Možete pratiti da putem dolje usluga središnje uprave.

Morate biti brza na nogama. Mahovina voli pisati log datoteku, često i verbosely. This can be trimmed but the default log writing behavior is "everything as quickly as possible".

MOSS: Ažuriranje prilagođeni popis

Postoje mnogi dobri primjeri ažuriranje prilagođene popise preko SDK. Ovdje je još jedan.

Poslovni problem: InfoPath obrazac je osmišljen koji omogućava korisnicima da unesete online kupnju obespravljivanja. Brojevi narudžbenica rekvizicije bi trebao biti tradicionalni slijed temelju cjelobrojne vrijednosti, a izračunava se automatski.

Poslovno rješenje: Stvaranje prilagođene Moss popis koji sadrži dva stupca: "ControlField" and "ControlValue". Vrijednost stupac sadrži sljedeći broj kupnju rekvizicije. Note that the generic "control" imenovanja konvencija predviđa buduće kontrole polja koja se mogu koristiti po potrebi.

Tehničko rješenje: Napravite web uslugu pristupa putem InfoPath klijentom. Web-usluga vraća sljedeći broj kupnju rekvizicije i ažurira vrijednost na popisu.

Lekcije naučene:

  • Kod dodavanja ovu web servis kao izvor podataka za InfoPath obrasca, Otkrio sam da je potrebno pretvoriti ga u UDK i pohraniti u knjižnicu podatkovne veze.
  • Također sam pronašao da je potrebno omogućiti unakrsna domene skripti putem usluga središnje uprave // aplikacija za upravljanje // Obrazac konfiguracije poslužitelja.
  • Prvi put pokušao obrazac za pristup web-usluge, to traje neko vrijeme, a povodom, da bi time out. Ja fiddled s postavkama u obliku poslužitelja konfiguraciji proširiti vremena isključivanja postavke i da se činilo da bi.

Kod:

pomoću Sustav;
pomoću System.Web;
pomoću System.Web.Services;
pomoću System.Web.Services.Protocols;
pomoću Microsoft.SharePoint;
pomoću System.Configuration;

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

//Uncomment the following line if using designed components
//InitializeComponent();
}

/// <rezime>
/// Obtain the next PO number from the sharepoint po number control list.
/// Increment the PO number in that list.
/// </rezime>
/// <se vraća></se vraća>
[WebMethod]
javni niz GetNextPoNumber()
{
niz SpPoControlSiteName; // Name of the actual MOSS site that hosts the PO Control list.
niz SpPoControlListName; // Name of the actual MOSS list containing the Po control.

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

niz nextPoReqNumber = "xyzzy";

pomoću (SPSite site = novi SPSite(SpPoControlSiteName))
{
pomoću (SPWeb web = site.OpenWeb())
{

SPList currentList = web.Lists[SpPoControlListName];

foreach (SPItem controlItem u currentList.Items)
{

ako (((niz)controlItem["ControlField"]).Jednako("NextPoNumber"))
{
nextPoReqNumber = (niz)controlItem["ControlValue"];

int int_nextPoReqNumber;
int_nextPoReqNumber = Pretvoriti.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")

povratak nextPoReqNumber;

}
}