Affärsscenario:
En metod som möjliggör för användare att ange korrekt inköpsrekvisitioner snabbt.
Affärsproblem:
Klienten gör affärer med flera hundra leverantörer.
Leverantörer är "typ" särskilda. Detta innebär att en leverantör säljer datorutrustning (t.ex. Dell) eller kontorsmateriel (t.ex. Staples).
Hur vi aktiverar slutanvändare som skapar inköpsrekvisitioner Välj en giltig leverantör?
Affärslösning:
Skilja leverantörer i systemet via "typ".
Möjligt för användare att välja vilken "typ" av produkten och sedan ge en filtrerad uppsättning lämpliga leverantörer.
Teknisk lösning:
Ett InfoPath-formulär har utformats att kan användare ange online inköpsrekvisitioner.
Två InfoPath listorna styra säljaren urval. Första, användaren väljer en "Köp typ". Detta begränsar en andra lista innehåller endast leverantörer som säljer för att köpa typ. Detta är en klassisk CSS nedrullningsbar.
Leverantörer lagras i en anpassad lista som MOSS med anpassade kolumner för leverantör attribut som namn, adress och särskilt "typ".
Genomföra en webbtjänst för en InfoPath klient att konsumera som itererar igenom leverantörslistan anpassade, återvänder bara leverantörer på en medföljande "typ".
Anropa webbtjänsten via InfoPath-formuläret.
Lärdomar:
- Första, Det verkar nödvändigt att gå denna väg. Jag skulle ha föredragit att göra filtreringen i InfoPath och inte skapa någon web service funktionalitet här. Men, Forms server ger inte de nödvändiga filtreringsfunktionen. Vi kan sätta en regel på en "type" listan i formuläret för att åter öppna typ av leverantör frågan, men vi kan inte få det att fungera ordentligt. Därför, Det var nödvändigt att genomföra webbtjänsten.
- Detta är en klassisk "cascading urvalslista" problem i InfoPath bildar server världen och det finns många goda exempel där ute som kan förklara hur man löser detta.
- Ett tomt värde för en kolumn i leverantörslistan returnerar inte en tom sträng när de refereras som denna: initItem["Leverantörens namn"]. I stället, den returnerar ett null-värde.
Några andra anteckningar:
- Jag returnerar en matris[] leverantörer eftersom jag hade vissa svårigheter att återvända en ArrayList. InfoPath klagar på det och jag hade inte tid eller lust att slåss om det. Detta, Självklart, sätter en konstlad gräns på det totala antalet leverantörer. Det också tvingade mig att genomföra en trim() metod på matrisen eftersom jag hatar tanken på att återvända tillbaka 100-tals null leverantörer. InfoPath inte bryr sig, men det tjatade på mig. (Igen, Detta var enklare än att bekämpa InfoPath över ArrayLists).
- Jag genomfört en GetSpecificVendorByName() funktion samt, som kan vara lärorikt.
Koden:
med hjälp av System;
med hjälp av System.Web;
med hjälp av System.Web.Services;
med hjälp av System.Web.Services.Protocols;
med hjälp av Microsoft.SharePoint;
med hjälp av System.Configuration;
/// <Sammanfattning>
/// Leverantörens Service: Ger leverantören med tjänster som idag konsumeras av formulär infopath klient.
///
/// Historia:
/// ——–
/// 07/24/07: Ursprungliga kodning, Paul J. Gavin av Conchango.
///
/// </Sammanfattning>
[WebService(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
offentliga klass VendorService : System.Web.Services.WebService
{
/// <Sammanfattning>
/// Representerar en leverantör från en anpassad sharepoint-lista som underhålls av MSUSA.
/// </Sammanfattning>
offentliga klass Leverantör
{
offentliga Leverantör() { }
offentliga Leverantör(SPItem initItem)
{
om (! (initItem["Leverantörens namn"] == null)) Leverantörsnamn = initItem["Leverantörens namn"].ToString();
om (! (initItem["Adress 1"] == null)) VendorAddress1 = initItem["Adress 1"].ToString();
om (! (initItem["Adress 2"] == null)) VendorAddress2 = initItem["Adress 2"].ToString();
om (! (initItem["City"] == null)) VendorCity = initItem["City"].ToString();
om (! (initItem["VendorPhone"] == null)) VendorPhone = initItem["VendorPhone"].ToString();
om (! (initItem["PurchaseType"] == null)) VendorType = initItem["PurchaseType"].ToString();
om (! (initItem["Staten"] == null)) VendorState = initItem["Staten"].ToString();
om (! (initItem["Zip"] == null)) VendorZip = initItem["Zip"].ToString();
om (!(initItem["Fax"] == null)) VendorFax = initItem["Fax"].ToString();
om (!(initItem["SalesRepName"] == null)) VendorSalesRepName = initItem["SalesRepName"].ToString();
VendorItemId = initItem.ID; // Unikt ID underhålls via MOSS.
}
offentliga int VendorItemId;
offentliga sträng Leverantörsnamn;
offentliga sträng VendorAddress1;
offentliga sträng VendorAddress2;
offentliga sträng VendorCity;
offentliga sträng VendorState;
offentliga sträng VendorZip;
offentliga sträng VendorPhone;
offentliga sträng VendorType;
offentliga sträng VendorSalesRepName;
offentliga sträng VendorFax;
}
offentliga VendorService () {
//Avkommentera följande rad om du använder komponenter för
//InitializeComponent();
}
privat Leverantör[] GenerateTestVendors()
{
Leverantör[] Tabellen;
Tabellen = nya Leverantör[100];
Leverantör v;
v = nya Leverantör();
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";
Tabellen[0] = v;
v = nya Leverantö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";
Tabellen[1] = v;
v = nya Leverantö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";
Tabellen[2] = v;
återvändande Tabellen;
}
[WebMethod]
offentliga Leverantör GetSpecificVendorById(int vendorId)
{
sträng SpVendorSiteName; // Namnet på den faktiska MOSS webbplats som är värd för den anpassade listan för leverantör.
sträng SpVendorListName; // Namnet på den faktiska MOSS lista som innehåller leverantörer.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
med hjälp av (SPSite plats = nya SPSite(SpVendorSiteName))
{
med hjälp av (SPWeb Web = webbplats. OpenWeb())
{
SPList currentList = web. Listor[SpVendorListName];
SPItem specificItem = currentList.Items[vendorId];
återvändande nya Leverantör(specificItem);
} // med hjälp av spweb web = site.openweb()
} // webbplatsen för spsite = nya spsite("http://localhost/mizuho")
}
[WebMethod]
// Antar att leverantörens namn är unik, från ett affärsperspektiv
offentliga Leverantör GetSpecificVendorByVendorName(sträng vara)
{
sträng SpVendorSiteName; // Namnet på den faktiska MOSS webbplats som är värd för den anpassade listan för leverantör.
sträng SpVendorListName; // Namnet på den faktiska MOSS lista som innehåller leverantörer.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
med hjälp av (SPSite plats = nya SPSite(SpVendorSiteName))
{
med hjälp av (SPWeb Web = webbplats. OpenWeb())
{
SPList currentList = web. Listor[SpVendorListName];
foreach (SPItem vendorItem i currentList.Items)
{
om (vendorItem["Leverantörens namn"] == null) «««;
om (vendorItem["Leverantörens namn"].ToString().Är lika med(vara))
återvändande nya Leverantör(vendorItem);
}
Leverantör v = nya Leverantör();
v.VendorPhone = "kunde inte hittas: " + vara;
återvändande v;
återvändande null;
} // med hjälp av spweb web = site.openweb()
} // webbplatsen för spsite = nya spsite("http://localhost/mizuho")
} // metoden
[WebMethod]
offentliga Leverantör[] GetVendorsOfType (sträng filterType)
{
sträng SpVendorSiteName; // Namnet på den faktiska MOSS webbplats som är värd t
Han anpassade leverantörslista.
sträng SpVendorListName; // Namnet på den faktiska MOSS lista som innehåller leverantörer.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
Leverantör[] Tabellen;
int vendorIndex = 0;
Tabellen = nya Leverantör[1000];
// Initiera listan med ett vänligt meddelande som standard.
Leverantör v = nya Leverantör();
v.VendorName = "Välja en leverantör att fylla denna listan.";
Tabellen[0] = v;
// Filtret Konvertera till gemener för lättare strängjämförelse senare.
filterType = filterType.ToLower();
// Om filtertypen passerade är "test", generera några enkla data.
#regionen Filtertypen = "test"
om (filterType. lika med("test"))
återvändande GenerateTestVendors();
#endregion
om (sant)
{
med hjälp av (SPSite plats = nya SPSite(SpVendorSiteName))
{
med hjälp av (SPWeb Web = webbplats. OpenWeb())
{
v = null;
SPList currentList = web. Listor[SpVendorListName];
// Iterera genom alla objekt i leverantörslistan.
foreach (SPItem vendorItem i currentList.Items)
{
sträng lowerVendorType;
lowerVendorType = vendorItem["PurchaseType"].ToString().ToLower();
lowerVendorType = lowerVendorType.Substring(3);
om (lika med lowerVendorType.(filterType))
{
Tabellen[vendorIndex ] = nya Leverantör(vendorItem);
}
} // iterera genom alla leverantörer i listan
återvändande TrimVendorArray(vendorIndex, Tabellen);
// Returnera tabellen;
} // med hjälp av spweb web = site.openweb()
} // webbplatsen för spsite = nya spsite("http://localhost/mizuho")
} // om värdet är true
återvändande null;
}
privat Leverantör[] TrimVendorArray(int newsize, Leverantör[] originalVendorArray)
{
Leverantör[] trimmedArray;
om (newsize == 0) newsize = 1;
trimmedArray = nya Leverantör[newsize];
int currentCounter = 0;
för (currentCounter = 0; currentCounter < newsize; currentCounter )
{
trimmedArray[currentCounter] = originalVendorArray[currentCounter];
}
återvändande trimmedArray;
}
}