Scénario d'entreprise:
Fournir une méthode qui permet aux utilisateurs d'entrer rapidement les demandes d'achat précis.
Problème commercial:
Le client fait affaire avec plusieurs fournisseurs de centaines.
Les fournisseurs sont de type"" spécifiques. Cela signifie qu'un vendeur vend du matériel de l'ordinateur (e.g. Référence Dell) ou de fournitures de bureau (e.g. Staples).
Comment est-ce que nous avons active des utilisateurs finaux qui créer achat réquisitions, sélectionnez un fournisseur valide?
Solution d'affaires:
Différencier les vendeurs dans le système par l'intermédiaire de « type ».
Permettre aux utilisateurs de sélectionner le type"" du produit et ensuite fournir un ensemble filtré de fournisseurs appropriés.
Solution technique:
Un formulaire InfoPath a été conçu pour que les demandes d'achat permet aux utilisateurs de s'inscrire en ligne.
Deux listes de sélection InfoPath contrôlent la sélection des fournisseurs. Première, l'utilisateur sélectionne un type de « achat ». Ce qui limite une deuxième liste de sélection afin qu'il contienne uniquement les fournisseurs qui vendent pour ce type d'achat. Il s'agit d'un classique déroulantes en cascade.
Vendeurs sont stockés dans une liste personnalisée de mousse avec des colonnes personnalisées pour les attributs du vendeur comme nom, adresse et surtout « type ».
Implémenter un service web pour un client InfoPath à consommer qui parcourt la liste des fournisseurs personnalisés, retourner uniquement les fournisseurs correspondant à un « type » fourni.
Invoquer le service web via le formulaire InfoPath.
Leçons apprises:
- Première, Il semble nécessaire d'emprunter cette voie. J'aurais préféré faire le filtrage entièrement dans InfoPath et ne crée pas une fonctionnalité du service web ici. Cependant, serveur de formulaires ne fournit pas la fonctionnalité de filtrage requise. Nous pouvons mettre une règle sur un "type" liste de sélection dans le formulaire de sorte de ré-ouvrir la requête du vendeur, mais nous ne pouvons pas faire fonctionner correctement. Donc, il était nécessaire de mettre en place le service web.
- Il s'agit d'une liste de sélection en cascade classique"" problème dans l'InfoPath forme monde serveur et il y a là-bas plusieurs bons exemples qui expliquent comment résoudre ce problème.
- Une valeur vide pour une colonne dans la liste des fournisseurs ne retourne pas une chaîne vide lorsqu'ils sont référencés comme ceci: initItem["Nom du vendeur"]. Au lieu de cela, elle retourne une valeur null.
Quelques autres Notes:
- Je reviens d'un tableau[] des vendeurs parce que j'ai eu quelques difficultés à retourner un ArrayList. InfoPath a été se plaindre à ce sujet et je n'avais pas le temps ou l'envie de se battre pour elle. Ce, Bien sûr, met une limite artificielle sur le nombre total de fournisseurs. Il contraint également moi pour mettre en œuvre une garniture() méthode sur le tableau parce que je déteste l'idée d'un retour en arrière 100 de vendeurs null. InfoPath ne se soucie pas, mais il a harcelé à moi. (Encore une fois, C'était plus facile que disputent InfoPath ArrayLists).
- J'ai implémenté un GetSpecificVendorByName() fonction aussi bien, qui peut être instructif.
Le code:
à l'aide de Système;
à l'aide de System.Web;
à l'aide de System.Web.Services;
à l'aide de System.Web.Services.Protocols;
à l'aide de Microsoft.SharePoint;
à l'aide de System.Configuration;
/// <Résumé>
/// Fournisseur Service: Offre des services de fournisseurs associés qui aujourd'hui sont consommés par un formulaire du client infopath.
///
/// Histoire:
/// ——–
/// 07/24/07: Codage initial, J Paul. Gavin de Conchango.
///
/// </Résumé>
[WebService(Namespace = « http://www.Conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public classe VendorService : System.Web.Services.WebService
{
/// <Résumé>
/// Représente un fournisseur d'une liste sharepoint personnalisée maintenu par Berthon.
/// </Résumé>
public classe Fournisseur
{
public Fournisseur() { }
public Fournisseur(SPItem initItem)
{
Si (! (initItem["Nom du vendeur"] == null)) VendorName = initItem["Nom du vendeur"].ToString();
Si (! (initItem["Adresse 1"] == null)) VendorAddress1 = initItem["Adresse 1"].ToString();
Si (! (initItem["Adresse 2"] == null)) VendorAddress2 = initItem["Adresse 2"].ToString();
Si (! (initItem["City"] == null)) VendorCity = initItem["City"].ToString();
Si (! (initItem["VendorPhone"] == null)) VendorPhone = initItem["VendorPhone"].ToString();
Si (! (initItem["PurchaseType"] == null)) VendorType = initItem["PurchaseType"].ToString();
Si (! (initItem["État"] == null)) VendorState = initItem["État"].ToString();
Si (! (initItem["Zip"] == null)) VendorZip = initItem["Zip"].ToString();
Si (!(initItem["Fax"] == null)) VendorFax = initItem["Fax"].ToString();
Si (!(initItem["SalesRepName"] == null)) VendorSalesRepName = initItem["SalesRepName"].ToString();
VendorItemId = initItem.ID; // ID unique maintenue par l'intermédiaire de mousse.
}
public int VendorItemId;
public chaîne VendorName;
public chaîne VendorAddress1;
public chaîne VendorAddress2;
public chaîne VendorCity;
public chaîne VendorState;
public chaîne VendorZip;
public chaîne VendorPhone;
public chaîne VendorType;
public chaîne VendorSalesRepName;
public chaîne VendorFax;
}
public VendorService () {
//Décommentez la ligne suivante si vous utilisez des composants conçus
//InitializeComponent();
}
privé Fournisseur[] GenerateTestVendors()
{
Fournisseur[] resultList;
resultList = Nouveau Fournisseur[100];
Fournisseur v;
v = Nouveau Fournisseur();
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 = Nouveau Fournisseur();
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 = Nouveau Fournisseur();
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;
retour resultList;
}
[WebMethod]
public Fournisseur GetSpecificVendorById(int VendorID)
{
chaîne SpVendorSiteName; // Nom du site MOSS réel qui héberge la liste personnalisée du vendeur.
chaîne SpVendorListName; // Nom de la liste réelle de mousses contenant des vendeurs.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
à l'aide de (SPSite site = Nouveau SPSite(SpVendorSiteName))
{
à l'aide de (SPWeb Web = site. OpenWeb())
{
SPList currentList = web. Listes[SpVendorListName];
SPItem specificItem = currentList.Items[VendorID];
retour Nouveau Fournisseur(specificItem);
} // Using web As spweb = site.openweb()
} // en utilisant spsite site = nouvelle spsite(« http://localhost/mizuho")
}
[WebMethod]
// Suppose que le nom du vendeur est unique, dans une perspective d'affaires
public Fournisseur GetSpecificVendorByVendorName(chaîne être)
{
chaîne SpVendorSiteName; // Nom du site MOSS réel qui héberge la liste personnalisée du vendeur.
chaîne SpVendorListName; // Nom de la liste réelle de mousses contenant des vendeurs.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
à l'aide de (SPSite site = Nouveau SPSite(SpVendorSiteName))
{
à l'aide de (SPWeb Web = site. OpenWeb())
{
SPList currentList = web. Listes[SpVendorListName];
foreach (SPItem vendorItem dans currentList.Items)
{
Si (vendorItem["Nom du vendeur"] == null) continuer;
Si (vendorItem["Nom du vendeur"].ToString().Est égal à(être))
retour Nouveau Fournisseur(vendorItem);
}
Fournisseur v = Nouveau Fournisseur();
v.VendorPhone = "non trouvé: " + être;
retour v;
retour null;
} // Using web As spweb = site.openweb()
} // en utilisant spsite site = nouvelle spsite(« http://localhost/mizuho")
} // méthode
[WebMethod]
public Fournisseur[] GetVendorsOfType (chaîne filterType)
{
chaîne SpVendorSiteName; // Nom du site MOSS réel qui héberge t
liste personnalisée de HE du vendeur.
chaîne SpVendorListName; // Nom de la liste réelle de mousses contenant des vendeurs.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
Fournisseur[] resultList;
int vendorIndex = 0;
resultList = Nouveau Fournisseur[1000];
// Initialiser la liste avec un message amical par défaut.
Fournisseur v = Nouveau Fournisseur();
v.VendorName = « Sélectionner un type de fournisseur pour remplir cette liste.";
resultList[0] = v;
// Convertir le filtre en minuscules pour faciliter la comparaison string plus tard.
filterType = filterType.ToLower();
// Si le type de filtre passé est « test », générer des données simples.
#région Type de filtre = "test"
Si (Equals filterType.(« test"))
retour GenerateTestVendors();
#endregion
Si (True)
{
à l'aide de (SPSite site = Nouveau SPSite(SpVendorSiteName))
{
à l'aide de (SPWeb Web = site. OpenWeb())
{
v = null;
SPList currentList = web. Listes[SpVendorListName];
// Parcourir tous les éléments dans la liste des fournisseurs.
foreach (SPItem vendorItem dans currentList.Items)
{
chaîne lowerVendorType;
lowerVendorType = vendorItem["PurchaseType"].ToString().ToLower();
lowerVendorType = lowerVendorType.Substring(3);
Si (égal à lowerVendorType.(filterType))
{
resultList[vendorIndex ] = Nouveau Fournisseur(vendorItem);
}
} // une itération à travers tous les vendeurs dans la liste
retour TrimVendorArray(vendorIndex, resultList);
// retour resultList;
} // Using web As spweb = site.openweb()
} // en utilisant spsite site = nouvelle spsite(« http://localhost/mizuho")
} // Si elle est vraie
retour null;
}
privé Fournisseur[] TrimVendorArray(int newSize, Fournisseur[] originalVendorArray)
{
Fournisseur[] trimmedArray;
Si (newSize == 0) newSize = 1;
trimmedArray = Nouveau Fournisseur[newSize];
int currentCounter = 0;
pour (currentCounter = 0; currentCounter < newSize; currentCounter )
{
trimmedArray[currentCounter] = originalVendorArray[currentCounter];
}
retour trimmedArray;
}
}