Forretningsscenario:
Levere en metode, der gør det muligt for brugere at angive præcise indkøbsrekvisitioner hurtigt.
Business problem:
Klienten gør forretning med flere hundrede leverandører.
Sælgere er "type" specifikke. Det betyder, at en leverandør sælger edb-udstyr (strømsparetilstand. Dell) eller kontorartikler (strømsparetilstand. Hæfteklammer).
Hvordan vi aktiverer slutbrugerne, der skaber Køb pålæg Vælg en gyldig leverandør?
Business løsning:
Differentiere leverandører i systemet via "type".
Give brugerne mulighed at vælge typen"" af produkt og derefter give et filtreret sæt af relevante leverandører.
Tekniske løsning:
En InfoPath-formular er udformet, kan brugere angive online indkøbsrekvisitioner.
To InfoPath valglister styre leverandør udvælgelse. Første, brugeren vælger typen"køb". Dette begrænser en anden valglisten indeholder kun sælgere, der sælger for den pågældende køb. Dette er en klassisk overlappende drop-down.
Sælgere er gemt i en Mos brugerdefineret liste med brugerdefinerede kolonner for kreditor attributter som navn, adresse og især "type".
Gennemføre en webservice til en InfoPath-klienten til at forbruge, gennemløber listen Brugerdefineret kreditorer, returnerer kun leverandører matchende en medfølgende "type".
Påberåbe sig web service via InfoPath-formularen.
Indhøstede erfaringer:
- Første, Det synes nødvendigt at gå denne rute. Jeg ville have foretrukket at gøre filtrering helt inden for InfoPath og ikke oprette hvilken som helst web service funktioner her. Dog, Forms server giver ikke den nødvendige filterfunktion. Vi kan sætte en regel på et "type" valglisten i formen slags åbne forespørgslen leverandør, men vi kan ikke få det til at virke ordentligt. Derfor, Det var nødvendigt at gennemføre webtjenesten.
- Dette er en klassisk "overlappende selection list" problemet i InfoPath danner server verden og der er mange gode eksempler derude, der forklarer hvordan man kan løse dette.
- En tom værdi for en kolonne i listen over kreditorer returnerer ikke en tom streng, når der refereres til som dette: initItem["Kreditornavnet"]. I stedet, den returnerer en null-værdi.
Nogle andre noter:
- Jeg returnere et array[] af leverandører, fordi jeg havde nogle svært ved at vende tilbage en ArrayList. InfoPath klagede over det og jeg har ikke tid eller lyst til at kæmpe over det.. Dette, Selvfølgelig, sætter en kunstig grænse på det samlede antal af leverandører. Det også tvunget mig til at gennemføre en trim() metoden på matrixen fordi jeg hader tanken om at vende tilbage tilbage 100's af null leverandører. InfoPath er ligeglad, men det nagged på mig. (Igen, Det var nemmere end at kæmpe InfoPath over ArrayLists).
- Jeg har gennemført en GetSpecificVendorByName() funktion samt, der kan være lærerigt.
Koden:
ved hjælp af System;
ved hjælp af Sektionsgruppen;
ved hjælp af System.Web.Services;
ved hjælp af System.Web.Services.Protocols;
ved hjælp af Microsoft.SharePoint;
ved hjælp af System.Configuration;
/// <Resumé>
/// Kreditor Service: Giver kreditor relaterede tjenester, som i dag forbruges af en infopath-formular, klient.
///
/// Historie:
/// ——–
/// 07/24/07: Indledende kodning, Paul J. Gavin af Conchango.
///
/// </Resumé>
[WebService(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
offentlige klasse VendorService : System.Web.Services.WebService
{
/// <Resumé>
/// Repræsenterer en kreditor fra en custom sharepoint liste vedligeholdes af MSUSA.
/// </Resumé>
offentlige klasse Kreditor
{
offentlige Kreditor() { }
offentlige Kreditor(SPItem initItem)
{
Hvis (! (initItem["Kreditornavnet"] == Null)) Producentnavn = initItem["Kreditornavnet"].ToString();
Hvis (! (initItem["Løse 1"] == Null)) VendorAddress1 = initItem["Løse 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["Staten"] == Null)) VendorState = initItem["Staten"].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; // Unikke ID opretholdes via MOSS.
}
offentlige int VendorItemId;
offentlige streng Producentnavn;
offentlige streng VendorAddress1;
offentlige streng VendorAddress2;
offentlige streng VendorCity;
offentlige streng VendorState;
offentlige streng VendorZip;
offentlige streng VendorPhone;
offentlige streng VendorType;
offentlige streng VendorSalesRepName;
offentlige streng VendorFax;
}
offentlige VendorService () {
//Ualmindelig den følgende linje hvis bruger designede komponenter
//InitializeComponent();
}
privat Kreditor[] GenerateTestVendors()
{
Kreditor[] resultList;
resultList = nye Kreditor[100];
Kreditor v;
v = nye Kreditor();
v.VendorAddress1 = "v1_address1";
v.VendorAddress2 = "v1_address2";
v.VendorCity = "v1_city";
v.VendorName = "v1_vendorname";
v.VendorPhone = "v1_vendorphone";
v.VendorState =
v.VendorType = "v1_type";
v.VendorZip = "v1_zip";
resultList[0] = v;
v = nye Kreditor();
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 Kreditor();
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;
tilbagevenden resultList;
}
[WebMethod]
offentlige Kreditor GetSpecificVendorById(int vendorId)
{
streng SpVendorSiteName; // Navnet på den faktiske MOSS websted, der hoster brugerdefinerede kreditorliste.
streng SpVendorListName; // Navnet på den faktiske MOSS liste indeholdende leverandører.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
ved hjælp af (SPSite site = nye SPSite(SpVendorSiteName))
{
ved hjælp af (SPWeb Web = site. OpenWeb())
{
SPList.Update() currentList = web. Lister[SpVendorListName];
SPItem specificItem = currentList.Items[vendorId];
tilbagevenden nye Kreditor(specificItem);
} // ved hjælp af spweb web = site.openweb()
} // ved hjælp af spsite site = ny spsite("http://localhost/mizuho")
}
[WebMethod]
// Antager, at kreditornavnet er unik, fra et business perspektiv
offentlige Kreditor GetSpecificVendorByVendorName(streng være)
{
streng SpVendorSiteName; // Navnet på den faktiske MOSS websted, der hoster brugerdefinerede kreditorliste.
streng SpVendorListName; // Navnet på den faktiske MOSS liste indeholdende leverandører.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
ved hjælp af (SPSite site = nye SPSite(SpVendorSiteName))
{
ved hjælp af (SPWeb Web = site. OpenWeb())
{
SPList.Update() currentList = web. Lister[SpVendorListName];
foreach (SPItem vendorItem i currentList.Items)
{
Hvis (vendorItem["Kreditornavnet"] == Null) «««;
Hvis (vendorItem["Kreditornavnet"].ToString().Er lig med(være))
tilbagevenden nye Kreditor(vendorItem);
}
Kreditor v = nye Kreditor();
v.VendorPhone = "blev ikke fundet: " + være;
tilbagevenden v;
tilbagevenden Null;
} // ved hjælp af spweb web = site.openweb()
} // ved hjælp af spsite site = ny spsite("http://localhost/mizuho")
} // metode
[WebMethod]
offentlige Kreditor[] GetVendorsOfType (streng filterType)
{
streng SpVendorSiteName; // Navnet på den faktiske MOSS websted, der hoster t
han sælger brugerdefineret liste.
streng SpVendorListName; // Navnet på den faktiske MOSS liste indeholdende leverandører.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
Kreditor[] resultList;
int vendorIndex = 0;
resultList = nye Kreditor[1000];
// Initialisere listen med en venlig standardmeddelelse.
Kreditor v = nye Kreditor();
v.VendorName = "Skal du vælge en kreditortype til at udfylde denne liste.";
resultList[0] = v;
// Konvertere filteret til lavere tilfældet for lettere strengsammenligning senere.
filterType = filterType.ToLower();
// Hvis filtertypen bestået er "test", generere nogle simple data.
#regionen Filtrer type = "test"
Hvis (filterType. er lig med("test"))
tilbagevenden GenerateTestVendors();
#endregion
Hvis (True)
{
ved hjælp af (SPSite site = nye SPSite(SpVendorSiteName))
{
ved hjælp af (SPWeb Web = site. OpenWeb())
{
v = Null;
SPList.Update() currentList = web. Lister[SpVendorListName];
// Iterere gennem alle elementerne på listen over kreditorer.
foreach (SPItem vendorItem i currentList.Items)
{
streng lowerVendorType;
lowerVendorType = vendorItem["PurchaseType"].ToString().ToLower();
lowerVendorType = lowerVendorType.Substring(3);
Hvis (lowerVendorType. er lig med(filterType))
{
resultList[vendorIndex ] = nye Kreditor(vendorItem);
}
} // iterere gennem alle leverandører i listen
tilbagevenden TrimVendorArray(vendorIndex, resultList);
// tilbage resultList;
} // ved hjælp af spweb web = site.openweb()
} // ved hjælp af spsite site = ny spsite("http://localhost/mizuho")
} // Hvis det er sandt
tilbagevenden Null;
}
privat Kreditor[] TrimVendorArray(int newsize, Kreditor[] originalVendorArray)
{
Kreditor[] trimmedArray;
Hvis (newsize == 0) newsize = 1;
trimmedArray = nye Kreditor[newsize];
int currentCounter = 0;
for (currentCounter = 0; currentCounter < newsize; currentCounter )
{
trimmedArray[currentCounter] = originalVendorArray[currentCounter];
}
tilbagevenden trimmedArray;
}
}