业务方案:
提供一种方法,使用户可以快速输入准确的采购申请.
业务问题:
客户端与几个几百个供应商做生意.
供应商"类型" 具体. 这意味着供应商销售计算机设备 (例如:. 戴尔) 或办公用品 (例如:. 钉书钉).
我们如何使最终用户创建一个有效的供应商的采购请购单选择?
业务解决方案:
在"类型"通过系统中区分供应商.
使用户能够选择"类型" 产品,然后提供适当的供应商筛选的集.
技术解决方案:
InfoPath 表单而设计使用户能够输入在线购买请购单.
两个 InfoPath 选择列表控制选择供应商. 第一次, 用户选择"采购类型". 这就限制了第二次的选择列表包含只有卖那采购类型的供应商. 这是一个经典的级联下拉.
供应商存储在 MOSS 与供应商的属性,如名称的自定义列的自定义列表, 地址和特别是"类型".
要消耗的 InfoPath 客户端的 web 服务实现循环访问自定义供应商列表, 返回只有供应商匹配提供的"类型".
调用 web 服务通过 InfoPath 表单.
吸取的教训:
- 第一次, 看来有必要走这条路. 我宁愿做完全属于 InfoPath 的筛选并不创建任何的 web 服务功能. 不过, 表单服务器不提供所需的筛选功能. 我们可以把放到规则"类型" 选择列表中的重新打开供应商查询窗体, 但我们不能让它正常工作. 因此, 这是有必要实现的 web 服务.
- 这是一个经典"级联选择列表" 在 InfoPath 中的问题形成服务器世界并且有很好的例子很多外面解释如何解决这一问题.
- 供应商列表中的列的为空值不会返回一个空字符串时这样引用: initItem["供应商名称"]. 相反, 它将返回 null.
一些其他笔记:
- 返回一个[] 供应商的因为一些难以返回数组. InfoPath 抱怨它和我没有时间或倾向去争. 这, 答案是肯定的, 人工限制放的供应商总数. 它也迫使我执行修剪() 方法在阵列上的因为我痛恨的返回回 100 的空供应商. InfoPath 不关心, 但它唠唠叨叨我. (再次, 这是比 InfoPath 争夺数组列表更容易).
- 我实施 GetSpecificVendorByName() 功能以及为, 这可能是有教育意义.
代码:
使用 系统;
使用 System.Web;
使用 System.Web.Services;
使用 System.Web.Services.Protocols;
使用 Microsoft.SharePoint;
使用 System.Configuration;
/// <摘要>
/// 供应商服务: 提供了相关的供应商服务,今天由 infopath 客户端窗体.
///
/// 历史:
/// ——–
/// 07/24/07: 初始编码, Paul J. 加文的 Conchango.
///
/// </摘要>
[Web 服务(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
公众 类 VendorService : System.Web.Services.Web 服务
{
/// <摘要>
/// 表示由 MSUSA 维护的自定义 sharepoint 列表中的供应商.
/// </摘要>
公众 类 供应商
{
公众 供应商() { }
公众 供应商(SPItem initItem)
{
如果 (! (initItem["供应商名称"] == 则为 null)) VendorName = initItem["供应商名称"].ToString();
如果 (! (initItem["地址 1"] == 则为 null)) VendorAddress1 = initItem["地址 1"].ToString();
如果 (! (initItem["地址 2"] == 则为 null)) VendorAddress2 = initItem["地址 2"].ToString();
如果 (! (initItem["城市"] == 则为 null)) VendorCity = initItem["城市"].ToString();
如果 (! (initItem["VendorPhone"] == 则为 null)) VendorPhone = initItem["VendorPhone"].ToString();
如果 (! (initItem["PurchaseType"] == 则为 null)) VendorType = initItem["PurchaseType"].ToString();
如果 (! (initItem["状态"] == 则为 null)) VendorState = initItem["状态"].ToString();
如果 (! (initItem["邮编"] == 则为 null)) VendorZip = initItem["邮编"].ToString();
如果 (!(initItem["传真"] == 则为 null)) VendorFax = initItem["传真"].ToString();
如果 (!(initItem["SalesRepName"] == 则为 null)) VendorSalesRepName = initItem["SalesRepName"].ToString();
VendorItemId = initItem.ID; // 保持通过 MOSS 的唯一 ID.
}
公众 int VendorItemId;
公众 字符串 VendorName;
公众 字符串 VendorAddress1;
公众 字符串 VendorAddress2;
公众 字符串 VendorCity;
公众 字符串 VendorState;
公众 字符串 VendorZip;
公众 字符串 VendorPhone;
公众 字符串 VendorType;
公众 字符串 VendorSalesRepName;
公众 字符串 VendorFax;
}
公众 VendorService () {
//取消注释以下行如果使用设计的部件
//InitializeComponent();
}
私人 供应商[] GenerateTestVendors()
{
供应商[] resultList;
resultList = 新增功能 供应商[100];
供应商 v;
v = 新增功能 供应商();
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 = 新增功能 供应商();
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 = 新增功能 供应商();
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 =;
返回 resultList;
}
[WebMethod]
公众 供应商 GetSpecificVendorById(int vendorId)
{
字符串 SpVendorSiteName; // 主机供应商自定义列表的实际的 MOSS 站点名称.
字符串 SpVendorListName; // 实际的苔藓列表包含供应商的名称.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
使用 (SPSite 网站 = 新增功能 SPSite(SpVendorSiteName))
{
使用 (SPWeb web = 网站。OpenWeb())
{
写入 currentList = web。列表[SpVendorListName];
SPItem specificItem = currentList.Items[vendorId];
返回 新增功能 供应商(specificItem);
} // 使用 spweb web = site.openweb()
} // 使用 spsite 网站 = 新 spsite("http://本地主机/瑞穗")
}
[WebMethod]
// 假设供应商名称是唯一, 从业务的角度
公众 供应商 GetSpecificVendorByVendorName(字符串 将)
{
字符串 SpVendorSiteName; // 主机供应商自定义列表的实际的 MOSS 站点名称.
字符串 SpVendorListName; // 实际的苔藓列表包含供应商的名称.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
使用 (SPSite 网站 = 新增功能 SPSite(SpVendorSiteName))
{
使用 (SPWeb web = 网站。OpenWeb())
{
写入 currentList = web。列表[SpVendorListName];
foreach (SPItem vendorItem 在中 currentList.Items)
{
如果 (vendorItem["供应商名称"] == 则为 null) «««;
如果 (vendorItem["供应商名称"].ToString().等于(将))
返回 新增功能 供应商(vendorItem);
}
供应商 v = 新增功能 供应商();
v.VendorPhone = "找不到: " + 将;
返回 v;
返回 则为 null;
} // 使用 spweb web = site.openweb()
} // 使用 spsite 网站 = 新 spsite("http://本地主机/瑞穗")
} // 方法
[WebMethod]
公众 供应商[] GetVendorsOfType (字符串 过滤式)
{
字符串 SpVendorSiteName; // 承载 t 的实际的 MOSS 站点名称
他供应商自定义列表.
字符串 SpVendorListName; // 实际的苔藓列表包含供应商的名称.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
供应商[] resultList;
int vendorIndex = 0;
resultList = 新增功能 供应商[1000];
// 初始化默认友好消息列表.
供应商 v = 新增功能 供应商();
v.VendorName = 选择供应商类型来填充该列表。";
resultList[0] v =;
// 转换为小写为以后更容易的字符串比较的筛选器.
过滤式 = filterType.ToLower();
// 如果筛选器类型传递的是"测试", 生成一些简单的数据.
#区域 过滤器类型 ="测试"
如果 (等于 filterType。("测试"))
返回 GenerateTestVendors();
#endregion
如果 (true)
{
使用 (SPSite 网站 = 新增功能 SPSite(SpVendorSiteName))
{
使用 (SPWeb web = 网站。OpenWeb())
{
v = 则为 null;
写入 currentList = web。列表[SpVendorListName];
// 循环访问供应商列表中的所有项.
foreach (SPItem vendorItem 在中 currentList.Items)
{
字符串 lowerVendorType;
lowerVendorType = vendorItem["PurchaseType"].ToString().ToLower();
lowerVendorType = lowerVendorType.Substring(3);
如果 (等于 lowerVendorType。(过滤式))
{
resultList[vendorIndex ] = 新增功能 供应商(vendorItem);
}
} // 通过在列表中的所有供应商进行迭代
返回 TrimVendorArray(vendorIndex, resultList);
// 返回 resultList;
} // 使用 spweb web = site.openweb()
} // 使用 spsite 网站 = 新 spsite("http://本地主机/瑞穗")
} // 如果为 true,
返回 则为 null;
}
私人 供应商[] TrimVendorArray(int newsize, 供应商[] originalVendorArray)
{
供应商[] trimmedArray;
如果 (newsize = = 0) newsize = 1;
trimmedArray = 新增功能 供应商[newsize];
int currentCounter = 0;
为 (currentCounter = 0; currentCounter < newsize; currentCounter )
{
trimmedArray[currentCounter] originalVendorArray =[currentCounter];
}
返回 trimmedArray;
}
}