موس / InfoPath Forms Server (InfoPath 2007) الأداء القائمة المنسدلة

فئة إضافية: InfoPath

ملخص: InfoPath 2007 نموذج نشرة إلى خادم موس يوفر قائمة منسدلة من البائعين مرتبطة بقائمة مخصصة في موس. عند تحديد أحد البائعين, قواعد تعيين قيم الحقل لحفنة من حقول النص مثل اسم مندوب المبيعات, عنوان, مدينة, الدولة, الرمز البريدي والهاتف. الأداء أمر فظيع. ونلاحظ أن الأداء تزداد سوءا (بطريقة غير خطية) لكل حقل إضافي نقوم بتحديث هذه الطريقة. أي, إذا كنا فقط تحديث اسم مندوب المبيعات, فإنه يأخذ [x] مقدار الوقت. إذا نقوم بتحديث مندوب المبيعات, العنوان 1, عنوان 2, مدينة, الدولة, الرمز البريدي, فإنه يأخذ 10 أوقات أطول.

الحل: كتابة خدمة ويب (يمكن العثور على نموذج التعليمات البرمجية هنا) أن يتم تمرير اسم مورد وأنها ترجع إلى الوراء تفاصيل المورد. ثم, تعيين الحقول بهذه الطريقة. على الرغم من أن هذا يبدو جداً بطيئة, كان هناك أي اختلاف ملحوظ في الأداء عند تعيين نحن 1 ميدان مقابل 8 الحقول. كمكافأة إضافية, للمستخدمين الحصول على بارد "الاتصال بالخادم" سيلون تأثير في حين أنها تنتظر النموذج للاحتجاج وتستهلك الخدمة النتائج.

موس: حدث استثناء. (استثناء من HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

التحديث: نحن ابدأ تحديد السبب الجذري لهذه المشكلة وأنها السطحية ابدأ مرة أخرى.

ونلاحظ أن فجأة أثناء تنفيذ موقع التنمية, اثنين من المستخدمين غير قادر على الوصول إلى مجموعة الموقع. يمكن المصادقة هذه الحسابات إلى الموقع الرئيسي, ولكن عند محاولة الوصول إلى مجموعة موقع معين, أنها مجرد الحصول على شاشة فارغة. أية أخطاء عرض, مجرد صفحة بيضاء اللون الأبيض.

تسجيل الدخول كمسؤول مجموعة موقع، ومحاولة إضافة أحد هؤلاء المستخدمين كمسؤول موقع وهذا الوقت, عند الضغط على "موافق", نحصل على هذه الرسالة:

حدث استثناء. (استثناء من HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

لقد أمضينا بعض الوقت في البحث عن هذا وسوء الحظ, لم يخرج بأي شيء مفيد. وكانت هناك بعض الرسائل في سجل التشخيص, ولكن كان من الصعب ربط لهم تماما مع هذه المسألة.

وفي نهاية المطاف, نحن مجموعة الموقع حذف وإعادة إنشاء فإنه وأن تحل.

إذا كان يمكنني معرفة ما تسبب هذا في المستقبل, سوف أقوم بتحديث هذه الوظيفة.

موس: بالتكرار عن طريق القوائم المخصصة وإعادة البيانات المصفاة إلى InfoPath

سيناريو العمل:

توفير أسلوب يسمح للمستخدمين بإدخال طلبات شراء دقيقة بسرعة.

المشكلة التجارية:

يقوم العميل التجارية مع البائعين مئات عدة.

البائعين هم "نوع" محددة. وهذا يعني أن بائع يبيع المعدات الحاسوبية (مثلاً. ديل) أو اللوازم المكتبية (مثلاً. دبابيس).

كيف يمكننا تمكين المستخدمين النهائيين الذين يقومون بإنشاء تحديد طلبات شراء بائع صالحة?

حلول الأعمال التجارية:

التفريق بين البائعين في النظام عن طريق "النوع".

تمكين المستخدمين من تحديد نوع "" من المنتج ثم قم بتوفير مجموعة المصفاة من البائعين المناسبة.

الحل التقني:

وقد صمم نموذج InfoPath أن تمكين المستخدمين من الدخول على شبكة الإنترنت شراء طلبات الشراء.

قوائم الاختيار InfoPath اثنين التحكم في اختيار البائعين. الأولى, يقوم المستخدم بتحديد نوع "شراء". وهذا يحصر قائمة اختيار ثانية تحتوي على البائعين التي تبيع لهذا النوع من الشراء فقط. هذا منسدلة متتالية الكلاسيكية.

يتم تخزين البائعين في قائمة مخصصة موس مع أعمدة مخصصة لسمات البائع مثل اسم, عنوان وخاصة "النوع".

تنفيذ خدمة ويب لعميل InfoPath للاستهلاك التي يكرر فيها عن طريق قائمة الموردين مخصصة, العودة فقط البائعين مطابقة المتوفر "نوع".

استدعاء خدمة ويب عن طريق نموذج InfoPath.

الدروس المستفادة:

  • الأولى, يبدو من الضروري أن يذهب هذا الطريق. كان يفضل القيام بتصفية تماما داخل InfoPath وعدم إنشاء أي وظائف خدمة ويب هنا. ومع ذلك, ولم يوفر الملقم أشكال قدرات التصفية المطلوبة. نستطيع أن نضع قاعدة إلى نوع "" اختيار قائمة في النموذج إلى نوع من إعادة فتح الاستعلام البائع, ولكن لا يمكن أن نحصل عليه للعمل بشكل صحيح. ولذلك, كان من الضروري تنفيذ خدمة ويب.
  • هذه كلاسيك "متتالية اختيار قائمة" يشكل مشكلة في InfoPath العالم الملقم وهناك العديد من الأمثلة الجيدة هناك التي تشرح كيفية حل هذه المشكلة.
  • قيمة فارغة للعمود في قائمة الموردين لا يقوم بإرجاع سلسلة فارغة عند الرجوع إليها مثل هذا: إينيتيتيم["اسم المورد"]. وبدلاً من ذلك, تقوم بإرجاع قيمة خالية null.

بعض الملاحظات الأخرى:

  • إرجاع صفيف[] للبائعين لأن صعوبة بعض العائدين ArrayList. InfoPath كانت تشكو من وأنا لم يكن لديها الوقت أو الميل لمكافحة أكثر من ذلك. وهذا, طبعًا, يضع حدا مصطنعة على العدد الإجمالي للبائعين. أنها أيضا اضطرني إلى تنفيذ القطع() الأسلوب في الصفيف لأنني أكره فكرة العودة إلى الوراء 100 من البائعين فارغة. لا يهمه InfoPath, بل أنها مزعجة في وجهي. (مرة أخرى, وكان هذا أسهل من القتال InfoPath على أرايليستس).
  • أنا نفذت جيتسبيسيفيكفيندوربينامي() الدالة، فضلا عن, التي قد يكون من المفيد.

التعليمة البرمجية:

استخدام نظام;
استخدام System.Web;
استخدام System.Web.Services;
استخدام System.Web.Services.Protocols;
استخدام Microsoft.SharePoint;
استخدام System.Configuration;

/// <موجز>
///
خدمة المورد: يوفر المورد المتصلة خدمات اليوم التي يتم استهلاكها بواسطة نموذج عميل infopath.
///
/// التاريخ:
/// ——–
/// 07/24/07: الأولى الترميز, Paul J. غافن كونتشانجو.
///
/// </موجز>
[خدمة ويب(Namespace = "http://www.conchango.com/")]
[ويبسيرفيسيبيندينج(كونفورمستو = وسيبروفيليس.BasicProfile1_1)]
العامة فئة فيندورسيرفيسي : System.Web.Services.خدمة ويب
{

/// <موجز>
/// يمثل مورد من قائمة sharepoint مخصصة التي تحتفظ بها مسوسا.
/// </موجز>
العامة فئة بائع
{
العامة بائع() { }

العامة بائع(سبيتيم إينيتيتيم)
{
إذا كان (! (إينيتيتيم["اسم المورد"] == null)) VendorName = إينيتيتيم["اسم المورد"].ToString();
إذا كان (! (إينيتيتيم["العنوان 1"] == null)) VendorAddress1 = إينيتيتيم["العنوان 1"].ToString();
إذا كان (! (إينيتيتيم["عنوان 2"] == null)) VendorAddress2 = إينيتيتيم["عنوان 2"].ToString();
إذا كان (! (إينيتيتيم["المدينة"] == null)) فيندورسيتي = إينيتيتيم["المدينة"].ToString();
إذا كان (! (إينيتيتيم["فيندورفوني"] == null)) فيندورفوني = إينيتيتيم["فيندورفوني"].ToString();
إذا كان (! (إينيتيتيم["بورتشاسيتيبي"] == null)) فيندورتيبي = إينيتيتيم["بورتشاسيتيبي"].ToString();
إذا كان (! (إينيتيتيم["الدولة"] == null)) فيندورستاتي = إينيتيتيم["الدولة"].ToString();
إذا كان (! (إينيتيتيم["الرمز البريدي"] == null)) فيندورزيب = إينيتيتيم["الرمز البريدي"].ToString();
إذا كان (!(إينيتيتيم["الفاكس"] == null)) فيندورفاكس = إينيتيتيم["الفاكس"].ToString();
إذا كان (!(إينيتيتيم["ساليسريبنامي"] == null)) فيندورساليسريبنامي = إينيتيتيم["ساليسريبنامي"].ToString();

فيندوريتيميد = initItem.ID; // معرف فريد المحافظة عن طريق موس.
}

العامة int فيندوريتيميد;
العامة السلسلة VendorName;
العامة السلسلة VendorAddress1;
العامة السلسلة VendorAddress2;
العامة السلسلة فيندورسيتي;
العامة السلسلة فيندورستاتي;
العامة السلسلة فيندورزيب;
العامة السلسلة فيندورفوني;
العامة السلسلة فيندورتيبي;
العامة السلسلة فيندورساليسريبنامي;
العامة السلسلة فيندورفاكس;
}

العامة فيندورسيرفيسي () {

//قم بإلغاء السطر التالي في حالة استخدام المكونات المصممة
//InitializeComponent();
}

القطاع الخاص بائع[] جينيراتيتيستفيندورس()
{
بائع[] ريسولتليست;
ريسولتليست = الجديد بائع[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";

ريسولتليست[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";

ريسولتليست[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";

ريسولتليست[2] = v;

عودة ريسولتليست;

}

[WebMethod]
العامة بائع جيتسبيسيفيكفيندوربييد(int معرف المورد)
{
السلسلة سبفيندورسيتينامي; // اسم الموقع موس الفعلي الذي يستضيف قائمة مخصصة البائع.
السلسلة سبفيندورليستنامي; // اسم قائمة المعايير الأمنية التنفيذية الدنيا الفعلية التي تحتوي على البائعين.

سبفيندورسيتينامي = كونفيجوراتيونسيتينجس.AppSettings["فيندورليسثوستينجسيتي"].ToString();
سبفيندورليستنامي = كونفيجوراتيونسيتينجس.AppSettings["فيندورليست"].ToString();

استخدام (SPSite الموقع = الجديد SPSite(سبفيندورسيتينامي))
{

استخدام (SPWeb ويب = الموقع. أبنوب())
{

سبليست كورينتليست = ويب. قوائم[سبفيندورليستنامي];

سبيتيم سبيسيفيسيتيم = currentList.Items[معرف المورد];

عودة الجديد بائع(سبيسيفيسيتيم);

} // استخدام ويب spweb = site.openweb()
} // استخدام موقع spsite = spsite جديد("http://localhost/ميزوهو ")

}

[WebMethod]
// ويفترض أن اسم المورد فريدة من نوعها, من منظور الأعمال التجارية
العامة بائع جيتسبيسيفيكفيندوربيفيندورنامي(السلسلة vendorName)
{
السلسلة سبفيندورسيتينامي; // اسم الموقع موس الفعلي الذي يستضيف قائمة مخصصة البائع.
السلسلة سبفيندورليستنامي; // اسم قائمة المعايير الأمنية التنفيذية الدنيا الفعلية التي تحتوي على البائعين.

سبفيندورسيتينامي = كونفيجوراتيونسيتينجس.AppSettings["فيندورليسثوستينجسيتي"].ToString();
سبفيندورليستنامي = كونفيجوراتيونسيتينجس.AppSettings["فيندورليست"].ToString();

استخدام (SPSite الموقع = الجديد SPSite(سبفيندورسيتينامي))
{
استخدام (SPWeb ويب = الموقع. أبنوب())
{

سبليست كورينتليست = ويب. قوائم[سبفيندورليستنامي];

foreach (سبيتيم فيندوريتيم في currentList.Items)
{
إذا كان (فيندوريتيم["اسم المورد"] == null) مواصلة;

إذا كان (فيندوريتيم["اسم المورد"].ToString().يساوي(vendorName))
عودة الجديد بائع(فيندوريتيم);
}

بائع v = الجديد بائع();
v.VendorPhone = تعذر العثور على ": " + vendorName;

عودة v;

عودة null;

} // استخدام ويب spweb = site.openweb()
} // استخدام موقع spsite = spsite جديد("http://localhost/ميزوهو ")

} // الأسلوب

[WebMethod]
العامة بائع[] جيتفيندورسوفتيبي (السلسلة filterType)
{

السلسلة سبفيندورسيتينامي; // اسم الموقع موس الفعلي الذي يستضيف تي
قال بائع قائمة مخصصة.
السلسلة سبفيندورليستنامي; // اسم قائمة المعايير الأمنية التنفيذية الدنيا الفعلية التي تحتوي على البائعين.

سبفيندورسيتينامي = كونفيجوراتيونسيتينجس.AppSettings["فيندورليسثوستينجسيتي"].ToString();
سبفيندورليستنامي = كونفيجوراتيونسيتينجس.AppSettings["فيندورليست"].ToString();

بائع[] ريسولتليست;
int فيندورينديكس = 0;
ريسولتليست = الجديد بائع[1000];

// تهيئة القائمة مع رسالة ودية افتراضية.
بائع v = الجديد بائع();
v.VendorName = "تحديد نوع مورد لملء هذه القائمة.";
ريسولتليست[0] = v;

// تحويل عامل التصفية إلى حالة أقل لمقارنة السلسلة أسهل لاحقاً.
filterType = filterType.ToLower();

// إذا تم تمرير نوع عامل التصفية "اختبار", تولد بعض البيانات البسيطة.
#المنطقة تصفية نوع = "اختبار"
إذا كان (يساوي filterType.("اختبار"))
عودة جينيراتيتيستفيندورس();
#اندريجيون

إذا كان (صحيح)
{
استخدام (SPSite الموقع = الجديد SPSite(سبفيندورسيتينامي))
{
استخدام (SPWeb ويب = الموقع. أبنوب())
{

v = null;

سبليست كورينتليست = ويب. قوائم[سبفيندورليستنامي];

// التكرار خلال كافة العناصر في قائمة الموردين.
foreach (سبيتيم فيندوريتيم في currentList.Items)
{

السلسلة لوويرفيندورتيبي;

لوويرفيندورتيبي = فيندوريتيم["بورتشاسيتيبي"].ToString().String.tolower();
لوويرفيندورتيبي = lowerVendorType.Substring(3);

إذا كان (يساوي لوويرفيندورتيبي.(filterType))
{
ريسولتليست[فيندورينديكس ] = الجديد بائع(فيندوريتيم);
}
} // التكرار من خلال جميع البائعين في قائمة


عودة تريمفيندوراراي(فيندورينديكس, ريسولتليست);
// عودة ريسولتليست;

} // استخدام ويب spweb = site.openweb()
} // استخدام موقع spsite = spsite جديد("http://localhost/ميزوهو ")

} // إذا كان هذا صحيحاً

عودة null;
}

القطاع الخاص بائع[] تريمفيندوراراي(int نيوسيزي, بائع[] أوريجينالفيندوراراي)
{
بائع[] تريميداراي;

إذا كان (نيوسيزي = = 0) نيوسيزي = 1;
تريميداراي = الجديد بائع[نيوسيزي];

int كورينتكونتير = 0;

من أجل (كورينتكونتير = 0; كورينتكونتير < نيوسيزي; كورينتكونتير )
{
تريميداراي[كورينتكونتير] = أوريجينالفيندوراراي[كورينتكونتير];
}

عودة تريميداراي;

}
}

موس: ملاحظات حول InfoPath التصحيح

رسائل خطأ ملقم نموذج InfoPath مضللة.

أثناء تطوير نموذج InfoPath, أود أن البريد على الملقم موس والوصول إلى النموذج. ستبدأ النموذج تحميل وقم بإنشاء رسالة خطأ مضللة يشير لي إلى سجل أحداث windows للحصول على التفاصيل. في الحقيقة, تمت كتابة لا رسالة إلى سجل أحداث windows. بدلاً من ذلك, تم إرسال الرسالة إلى سجل التشخيص ascii موس. يمكنك تعقب التي عن طريق إدارة الخدمات المركزية.

أنت بحاجة إلى أن تكون سريعة على قدميك. موس يحب الكتابة إلى ملف السجل, وكثيراً ما وفيربوسيلي. وهذا يمكن أن يتم اقتطاعها ولكن السجل كتابة السلوك الافتراضي "كل شيء، في أسرع وقت ممكن".

موس: تحديث قائمة مخصصة

وهناك العديد من الأمثلة الجيدة لتحديث قوائم مخصصة عن طريق SDK. هنا هو آخر.

المشكلة التجارية: وقد تم تصميم نموذج InfoPath أن طلبات الشراء يتيح للمستخدمين للدخول على الإنترنت. طلب بو ينبغي أن تكون أرقام التسلسل التقليدي على أساس قيم الإعداد الصحيحة وحسابها تلقائياً.

حلول الأعمال التجارية: إنشاء قائمة مخصصة طحلب يحتوي على عمودين: "كونترولفيلد" و "كونترولفالوي". قيمة العمود يحتوي على رقم طلب الشراء القادم. لاحظ أنه العام "التحكم" وتنص الاتفاقية التسمية مستقبلا مراقبة الحقول التي يمكن استخدامها حسب الحاجة.

الحل التقني: إنشاء خدمة ويب الوصول إليها من قبل عميل InfoPath. خدمة ويب تقوم بإرجاع رقم طلب الشراء القادم مرة أخرى وتحديث القيمة القائمة.

الدروس المستفادة:

  • عند إضافة هذه الخدمة ويب كمصدر بيانات لنموذج InfoPath, لقد وجدت أنه من اللازم تحويله إلى udc وتخزينها في مكتبة ملفات اتصال البيانات.
  • كذلك وجدت أنها ضرورية تمكين البرمجة النصية عبر مجال عن طريق إدارة الخدمات المركزية // إدارة التطبيقات // تكوين ملقم نموذج.
  • في المرة الأولى حاول النموذج للوصول إلى خدمة ويب, يستغرق بعض الوقت، وفي بعض الأحيان, أن مهلة. أنا مغشوش مع الإعدادات في تكوين ملقم نموذج توسيع إعدادات المهلة، ويبدو أن ذلك يساعد.

التعليمة البرمجية:

استخدام نظام;
استخدام System.Web;
استخدام System.Web.Services;
استخدام System.Web.Services.Protocols;
استخدام Microsoft.SharePoint;
استخدام System.Configuration;

[خدمة ويب(Namespace = "http://www.conchango.com/")]
[ويبسيرفيسيبيندينج(كونفورمستو = وسيبروفيليس.BasicProfile1_1)]
العامة فئة بوسيرفيسي : System.Web.Services.خدمة ويب
{
العامة بوسيرفيسي () {

//قم بإلغاء السطر التالي في حالة استخدام المكونات المصممة
//InitializeComponent();
}

/// <موجز>
/// الحصول على رقم بو القادمة من قائمة عنصر تحكم sharepoint بو رقم.
/// زيادة رقم بو في تلك القائمة.
/// </موجز>
/// <تقوم بإرجاع></تقوم بإرجاع>
[WebMethod]
العامة السلسلة جيتنيكستبونومبير()
{
السلسلة سبوكونترولسيتينامي; // اسم الموقع موس الفعلي الذي يستضيف قائمة "التحكم بو".
السلسلة سبوكونتروليستنامي; // اسم قائمة المعايير الأمنية التنفيذية الدنيا الفعلية التي تحتوي على عنصر التحكم بو.

سبوكونترولسيتينامي = كونفيجوراتيونسيتينجس.AppSettings["بوكونتروليسثوستينجسيتي"].ToString();
سبوكونتروليستنامي = كونفيجوراتيونسيتينجس.AppSettings["بوكونتروليست"].ToString();

السلسلة نيكستبوريقنومبير = "xyzzy";

استخدام (SPSite الموقع = الجديد SPSite(سبوكونترولسيتينامي))
{
استخدام (SPWeb ويب = الموقع. أبنوب())
{

سبليست كورينتليست = ويب. قوائم[سبوكونتروليستنامي];

foreach (سبيتيم كونتروليتيم في currentList.Items)
{

إذا كان (((السلسلة)كونتروليتيم["كونترولفيلد"]).يساوي("نيكستبونومبير"))
{
نيكستبوريقنومبير = (السلسلة)كونتروليتيم["كونترولفالوي"];

int int_nextPoReqNumber;
int_nextPoReqNumber = تحويل.ToInt32(نيكستبوريقنومبير);

int_nextPoReqNumber ;

كونتروليتيم["كونترولفالوي"] = int_nextPoReqNumber;
controlItem.Update();
}

} // تحديد موقع, قراءة وتحديث عدد بو في قائمة.


} // استخدام ويب spweb = site.openweb()
} // استخدام موقع spsite = spsite جديد("http://localhost/ميزوهو ")

عودة نيكستبوريقنومبير;

}
}