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;

}
}

legg igjen et svar

e-postadressen din vil ikke offentliggjøres. Obligatoriske felt er merket *