Business-Szenario:
Stellen Sie eine Methode, die Benutzern ermöglicht, genaue Bestellanforderungen schnell eingeben.
Geschäftsproblem:
Der Client ist mit mehreren hundert Anbietern.
Anbieter sind "Typ" spezifische. Dies bedeutet, dass ein Anbieter EDV-Anlagen verkauft (zB. Dell) oder Bürotechnik (zB. Staples).
Wie aktiviere wir Endbenutzer, die Einkauf Bestellanforderungen wählen Sie einen gültigen Anbieter erstellen?
Business-Lösung:
Anbietern zu unterscheiden, in das System über "Typ".
Ermöglichen Sie es Benutzern, den "auswählen" Produkt und geben Sie dann eine gefilterte Menge von geeigneten Anbietern.
Technische Lösung:
Ein InfoPath-Formular wurde entwickelt, dass ermöglicht Benutzern online eingeben Bestellanforderungen kaufen.
Zwei InfoPath-Auswahllisten Steuern Anbieterauswahl. Erste, der Benutzer wählt ein "Kauf". Dies schränkt eine zweite Auswahlliste nur Lieferanten enthalten, die für diesen Kauf zu verkaufen. Dies ist ein klassisches cascading Drop-down.
Anbieter sind in einer MOSS benutzerdefinierte Liste mit benutzerdefinierten Spalten für Anbieter Attribute wie Name gespeichert., Adresse und vor allem "Typ".
Implementieren eines Webdienstes für ein InfoPath-Client zu konsumieren durchläuft der benutzerdefinierten Anbieter-Liste, Rückgabe nur Lieferanten, die passend mitgelieferten "Typs".
Den Webdienst über das InfoPath-Formular aufrufen.
Lessons Learned:
- Erste, Es erscheint notwendig, diesen Weg zu gehen. Ich hätte es vorgezogen, zu tun, die Filterung komplett in InfoPath und nicht erstellen Sie hier Funktionalität für die Web service. Jedoch, Formularserver bietet keine erforderlichen Filterfunktion. Wir setzen in der Regel auf eine "Typ" Auswahlliste im Formular irgendwie die Kreditor-Abfrage erneut öffnen, aber wir können es richtig funktioniert nicht. Daher, Es war notwendig, um die Implementierung des Webservice.
- Dies ist eine klassische "kaskadierende Auswahlliste" Problem in der InfoPath forms Server-Welt und es gibt viele gute Beispiele gibt, die erklären, wie dieses Problem zu lösen.
- Ein leerer Wert für eine Spalte in der Liste der Anbieter gibt eine leere Zeichenfolge wie folgt verwiesen nicht zurück.: initItem["Herstellernamen"]. Stattdessen, Es gibt Null zurück.
Einige andere Hinweise:
- Ich zurückgibt ein Array[] der Anbieter weil ich hatte einige Schwierigkeiten, die Rückgabe ArrayList. InfoPath klagte darüber, und ich habe nicht die Zeit oder Lust, darüber zu kämpfen. Dies, Natürlich, stellt eine künstliche Beschränkung auf die Gesamtzahl der Anbieter. Es hielt auch mich, ein Trimm zu implementieren() Methode auf dem Array weil ich hasse die Idee der Rückkehr zurück 100 null Anbieter. InfoPath ist es egal, aber es nörgelte mich an. (Wieder, Das war einfacher als Arraylisten InfoPath streiten).
- Ich habe implementiert eine GetSpecificVendorByName() Funktion sowie, Das könnte durchaus aufschlussreich sein.
Der code:
Verwendung System;
Verwendung System.Web;
Verwendung System.Web.Services;
Verwendung System.Web.Services.Protocols;
Verwendung Microsoft.SharePoint;
Verwendung System.Configuration;
/// <Zusammenfassung>
/// Hersteller-Service: Stellt, dass Anbieter, die im Zusammenhang mit Dienstleistungen, die heute durch ein Infopath-Clientformular verbraucht werden.
///
/// Geschichte:
/// ——–
/// 07/24/07: Anfängliche Codierung, Paul J. Gavin von Conchango.
///
/// </Zusammenfassung>
[WebService(Namespace = "http://www.Conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
öffentliche Klasse VendorService : System.Web.Services.WebService
{
/// <Zusammenfassung>
/// Stellt einen Anbieter aus einer benutzerdefinierten Sharepoint-Liste verwaltet von MSUSA.
/// </Zusammenfassung>
öffentliche Klasse Hersteller
{
öffentliche Hersteller() { }
öffentliche Hersteller(SPItem initItem)
{
If (! (initItem["Herstellernamen"] == NULL)) Herstellername = InitItem["Herstellernamen"].ToString();
If (! (initItem["Adresse 1"] == NULL)) VendorAddress1 = InitItem["Adresse 1"].ToString();
If (! (initItem["Adresse 2"] == NULL)) VendorAddress2 = InitItem["Adresse 2"].ToString();
If (! (initItem["City"] == NULL)) VendorCity = InitItem["City"].ToString();
If (! (initItem["VendorPhone"] == NULL)) VendorPhone = InitItem["VendorPhone"].ToString();
If (! (initItem["PurchaseType"] == NULL)) VendorType = InitItem["PurchaseType"].ToString();
If (! (initItem["Staat"] == NULL)) VendorState = InitItem["Staat"].ToString();
If (! (initItem["Zip"] == NULL)) VendorZip = InitItem["Zip"].ToString();
If (!(initItem["Fax"] == NULL)) VendorFax = InitItem["Fax"].ToString();
If (!(initItem["SalesRepName"] == NULL)) VendorSalesRepName = InitItem["SalesRepName"].ToString();
VendorItemId = initItem.ID; // Eindeutige ID gepflegt über Moos.
}
öffentliche int VendorItemId;
öffentliche Zeichenfolge Herstellername;
öffentliche Zeichenfolge VendorAddress1;
öffentliche Zeichenfolge VendorAddress2;
öffentliche Zeichenfolge VendorCity;
öffentliche Zeichenfolge VendorState;
öffentliche Zeichenfolge VendorZip;
öffentliche Zeichenfolge VendorPhone;
öffentliche Zeichenfolge VendorType;
öffentliche Zeichenfolge VendorSalesRepName;
öffentliche Zeichenfolge VendorFax;
}
öffentliche VendorService () {
//Kommentieren Sie, dass die folgende Zeile verwenden Komponenten ausgelegt
//InitializeComponent();
}
Privat Hersteller[] GenerateTestVendors()
{
Hersteller[] Ergebnisliste;
Ergebnisliste = Neu Hersteller[100];
Hersteller v;
V = Neu Hersteller();
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";
Ergebnisliste[0] = v;
V = Neu Hersteller();
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";
Ergebnisliste[1] = v;
V = Neu Hersteller();
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";
Ergebnisliste[2] = v;
Rückkehr Ergebnisliste;
}
[WebMethod]
öffentliche Hersteller GetSpecificVendorById(int vendorId)
{
Zeichenfolge SpVendorSiteName; // Name des tatsächlichen MOSS-Website, die die benutzerdefinierte Liste Anbieter hostet.
Zeichenfolge SpVendorListName; // Name der eigentlichen MOSS Liste mit Anbietern.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
Verwendung (SPSite Website = Neu SPSite(SpVendorSiteName))
{
Verwendung (SPWeb Web = Site. OpenWeb())
{
SPList CurrentList = Web. Listen[SpVendorListName];
SPItem SpecificItem = currentList.Items[vendorId];
Rückkehr Neu Hersteller(specificItem);
} // mit Spweb Web = site.openweb()
} // Nutzung Spsite Site = neue Spsite("http://Localhost/Mizuho")
}
[WebMethod]
// Setzt voraus, dass der Kreditorname eindeutig ist, aus betriebswirtschaftlicher Sicht
öffentliche Hersteller GetSpecificVendorByVendorName(Zeichenfolge werden)
{
Zeichenfolge SpVendorSiteName; // Name des tatsächlichen MOSS-Website, die die benutzerdefinierte Liste Anbieter hostet.
Zeichenfolge SpVendorListName; // Name der eigentlichen MOSS Liste mit Anbietern.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
Verwendung (SPSite Website = Neu SPSite(SpVendorSiteName))
{
Verwendung (SPWeb Web = Site. OpenWeb())
{
SPList CurrentList = Web. Listen[SpVendorListName];
foreach (SPItem vendorItem im currentList.Items)
{
If (vendorItem["Herstellernamen"] == NULL) weiter;
If (vendorItem["Herstellernamen"].ToString().Entspricht(werden))
Rückkehr Neu Hersteller(vendorItem);
}
Hersteller V = Neu Hersteller();
v.VendorPhone = "nicht gefunden: " + werden;
Rückkehr v;
Rückkehr NULL;
} // mit Spweb Web = site.openweb()
} // Nutzung Spsite Site = neue Spsite("http://Localhost/Mizuho")
} // Methode
[WebMethod]
öffentliche Hersteller[] GetVendorsOfType (Zeichenfolge filterType)
{
Zeichenfolge SpVendorSiteName; // Namen der tatsächlichen MOSS-Website, die t hostet
benutzerdefinierte Liste der He-Anbieter.
Zeichenfolge SpVendorListName; // Name der eigentlichen MOSS Liste mit Anbietern.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
Hersteller[] Ergebnisliste;
int VendorIndex = 0;
Ergebnisliste = Neu Hersteller[1000];
// Die Liste mit einer Standardnachricht freundlich zu initialisieren.
Hersteller V = Neu Hersteller();
v.VendorName = "Wählen Sie einen Hersteller um diese Liste zu füllen.";
Ergebnisliste[0] = v;
// Konvertieren Sie den Filter in Kleinbuchstaben für später einfacher String-Vergleiche.
FilterType = filterType.ToLower();
// Wenn der Filtertyp übergeben wird "test", einige einfachen Daten generieren.
#Gebiet Filter Typ = "test"
If (Equals FilterType.("test"))
Rückkehr GenerateTestVendors();
#endregion
If (wahr)
{
Verwendung (SPSite Website = Neu SPSite(SpVendorSiteName))
{
Verwendung (SPWeb Web = Site. OpenWeb())
{
V = NULL;
SPList CurrentList = Web. Listen[SpVendorListName];
// Durchlaufen Sie aller Elemente in der Liste der Anbieter.
foreach (SPItem vendorItem im currentList.Items)
{
Zeichenfolge lowerVendorType;
LowerVendorType = VendorItem["PurchaseType"].ToString().ToLower();
LowerVendorType = lowerVendorType.Substring(3);
If (Gleich LowerVendorType.(filterType))
{
Ergebnisliste[VendorIndex ] = Neu Hersteller(vendorItem);
}
} // Iteration über alle Anbieter in der Liste
Rückkehr TrimVendorArray(vendorIndex, Ergebnisliste);
// Ergebnisliste zurückkehren;
} // mit Spweb Web = site.openweb()
} // Nutzung Spsite Site = neue Spsite("http://Localhost/Mizuho")
} // Wenn der Wert true
Rückkehr NULL;
}
Privat Hersteller[] TrimVendorArray(int newSize, Hersteller[] originalVendorArray)
{
Hersteller[] trimmedArray;
If (NewSize == 0) NewSize = 1;
TrimmedArray = Neu Hersteller[newSize];
int CurrentCounter = 0;
für (CurrentCounter = 0; currentCounter < newSize; CurrentCounter )
{
trimmedArray[currentCounter] = originalVendorArray[currentCounter];
}
Rückkehr trimmedArray;
}
}