คลังเก็บรายเดือน: กรกฎาคม 2007

มอส: วนผ่านรายการแบบกำหนดเองและคืนค่าข้อมูลที่กรองแล้วไปยัง InfoPath

สถานการณ์ของธุรกิจ:

วิธีที่ช่วยให้ผู้ใช้ป้อนใบขอซื้อที่ถูกต้องรวดเร็ว.

ปัญหาธุรกิจ:

ลูกค้าทำธุรกิจกับผู้ขายหลายร้อยราย.

ผู้ขายเป็น "ชนิด" เฉพาะ. หมายความ ว่า ผู้จัดจำหน่ายจำหน่ายอุปกรณ์คอมพิวเตอร์ (เช่น. 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;

}
}

มอส: ใน InfoPath ตรวจแก้จุดบกพร่อง

ข้อผิดพลาดเซิร์ฟเวอร์ของฟอร์ม InfoPath จะเข้าใจ.

ในระหว่างการพัฒนาของฟอร์ม InfoPath, ฉันจะลงรายการบัญชีไปยังเซิร์ฟเวอร์ MOSS และเข้าถึงแบบฟอร์ม. แบบฟอร์มจะเริ่มโหลด และสร้างข้อความข้อผิดพลาดเข้าใจฉันชี้ไปที่รายละเอียดในล็อกเหตุการณ์ของ windows แล้ว. อันที่จริง, ไม่มีข้อความถูกเขียนลงในล็อกเหตุการณ์ของ windows. ค่อนข้าง, ข้อความถูกส่งไปบันทึกการวินิจฉัย MOSS ascii. คุณสามารถติดตามที่ลงผ่านจัดการบริการกลาง.

คุณจำเป็นต้องด่วนบนเท้าของคุณ. มอสชอบเขียนไปยังล็อกไฟล์, บ่อย ๆ และ verbosely. นี้สามารถตัด แต่ล็อกเริ่มต้นเขียนลักษณะการทำงาน "ทุกอย่างโดยเร็วที่สุด".

มอส: ปรับปรุงรายการที่กำหนดเอง

มีหลายตัวอย่างของการปรับปรุงรายการที่กำหนดเองผ่าน SDK. นี่คือยังอื่น.

ปัญหาธุรกิจ: ฟอร์ม InfoPath ได้รับการออกแบบที่ช่วยให้ผู้ใช้ป้อนออนไลน์ใบขอซื้อ. ใบ PO เลขควรลำดับดั้งเดิมตามค่าจำนวนเต็ม และคำนวณโดยอัตโนมัติ.

แก้ไขปัญหาธุรกิจ: สร้าง MOSS รายการแบบกำหนดเองที่ประกอบด้วยสองคอลัมน์: "ControlField" และ "ControlValue". ค่าคอลัมน์ประกอบด้วยหมายเลขใบขอซื้อต่อไป. หมายเหตุว่า ทั่วไปที่ "ควบคุม" ชื่อที่แสดงสำหรับเขตข้อมูลตัวควบคุมในอนาคตที่อาจจะใช้ได้ตามความจำเป็น.

ด้านเทคนิค: สร้างบริการเว็บที่เข้าถึงได้ โดยไคลเอ็นต์ InfoPath. บริการเว็บการส่งกลับค่าหมายเลขใบขอซื้อถัดไปกลับ และปรับปรุงค่าของรายการ.

บทเรียนที่เรียนรู้:

  • เมื่อมีการเพิ่มบริการเว็บนี้เป็นแหล่งข้อมูลให้กับฟอร์ม InfoPath, ผมพบว่ามันจำเป็นต้องแปลงเป็น udc และเก็บลงในไลบรารีการเชื่อมต่อข้อมูล.
  • ยังพบว่าจำเป็นต้องเปิดใช้งานสคริปต์ข้ามโดเมนผ่านการจัดการบริการศูนย์กลาง // จัดการโปรแกรมประยุกต์ // ตั้งค่าคอนฟิกเซิร์ฟเวอร์ของฟอร์ม.
  • ครั้งแรกแบบพยายามที่จะเข้าถึงบริการเว็บ, ในขณะที่ใช้ และในบางโอกาส, มันจะหมดเวลา. ผมเล่นการตั้งค่าในแบบฟอร์มการกำหนดค่าเซิร์ฟเวอร์เพื่อขยายการตั้งค่าการหมดเวลา และที่ดูเหมือนจะช่วย.

รหัส:

โดยใช้ ระบบ;
โดยใช้ System.Web;
โดยใช้ System.Web.Services;
โดยใช้ System.Web.Services.Protocols;
โดยใช้ Microsoft.SharePoint;
โดยใช้ System.Configuration;

[WebService(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
สาธารณะ คลาส PoService : System.Web.Services.WebService
{
สาธารณะ PoService () {

//Uncomment บรรทัดต่อไปนี้ถ้าใช้ออกแบบส่วนประกอบ
//InitializeComponent();
}

/// <สรุป>
/// ได้รับใบ PO po เลขควบคุมรายการ sharepoint.
/// เพิ่มหมายเลข PO ในรายการ.
/// </สรุป>
/// <ส่งกลับค่า></ส่งกลับค่า>
[WebMethod]
สาธารณะ สายอักขระ GetNextPoNumber()
{
สายอักขระ SpPoControlSiteName; // ชื่อของมอไซต์จริงที่เป็นโฮสต์ให้กับรายการควบคุม PO.
สายอักขระ SpPoControlListName; // ชื่อของรายการมอจริงที่ประกอบด้วยการควบคุมปอ.

SpPoControlSiteName = ConfigurationSettings.AppSettings["PoControlListHostingSite"].ToString();
SpPoControlListName = ConfigurationSettings.AppSettings["PoControlList"].ToString();

สายอักขระ nextPoReqNumber = "xyzzy";

โดยใช้ (SPSite ไซต์ = ใหม่ SPSite(SpPoControlSiteName))
{
โดยใช้ (SPWeb เว็บไซต์ = OpenWeb())
{

Splist.update() currentList =เว็บ รายการ[SpPoControlListName];

foreach (SPItem controlItem ใน currentList.Items)
{

ถ้า (((สายอักขระ)controlItem["ControlField"]).เท่ากับ("NextPoNumber"))
{
nextPoReqNumber = (สายอักขระ)controlItem["ControlValue"];

int int_nextPoReqNumber;
int_nextPoReqNumber = แปลง.ToInt32(nextPoReqNumber);

int_nextPoReqNumber ;

controlItem["ControlValue"] = int_nextPoReqNumber;
controlItem.Update();
}

} // ค้นหา, การอ่าน และการปรับปรุงหมายเลข PO ในรายการ.


} // ใช้เว็บ spweb = site.openweb()
} // ใช้ spsite ไซต์ = spsite ใหม่("http://localhost/mizuho")

เที่ยวกลับ nextPoReqNumber;

}
}