Escenario de negocio:
Proporcionar un método que permite a los usuarios entrar en las requisiciones de compra precisa rápidamente.
Problema del negocio:
El cliente hace negocios con varios proveedores de cien.
Los vendedores son "tipo" específicos. Esto significa que el vendedor vende equipos informáticos (por ejemplo:. Dell) o suministros de oficina (por ejemplo:. Staples).
Cómo nos permiten a los usuarios finales que crean Seleccione las requisiciones de compra un vendedor válido?
Solución de negocio:
Distinguir los vendedores en el sistema a través de "tipo".
Permiten a los usuarios seleccionar el "tipo" de producto proporciona un conjunto filtrado de proveedores adecuados.
Solución técnica:
Se ha diseñado un formulario de InfoPath que permite a los usuarios entrar en línea requisiciones de compra.
Selección de proveedores de control de dos listas de selección de InfoPath. Primero, el usuario selecciona un tipo de"compra". Esto limita una segunda lista de selección para contener solamente los proveedores que venden para ese tipo de compra. Se trata de un desplegable en cascada clásico.
Los vendedores se almacenan en una lista personalizada de MOSS con columnas personalizadas para los atributos como nombre proveedor, Dirección y sobre todo "tipo".
Implementar un servicio web para un cliente de InfoPath consumir itera a través de la lista de proveedores personalizados, devolver sólo los proveedores que empareja un "tipo" proporcionado.
Invocar el servicio web mediante el formulario de InfoPath.
Lecciones aprendidas:
- Primero, Parece necesario seguir esta ruta. Hubiera preferido hacer el filtrado completamente dentro de InfoPath y no crea ninguna funcionalidad de servicio web aquí. Sin embargo, servidor de formas no proporcionan la funcionalidad de filtrado requerida. Podemos poner una regla en un tipo"" lista de selección en la forma de una especie de volver a abrir la consulta de proveedores, Pero no podemos hacerlo para que funcione correctamente. Por lo tanto, era necesario implementar el servicio web.
- Este es una clásico "en cascada lista de selección" problema en el InfoPath forma mundial de servidores y hay muchos buenos ejemplos por ahí que explican cómo resolver esto.
- Un valor en blanco para una columna en la lista de proveedores no devuelve una cadena vacía cuando se hace referencia como esta: initItem["Nombre del proveedor"]. En su lugar, Devuelve un valor null.
Algunas otras notas:
- Vuelva una matriz[] de los vendedores porque tenía cierta dificultad devolver una lista de matrices. InfoPath se quejó de ello y no tuve el tiempo ni la inclinación a pelear por él. Esto, Claro, pone un límite artificial sobre el número total de proveedores. También me obligó a aplicar un recorte() método de la matriz porque odio la idea de volver atrás 100 vendedores null. InfoPath no le importa, Pero daba la lata a mí. (Nuevo, Esto era más fácil que InfoPath peleando ArrayLists).
- Implementé un GetSpecificVendorByName() así como la función, que puede ser instructivo.
El código:
utilizando Sistema;
utilizando System.Web;
utilizando System.Web.Services;
utilizando System.Web.Services.Protocols;
utilizando Microsoft.SharePoint;
utilizando System.Configuration;
/// <Resumen>
/// Proveedor servicio: Proporciona el proveedor relacionados con servicios que hoy son consumidos por un formulario de cliente de infopath.
///
/// Historia:
/// ——–
/// 07/24/07: Inicial de codificación, Paul J. Gavin de Conchango.
///
/// </Resumen>
[WebService(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
público clase VendorService : System.Web.Services.WebService
{
/// <Resumen>
/// Representa un proveedor de una lista personalizada de sharepoint MSUSA.
/// </Resumen>
público clase Proveedor
{
público Proveedor() { }
público Proveedor(SPItem initItem)
{
Si (! (initItem["Nombre del proveedor"] == NULL)) NombreDeProveedor = initItem["Nombre del proveedor"].ToString();
Si (! (initItem["Dirección 1"] == NULL)) VendorAddress1 = initItem["Dirección 1"].ToString();
Si (! (initItem["Dirección 2"] == NULL)) VendorAddress2 = initItem["Dirección 2"].ToString();
Si (! (initItem["La ciudad"] == NULL)) VendorCity = initItem["La ciudad"].ToString();
Si (! (initItem["VendorPhone"] == NULL)) VendorPhone = initItem["VendorPhone"].ToString();
Si (! (initItem["PurchaseType"] == NULL)) VendorType = initItem["PurchaseType"].ToString();
Si (! (initItem["Estado"] == NULL)) VendorState = initItem["Estado"].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 único gracias a MOSS.
}
público int VendorItemId;
público cadena NombreDeProveedor;
público cadena VendorAddress1;
público cadena VendorAddress2;
público cadena VendorCity;
público cadena VendorState;
público cadena VendorZip;
público cadena VendorPhone;
público cadena VendorType;
público cadena VendorSalesRepName;
público cadena VendorFax;
}
público VendorService () {
//Descomentar la siguiente línea si utiliza componentes diseñados
//InitializeComponent();
}
privada Proveedor[] GenerateTestVendors()
{
Proveedor[] resultList;
resultList = Nuevo Proveedor[100];
Proveedor v;
v = Nuevo Proveedor();
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";
resultList[0] = v;
v = Nuevo Proveedor();
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 = Nuevo Proveedor();
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;
retorno resultList;
}
[WebMethod]
público Proveedor GetSpecificVendorById(int Identificador)
{
cadena SpVendorSiteName; // Nombre del Real Sitio MOSS que aloja la lista de proveedores de encargo.
cadena SpVendorListName; // Nombre de la actual lista de musgo proveedores.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
utilizando (SPSite sitio = Nuevo SPSite(SpVendorSiteName))
{
utilizando (SPWeb Web = página. OpenWeb())
{
SPList currentList = web. Listas de[SpVendorListName];
SPItem specificItem = currentList.Items[Identificador];
retorno Nuevo Proveedor(specificItem);
} // uso de spweb web = site.openweb()
} // uso de spsite site = new spsite("http://localhost/mizuho")
}
[WebMethod]
// Se supone que el nombre del proveedor es único, desde una perspectiva empresarial
público Proveedor GetSpecificVendorByVendorName(cadena ser)
{
cadena SpVendorSiteName; // Nombre del Real Sitio MOSS que aloja la lista de proveedores de encargo.
cadena SpVendorListName; // Nombre de la actual lista de musgo proveedores.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
utilizando (SPSite sitio = Nuevo SPSite(SpVendorSiteName))
{
utilizando (SPWeb Web = página. OpenWeb())
{
SPList currentList = web. Listas de[SpVendorListName];
foreach (SPItem vendorItem en currentList.Items)
{
Si (vendorItem["Nombre del proveedor"] == NULL) «««;
Si (vendorItem["Nombre del proveedor"].ToString().Es igual a(ser))
retorno Nuevo Proveedor(vendorItem);
}
Proveedor v = Nuevo Proveedor();
v.VendorPhone = "no se encuentra: " + ser;
retorno v;
retorno NULL;
} // uso de spweb web = site.openweb()
} // uso de spsite site = new spsite("http://localhost/mizuho")
} // método
[WebMethod]
público Proveedor[] GetVendorsOfType (cadena filterType)
{
cadena SpVendorSiteName; // Nombre del Real Sitio MOSS que aloja t
lista personalizada de proveedores.
cadena SpVendorListName; // Nombre de la actual lista de musgo proveedores.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
Proveedor[] resultList;
int vendorIndex = 0;
resultList = Nuevo Proveedor[1000];
// Inicializar la lista con un mensaje amigable por defecto.
Proveedor v = Nuevo Proveedor();
v.VendorName = "Seleccione un tipo de proveedor para completar esta lista.";
resultList[0] = v;
// Convertir el filtro inferior caso para más fácil comparación de cadenas más adelante.
filterType = filterType.ToLower();
// Si pasado el tipo de filtro es "prueba", generar algunos datos simples.
#región Tipo de filtro = "prueba de la"
Si (Iguales filterType.("prueba de"))
retorno GenerateTestVendors();
#endregion
Si (verdadero)
{
utilizando (SPSite sitio = Nuevo SPSite(SpVendorSiteName))
{
utilizando (SPWeb Web = página. OpenWeb())
{
v = NULL;
SPList currentList = web. Listas de[SpVendorListName];
// Recorrer en iteración todos los elementos de la lista de proveedores de.
foreach (SPItem vendorItem en currentList.Items)
{
cadena lowerVendorType;
lowerVendorType = vendorItem["PurchaseType"].ToString().ToLower();
lowerVendorType = lowerVendorType.Substring(3);
Si (igual a lowerVendorType.(filterType))
{
resultList[vendorIndex ] = Nuevo Proveedor(vendorItem);
}
} // Iterar a través de todos los proveedores en la lista
retorno TrimVendorArray(vendorIndex, resultList);
// volver resultList;
} // uso de spweb web = site.openweb()
} // uso de spsite site = new spsite("http://localhost/mizuho")
} // Si es cierto
retorno NULL;
}
privada Proveedor[] TrimVendorArray(int NewSize, Proveedor[] originalVendorArray)
{
Proveedor[] trimmedArray;
Si (NewSize == 0) NewSize = 1;
trimmedArray = Nuevo Proveedor[NewSize];
int currentCounter = 0;
para (currentCounter = 0; currentCounter < NewSize; currentCounter )
{
trimmedArray[currentCounter] = originalVendorArray[currentCounter];
}
retorno trimmedArray;
}
}