คลังเก็บหมวดหมู่: มอส

MOSS ขั้นสูงค้นหาเอง — กรณีเรื่องในการค้นหาขั้นสูง XSLT

ฉันไม่ปรับเปลี่ยนการค้นหาขั้นสูง XSLT บ่อย, ดังนั้นจึงดูเหมือนว่าผมกำลังปีนเนินเขาขนาดเล็กทุกครั้ง.

นี่คือบทเรียนของฉันใหม่ล่าสุด: กรณีเรื่องเมื่ออ้างอิงคอลัมน์. ในการค้นหาขั้นสูงของฉัน, มีคอลัมน์ที่กำหนดไว้เช่นนี้:

<ราก xmlns:xsi="http://www.w3.org/ 2001/XMLSchema-อินสแตนซ์">
<
คอลัมน์>
<
คอลัมน์ ชื่อ="GafTrainingInvoiceNumber" />
<
คอลัมน์ ชื่อ="GafTrainingInvoiceLocation" />
<
คอลัมน์ ชื่อ="WorkId"/>
<
คอลัมน์ ชื่อ="อันดับ"/>
<
คอลัมน์ ชื่อ="ชื่อเรื่อง"/>
<
คอลัมน์ ชื่อ="ผู้เขียน"/>
<
คอลัมน์ ชื่อ="ขนาด"/>
<
คอลัมน์ ชื่อ="เส้นทาง"/>
<
คอลัมน์ ชื่อ="คำอธิบาย"/>
<
คอลัมน์ ชื่อ="เขียน"/>
<
คอลัมน์ ชื่อ="SiteName"/>
<
คอลัมน์ ชื่อ="CollapsingStatus"/>
<
คอลัมน์ ชื่อ="HitHighlightedSummary"/>
<
คอลัมน์ ชื่อ="HitHighlightedProperties"/>
<
คอลัมน์ ชื่อ="ContentClass"/>
<
คอลัมน์ ชื่อ="IsDocument"/>
<
คอลัมน์ ชื่อ="PictureThumbnailURL"/>
</
คอลัมน์>
</
ราก>

XLST ที่แสดงที่ตั้งหมายเลขและใบแจ้งหนี้ใบแจ้งหนี้ได้:

<p>
หมายเลขอินวอยซ์ของการฝึกอบรม: <xsl:ค่าของ เลือก="GafTrainingInvoiceNumber"/>
<
br></br>
สถานฝึกอบรมใบแจ้งหนี้: <xsl:ค่าของ เลือก="GafTrainingInvoiceLocation"/>
</
p>

อย่างไรก็ตาม, เลือกมีการอ้างอิงคุณสมบัติในทุกกรณี, เช่นใน:

<p>
หมายเลขอินวอยซ์ของการฝึกอบรม: <xsl:ค่าของ เลือก="gaftraininginvoicenumber"/>
<
br></br>
สถานฝึกอบรมใบแจ้งหนี้: <xsl:ค่าของ เลือก="gaftraininginvoicelocation"/>
</
p>


จนกว่าฉันแก้ไขที่, ผลการค้นหาพบป้ายชื่อ (อาทิ. "การฝึกอบรมหมายเลข") แต่ไม่มีข้อมูล.

มอส / InfoPath Forms Server (InfoPath 2007) ประสิทธิภาพการทำงานรายการหล่นลง

ประเภทเพิ่มเติม: InfoPath

สรุป: มี InfoPath 2007 ฟอร์มจัดวางเซิร์ฟเวอร์ MOSS แสดงรายการแบบหล่นลงของผู้ขายที่เชื่อมโยงกับรายการมอสเอง. เมื่อเลือกผู้จัดจำหน่าย, กฎกำหนดค่าฟิลด์ที่กำมือของเขตข้อมูลข้อความเช่นชื่อพนักงานขาย, ที่อยู่, เมือง, รัฐ, ไปรษณีย์และโทรศัพท์. ประสิทธิภาพเป็นน่ากลัว. เราสังเกตว่า ประสิทธิภาพลม (แฟชั่นไม่ใช่เชิงเส้น) สำหรับแต่ละฟิลด์เพิ่มเติม เราปรับปรุงด้วยวิธีนี้. เช่น, ถ้าเราเพียง ปรับปรุงชื่อตัวแทนขาย, มันต้องใช้เวลา [x] จำนวนเวลา. ถ้าเราปรับปรุงตัวแทนขาย, address1, address2, เมือง, รัฐ, ไปรษณีย์, มันต้องใช้เวลา 10 เวลาอีกต่อไป.

โซลูชั่น: เขียนเว็บเซอร์วิส (สามารถพบรหัสตัวอย่าง ที่นี่) ที่ถูกส่งผ่านชื่อของผู้จัดจำหน่าย และคืนกลับรายละเอียดผู้จัดจำหน่าย. แล้ว, กำหนดฟิลด์วิธีนี้. แม้ว่าดูเหมือนเกินไปนี้ ช้า, มีความแตกต่างไม่ discernable ประสิทธิภาพเมื่อเรากำหนดให้ 1 ฟิลด์เมื่อเทียบกับ 8 เขตข้อมูล. เป็นโบนัส, ผู้ใช้ได้รับเย็น "ติดต่อเซิร์ฟเวอร์" Cylon ผลผลในขณะที่พวกเขารอแบบฟอร์ม การเรียกใช้บริการ.

มอส: เกิดข้อยกเว้น. (ข้อยกเว้นจาก hresult ใน: 0x 80020009 (DISP_E_EXCEPTION))

โปรแกรมปรับปรุง: เราไม่เคยพิจารณาสาเหตุหลักของปัญหานี้และมันไม่เคยผิวอีกครั้ง.

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

เราเข้าสู่ระบบในฐานะ admin เป็นคอลเลกชันของไซต์ และพยายามเพิ่มผู้ใช้เหล่านั้นอย่างใดอย่างหนึ่งเป็น admin ของเว็บไซต์และในเวลานี้, เมื่อกด "OK", เราได้รับข้อความนี้:

เกิดข้อยกเว้น. (ข้อยกเว้นจาก hresult ใน: 0x 80020009 (DISP_E_EXCEPTION))

เราใช้เวลาบางครั้งที่ทำการวิจัยนี้ และขออภัย, ไม่ได้มากับสิ่งที่มีประโยชน์. มีบางข้อความในแฟ้มบันทึกการวินิจฉัย, แต่มันยากตรงสัมพันธ์กับปัญหานี้.

ในสุด, เราลบไซต์คอลเลกชัน และถูกสร้างขึ้นใหม่ได้และการที่แก้ไขได้.

ถ้าฉันสามารถหา สิ่งที่เกิดนี้ในอนาคต, จะปรับปรุงการลงรายการบัญชีนี้.

มอส: วนผ่านรายการแบบกำหนดเองและคืนค่าข้อมูลที่กรองแล้วไปยัง 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;

}
}