MOSS / InfoPath Forms Server (InfoPath 2007) բացվող ցուցակ կատարումը

Լրացուցիչ աստիճան: InfoPath

Ամփոփում: An InfoPath 2007 ձեւավորել տեղակայվել է MOSS սերվերի տրամադրում է բացվող ցուցակում վաճառողներին կապված են մաքսային MOSS ցուցակում. Հետո ընտրելով մատակարարին, կանոնները նշանակում դաշտային արժեքները մի բուռ տեքստ բնագավառներում, ինչպիսիք են վաճառքի rep անունը, հասցե, քաղաք, պետական, ZIP եւ հեռախոսը. Performance է սարսափելի. Մենք, որ կատարում է վատ (է ոչ գծային նորաձեւության) յուրաքանչյուր լրացուցիչ դաշտ, մենք է այս ճանապարհը. Այսինքն,, եթե մենք պարզապես թարմացնել վաճառքի սերտում անունը, այն տեւում է [x] գումարը ժամանակ. Եթե ​​մենք նորացնել վաճառքի Գրառումներ, address1, address2, քաղաք, պետական, աշխուժություն, այն տեւում է 10 անգամ ավելի երկար.

Լուծում: Գրել վեբ ծառայություն (Նմուշի համար կարելի է գտնել այստեղ) որը անցել անունով մի վաճառողի եւ վերադարձնում ետ վաճառողի մանրամասները. Ապա, հատկացնել ոլորտներում այս ձեւով. Թեեւ սա եւս կարծես դանդաղ, չկար discernable տարբերություն կատարման, երբ մենք նշանակվում 1 դաշտը versus 8 fields. Որպես ավելացված պարգեւավճար, users get a cool "contacting the server" Cylon ազդեցություն երբ նրանք սպասել ձեւով վկայակոչել եւ սպառում է ծառայողական արդյունքները.

MOSS: Բացառություն է տեղի ունեցել. (Բացառություն HRESULT: 0x80020009 (DISP_E_EXCEPTION))

ԹԱՐՄԱՑՆԵԼ: Մենք երբեք չենք որոշել արմատային պատճառը այս խնդրին եւ այն երբեք չի վերգետնյա կրկին.

Մենք նկատում ընթացքում իրականացման զարգացման կայքում, որը հանկարծակի, երկու օգտվողները չեն կարողանում մուտք գործել կայքը հավաքածու. Այդ հաշիվները կարող իսկությունը հիմնական կայքում, բայց երբ փորձում եք մուտք գործել որոշակի կայքը հավաքածու, նրանք պարզապես դատարկ էկրան. Ոչ սխալները դրսեւորվում, մի սպիտակ դատարկ էջ.

Մենք մուտք որպես կայքի հավաքածուի ադմինիստրատորի եւ փորձում է ավելացնել այն օգտվողների, որպես կայքի ադմինիստրատորի կողմից եւ այս անգամ, upon pressing "OK", ենք ստանում այս հաղորդագրության մասին:

Բացառություն է տեղի ունեցել. (Բացառություն HRESULT: 0x80020009 (DISP_E_EXCEPTION))

Մենք անցկացրել որոշ ժամանակ ուսումնասիրում է այս եւ, ցավոք, չի գալիս հետ, որեւէ բան օգտակար. Կային մի քանի հաղորդագրություններ դիագնոստիկ log, բայց դա դժվար թե առնչություն նրանց հետ այդ հարցով.

Վերջում, Մենք վերացման կայքը հավաքածուն եւ կրկին ստեղծվել է այն, որ լուծվում է այն.

Եթե ​​ես պարզել, թե ինչ պատճառով դա ապագայում, Ես նորացնել Այս գրառումը.

MOSS: Iterating միջոցով մաքսային ցուցակներում, եւ վերադառնալով ֆիլտրացված տվյալների InfoPath

Բիզնես Սցենար:

Տրամադրել է մեթոդ, որը հնարավորություն է տալիս օգտվողներին մուտք գործել ճշգրիտ գնման requisitions արագ.

Բիզնես խնդիրը:

Հաճախորդը ունի մի քանի հարյուր վաճառողներին.

Vendors are "type" հատուկ. Սա նշանակում է, որ վաճառողը վաճառում է համակարգչային տեխնիկա (e.g. Անտառապատ հովիտ) կամ Գրասենյակային պարագաներ (e.g. Staples).

Ինչպես ենք տալիս վերջնական օգտագործողների, ովքեր ստեղծել գնման requisitions ընտրել վավեր մատակարարին?

Բիզնես Solution:

Differentiate vendors in the system via "type".

Enable users to select the "type" Ապրանքի ապա տրամադրել ֆիլտրացված շարք համապատասխան վաճառողներին.

Տեխնիկական Solution:

An InfoPath ձեւը արդեն մշակված է, որ հնարավորություն է տալիս օգտվողներին մուտք գործել առցանց գնումների requisitions.

Երկու InfoPath ընտրությունը ցուցակները հսկողություն վաճառող ընտրությունը. Առաջին, the user selects a "purchase type". This limits a second selection list to contain only vendors that sell for that purchase type. This is a classic cascading drop-down.

Արտադրողներ պահվում են MOSS մաքսային ցուցակի հետ մաքսային սյուների համար վաճառողի հատկանիշներ, ինչպիսիք են անունը, address and especially "type".

Իրականացնել վեբ ծառայություն, որը հաճախորդի InfoPath է սպառում, որ iterates միջոցով մաքսային vendor ցուցակում, returning only vendors matching a supplied "type".

Վկայակոչել վեբ ծառայություն միջոցով InfoPath ձեւով.

Քաղված դասերը:

  • Առաջին, թվում անհրաժեշտ է գնալ այդ ճանապարհով. Ես նախընտրում անել զտիչ ամբողջությամբ ներսում InfoPath եւ ստեղծել ցանկացած վեբ ծառայություն ֆունկցիոնալությունը այստեղ. Սակայն, ձեւերը սերվեր չի տրամադրում պահանջվող զտիչ հնարավորություն. We can put a rule onto a the "type" ընտրությունը ցուցակ ձեւի տեսակավորելու են կրկին բացել է վաճառողի հարցումը, սակայն մենք չենք կարող հասնել այն աշխատի. Ուստի, անհրաժեշտ էր իրականացնել ինտերնետային ծառայություն.
  • This is a classic "cascading selection list" խնդիր է InfoPath ձեւերի սերվերի աշխարհում եւ կան շատ լավ օրինակները դուրս այնտեղ, որ բացատրել, թե ինչպես պետք է լուծել այդ.
  • Դատարկ արժեք է սյունակում է վաճառողի ցուցակում չի վերադառնում դատարկ տողը, երբ Ուղեկցող նման: initItem["Vendor Name"]. Փոխարեն, Այն վերադարձնում է առ.

Որոշ այլ Notes:

  • Ես վերադարձնում զանգված[] եւ վաճառողներին, քանի որ ես ինչ - որ դժվարությամբ է վերադառնում ArrayList. InfoPath էր բողոքում, եւ ես չէի ունենա ժամանակ կամ ցանկություն պայքարելու է դրա. Սա, Իհարկե, դնում արհեստական ​​սահմանափակում ընդհանուր թվի ձայների վաճառողներին. Այն նաեւ ստիպված եմ կատարել մի փոքր կարճացրեք() method on the array because I hate the idea of returning back 100’s of null vendors. InfoPath չի հետաքրքրում, բայց nagged ինձ. (Կրկին, դա ավելի հեշտ է, քան պատերազմը InfoPath է ArrayLists).
  • Ես իրականացրել է GetSpecificVendorByName() ֆունկցիան, ինչպես նաեւ, որոնք կարող են ուսանելի.

Կոդը:

օգտագործելով Համակարգ;
օգտագործելով System.Web;
օգտագործելով System.Web.Services;
օգտագործելով System.Web.Services.Protocols;
օգտագործելով Microsoft.SharePoint;
օգտագործելով System.Configuration;

/// <ամփոփում>
///
Vendor Service: Provides vendor related services which today are consumed by an infopath client form.
///
/// History:
/// ——–
/// 07/24/07: Initial coding, Paul J. Gavin of Conchango.
///
/// </ամփոփում>
[WebService(Namespace = "Http :/://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
հասարակություն դաս VendorService : System.Web.Services.WebService
{

/// <ամփոփում>
/// Represents a vendor from a custom sharepoint list maintained by MSUSA.
/// </ամփոփում>
հասարակություն դաս Վաճառող
{
հասարակություն Վաճառող() { }

հասարակություն Վաճառող(Թքել initItem)
{
եթե (! (initItem["Vendor Name"] == զրո)) VendorName = initItem["Vendor Name"].ToString();
եթե (! (initItem["Address 1"] == զրո)) VendorAddress1 = initItem["Address 1"].ToString();
եթե (! (initItem["Address 2"] == զրո)) VendorAddress2 = initItem["Address 2"].ToString();
եթե (! (initItem["City"] == զրո)) VendorCity = initItem["City"].ToString();
եթե (! (initItem["VendorPhone"] == զրո)) VendorPhone = initItem["VendorPhone"].ToString();
եթե (! (initItem["PurchaseType"] == զրո)) VendorType = initItem["PurchaseType"].ToString();
եթե (! (initItem["State"] == զրո)) VendorState = initItem["State"].ToString();
եթե (! (initItem["Zip"] == զրո)) VendorZip = initItem["Zip"].ToString();
եթե (!(initItem["Fax"] == զրո)) VendorFax = initItem["Fax"].ToString();
եթե (!(initItem["SalesRepName"] == զրո)) VendorSalesRepName = initItem["SalesRepName"].ToString();

VendorItemId = initItem.ID; // Unique ID maintained via MOSS.
}

հասարակություն int VendorItemId;
հասարակություն լարային VendorName;
հասարակություն լարային VendorAddress1;
հասարակություն լարային VendorAddress2;
հասարակություն լարային VendorCity;
հասարակություն լարային VendorState;
հասարակություն լարային VendorZip;
հասարակություն լարային VendorPhone;
հասարակություն լարային VendorType;
հասարակություն լարային VendorSalesRepName;
հասարակություն լարային VendorFax;
}

հասարակություն VendorService () {

//Uncomment the following line if using designed components
//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; // Name of the actual MOSS site that hosts the vendor custom list.
լարային SpVendorListName; // Name of the actual MOSS list containing vendors.

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

օգտագործելով (SPSite site = նոր SPSite(SpVendorSiteName))
{

օգտագործելով (SPWeb web = site.OpenWeb())
{

SPList currentList = web.Lists[SpVendorListName];

Թքել specificItem = currentList.Items[vendorId];

վերադարձ նոր Վաճառող(specificItem);

} // using spweb web = site.openweb()
} // using spsite site = new spsite("Http :/://localhost/mizuho")

}

[WebMethod]
// Assumes that the vendor name is unique, from a business perspective
հասարակություն Վաճառող GetSpecificVendorByVendorName(լարային vendorName)
{
լարային SpVendorSiteName; // Name of the actual MOSS site that hosts the vendor custom list.
լարային SpVendorListName; // Name of the actual MOSS list containing vendors.

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

օգտագործելով (SPSite site = նոր SPSite(SpVendorSiteName))
{
օգտագործելով (SPWeb web = site.OpenWeb())
{

SPList currentList = web.Lists[SpVendorListName];

ԲՀԿ (Թքել vendorItem մեջ currentList.Items)
{
եթե (vendorItem["Vendor Name"] == զրո) շարունակել;

եթե (vendorItem["Vendor Name"].ToString().Հավասար(vendorName))
վերադարձ նոր Վաճառող(vendorItem);
}

Վաճառող v = նոր Վաճառող();
v.VendorPhone = "not found: " + vendorName;

վերադարձ v;

վերադարձ զրո;

} // using spweb web = site.openweb()
} // using spsite site = new spsite("Http :/://localhost/mizuho")

} // մեթոդ

[WebMethod]
հասարակություն Վաճառող[] GetVendorsOfType (լարային Զտել տեսակը)
{

լարային SpVendorSiteName; // Name of the actual MOSS site that hosts t
he vendor custom list.
լարային SpVendorListName; // Name of the actual MOSS list containing vendors.

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

Վաճառող[] resultList;
int vendorIndex = 0;
resultList = նոր Վաճառող[1000];

// Initialize the list with a default friendly message.
Վաճառող v = նոր Վաճառող();
v.VendorName = "Select a vendor type to populate this list.";
resultList[0] = v;

// Convert the filter to lower case for easier string comparison later.
filterType = filterType.ToLower();

// If the filter type passed is "test", generate some simple data.
#մարզ Filter type = "test"
եթե (filterType.Equals("test"))
վերադարձ GenerateTestVendors();
#endregion

եթե (ճիշտ)
{
օգտագործելով (SPSite site = նոր SPSite(SpVendorSiteName))
{
օգտագործելով (SPWeb web = site.OpenWeb())
{

v = զրո;

SPList currentList = web.Lists[SpVendorListName];

// Iterate through all the items in the vendor list.
ԲՀԿ (Թքել vendorItem մեջ currentList.Items)
{

լարային lowerVendorType;

lowerVendorType = vendorItem["PurchaseType"].ToString().ToLower();
lowerVendorType = lowerVendorType.Substring(3);

եթե (lowerVendorType.Equals(Զտել տեսակը))
{
resultList[vendorIndex ] = նոր Վաճառող(vendorItem);
}
} // iterating thru all the vendors in the list


վերադարձ TrimVendorArray(vendorIndex, resultList);
// return resultList;

} // using spweb web = site.openweb()
} // using spsite site = new spsite("Http :/://localhost/mizuho")

} // if true

վերադարձ զրո;
}

անձնական Վաճառող[] TrimVendorArray(int newsize, Վաճառող[] originalVendorArray)
{
Վաճառող[] trimmedArray;

եթե (newsize == 0) newsize = 1;
trimmedArray = նոր Վաճառող[newsize];

int currentCounter = 0;

համար (currentCounter = 0; currentCounter < newsize; currentCounter )
{
trimmedArray[currentCounter] = originalVendorArray[currentCounter];
}

վերադարձ trimmedArray;

}
}

MOSS: Դիտարկումներ InfoPath կարգաբերում

InfoPath ձեւ server error messages են մոլորեցնելու.

Ընթացքում զարգացման վրա InfoPath ձեւ, Ես չունեք այն MOSS սերվերի եւ մուտք ձեւը. Ձեւը սկսում է բեռնել եւ ապա առաջացնում ապակողմնորոշիչ չունեք հաղորդագրություն մատնացույց ինձ պատուհանների միջոցառման log Մանրամասների համար. Ի դեպ, ոչ հաղորդագրությունը գրվել է Windows միջոցառման log. Ավելի շուտ, հաղորդագրությունը ուղարկվել է MOSS ascii դիագնոստիկ log. Դուք կարող եք հետեւել, թե ներքեւ միջոցով կենտրոնական ծառայությունների կառավարման.

Դուք պետք է արագ ձեր ոտքերը. MOSS սիրում գրել, որ ֆայլը, հաճախ եւ verbosely. This can be trimmed but the default log writing behavior is "everything as quickly as possible".

MOSS: Թարմացվում գործարկողի ցուցակը

Կան շատ լավ օրինակներ թարմացնելու հարմարեցված ցուցակների միջոցով SDK. Ահա եւս մեկ.

Բիզնես խնդիրը: InfoPath ձեւը արդեն մշակված է, որ հնարավորություն է տալիս օգտվողներին մուտք գործել առցանց գնումների requisitions. PO պահանջ համարները պետք է լինի ավանդական հաջորդականությունը ի թիվ արժեքները եւ հաշվարկվում է ավտոմատ կերպով.

Բիզնես Solution: Ստեղծել գործարկողի MOSS ցանկը պարունակող երկու սյունակների: "ControlField" and "ControlValue". Արժեքը սյունակը պարունակում է հաջորդ գնման պահանջ համարը. Note that the generic "control" անվանելու Կոնվենցիայի հետագա կառավարման ոլորտներում, որը կարող է օգտագործվել որպես անհրաժեշտ.

Տեխնիկական Solution: Ստեղծել վեբ ծառայություն մուտք գործել կողմից InfoPath հաճախորդի. Վեբ ծառայությունը վերադարձնում հետ հերթական գնման պահանջ համարը եւ թարմացումներ արժեքը ցուցակի.

Քաղված դասերը:

  • Երբ որ այս վեբ ծառայություն, որպես տվյալների աղբյուր է InfoPath ձեւով, Ես գտա, որ անհրաժեշտ է փոխարկել այն UDC եւ պահպանել այն տվյալների կապի գրադարան.
  • Ես էլ գտա, որ անհրաժեշտ է հնարավորություն տալ խաչ դոմենի Scripting միջոցով կենտրոնական ծառայությունների կառավարման // դիմումը կառավարում // Ձեւ սերվերի կոնֆիգուրացիայի.
  • Առաջին անգամ ձեւը փորձեց օգտվել ինտերնետային ծառայություններից, Այն տեւում է մի քիչ, իսկ կապակցությամբ, դա Ժամանակը ավարտվեց. Ես fiddled պարամետրերով ձեւի սերվերի կոնֆիգուրացիայի ընդլայնել timeout պարամետրերը, եւ որ կարծես օգնել.

Կոդը:

օգտագործելով Համակարգ;
օգտագործելով 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 the following line if using designed components
//InitializeComponent();
}

/// <ամփոփում>
/// Obtain the next PO number from the sharepoint po number control list.
/// Increment the PO number in that list.
/// </ամփոփում>
/// <վերադառնում></վերադառնում>
[WebMethod]
հասարակություն լարային GetNextPoNumber()
{
լարային SpPoControlSiteName; // Name of the actual MOSS site that hosts the PO Control list.
լարային SpPoControlListName; // Name of the actual MOSS list containing the Po control.

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

լարային nextPoReqNumber = "Xyzzy";

օգտագործելով (SPSite site = նոր SPSite(SpPoControlSiteName))
{
օգտագործելով (SPWeb web = site.OpenWeb())
{

SPList currentList = web.Lists[SpPoControlListName];

ԲՀԿ (Թքել controlItem մեջ currentList.Items)
{

եթե (((լարային)controlItem["ControlField"]).Հավասար("NextPoNumber"))
{
nextPoReqNumber = (լարային)controlItem["ControlValue"];

int int_nextPoReqNumber;
int_nextPoReqNumber = Փոխակերպել.ToInt32(nextPoReqNumber);

int_nextPoReqNumber ;

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

} // Locating, reading and updating the PO number in the list.


} // using spweb web = site.openweb()
} // using spsite site = new spsite("Http :/://localhost/mizuho")

վերադարձ nextPoReqNumber;

}
}