Cenário de negócios:
Fornecer um método que permite aos usuários enter requisições de compra precisas rapidamente.
Problema de negócios:
O cliente faz negócios com vários fornecedores de cem.
Fornecedores são "tipo" específicos. Isso significa que um fornecedor vende equipamentos de informática (EG. Dell) ou material de escritório (EG. Grampos).
Como podemos ativar os usuários finais que criar compra requisições selecionar um fornecedor válido?
Solução de negócios:
Diferenciar fornecedores no sistema por meio do "tipo".
Habilitar usuários selecionar o tipo de"" do produto e, em seguida, fornecer um conjunto filtrado de fornecedores adequados.
Solução técnica:
Foi concebido um formulário do InfoPath que permite aos usuários para entrar on-line Compre requisições.
Duas listas de seleção do InfoPath Controlaram seleção de fornecedor. Primeira, o usuário seleciona um tipo de"compra". Isso limita uma segunda lista de seleção para conter apenas os fornecedores que vendem para esse tipo de compra. Este é uma clássica suspensa em cascata.
Fornecedores são armazenadas em uma lista personalizada de MOSS com colunas personalizadas para atributos como o nome do fornecedor, endereço e especialmente "tipo".
Implementar um serviço da web para um cliente do InfoPath consumir que itera através da lista de fornecedores personalizado, retornando somente fornecedores correspondência um "tipo" fornecido.
Chamar o serviço web através do formulário do InfoPath.
Lições aprendidas:
- Primeira, parece necessário ir esta rota. Eu teria preferido fazer a filtragem totalmente no InfoPath e não criar qualquer funcionalidade do serviço da web aqui. No entanto, servidor de formulários não fornece a capacidade de filtragem necessária. Podemos colocar uma regra para um tipo"" lista de seleção no formulário tipo de reabrir a consulta fornecedor, mas nós não podemos fazê-lo funcionar corretamente. Por conseguinte, era necessário implementar o serviço da web.
- Este é uma clássico "em cascata lista de seleção" problema no InfoPath faz mundo servidor e há muitos bons exemplos lá fora que explicam como resolver isso.
- Um valor em branco para uma coluna na lista fornecedor não retornará um seqüência vazia quando referenciado como este: initItem["Nome do fornecedor"]. Em vez disso, Retorna um valor nulo.
Algumas outras notas:
- Posso devolver uma matriz[] de fornecedores porque eu tive alguma dificuldade para retornar um ArrayList. O InfoPath foi reclamando sobre isso e eu não tenho o tempo ou a inclinação para lutar sobre ele. Isso, É claro, coloca um limite artificial sobre o número total de fornecedores. Ele também me obrigou a implementar uma guarnição() método na matriz porque eu odeio a idéia de voltar volta 100 de fornecedores nulos. O InfoPath não se importa, mas atormentado em mim. (Mais uma vez, Isso foi mais fácil do que brigando InfoPath por ArrayLists).
- Implementei um GetSpecificVendorByName() função bem, que pode ser instrutivo.
O código:
usando Sistema;
usando System. Web;
usando System.Web.Services;
usando Protocols;
usando Microsoft. SharePoint;
usando System. Configuration;
/// <Resumo>
/// Serviço de fornecedor: Fornece serviços de fornecedores relacionados ao que hoje são consumidos por um formulário de cliente do infopath.
///
/// História:
/// ——–
/// 07/24/07: Inicial de codificação, Paul J. Gavin da Conchango.
///
/// </Resumo>
[WebService(Namespace = "http://www.Conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
público Classe VendorService : System.Web.Services.WebService
{
/// <Resumo>
/// Representa um fornecedor de uma lista do sharepoint personalizado mantido por Luis.
/// </Resumo>
público Classe Fornecedor
{
público Fornecedor() { }
público Fornecedor(SPItem initItem)
{
se (! (initItem["Nome do fornecedor"] == nulo)) Nomefornecedor = initItem["Nome do fornecedor"].ToString();
se (! (initItem["Endereço 1"] == nulo)) VendorAddress1 = initItem["Endereço 1"].ToString();
se (! (initItem["Endereço 2"] == nulo)) VendorAddress2 = initItem["Endereço 2"].ToString();
se (! (initItem["Cidade"] == nulo)) VendorCity = initItem["Cidade"].ToString();
se (! (initItem["VendorPhone"] == nulo)) VendorPhone = initItem["VendorPhone"].ToString();
se (! (initItem["PurchaseType"] == nulo)) VendorType = initItem["PurchaseType"].ToString();
se (! (initItem["Estado"] == nulo)) VendorState = initItem["Estado"].ToString();
se (! (initItem["Zip"] == nulo)) VendorZip = initItem["Zip"].ToString();
se (!(initItem["Fax"] == nulo)) VendorFax = initItem["Fax"].ToString();
se (!(initItem["SalesRepName"] == nulo)) VendorSalesRepName = initItem["SalesRepName"].ToString();
VendorItemId = initItem.ID; // ID exclusiva mantida através de musgo.
}
público int VendorItemId;
público Cadeia de caracteres VendorName;
público Cadeia de caracteres VendorAddress1;
público Cadeia de caracteres VendorAddress2;
público Cadeia de caracteres VendorCity;
público Cadeia de caracteres VendorState;
público Cadeia de caracteres VendorZip;
público Cadeia de caracteres VendorPhone;
público Cadeia de caracteres VendorType;
público Cadeia de caracteres VendorSalesRepName;
público Cadeia de caracteres VendorFax;
}
público VendorService () {
//Descomente a linha a seguir se usando componentes concebidos
//InitializeComponent();
}
privada Fornecedor[] GenerateTestVendors()
{
Fornecedor[] Resultados;
Resultados = Novo Fornecedor[100];
Fornecedor v;
v = Novo Fornecedor();
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";
Resultados[0] = v;
v = Novo Fornecedor();
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";
Resultados[1] = v;
v = Novo Fornecedor();
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";
Resultados[2] = v;
Voltar Resultados;
}
[WebMethod]
público Fornecedor GetSpecificVendorById(int vendorId)
{
Cadeia de caracteres SpVendorSiteName; // Nome do site do musgo real que hospeda a lista personalizada de fornecedores.
Cadeia de caracteres SpVendorListName; // Nome da lista de musgo real contendo fornecedores.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
usando (SPSite t: Microsoft.SharePoint.SPSite local = Novo SPSite t: Microsoft.SharePoint.SPSite(SpVendorSiteName))
{
usando (SPWeb Web = site. OpenWeb())
{
SPList t: Microsoft.SharePoint.SPList currentList = web. Listas de[SpVendorListName];
SPItem specificItem = currentList.Items[vendorId];
Voltar Novo Fornecedor(specificItem);
} // usando spweb web = site.openweb()
} // usando spsite site = new spsite("http://localhost/mizuho")
}
[WebMethod]
// Pressupõe que o nome do fornecedor é único, de uma perspectiva de negócios
público Fornecedor GetSpecificVendorByVendorName(Cadeia de caracteres Nomefornecedor)
{
Cadeia de caracteres SpVendorSiteName; // Nome do site do musgo real que hospeda a lista personalizada de fornecedores.
Cadeia de caracteres SpVendorListName; // Nome da lista de musgo real contendo fornecedores.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
usando (SPSite t: Microsoft.SharePoint.SPSite local = Novo SPSite t: Microsoft.SharePoint.SPSite(SpVendorSiteName))
{
usando (SPWeb Web = site. OpenWeb())
{
SPList t: Microsoft.SharePoint.SPList currentList = web. Listas de[SpVendorListName];
foreach (SPItem vendorItem em currentList.Items)
{
se (vendorItem["Nome do fornecedor"] == nulo) continuar;
se (vendorItem["Nome do fornecedor"].ToString().É igual a(Nomefornecedor))
Voltar Novo Fornecedor(vendorItem);
}
Fornecedor v = Novo Fornecedor();
v.VendorPhone = "não foi encontrado: " + Nomefornecedor;
Voltar v;
Voltar nulo;
} // usando spweb web = site.openweb()
} // usando spsite site = new spsite("http://localhost/mizuho")
} // Método
[WebMethod]
público Fornecedor[] GetVendorsOfType (Cadeia de caracteres filterType)
{
Cadeia de caracteres SpVendorSiteName; // Nome do site do musgo real que hospeda t
lista personalizada de fornecedores.
Cadeia de caracteres SpVendorListName; // Nome da lista de musgo real contendo fornecedores.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
Fornecedor[] Resultados;
int vendorIndex = 0;
Resultados = Novo Fornecedor[1000];
// Inicializar a lista com uma mensagem amigável padrão.
Fornecedor v = Novo Fornecedor();
v.VendorName = "Selecione um tipo de fornecedor para preencher essa lista.";
Resultados[0] = v;
// Converter o filtro em minúsculas para mais fácil comparação de seqüência de caracteres mais tarde.
filterType = filterType.ToLower();
// Se o tipo de filtro passado é "teste", gerar alguns dados simples.
#região Tipo de filtro = "teste"
se (filterType Equals.("teste"))
Voltar GenerateTestVendors();
#endregion
se (verdadeiro)
{
usando (SPSite t: Microsoft.SharePoint.SPSite local = Novo SPSite t: Microsoft.SharePoint.SPSite(SpVendorSiteName))
{
usando (SPWeb Web = site. OpenWeb())
{
v = nulo;
SPList t: Microsoft.SharePoint.SPList currentList = web. Listas de[SpVendorListName];
// Percorrer todos os itens na lista de fornecedores.
foreach (SPItem vendorItem em currentList.Items)
{
Cadeia de caracteres lowerVendorType;
lowerVendorType = vendorItem["PurchaseType"].ToString().ToLower();
lowerVendorType = lowerVendorType.Substring(3);
se (É igual a lowerVendorType.(filterType))
{
Resultados[vendorIndex ] = Novo Fornecedor(vendorItem);
}
} // Iterando através de todos os fornecedores na lista
Voltar TrimVendorArray(vendorIndex, Resultados);
// retornar resultados;
} // usando spweb web = site.openweb()
} // usando spsite site = new spsite("http://localhost/mizuho")
} // Se for verdade
Voltar nulo;
}
privada Fornecedor[] TrimVendorArray(int newSize, Fornecedor[] originalVendorArray)
{
Fornecedor[] trimmedArray;
se (newSize = = 0) newSize = 1;
trimmedArray = Novo Fornecedor[newSize];
int currentCounter = 0;
para (currentCounter = 0; currentCounter < newSize; currentCounter )
{
trimmedArray[currentCounter] = originalVendorArray[currentCounter];
}
Voltar trimmedArray;
}
}