מוס / InfoPath Forms Server (InfoPath 2007) תיבת הרשימה הנפתחת ביצועים

קטגוריה נוספת: InfoPath

סיכום: InfoPath 2007 טופס פריסת לשרת מוס מספקת רשימה נפתחת של ספקים קשור רשימה מותאמת אישית של מוס. בחירת ספק, כללים להקצות ערכי שדה קומץ של שדות טקסט כגון שם נציג מכירות, כתובת, העיר, המדינה, מיקוד וטלפון. הביצועים הוא נורא. אנו מבחינים כי הביצועים מחמיר (באופן ליניארי) עבור כל שדה נוסף אנו מעדכנים בכיוון הזה. קרי, אם רק לעדכן את שם נציג מכירות, זה לוקח [x] כמות הזמן. אם אנו מעדכנים נציג מכירות, כתובת1, address2, העיר, המדינה, zip, זה לוקח 10 פעמים יותר.

פתרון: לכתוב שירות אינטרנט (ניתן למצוא דוגמאות קוד כאן) זה מועבר בשם ספק ומחזירה אותו בחזרה את פרטי הספק. לאחר מכן, להקצות את השדות בכיוון הזה. למרות שזה גם נראה איטי, לא היה ניכרת הבדל בביצועים כאשר אנחנו מוקצה 1 שדה לעומת 8 שדות. כבונוס נוסף, המשתמשים מקבלים מגניב "פנייה אל השרת" הסילונים אפקט בזמן שהם מחכים הטופס כדי להפעיל ולצרוך את התוצאות שירות.

מוס: אירעה חריגה. (חריגה מ- HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

עדכון: קבענו מעולם לא שורש הבעיה וזה לעולם השטח שוב.

אנו מבחינים כי פתאום במהלך היישום של אתר פיתוח, שני משתמשים אינם יכולים לגשת אוסף אתרים. חשבונות אלה יוכל לבצע אימות האתר הראשי, אך כאשר מנסים לגשת אוסף אתר מסוים, הם פשוט מקבלים מסך ריק. אין שגיאות המוצגות, רק דף ריק לבן.

אנו להיכנס בתור מנהל מערכת של אוסף אתרים, מנסה להוסיף את אחד מאותם משתמשים מנהל האתר, הפעם, לחיצה על "אישור", אנחנו מקבלים הודעה זו:

אירעה חריגה. (חריגה מ- HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

בילינו זמן במחקר זה, למרבה הצער, לא לבוא עם משהו מועיל. היו כמה הודעות יומן דיגאנוסטי, אבל זה היה קשה לתאם להם בדיוק לנושא הזה.

בסופו של דבר, מחיקת אוסף האתרים ונוצרת לפיה פתרנו את זה.

אם לגלות מה גרם לזה בעתיד, אני אעדכן את הפוסט הזה.

מוס: איטראציה באמצעות רשימות מותאמות אישית והחזרת נתונים מסוננים ל- InfoPath

תרחישים עסקיים:

מספקות שיטה המאפשרת למשתמשים להזין רכש מדויק במהירות.

הבעיה העסקית:

הלקוח עושה עסקים עם מספר ספקי מאות.

ספקים הם מסוג"" ספציפי. משמעות הדבר היא כי ספק מוכר ציוד מחשבים (המסופקים. Dell) או ציוד משרדי (המסופקים. סיכות).

איך אנו מאפשרים למשתמשי קצה שיוצרים בחר דרישות רכש ספק בתוקף?

הפתרון העסקי:

להבדיל ספקים במערכת באמצעות "סוג".

לאפשר למשתמשים לבחור את סוג"" של המוצר ולאחר מכן מספקים סדרה מסוננת של ספקים מתאימים.

פתרון טכני:

טופס InfoPath תוכנן מאפשר למשתמשים להזין באינטרנט רכש.

שתי רשימות הבחירה InfoPath לשלוט בחירת הספק. הראשונה, המשתמש בוחר "סוג הרכישה". זה מגביל את רשימת הבחירה השניה להכיל רק ספקים מוכרים עבור אותו סוג רכישה. . זה קלאסי מדורגים נפתחת.

הספקים מאוחסנים רשימה מותאמת אישית מוס עם עמודות מותאמות אישית עבור ספק תכונות כגון שם, במיוחד "סוג" וכתובת.

יישום שירות האינטרנט לקוח InfoPath לצרוך את זה סובבת בין הרשימה ספק מותאם אישית, חוזרים רק ספקים התאמת שסופקו "סוג".

הפעל את שירות האינטרנט באמצעות טופס InfoPath.

לקחים:

  • הראשונה, נראה שצריך. ללכת בדרך הזאת. הייתי מעדיף לעשות סינון לחלוטין בתוך InfoPath, אינם יוצרים כל פונקציונליות שירות האינטרנט כאן. עם זאת, שרת הטפסים אינו מספק יכולת הסינון הנדרשת. אנחנו יכולים לשים כלל על גבי הסוג"" רשימה עם אפשרויות בחירה בטופס סוג של פתח מחדש את השאילתה הספק, אבל אנחנו לא מצליחים שזה יעבוד כמו שצריך. לכן, היה צורך ליישם שירות האינטרנט.
  • . זה קלאסי "מדורגים הבחירה ברשימה" בעיה של InfoPath יוצר העולם שרת ויש דוגמאות רבות שם בחוץ המסבירים כיצד לפתור את זה.
  • ערך ריק עבור עמודה ברשימה הספק אינו מחזיר מחרוזת ריקה בעת הפניה ככה: initItem["שם הספק"]. במקום זאת, היא תחזיר null.

כמה הערות נוספות:

  • אני להחזיר מערך[] הספקים כי היה קושי חוזרים של ArrayList. InfoPath התלונן על זה ולא היה לי הזמן או רצון להילחם על זה. זה, בטח, מציב גבול מלאכותי על המספר הכולל של ספקים. זה גם גרם לי ליישם לתספורת() שיטת במערך כי אני שונאת את הרעיון לחזור חזרה 100 הספקים null. InfoPath לא אכפת, . אבל זה נדנדה.. (שוב, זה היה קל יותר לריב InfoPath על ArrayLists).
  • הובלתי את GetSpecificVendorByName() הפונקציה גם כן, אשר עשוי להיות מאלף.

הקוד:

שימוש מערכת;
שימוש System. web;
שימוש System.Web.Services;
שימוש System.Web.Services.Protocols;
שימוש Microsoft.SharePoint;
שימוש System.Configuration;

/// <סיכום>
///
ספק שירות: מספקת הספק הקשורים שירותים אשר כיום שנצרכים על ידי טופס לקוח infopath.
///
/// היסטוריה:
/// ——–
/// 07/24/07: הראשונית קידוד, Paul J. גאווין של 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; // מזהה ייחודי מתוחזקים באמצעות מוס.
}

הציבור 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 מזהה ספק)
{
מחרוזת SpVendorSiteName; // שם האתר מוס בפועל שמארח את הרשימה המותאמת אישית של הספק.
מחרוזת SpVendorListName; // שם רשימת מוס בפועל המכיל ספקים.

SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();

שימוש (SPSite האתר = חדש SPSite(SpVendorSiteName))
{

שימוש (SPWeb אינטרנט = האתר. OpenWeb())
{

Splist.update() currentList = אינטרנט. רשימות[SpVendorListName];

SPItem specificItem = currentList.Items[מזהה ספק];

החזרה חדש הספק(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);
}
} // איטראציה thru כל הספקים ברשימה


החזרה 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, הייתי מפרסם את אותה לשרת מוס, לגשת לטופס. הטופס יתחיל לטעון ולאחר מכן ליצור הודעת שגיאה מטעה הצבעה לי ביומן האירועים של windows לקבלת פרטים. למעשה, אף מסר היה כתוב ביומן האירועים של windows. מעדיף, ההודעה נשלחה ביומן אבחון ascii מוס. אתה יכול לאתר את זה דרך ניהול שירותים במרכז.

אתה צריך להיות מהיר על הרגליים. מוס אוהב לכתוב לקובץ יומן הרישום, לעתים קרובות, verbosely. זה יכול להיות מעוטרים אבל היומן ברירת המחדל בכתיבה התנהגות "הכל מהר ככל האפשר".

מוס: עדכון רשימה מותאמת אישית

ישנן דוגמאות רבות של עדכון רשימות מותאמות אישית באמצעות ה-SDK. הנה עוד.

הבעיה העסקית: טופס של InfoPath תוכנן מאפשר למשתמשים להזין באינטרנט רכש. פו המספרים צריך להיות רצף מסורתי המבוסס על ערכי המספרים השלמים וראיונות מחושב באופן אוטומטי.

הפתרון העסקי: יצירת רשימה מותאמת אישית מוס המכיל שתי עמודות: "ControlField" ו- "ControlValue". ערך העמודה מכילה את המספר הבא של דרישת רכש. שימו לב כי הכללי "לשלוט" המוסכמה מספק עבור שדות שליטה עתידית שבה ניתן להשתמש לפי הצורך.

פתרון טכני: יצירת שירות אינטרנט לגשת על ידי הלקוח InfoPath. שירות האינטרנט מחזירה בחזרה את המספר הבא של דרישת רכש ומעדכן את הערך של הרשימה.

לקחים:

  • בעת הוספת שירות אינטרנט כמקור נתונים של טופס InfoPath, מצאתי את זה צורך להמיר אותו udc ואחסן אותו לתוך בספריית חיבורי נתונים.
  • גם מצאתי את זה הכרחי לאפשר scripting בין תחומים באמצעות ניהול שירותים במרכז // ניהול יישומים // תצורת שרת טופס.
  • בפעם הראשונה הטופס ניסה לגשת לשירות אינטרנט, זה לוקח זמן, לעיתים, . זה היה פסק זמן. אני לכיסו עם הגדרות תצורת שרת טופס כדי להרחיב את הגדרות זמן קצוב ונראה את זה כדי לעזור.

הקוד:

שימוש מערכת;
שימוש 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 () {

//ההערה השורה הבאה, אם באמצעות רכיבים המיועדים
//InitializeComponent();
}

/// <סיכום>
/// להשיג את מספר הזמנת הרכש הבאה של רשימת בקרת sharepoint מספר פו.
/// להגדיל את מספר הזמנת הרכש ברשימה הזאת.
/// </סיכום>
/// <החזרת></החזרת>
[WebMethod]
הציבור מחרוזת GetNextPoNumber()
{
מחרוזת SpPoControlSiteName; // שם האתר מוס בפועל שמארח את רשימת בקרת פו.
מחרוזת 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();
}

} // איתור, קריאה ועדכון את מספר הזמנת הרכש ברשימה.


} // באמצעות האינטרנט spweb = site.openweb()
} // שימוש באתר spsite = spsite חדש(ב- "http://localhost/mizuho")

החזרה nextPoReqNumber;

}
}