Scenario business:
Fornire un metodo che consente agli utenti di immettere rapidamente le richieste di acquisto accurato.
Problema aziendale:
Il cliente fa affari con diverse centinaia di venditori.
Fornitori sono di tipo"" specifiche. Questo significa che un fornitore vende attrezzatura informatica (e. g. Dell) o forniture per ufficio (e. g. Staples).
Come consentire agli utenti finali che creare acquisto requisizioni selezionare un fornitore valido?
Soluzione di business:
Differenziare i fornitori del sistema tramite il "tipo".
Consentire agli utenti di selezionare il tipo"" del prodotto e quindi fornire un set filtrato di venditori appropriati.
Soluzione tecnica:
È stato progettato un modulo di InfoPath che permette agli utenti di immettere on-line le richieste di acquisto.
Due elenchi di selezione InfoPath controllano la selezione del fornitore. Primo, l'utente seleziona un tipo di"acquisto". Questo limita un secondo elenco di selezione per contenere solo fornitori che vendono per quel tipo di acquisto. Si tratta di un classico CSS menu a discesa.
Fornitori sono memorizzati in un elenco personalizzato di muschio con colonne personalizzate per gli attributi di vendor come nome, indirizzo e soprattutto "tipo".
Implementare un servizio web per un client InfoPath a consumare che scorre l'elenco personalizzato fornitore, Tornando solo fornitori un "tipo" fornito di corrispondenza.
Richiamare il servizio web tramite il modulo di InfoPath.
Lezioni apprese:
- Primo, sembra necessario andare questo itinerario. Avrei preferito fare il filtraggio interamente all'interno di InfoPath e non creare alcuna funzionalità di servizio web qui. Tuttavia, Form server non fornisce la necessaria capacità filtrante. Possiamo mettere una regola su un tipo"" lista di selezione sotto forma di sorta di riaprire la query vendor, ma noi non possiamo farlo funzionare correttamente. Pertanto, era necessario implementare il servizio web.
- Questo è un classico "CSS selezione elenco" problema nel InfoPath forma mondo server e ci sono molti buoni esempi là fuori che spiegano come risolvere questo problema.
- Un valore vuoto per una colonna nell'elenco fornitori non restituisce una stringa vuota quando fa riferimento a come questo: initItem["Nome del fornitore"]. Invece, Restituisce un valore null.
Alcune altre note:
- Restituire una matrice[] di venditori perché ho avuto qualche difficoltà restituendo un ArrayList. InfoPath si lamentava e non ho avuto il tempo o l'inclinazione a combattere su di esso. Questo, Naturalmente, mette un limite artificiale al numero totale di fornitori. Esso costretto anche me a implementare un assetto() Metodo sull'array perché io odio l'idea di tornare indietro 100 di fornitori null. Non si cura di InfoPath, ma tormentava me. (Ancora una volta, Questo è stato più facile di combattimento InfoPath sopra ArrayLists).
- Ho implementato un GetSpecificVendorByName() funzione pure, che può essere istruttivo.
Il codice:
utilizzando Sistema;
utilizzando System. Web;
utilizzando System.Web.Services;
utilizzando Protocols;
utilizzando Microsoft. SharePoint;
utilizzando System. Configuration;
/// <Riassunto>
/// Servizio fornitore: Fornisce il fornitore dei servizi che oggi sono consumati da un modulo di infopath client.
///
/// Storia:
/// ——–
/// 07/24/07: Iniziale di codifica, Paul J. Gavin di Conchango.
///
/// </Riassunto>
[WebService(Namespace = "http://www.Conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
pubblica classe VendorService : System.Web.Services.WebService
{
/// <Riassunto>
/// Rappresenta un fornitore da un elenco sharepoint personalizzato gestito da e.
/// </Riassunto>
pubblica classe Fornitore
{
pubblica Fornitore() { }
pubblica Fornitore(SPItem initItem)
{
Se (! (initItem["Nome del fornitore"] == null)) VendorName = initItem["Nome del fornitore"].ToString();
Se (! (initItem["Indirizzo 1"] == null)) VendorAddress1 = initItem["Indirizzo 1"].ToString();
Se (! (initItem["Indirizzo 2"] == null)) VendorAddress2 = initItem["Indirizzo 2"].ToString();
Se (! (initItem["Città"] == null)) VendorCity = initItem["Città"].ToString();
Se (! (initItem["VendorPhone"] == null)) VendorPhone = initItem["VendorPhone"].ToString();
Se (! (initItem["PurchaseType"] == null)) VendorType = initItem["PurchaseType"].ToString();
Se (! (initItem["Stato"] == null)) VendorState = initItem["Stato"].ToString();
Se (! (initItem["Zip"] == null)) VendorZip = initItem["Zip"].ToString();
Se (!(initItem["Fax"] == null)) VendorFax = initItem["Fax"].ToString();
Se (!(initItem["SalesRepName"] == null)) VendorSalesRepName = initItem["SalesRepName"].ToString();
VendorItemId = initItem.ID; // ID univoco mantenuto via MOSS.
}
pubblica int VendorItemId;
pubblica stringa VendorName;
pubblica stringa VendorAddress1;
pubblica stringa VendorAddress2;
pubblica stringa VendorCity;
pubblica stringa VendorState;
pubblica stringa VendorZip;
pubblica stringa VendorPhone;
pubblica stringa VendorType;
pubblica stringa VendorSalesRepName;
pubblica stringa VendorFax;
}
pubblica VendorService () {
//Decommentare la seguente riga se utilizza componenti progettati
//InitializeComponent();
}
privato Fornitore[] GenerateTestVendors()
{
Fornitore[] Risultati;
Risultati = Nuovo Fornitore[100];
Fornitore v;
v = Nuovo Fornitore();
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";
Risultati[0] = v;
v = Nuovo Fornitore();
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";
Risultati[1] = v;
v = Nuovo Fornitore();
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";
Risultati[2] = v;
ritorno Risultati;
}
[WebMethod]
pubblica Fornitore GetSpecificVendorById(int vendorId)
{
stringa SpVendorSiteName; // Nome del sito MOSS effettivo che ospita l'elenco personalizzato fornitore.
stringa SpVendorListName; // Nome dell'elenco effettivo MOSS contenente fornitori.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
utilizzando (SPSite sito = Nuovo SPSite(SpVendorSiteName))
{
utilizzando (SPWeb Web = site. OpenWeb())
{
SPList currentList = web. Elenchi[SpVendorListName];
SPItem specificItem = currentList.Items[vendorId];
ritorno Nuovo Fornitore(specificItem);
} // utilizzando spweb web = site.openweb()
} // utilizzando il sito spsite = nuovo spsite("http://localhost/mizuho")
}
[WebMethod]
// Si presuppone che il nome del fornitore è unico, da una prospettiva di business
pubblica Fornitore GetSpecificVendorByVendorName(stringa essere)
{
stringa SpVendorSiteName; // Nome del sito MOSS effettivo che ospita l'elenco personalizzato fornitore.
stringa SpVendorListName; // Nome dell'elenco effettivo MOSS contenente fornitori.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
utilizzando (SPSite sito = Nuovo SPSite(SpVendorSiteName))
{
utilizzando (SPWeb Web = site. OpenWeb())
{
SPList currentList = web. Elenchi[SpVendorListName];
foreach (SPItem vendorItem in currentList.Items)
{
Se (vendorItem["Nome del fornitore"] == null) continuare;
Se (vendorItem["Nome del fornitore"].ToString().È uguale a(essere))
ritorno Nuovo Fornitore(vendorItem);
}
Fornitore v = Nuovo Fornitore();
v.VendorPhone = "non trovato: " + essere;
ritorno v;
ritorno null;
} // utilizzando spweb web = site.openweb()
} // utilizzando il sito spsite = nuovo spsite("http://localhost/mizuho")
} // Metodo.
[WebMethod]
pubblica Fornitore[] GetVendorsOfType (stringa filterType)
{
stringa SpVendorSiteName; // Nome del sito MOSS effettivo che ospita t
elenco personalizzato di lui fornitore.
stringa SpVendorListName; // Nome dell'elenco effettivo MOSS contenente fornitori.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
Fornitore[] Risultati;
int vendorIndex = 0;
Risultati = Nuovo Fornitore[1000];
// Inizializzare l'elenco con un messaggio predefinito.
Fornitore v = Nuovo Fornitore();
v.VendorName = "Selezionare un tipo di fornitore per compilare questa lista.";
Risultati[0] = v;
// Convertire il filtro in lettere minuscole per più facile confronto di stringhe più tardi.
filterType = filterType.ToLower();
// Se il tipo di filtro passato è "test", generare alcuni semplici dati.
#regione Tipo di filtro = "test"
Se (filterType. Equals("prova"))
ritorno GenerateTestVendors();
#endregion
Se (true)
{
utilizzando (SPSite sito = Nuovo SPSite(SpVendorSiteName))
{
utilizzando (SPWeb Web = site. OpenWeb())
{
v = null;
SPList currentList = web. Elenchi[SpVendorListName];
// Scorrere tutti gli elementi nell'elenco Fornitore.
foreach (SPItem vendorItem in currentList.Items)
{
stringa lowerVendorType;
lowerVendorType = vendorItem["PurchaseType"].ToString().ToLower();
lowerVendorType = lowerVendorType.Substring(3);
Se (lowerVendorType. Equals(filterType))
{
Risultati[vendorIndex ] = Nuovo Fornitore(vendorItem);
}
} // l'iterazione attraverso tutti i fornitori in elenco
ritorno TrimVendorArray(vendorIndex, Risultati);
// restituire risultati;
} // utilizzando spweb web = site.openweb()
} // utilizzando il sito spsite = nuovo spsite("http://localhost/mizuho")
} // Se true
ritorno null;
}
privato Fornitore[] TrimVendorArray(int newSize, Fornitore[] originalVendorArray)
{
Fornitore[] trimmedArray;
Se (newSize = = 0) newSize = 1;
trimmedArray = Nuovo Fornitore[newSize];
int currentCounter = 0;
per (currentCounter = 0; currentCounter < newSize; currentCounter )
{
trimmedArray[currentCounter] = originalVendorArray[currentCounter];
}
ritorno trimmedArray;
}
}