Bedrijfsscenario:
Bieden een methode waarmee gebruikers snel invoeren van nauwkeurige aankoop vorderingen.
Bedrijfsprobleem:
De cliënt doet zaken met meerdere honderden leveranciers.
Leveranciers zijn "type" specifieke. Dit betekent dat een leverancier computerapparatuur verkoopt (bijvoorbeeld. Dell) of kantoorbenodigdheden (bijvoorbeeld. Nietjes).
Hoe we eindgebruikers die aankoop vorderingen Selecteer een geldige leverancier maken inschakelen?
Zakelijke oplossing:
Onderscheiden van leveranciers in het systeem via "type".
Gebruikers om te selecteren van het type"in staat stellen" van product en geef vervolgens een gefilterde set van passende leveranciers.
Technische oplossing:
Een InfoPath-formulier is ontworpen dat stelt gebruikers in staat om online vorderingen kopen.
Twee InfoPath selectie lijsten beheren leverancier selectie. Eerste, de gebruiker selecteert een type"inkoop". Dit houdt in dat een tweede selectielijst bevatten alleen leveranciers die voor dat type Inkoop verkopen. Dit is een klassieke trapsgewijze keuzelijst.
Leveranciers worden opgeslagen in een aangepaste lijst van MOSS met aangepaste kolommen voor leverancier kenmerken zoals naam, adres en vooral "type".
Uitvoering van een webservice voor een InfoPath-client om te consumeren die een iteratie uitgevoerd via de aangepaste leveranciersoverzicht, alleen leveranciers overeenkomt met een meegeleverde "type" terug te keren.
Aanroepen van de webservice via het InfoPath-formulier.
Geleerde lessen:
- Eerste, het lijkt noodzakelijk om deze route te gaan. Ik zou liever om te doen de filtering volledig binnen InfoPath en niet het maken van een web service functionaliteit hier. Echter, formulieren server voorziet niet in de vereiste filterfunctie. Kunnen we een regel op een het type"" keuzelijst in het formulier in om de soort van de leverancier query opnieuw te openen, maar we kan niet krijgen om goed te werken. Daarom, het was nodig voor de uitvoering van de webservice.
- Dit is een klassieke "trapsgewijze keuzelijst" probleem in de InfoPath forms server wereld en er zijn vele goede voorbeelden die er waarin wordt uitgelegd hoe dit op te lossen.
- Een lege waarde voor een kolom in het leveranciersoverzicht geeft geen resultaat een lege tekenreeks wanneer verwezen als dit: initItem["De naam van de verkoper"]. In plaats daarvan, het geeft als resultaat een null.
Sommige andere notities:
- Ik retourneren een matrix[] van leveranciers omdat ik had grote moeite terug te keren een ArrayList. InfoPath was klagen over het en ik heb niet de tijd of de neiging om te vechten over het. Dit, Natuurlijk, Zet een kunstmatige limiet op het totale aantal leveranciers. Het ook gedwongen mij te voeren een trim() methode op de array omdat ik haat het idee van terugkeer terug 100's van null leveranciers. InfoPath schelen niet, maar het gezeurd op mij. (Weer, Dit was makkelijker dan InfoPath vechten over ArrayLists).
- Ik heb een GetSpecificVendorByName geïmplementeerd() functie, die kan worden leerzaam.
De code:
met behulp van Systeem;
met behulp van System.Web;
met behulp van System.Web.Services;
met behulp van System.Web.Services.Protocols;
met behulp van Microsoft.SharePoint;
met behulp van System.Configuration;
/// <Samenvatting>
/// Service leverancier: Biedt leverancier gerelateerde services die vandaag de dag worden verbruikt door een infopath-formulier voor client.
///
/// Geschiedenis:
/// ——–
/// 07/24/07: Eerste codering, Paul J. Gavin van Conchango.
///
/// </Samenvatting>
[WebService(Namespace = 'http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
openbare klasse VendorService : System.Web.Services.WebService
{
/// <Samenvatting>
/// Hiermee geeft u een leverancier uit een aangepaste sharepoint-lijst onderhouden door MSUSA.
/// </Samenvatting>
openbare klasse Leverancier
{
openbare Leverancier() { }
openbare Leverancier(SPItem initItem)
{
Als (! (initItem["De naam van de verkoper"] == Null)) Leveranciersnaam = initItem["De naam van de verkoper"].ToString();
Als (! (initItem["Adres 1"] == Null)) VendorAddress1 = initItem["Adres 1"].ToString();
Als (! (initItem["Adres 2"] == Null)) VendorAddress2 = initItem["Adres 2"].ToString();
Als (! (initItem["City"] == Null)) VendorCity = initItem["City"].ToString();
Als (! (initItem["VendorPhone"] == Null)) VendorPhone = initItem["VendorPhone"].ToString();
Als (! (initItem["PurchaseType"] == Null)) VendorType = initItem["PurchaseType"].ToString();
Als (! (initItem["State"] == Null)) VendorState = initItem["State"].ToString();
Als (! (initItem["Zip"] == Null)) VendorZip = initItem["Zip"].ToString();
Als (!(initItem["Fax"] == Null)) VendorFax = initItem["Fax"].ToString();
Als (!(initItem["SalesRepName"] == Null)) VendorSalesRepName = initItem["SalesRepName"].ToString();
VendorItemId = initItem.ID; // Unieke ID onderhouden via MOSS.
}
openbare int VendorItemId;
openbare tekenreeks Leveranciersnaam;
openbare tekenreeks VendorAddress1;
openbare tekenreeks VendorAddress2;
openbare tekenreeks VendorCity;
openbare tekenreeks VendorState;
openbare tekenreeks VendorZip;
openbare tekenreeks VendorPhone;
openbare tekenreeks VendorType;
openbare tekenreeks VendorSalesRepName;
openbare tekenreeks VendorFax;
}
openbare VendorService () {
//Uncomment de volgende regel als gebruikt ontworpen onderdelen
//InitializeComponent();
}
privé Leverancier[] GenerateTestVendors()
{
Leverancier[] Resultaten;
Resultaten = Nieuw Leverancier[100];
Leverancier v;
v = Nieuw Leverancier();
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";
Resultaten[0] = v;
v = Nieuw Leverancier();
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";
Resultaten[1] = v;
v = Nieuw Leverancier();
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";
Resultaten[2] = v;
terugkeer Resultaten;
}
[WebMethod]
openbare Leverancier GetSpecificVendorById(int vendorId)
{
tekenreeks SpVendorSiteName; // Naam van de werkelijke MOSS-site die als host optreedt van de aangepaste lijst van de leverancier.
tekenreeks SpVendorListName; // Naam van de werkelijke MOSS lijst met leveranciers.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
met behulp van (SPSite site = Nieuw SPSite(SpVendorSiteName))
{
met behulp van (SPWeb Web = site. OpenWeb())
{
SPList currentList = web. Lijsten[SpVendorListName];
SPItem specificItem = currentList.Items[vendorId];
terugkeer Nieuw Leverancier(specificItem);
} // met behulp van spweb web = site.openweb()
} // gebruik van spsite site = nieuwe spsite('http://localhost/mizuho")
}
[WebMethod]
// Wordt ervan uitgegaan dat de naam van de verkoper uniek is, vanuit een zakelijk perspectief
openbare Leverancier GetSpecificVendorByVendorName(tekenreeks worden)
{
tekenreeks SpVendorSiteName; // Naam van de werkelijke MOSS-site die als host optreedt van de aangepaste lijst van de leverancier.
tekenreeks SpVendorListName; // Naam van de werkelijke MOSS lijst met leveranciers.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
met behulp van (SPSite site = Nieuw SPSite(SpVendorSiteName))
{
met behulp van (SPWeb Web = site. OpenWeb())
{
SPList currentList = web. Lijsten[SpVendorListName];
foreach (SPItem vendorItem in currentList.Items)
{
Als (vendorItem["De naam van de verkoper"] == Null) «««;
Als (vendorItem["De naam van de verkoper"].ToString().Is gelijk aan(worden))
terugkeer Nieuw Leverancier(vendorItem);
}
Leverancier v = Nieuw Leverancier();
v.VendorPhone = 'niet gevonden: " + worden;
terugkeer v;
terugkeer Null;
} // met behulp van spweb web = site.openweb()
} // gebruik van spsite site = nieuwe spsite('http://localhost/mizuho")
} // methode
[WebMethod]
openbare Leverancier[] GetVendorsOfType (tekenreeks filterType)
{
tekenreeks SpVendorSiteName; // Naam van de werkelijke MOSS-site die als host optreedt van t
Hij leverancier aangepaste lijst.
tekenreeks SpVendorListName; // Naam van de werkelijke MOSS lijst met leveranciers.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
Leverancier[] Resultaten;
int vendorIndex = 0;
Resultaten = Nieuw Leverancier[1000];
// De lijst met een vriendelijke standaardbericht initialiseren.
Leverancier v = Nieuw Leverancier();
v.VendorName = "Selecteer een leveranciertype om deze lijst te vullen.";
Resultaten[0] = v;
// Het filter converteren naar kleine letters voor later gemakkelijker tekenreeksvergelijking.
filterType = filterType.ToLower();
// Als u het filtertype doorgegeven is "test", sommige eenvoudige gegevens genereren.
#regio Filtertype = "test"
Als (filterType. is gelijk aan("test"))
terugkeer GenerateTestVendors();
#endregion
Als (True)
{
met behulp van (SPSite site = Nieuw SPSite(SpVendorSiteName))
{
met behulp van (SPWeb Web = site. OpenWeb())
{
v = Null;
SPList currentList = web. Lijsten[SpVendorListName];
// Alle items in het leveranciersoverzicht doorlopen.
foreach (SPItem vendorItem in currentList.Items)
{
tekenreeks lowerVendorType;
lowerVendorType = vendorItem["PurchaseType"].ToString().ToLower();
lowerVendorType = lowerVendorType.Substring(3);
Als (lowerVendorType. is gelijk aan(filterType))
{
Resultaten[vendorIndex ] = Nieuw Leverancier(vendorItem);
}
} // doorlopen door alle leveranciers in de lijst
terugkeer TrimVendorArray(vendorIndex, Resultaten);
// retourneren van de resultaten;
} // met behulp van spweb web = site.openweb()
} // gebruik van spsite site = nieuwe spsite('http://localhost/mizuho")
} // Als de waarde true
terugkeer Null;
}
privé Leverancier[] TrimVendorArray(int newsize, Leverancier[] originalVendorArray)
{
Leverancier[] trimmedArray;
Als (newsize == 0) newsize = 1;
trimmedArray = Nieuw Leverancier[newsize];
int currentCounter = 0;
voor (currentCounter = 0; currentCounter < newsize; currentCounter )
{
trimmedArray[currentCounter] = originalVendorArray[currentCounter];
}
terugkeer trimmedArray;
}
}