สถานการณ์ของธุรกิจ:
วิธีที่ช่วยให้ผู้ใช้ป้อนใบขอซื้อที่ถูกต้องรวดเร็ว.
ปัญหาธุรกิจ:
ลูกค้าทำธุรกิจกับผู้ขายหลายร้อยราย.
ผู้ขายเป็น "ชนิด" เฉพาะ. หมายความ ว่า ผู้จัดจำหน่ายจำหน่ายอุปกรณ์คอมพิวเตอร์ (เช่น. Dell) หรือเครื่องใช้สำนักงาน (เช่น. ลวดเย็บกระดาษ).
เราทำให้ผู้ใช้ผู้สร้างผู้จัดจำหน่ายถูกต้องเลือกใบขอซื้อได้อย่างไร?
แก้ไขปัญหาธุรกิจ:
แยกความแตกต่างของผู้ขายในระบบผ่านทาง "ชนิด".
ให้ผู้ใช้สามารถเลือกชนิด"" ของผลิตภัณฑ์ และให้ชุดตัวกรองของผู้จัดจำหน่ายที่เหมาะสมแล้ว.
ด้านเทคนิค:
ฟอร์ม InfoPath ได้รับการออกแบบที่ช่วยให้ผู้ใช้ป้อนออนไลน์ใบขอซื้อ.
สอง InfoPath การเลือกรายการควบคุมการเลือกผู้จัดจำหน่าย. แรก, ผู้ใช้เลือก "ชนิดซื้อ". นี้จำกัดรายการเลือกสองที่ประกอบด้วยจัดจำหน่ายที่ขายสำหรับชนิดซื้อ. นี้เป็นคลาสสิกน้ำตกหล่นลง.
เก็บอยู่ในรายการกำหนดเองมอสกับคอลัมน์ที่กำหนดเองสำหรับแอตทริบิวต์ของผู้ขายเช่นชื่อผู้จัดจำหน่าย, ที่อยู่และโดยเฉพาะอย่างยิ่ง "ชนิด".
ใช้บริการเว็บสำหรับไคลเอ็นต์ InfoPath ที่เปลืองที่คำนวณซ้ำรายการผู้จัดจำหน่ายเอง, ความเฉพาะผู้จัดจำหน่าย "ชนิด" ให้ตรงกัน.
เรียกใช้บริการเว็บได้อย่างง่าย ๆ ด้วยแบบฟอร์มการ InfoPath.
บทเรียนที่เรียนรู้:
- แรก, เหมือนต้องไปเส้นทางนี้. ฉันจะได้ต้องทำการกรองทั้งหมดภายใน InfoPath และไม่สร้างใด ๆ เว็บบริการทำงานที่นี่. อย่างไรก็ตาม, แบบฟอร์มเซิร์ฟเวอร์ให้ความสามารถในการกรองที่จำเป็น. เราสามารถนำกฎไปเป็นชนิด"" รายการตัวเลือกในแบบฟอร์มการจัดเรียงของเปิดการสอบถามผู้จัดจำหน่ายใหม่, แต่เราไม่ได้ไปทำงานอย่างถูกต้อง. ดังนั้น, ก็จำเป็นต้องใช้บริการเว็บ.
- นี้เป็นคลาสสิก "ลำดับรายการเลือก" ปัญหา InfoPath ฟอร์มเซิร์ฟเวอร์โลก และมีหลายตัวอย่างค่ะที่อธิบายวิธีการแก้ปัญหานี้.
- ค่าว่างสำหรับคอลัมน์ในรายการผู้จัดจำหน่ายกลับเป็นสตริงว่างเมื่ออ้างอิงดังนี้: initItem["ชื่อผู้จัดจำหน่าย"]. แทน, จะส่งกลับค่าเป็น null.
หมายเหตุอื่น ๆ:
- กลับเป็นแถว[] ผู้จัดจำหน่ายเนื่องจากมีปัญหาบางความการ ArrayList. InfoPath มีบ่นเกี่ยวกับเรื่องนี้ และไม่มีเวลาหรือความเอียงเพื่อต่อสู้กับมัน. นี้, แน่นอน, ทำให้วงเงินการประดิษฐ์ในจำนวนของผู้จัดจำหน่าย. นอกจากนี้ยังบังคับให้ใช้การตัดแต่ง() วิธีในอาร์เรย์ เพราะฉันเกลียดคิดคืนกลับ 100 ของผู้ขายที่เป็น null. InfoPath ไม่ดูแล, แต่มัน nagged ที. (อีกครั้ง, นี้ได้ง่ายกว่าการต่อสู้ InfoPath ผ่าน ArrayLists).
- ดำเนินการแบบ GetSpecificVendorByName() ฟังก์ชันเช่น, ซึ่งอาจให้คำแนะนำ.
รหัส:
โดยใช้ ระบบ;
โดยใช้ System.Web;
โดยใช้ System.Web.Services;
โดยใช้ System.Web.Services.Protocols;
โดยใช้ Microsoft.SharePoint;
โดยใช้ System.Configuration;
/// <สรุป>
/// บริการจัดจำหน่าย: ให้ผู้จัดจำหน่ายที่เกี่ยวข้องกับบริการซึ่งวันนี้จะถูกใช้ โดยไคลเอ็นต์ฟอร์ม infopath.
///
/// ประวัติ:
/// ——–
/// 07/24/07: เริ่มต้นการเขียนโค้ด, Paul J. Gavin ของ Conchango.
///
/// </สรุป>
[WebService(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
สาธารณะ คลาส VendorService : System.Web.Services.WebService
{
/// <สรุป>
/// ตัวแทนผู้จัดจำหน่ายจากรายการ sharepoint แบบกำหนดเองบำรุงรักษา โดย MSUSA.
/// </สรุป>
สาธารณะ คลาส ผู้จัดจำหน่าย
{
สาธารณะ ผู้จัดจำหน่าย() { }
สาธารณะ ผู้จัดจำหน่าย(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; // ID เฉพาะรักษาผ่านมอ.
}
สาธารณะ int VendorItemId;
สาธารณะ สายอักขระ VendorName;
สาธารณะ สายอักขระ VendorAddress1;
สาธารณะ สายอักขระ VendorAddress2;
สาธารณะ สายอักขระ VendorCity;
สาธารณะ สายอักขระ VendorState;
สาธารณะ สายอักขระ VendorZip;
สาธารณะ สายอักขระ VendorPhone;
สาธารณะ สายอักขระ VendorType;
สาธารณะ สายอักขระ VendorSalesRepName;
สาธารณะ สายอักขระ VendorFax;
}
สาธารณะ VendorService () {
//Uncomment บรรทัดต่อไปนี้ถ้าใช้ออกแบบส่วนประกอบ
//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; // ชื่อของมอไซต์จริงที่เป็นโฮสต์ของรายการที่กำหนดเองของผู้จัดจำหน่าย.
สายอักขระ SpVendorListName; // ชื่อจริงมอรายการที่ประกอบด้วยผู้จัดจำหน่าย.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
โดยใช้ (SPSite ไซต์ = ใหม่ SPSite(SpVendorSiteName))
{
โดยใช้ (SPWeb เว็บไซต์ = OpenWeb())
{
Splist.update() currentList =เว็บ รายการ[SpVendorListName];
SPItem specificItem =เข้า[vendorId];
เที่ยวกลับ ใหม่ ผู้จัดจำหน่าย(specificItem);
} // ใช้เว็บ spweb = site.openweb()
} // ใช้ spsite ไซต์ = spsite ใหม่("http://localhost/mizuho")
}
[WebMethod]
// สันนิษฐานว่า ชื่อผู้จัดจำหน่ายเฉพาะ, จากมุมมองทางธุรกิจ
สาธารณะ ผู้จัดจำหน่าย GetSpecificVendorByVendorName(สายอักขระ จะ)
{
สายอักขระ SpVendorSiteName; // ชื่อของมอไซต์จริงที่เป็นโฮสต์ของรายการที่กำหนดเองของผู้จัดจำหน่าย.
สายอักขระ SpVendorListName; // ชื่อจริงมอรายการที่ประกอบด้วยผู้จัดจำหน่าย.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
โดยใช้ (SPSite ไซต์ = ใหม่ SPSite(SpVendorSiteName))
{
โดยใช้ (SPWeb เว็บไซต์ = OpenWeb())
{
Splist.update() currentList =เว็บ รายการ[SpVendorListName];
foreach (SPItem vendorItem ใน currentList.Items)
{
ถ้า (vendorItem["ชื่อผู้จัดจำหน่าย"] == null) « « «;
ถ้า (vendorItem["ชื่อผู้จัดจำหน่าย"].ToString().เท่ากับ(จะ))
เที่ยวกลับ ใหม่ ผู้จัดจำหน่าย(vendorItem);
}
ผู้จัดจำหน่าย v = ใหม่ ผู้จัดจำหน่าย();
v.VendorPhone = "ไม่พบ: " + จะ;
เที่ยวกลับ v;
เที่ยวกลับ null;
} // ใช้เว็บ spweb = site.openweb()
} // ใช้ spsite ไซต์ = spsite ใหม่("http://localhost/mizuho")
} // วิธีการ
[WebMethod]
สาธารณะ ผู้จัดจำหน่าย[] GetVendorsOfType (สายอักขระ filterType)
{
สายอักขระ SpVendorSiteName; // ชื่อของมอไซต์จริงที่โฮสต์ t
เขาขายรายการกำหนดเอง.
สายอักขระ SpVendorListName; // ชื่อจริงมอรายการที่ประกอบด้วยผู้จัดจำหน่าย.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
ผู้จัดจำหน่าย[] resultList;
int vendorIndex = 0;
resultList = ใหม่ ผู้จัดจำหน่าย[1000];
// เตรียมใช้งานรายการเริ่มต้นข้อความเป็นมิตร.
ผู้จัดจำหน่าย v = ใหม่ ผู้จัดจำหน่าย();
v.VendorName = "เลือกชนิดผู้จัดจำหน่ายเพื่อสร้างรายการนี้";
resultList[0] = v;
// แปลงตัวตัวพิมพ์เล็กสำหรับการเปรียบเทียบสตริงที่ง่ายขึ้นในภายหลัง.
filterType = filterType.ToLower();
// ถ้าผ่านตัวกรองชนิด เป็น "ทดสอบ", สร้างข้อมูลบางแบบง่าย.
#ภูมิภาค ตัวกรองชนิด = "ทดสอบ"
ถ้า (filterType เท่ากับ("การทดสอบ"))
เที่ยวกลับ GenerateTestVendors();
#endregion
ถ้า (จริง)
{
โดยใช้ (SPSite ไซต์ = ใหม่ SPSite(SpVendorSiteName))
{
โดยใช้ (SPWeb เว็บไซต์ = OpenWeb())
{
v = null;
Splist.update() currentList =เว็บ รายการ[SpVendorListName];
// ทำซ้ำในการผ่านรายการทั้งหมดในรายชื่อของผู้จัดจำหน่าย.
foreach (SPItem vendorItem ใน currentList.Items)
{
สายอักขระ lowerVendorType;
lowerVendorType = vendorItem["PurchaseType"].ToString().ToLower();
lowerVendorType = lowerVendorType.Substring(3);
ถ้า (lowerVendorType เท่ากับ(filterType))
{
resultList[vendorIndex ] = ใหม่ ผู้จัดจำหน่าย(vendorItem);
}
} // วนผ่านผู้ขายทั้งหมดในรายการ
เที่ยวกลับ TrimVendorArray(vendorIndex, resultList);
// กลับ resultList;
} // ใช้เว็บ spweb = site.openweb()
} // ใช้ spsite ไซต์ = spsite ใหม่("http://localhost/mizuho")
} // ถ้าเป็นจริง
เที่ยวกลับ 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;
}
}