Escenari de negocis:
Proporcionar un mètode que permet als usuaris introduir precisa compra requisitions ràpidament.
Problema de negoci:
El client fa negoci amb diversos centenars de proveïdors.
Els venedors són "tipus" específics. Això significa que un distribuïdor ven equips informàtics (e. g. Dell) o material d'oficina (e. g. Staples).
Com podem permetre als usuaris finals que creen compra requisitions seleccionar un proveïdor vàlid?
Solució de negoci:
Diferenciar els venedors en el sistema via "tipus".
Permeten usuaris seleccionar el tipus de"" de producte and then provide un conjunt filtrat de venedors apropiats.
Solució tècnica:
Una forma d'InfoPath ha estat dissenyat que permet als usuaris introduir en línia compra requisitions.
Selecció de venedor de control de dues llistes de selecció d'InfoPath. Primer, l'usuari selecciona un tipus de"compra". Això limita una segona llista de selecció per contenir només els venedors que venen per a aquest tipus de compra. Aquest és un clàssic en cascada desplegable.
Els venedors s'emmagatzemen en una llista personalitzada de MOSS amb la columnes personalitzat per atributs venedor com ara nom, Adreça i especialment "tipus".
Implementar un servei web per a un client de l'InfoPath consumir que itera a través de la llista de proveïdors de costum, tornar només els venedors que coincideixen amb un subministrada "tipus".
Invocar el servei web mitjançant el formulari de l'InfoPath.
Lliçons apreses:
- Primer, sembla necessari per seguir aquest camí. Hauria preferit de fer la filtració totalment dins de l'InfoPath i no crear cap funcionalitat servei web aquí. No obstant això, servidor de formes no proporciona la capacitat de filtració requerida. Podem posar una regla a del tipus"" Llista de selecció en forma per tipus de tornar a obrir la consulta proveïdors, però no podem aconseguir-lo treballar pròpiament. Per tant, era necessari implementar el servei de web.
- Aquest és un clàssic "cascada llista de selecció" problema a l'InfoPath formes món del servidor i hi ha molts bons exemples fora d'allà que expliquen com resoldre-ho.
- Un valor en blanc per a una columna a la llista de proveïdors no retorna una cadena buida quan es fa referència com aquest: initItem["El nom del proveïdor"]. En canvi, es retorna un valor null.
Alguns altres Notes:
- Puc retornar una matriu[] dels venedors perquè he tingut algunes dificultats tornant un ArrayList. L'InfoPath es queixava sobre això i no tinc el temps o la inclinació de lluitar pel. Això, clar, posa un límit artificial sobre el nombre total de venedors. Això també em d'aplicar una retallada obligat() mètode en la matriu perquè m'agrada la idea de tornar enrere 100 dels venedors nuls. L'InfoPath no li importa, però li molestava en mi. (Una altra vegada, això era més fàcil que l'InfoPath barallant perquè el ArrayLists).
- Vaig implementar un GetSpecificVendorByName() funció, així, que pot ser instructiu.
El codi:
utilitzant Sistema;
utilitzant System;
utilitzant System.Web.Services;
utilitzant System.Web.Services.Protocols;
utilitzant Microsoft.SharePoint;
utilitzant System.Configuration;
/// <resum>
/// Proveïdor de servei: Proporciona venedor relacionats amb serveis que avui són consumides per una forma de client de l'infopath.
///
/// Història:
/// ——–
/// 07/24/07: Inicial de codificació, Paul J. Gavin de Conchango.
///
/// </resum>
[WebService(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
públic classe VendorService : System.Web.Services.WebService
{
/// <resum>
/// Representa un venedor d'una llista de costum sharepoint mantingut per MSUSA.
/// </resum>
públic classe Venedor
{
públic Venedor() { }
públic Venedor(SPItem initItem)
{
Si (! (initItem["El nom del proveïdor"] == nul·la)) VendorName = initItem["El nom del proveïdor"].ToString();
Si (! (initItem[«Discurs 1"] == nul·la)) VendorAddress1 = initItem[«Discurs 1"].ToString();
Si (! (initItem[«Discurs 2"] == nul·la)) VendorAddress2 = initItem[«Discurs 2"].ToString();
Si (! (initItem["Ciutat"] == nul·la)) VendorCity = initItem["Ciutat"].ToString();
Si (! (initItem["VendorPhone"] == nul·la)) VendorPhone = initItem["VendorPhone"].ToString();
Si (! (initItem["PurchaseType"] == nul·la)) VendorType = initItem["PurchaseType"].ToString();
Si (! (initItem["L'estat"] == nul·la)) VendorState = initItem["L'estat"].ToString();
Si (! (initItem["Zip"] == nul·la)) VendorZip = initItem["Zip"].ToString();
Si (!(initItem["Fax"] == nul·la)) VendorFax = initItem["Fax"].ToString();
Si (!(initItem["SalesRepName"] == nul·la)) VendorSalesRepName = initItem["SalesRepName"].ToString();
VendorItemId = initItem.ID; // ID únic mantingut mitjançant molsa.
}
públic Int VendorItemId;
públic corda VendorName;
públic corda VendorAddress1;
públic corda VendorAddress2;
públic corda VendorCity;
públic corda VendorState;
públic corda VendorZip;
públic corda VendorPhone;
públic corda VendorType;
públic corda VendorSalesRepName;
públic corda VendorFax;
}
públic VendorService () {
//Incomenti la línia següent si utilitzant dissenyat components de
//InitializeComponent();
}
privat Venedor[] GenerateTestVendors()
{
Venedor[] resultList;
resultList = nou Venedor[100];
Venedor v;
v = nou Venedor();
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 = nou Venedor();
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 = nou Venedor();
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;
retorn resultList;
}
[WebMethod]
públic Venedor GetSpecificVendorById(Int vendorId)
{
corda SpVendorSiteName; // Nom del lloc real molsa que allotja la llista personalitzades proveïdor.
corda SpVendorListName; // Nom de la llista actual de molsa que conté venedors.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
utilitzant (SPSite lloc = nou SPSite(SpVendorSiteName))
{
utilitzant (SPWeb web = lloc. OpenWeb())
{
SPList currentList = la web. Llistes[SpVendorListName];
SPItem specificItem = currentList.Items[vendorId];
retorn nou Venedor(specificItem);
} // utilitzant spweb web = site.openweb()
} // utilitzant spsite lloc = spsite nou("http://localhost/mizuho")
}
[WebMethod]
// Assumeix que el nom de proveïdor és únic, des de la perspectiva empresarial
públic Venedor GetSpecificVendorByVendorName(corda ser)
{
corda SpVendorSiteName; // Nom del lloc real molsa que allotja la llista personalitzades proveïdor.
corda SpVendorListName; // Nom de la llista actual de molsa que conté venedors.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
utilitzant (SPSite lloc = nou SPSite(SpVendorSiteName))
{
utilitzant (SPWeb web = lloc. OpenWeb())
{
SPList currentList = la web. Llistes[SpVendorListName];
foreach (SPItem vendorItem en currentList.Items)
{
Si (vendorItem["El nom del proveïdor"] == nul·la) «««;
Si (vendorItem["El nom del proveïdor"].ToString().És igual a(ser))
retorn nou Venedor(vendorItem);
}
Venedor v = nou Venedor();
v.VendorPhone = "no es troba: " + ser;
retorn v;
retorn nul·la;
} // utilitzant spweb web = site.openweb()
} // utilitzant spsite lloc = spsite nou("http://localhost/mizuho")
} // mètode
[WebMethod]
públic Venedor[] GetVendorsOfType (corda filterType)
{
corda SpVendorSiteName; // Nom del lloc real molsa que allotja t
llista personalitzades de proveïdors de va.
corda SpVendorListName; // Nom de la llista actual de molsa que conté venedors.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
Venedor[] resultList;
Int vendorIndex = 0;
resultList = nou Venedor[1000];
// Inicialitzar la llista amb un missatge amable per defecte.
Venedor v = nou Venedor();
v.VendorName = "Seleccionar un tipus de venedor a poblar aquesta llista.";
resultList[0] = v;
// Convertir el filtre a minúscules per a la comparació de corda més fàcil més tard.
filterType = filterType.ToLower();
// Si el tipus de filtre passat és "prova", generar algunes dades simples.
#regió Tipus de filtre = "prova"
Si (equival a filterType.(«prova"))
retorn GenerateTestVendors();
#endregion
Si (True)
{
utilitzant (SPSite lloc = nou SPSite(SpVendorSiteName))
{
utilitzant (SPWeb web = lloc. OpenWeb())
{
v = nul·la;
SPList currentList = la web. Llistes[SpVendorListName];
// Recórrer tots els elements a la llista de proveïdors.
foreach (SPItem vendorItem en currentList.Items)
{
corda lowerVendorType;
lowerVendorType = vendorItem["PurchaseType"].ToString().ToLower();
lowerVendorType = lowerVendorType.Substring(3);
Si (equival a lowerVendorType.(filterType))
{
resultList[vendorIndex ] = nou Venedor(vendorItem);
}
} // itereu seguit tots els proveïdors de la llista
retorn TrimVendorArray(vendorIndex, resultList);
// tornar resultList;
} // utilitzant spweb web = site.openweb()
} // utilitzant spsite lloc = spsite nou("http://localhost/mizuho")
} // Si és cert
retorn nul·la;
}
privat Venedor[] TrimVendorArray(Int newsize, Venedor[] originalVendorArray)
{
Venedor[] trimmedArray;
Si (newsize = = 0) newsize = 1;
trimmedArray = nou Venedor[newsize];
Int currentCounter = 0;
per a (currentCounter = 0; currentCounter < newsize; currentCounter )
{
trimmedArray[currentCounter] = originalVendorArray[currentCounter];
}
retorn trimmedArray;
}
}