MOSS / InfoPath Forms Server (InfoPath 2007) rullegardinlisten ytelse

Ekstra kategori: InfoPath

Sammendrag: En InfoPath 2007 deployert til en MOSS server-skjemaet gir en miste-ned liste over leverandører som er knyttet til en egendefinert MOSS-liste. Når du velger en leverandør, regler tilordne verdier til en håndfull tekstfelt som salgsrepresentant navn, adresse, byen, tilstand, zip og telefon. Ytelse er fryktelig. Vi merker at ytelsen blir verre (i et ikke-lineært) for hvert enkelt felt oppdaterer vi denne måten. Dvs., Hvis vi bare oppdatere salgsrepresentant navnet, Det tar [x] tidsperiode. Hvis vi oppdaterer salgsrepresentant, address1, Adresse2, byen, tilstand, zip, Det tar 10 ganger lenger.

Løsning: Skrive en webtjeneste (eksempelkode finnes her) som er sendt i en leverandør og returneres tilbake leverandør detaljer. Deretter, tilordne feltene slik. Selv om dette virker treg, Det var ingen merkes forskjell i ytelse når vi tildelt 1 feltet versus 8 felt. Som en ekstra bonus, brukerne får en kul "kontakter serveren" Cylon effekten mens de venter på skjemaet for å aktivere og bruke tjenesten resultater.

MOSS: Unntak oppstod. (Exception from HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

OPPDATERINGEN: Vi har aldri bestemt det rot årsaken til dette problemet og det aldri overflaten igjen.

Vi merker under implementering av et nettsted utvikling som plutselig, to brukere får ikke tilgang til en områdesamling. Disse kontoene kan godkjenne på hovednettstedet, men når du prøver å få tilgang til en bestemt områdesamling, de får bare en blank skjerm. Ingen feil vises, bare en hvit tom side.

Vi logger deg på som en administrator for samling og prøver å legge til en av disse brukerne som en administrator, og denne gangen, Når du trykker på "OK", Vi får denne meldingen:

Unntak oppstod. (Exception from HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

Vi brukte litt tid forskning dette og dessverre, ikke komme opp med noe nyttig. Det var noen meldinger i diagnoseloggen, men det var vanskelig å nøyaktig relatere dem med dette problemet.

Til slutt, løste vi områdesamlingen slettes og opprettes på nytt det og at det.

Hvis jeg finne ut hva som forårsaket dette i fremtid, Jeg vil oppdatere dette innlegget.

MOSS: Veksle mellom egendefinerte lister og tilbake filtrerte data til InfoPath

Virksomhet Scenario:

Angi en metode som gjør det mulig å raskt skrive inn nøyaktig innkjøpsrekvisisjoner.

Forretningsproblem:

Klienten gjør forretninger med flere hundre leverandører.

Leverandører er "type" bestemt. Dette betyr at en leverandør selger datautstyr (f.eks. Dell) eller kontorrekvisita (f.eks. Kramper).

Hvordan kan vi aktivere sluttbrukere som oppretter Kjøp rekvisisjoner Velg en gyldig leverandør?

Forretningsløsning:

Skille leverandører i systemet via "type".

Brukerne kan velge hvilke"" produkt og gir en filtrert sett med aktuelle leverandører.

Teknisk løsning:

Et InfoPath-skjema er designet som lar brukerne angi online innkjøpsrekvisisjoner.

To InfoPath valglistene kontrollere leverandører utvalget. Første, brukeren velger en "Kjøp type". Dette begrenser en andre valglisten inneholder bare leverandører som selger for denne kjøp. Dette er en klassisk gjennomgripende rullegardinliste.

Leverandører er lagret i en MOSS egendefinert liste med egendefinerte kolonner for leverandørattributter som navn, adresse og spesielt "type".

Implementere en tjeneste for en InfoPath-klient å konsumere som går gjennom leverandørlisten egendefinert, returnerer bare leverandører matchende en medfølgende "type".

Starte web-tjenesten via InfoPath-skjemaet.

Erfaringer:

  • Første, Det synes nødvendig å gå denne ruten. Jeg ville ha foretrukket å gjøre filtreringen i InfoPath og ikke opprette web service funksjonalitet her. Men, skjemaer server gir ikke den nødvendige filtreringsfunksjon. Vi kan sette en regel på en "type" valglisten i skjemaet for å åpne slags leverandør spørringen på nytt, men vi kan ikke få det til å fungere. Derfor, Det var nødvendig å implementere webtjenesten.
  • Dette er en klassisk "gjennomgripende valgliste" problemet i InfoPath danner server verden og det er mange gode eksempler der ute som forklarer hvordan å løse.
  • En tom verdi for en kolonne i leverandøroversikten returnerer ikke en tom streng når det refereres til som dette: initItem["Leverandørnavn"]. I stedet, den returnerer en null.

Noen andre notater:

  • Jeg returnerer en matrise[] leverandører fordi jeg hadde problemer med retur en ArrayList. InfoPath ble klagende om det og jeg har ikke tid eller tilbøyelighet til å kjempe over det.. Dette, selvfølgelig, setter en kunstig grense på antall leverandører. Det også tvunget meg til å implementere en trim() metoden på matrisen fordi jeg hater tanken på å returnere tilbake 100's null leverandører. InfoPath vare ikke, men det mast på meg. (Igjen, Dette var lettere enn å kjempe InfoPath over ArrayLists).
  • Jeg implementert en GetSpecificVendorByName() funksjonen også, som kan være lærerikt.

Koden:

ved hjelp av Systemet;
ved hjelp av System.Web;
ved hjelp av System.Web.Services;
ved hjelp av System.Web.Services.Protocols;
ved hjelp av Microsoft.SharePoint;
ved hjelp av System.Configuration;

/// <Sammendrag>
///
Leverandør-tjenesten: Gir leverandøren relaterte tjenester som i dag brukes av et infopath-skjema for klient.
///
/// Historie:
/// ——–
/// 07/24/07: Innledende koding, Paul J. Gavin av Conchango.
///
/// </Sammendrag>
[WebService(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
offentlig klassen VendorService : System.Web.Services.WebService
{

/// <Sammendrag>
/// Representerer en leverandør fra en egendefinert sharepoint-liste vedlikeholdes av MSUSA.
/// </Sammendrag>
offentlig klassen Leverandør
{
offentlig Leverandør() { }

offentlig Leverandør(SPItem initItem)
{
Hvis (! (initItem["Leverandørnavn"] == null)) Leverandørnavn = initItem["Leverandørnavn"].ToString();
Hvis (! (initItem["Adresse 1"] == null)) VendorAddress1 = initItem["Adresse 1"].ToString();
Hvis (! (initItem["Adresse 2"] == null)) VendorAddress2 = initItem["Adresse 2"].ToString();
Hvis (! (initItem["City"] == null)) VendorCity = initItem["City"].ToString();
Hvis (! (initItem["VendorPhone"] == null)) VendorPhone = initItem["VendorPhone"].ToString();
Hvis (! (initItem["PurchaseType"] == null)) VendorType = initItem["PurchaseType"].ToString();
Hvis (! (initItem["State"] == null)) VendorState = initItem["State"].ToString();
Hvis (! (initItem["Zip"] == null)) VendorZip = initItem["Zip"].ToString();
Hvis (!(initItem["Fax"] == null)) VendorFax = initItem["Fax"].ToString();
Hvis (!(initItem["SalesRepName"] == null)) VendorSalesRepName = initItem["SalesRepName"].ToString();

VendorItemId = initItem.ID; // Unik ID vedlikeholdes via MOSS.
}

offentlig Int VendorItemId;
offentlig streng Leverandørnavn;
offentlig streng VendorAddress1;
offentlig streng VendorAddress2;
offentlig streng VendorCity;
offentlig streng VendorState;
offentlig streng VendorZip;
offentlig streng VendorPhone;
offentlig streng VendorType;
offentlig streng VendorSalesRepName;
offentlig streng VendorFax;
}

offentlig VendorService () {

//Uncomment følgende linje hvis bruker utviklet komponenter
//InitializeComponent();
}

privat Leverandør[] GenerateTestVendors()
{
Leverandør[] resultList;
resultList = nye Leverandør[100];

Leverandør v;
v = nye Leverandør();
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 = nye Leverandør();

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 = nye Leverandør();
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;

avkastning resultList;

}

[WebMethod]
offentlig Leverandør GetSpecificVendorById(Int vendorId)
{
streng SpVendorSiteName; // Navnet på selve MOSS området som inneholder egendefinerte leverandøroversikten.
streng SpVendorListName; // Navnet på den faktiske MOSS listen inneholder leverandører.

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

ved hjelp av (SPSite Site = nye SPSite(SpVendorSiteName))
{

ved hjelp av (SPWeb Web = området. OpenWeb())
{

SPList currentList = web. Lister[SpVendorListName];

SPItem specificItem = currentList.Items[vendorId];

avkastning nye Leverandør(specificItem);

} // bruke spweb web = site.openweb()
} // bruke spsite siden = nye spsite("http://localhost/mizuho")

}

[WebMethod]
// Forutsetter at leverandørnavnet er unik, fra en bedriftsperspektiv
offentlig Leverandør GetSpecificVendorByVendorName(streng være)
{
streng SpVendorSiteName; // Navnet på selve MOSS området som inneholder egendefinerte leverandøroversikten.
streng SpVendorListName; // Navnet på den faktiske MOSS listen inneholder leverandører.

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

ved hjelp av (SPSite Site = nye SPSite(SpVendorSiteName))
{
ved hjelp av (SPWeb Web = området. OpenWeb())
{

SPList currentList = web. Lister[SpVendorListName];

foreach (SPItem vendorItem i currentList.Items)
{
Hvis (vendorItem["Leverandørnavn"] == null) «««;

Hvis (vendorItem["Leverandørnavn"].ToString().Er lik(være))
avkastning nye Leverandør(vendorItem);
}

Leverandør v = nye Leverandør();
v.VendorPhone = "ikke funnet: " + være;

avkastning v;

avkastning null;

} // bruke spweb web = site.openweb()
} // bruke spsite siden = nye spsite("http://localhost/mizuho")

} // metoden

[WebMethod]
offentlig Leverandør[] GetVendorsOfType (streng filterType)
{

streng SpVendorSiteName; // Navnet på det faktiske MOSS nettstedet som er vert t
Han leverandør egendefinert liste.
streng SpVendorListName; // Navnet på den faktiske MOSS listen inneholder leverandører.

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

Leverandør[] resultList;
Int vendorIndex = 0;
resultList = nye Leverandør[1000];

// Initialisere listen med en standard vennlig melding.
Leverandør v = nye Leverandør();
v.VendorName = "Velg en leverandør til å fylle listen.";
resultList[0] = v;

// Konvertere filteret til små bokstaver for enklere strengsammenligning senere.
filterType = filterType.ToLower();

// Hvis filtertypen gått er "test", generere noen enkle data.
#regionen Filtertype = "test"
Hvis (filterType. lik("test"))
avkastning GenerateTestVendors();
#endregion

Hvis (sann)
{
ved hjelp av (SPSite Site = nye SPSite(SpVendorSiteName))
{
ved hjelp av (SPWeb Web = området. OpenWeb())
{

v = null;

SPList currentList = web. Lister[SpVendorListName];

// Gå gjennom alle elementene i leverandørlisten.
foreach (SPItem vendorItem i currentList.Items)
{

streng lowerVendorType;

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

Hvis (lowerVendorType. er lik(filterType))
{
resultList[vendorIndex ] = nye Leverandør(vendorItem);
}
} // iterating gjennom alle leverandører i listen


avkastning TrimVendorArray(vendorIndex, resultList);
// returnere resultList;

} // bruke spweb web = site.openweb()
} // bruke spsite siden = nye spsite("http://localhost/mizuho")

} // Hvis sann

avkastning null;
}

privat Leverandør[] TrimVendorArray(Int newsize, Leverandør[] originalVendorArray)
{
Leverandør[] trimmedArray;

Hvis (newsize == 0) newsize = 1;
trimmedArray = nye Leverandør[newsize];

Int currentCounter = 0;

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

avkastning trimmedArray;

}
}

MOSS: Observasjoner på InfoPath feilsøking

Feilmeldinger for InfoPath-skjema-server er misvisende.

Under utviklingen av et InfoPath-skjema, Jeg vil legge det til MOSS server og få tilgang til skjemaet. Skjemaet vil begynne å laste inn og deretter generere en misvisende feilmelding peker meg til windows-hendelsesloggen for detaljer. faktisk, ingen melding ble skrevet til hendelsesloggen i windows. Heller, meldingen ble sendt til diagnoseloggen som MOSS ascii. Du kan spore det opp via sentrale tjenester administrasjon.

Du må være rask på føttene. MOSS liker å skrive til loggfilen, ofte og verbosely. Dette kan trimmes men standardloggen skrive atferd er "alt så raskt som mulig".

MOSS: Oppdatere en egendefinert liste

Det er mange gode eksempler på oppdaterer egendefinerte lister via SDK. Her er enda en.

Forretningsproblem: InfoPath-skjemaet er utformet som lar brukerne angi online innkjøpsrekvisisjoner. PO innkjøpsrekvisisjon tall bør være tradisjonelle sekvens basert heltallsverdier og beregnet automatisk.

Forretningsløsning: Opprette en egendefinert MOSS-liste som inneholder to kolonner: "ControlField" og "ControlValue". Verdi-kolonnen inneholder den neste kjøpsordrenummer. Merk at generisk "kontroll" navnekonvensjonen inneholder for fremtidige kontrollfelt som kan brukes som nødvendig.

Teknisk løsning: Opprette en webtjeneste tilgang til InfoPath klienten. Webtjenesten returnerer tilbake neste kjøpsordrenummer og oppdaterer verdien for listen.

Erfaringer:

  • Når du legger til denne webtjenesten som datakilde i InfoPath-skjemaet, Jeg fant det nødvendig å konvertere den til en udc og lagre dem i et datatilkoblingsbibliotek.
  • Jeg også funnet det nødvendig å aktivere tvers av domener skripting via sentrale tjenester administrasjon // Programbehandling // skjemaet serverkonfigurasjon.
  • Første gang skjemaet prøvde å få tilgang til webtjenesten, Det tar en stund og til tider, det ville tid ut. Jeg fingret med innstillingene i skjemaet server å utvide tidsavbruddsinnstillingene og som syntes å.

Koden:

ved hjelp av Systemet;
ved hjelp av System.Web;
ved hjelp av System.Web.Services;
ved hjelp av System.Web.Services.Protocols;
ved hjelp av Microsoft.SharePoint;
ved hjelp av System.Configuration;

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

//Uncomment følgende linje hvis bruker utviklet komponenter
//InitializeComponent();
}

/// <Sammendrag>
/// Få neste PO nummer fra sharepoint po nummer kontroll-listen.
/// Øke innkjøpsordrenummer i listen.
/// </Sammendrag>
/// <Returnerer></Returnerer>
[WebMethod]
offentlig streng GetNextPoNumber()
{
streng SpPoControlSiteName; // Navnet på selve MOSS området som inneholder listen PO kontroll.
streng SpPoControlListName; // Navnet på den faktiske MOSS listen som inneholder kontrollen Po.

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

streng nextPoReqNumber = "xyzzy";

ved hjelp av (SPSite Site = nye SPSite(SpPoControlSiteName))
{
ved hjelp av (SPWeb Web = området. OpenWeb())
{

SPList currentList = web. Lister[SpPoControlListName];

foreach (SPItem controlItem i currentList.Items)
{

Hvis (((streng)controlItem["ControlField"]).Er lik("NextPoNumber"))
{
nextPoReqNumber = (streng)controlItem["ControlValue"];

Int int_nextPoReqNumber;
int_nextPoReqNumber = Konvertere.ToInt32(nextPoReqNumber);

int_nextPoReqNumber ;

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

} // Finne, lese og oppdatere innkjøpsordrenummeret i listen.


} // bruke spweb web = site.openweb()
} // bruke spsite siden = nye spsite("http://localhost/mizuho")

avkastning nextPoReqNumber;

}
}