Moss / InfoPath Format Server (InfoPath 2007) drop-down list performancës

Kategoria shtesë: InfoPath

Përmbledhje: Një InfoPath 2007 formojnë të vendoset në një server MOSS ofron një drop-down list e shitësit të lidhura me një listë me porosi MOSS. Me zgjedhjen e një shitës, Rregullat caktojë vlerat në terren për një pjesë të vogël të fushave të tekstit të tilla si emri shitjes rep, adresë, qytet, shtet, zip dhe telefoni. Performanca është e tmerrshme. Vërejmë se performanca merr keq (në një mënyrë jo-lineare) për çdo fushë shtesë ne update këtë mënyrë. Dmth, nëse ne vetëm update emrin shitjes rep, ajo merr [x] Sasinë e kohës. Nëse ne update shitjes rep, address1, address2, qytet, shtet, zip, ajo merr 10 herë më të gjatë.

Zgjidhje: Shkruani një shërbim web (Kodi mostër mund të gjenden këtu) që është kaluar në emër të një shitës dhe ajo kthehet prapa detajet shitësi. Pastaj, caktojë fushat në këtë mënyrë. Edhe pse kjo duket shumë e ngadaltë, nuk kishte asnjë dallim dukshme në performancën kur kemi caktuar 1 fushë kundrejt 8 Fushat. Si një bonus shtuar, users get a cool "contacting the server" Cylon Efekti ndërsa ata presin për formën të thirret dhe të konsumojnë rezultatet shërbimit.

Moss: Përjashtim ndodhur. (Përjashtim nga HRESULT: 0x80020009 (DISP_E_EXCEPTION))

UPDATE: Ne kurrë nuk përcaktohet shkaku rrënja e këtij problemi dhe ajo kurrë nuk shfaqen përsëri.

Ne njoftim gjatë zbatimit të një faqe të zhvillimit që papritmas, dy përdoruesit janë në gjendje për të hyrë në një koleksion faqe. Ato llogaritë mund të vërtetoj në faqen kryesore, por kur u përpjekur për të hyrë në një koleksion të veçantë faqe, ata vetëm të marrë një ekran bosh. Nuk ka gabime shfaqet, vetëm një faqe bosh të bardhë.

Ne hyni në si një admin site collection dhe të përpiqemi për të shtuar një nga ata përdorues admin si një vend dhe këtë herë, upon pressing "OK", ne kemi marrë këtë mesazh:

Përjashtim ndodhur. (Përjashtim nga HRESULT: 0x80020009 (DISP_E_EXCEPTION))

Ne kaloi disa kohë kërkime dhe kjo për fat të keq, nuk ka dalë me ndonjë gjë të dobishme. Ka pasur disa mesazhe në log diagnostik, por ajo ishte e vështirë për të pikërisht ato lidhen me këtë çështje.

Në fund, Ne fshirjes site collection dhe ri-krijuar atë dhe zgjidhur atë që.

Nëse unë kuptoj se çfarë e shkaktoi këtë në të ardhmen, Unë do update këtë post.

Moss: Iterating përmes listave doganore dhe kthimin e të dhënave për të filtruar InfoPath

Skenari Biznes:

Të sigurojë një metodë që mundëson përdoruesve për të hyrë shkresave të sakta blerjes shpejt.

Problemi Biznes:

Klienti bën biznes me qindra disa shitësit.

Vendors are "type" specifik. Kjo do të thotë që një shitës shet pajisje kompjuterike (e.g. Luginë) ose furnizimet e zyrës (e.g. Staples).

Si nuk kemi të mundësojë përdoruesit përfundimtarë të cilët krijojnë shkresave blerjes përzgjidhni një shitës të vlefshme?

Zgjidhja e Biznesit:

Differentiate vendors in the system via "type".

Enable users to select the "type" e produktit dhe pastaj të sigurojë një sërë filtruar nga shitësit të përshtatshme.

Zgjidhja teknike:

Një formë InfoPath ka qenë i dizajnuar që i mundëson përdoruesve për të hyrë shkresave blerje online.

Dy Zgjedhja InfoPath listat e kontrollit shitësi përzgjedhjes. I parë, 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.

Shitësit janë të ruajtura në një listë me porosi MOSS me kolona porosi për shitësi atributeve të tilla si emri, address and especially "type".

Zbatimi i një web shërbim për një klient InfoPath për të konsumuar që iterates nëpër lista shitësi porosi, returning only vendors matching a supplied "type".

Të thirret në shërbimin e internetit nëpërmjet formularit InfoPath.

Mësimet e mësuara:

  • I parë, kjo duket e nevojshme të shkoni këtë rrugë. Unë do të kishte preferuar për të bërë filtrimin tërësisht brenda InfoPath dhe nuk krijojnë asnjë funksionalitet të shërbimit të internetit këtu. Megjithatë, forma server nuk siguron aftësinë e kërkuar filtrim. We can put a rule onto a the "type" Lista e përzgjedhjes në formë të lloj ri-hapur query shitësi, por ne nuk mund të merrni atë për të punuar si duhet. Prandaj, ajo ishte e nevojshme për të zbatuar shërbimin e internetit.
  • This is a classic "cascading selection list" Problemi në botë forma InfoPath server dhe ka shumë shembuj të mirë atje që shpjegojnë se si për të zgjidhur këtë.
  • Një vlerë bosh për një kolonë në listën shitësi nuk kthehet një varg të zbrazët kur referohen si kjo: initItem["Vendor Name"]. Në vend të kësaj, ajo kthen një nul.

Disa shënime të tjera:

  • Unë kthehem një rrjet[] e shitësit, sepse kam pasur disa vështirësi kthimin e një ArrayList. InfoPath u ankuar në lidhje me të dhe unë nuk kanë kohë ose preferencë për të luftuar mbi të. Kjo, sigurisht, vendos një limit artificiale të numrit të përgjithshëm të shitësit. Ajo gjithashtu detyruar mua për të zbatuar një trim() method on the array because I hate the idea of returning back 100’s of null vendors. InfoPath nuk kujdeset, por ajo nagged në mua. (Përsëri, kjo ishte më e lehtë se sa duke luftuar InfoPath mbi ArrayLists).
  • Unë zbatuar një GetSpecificVendorByName() funksionojnë si edhe, e cila mund të jetë udhëzuese.

Kodi:

përdorim Sistem;
përdorim System.Web;
përdorim System.Web.Services;
përdorim System.Web.Services.Protocols;
përdorim Microsoft.SharePoint;
përdorim System.Configuration;

/// <përmbledhje>
///
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.
///
/// </përmbledhje>
[Webservice(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
publik klasë VendorService : System.Web.Services.Webservice
{

/// <përmbledhje>
/// Represents a vendor from a custom sharepoint list maintained by MSUSA.
/// </përmbledhje>
publik klasë Shitës
{
publik Shitës() { }

publik Shitës(Pështyj initItem)
{
nëse (! (initItem["Vendor Name"] == zero)) VendorName = initItem["Vendor Name"].ToString();
nëse (! (initItem["Address 1"] == zero)) VendorAddress1 = initItem["Address 1"].ToString();
nëse (! (initItem["Address 2"] == zero)) VendorAddress2 = initItem["Address 2"].ToString();
nëse (! (initItem["City"] == zero)) VendorCity = initItem["City"].ToString();
nëse (! (initItem["VendorPhone"] == zero)) VendorPhone = initItem["VendorPhone"].ToString();
nëse (! (initItem["PurchaseType"] == zero)) VendorType = initItem["PurchaseType"].ToString();
nëse (! (initItem["State"] == zero)) VendorState = initItem["State"].ToString();
nëse (! (initItem["Zip"] == zero)) VendorZip = initItem["Zip"].ToString();
nëse (!(initItem["Fax"] == zero)) VendorFax = initItem["Fax"].ToString();
nëse (!(initItem["SalesRepName"] == zero)) VendorSalesRepName = initItem["SalesRepName"].ToString();

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

publik int VendorItemId;
publik varg VendorName;
publik varg VendorAddress1;
publik varg VendorAddress2;
publik varg VendorCity;
publik varg VendorState;
publik varg VendorZip;
publik varg VendorPhone;
publik varg VendorType;
publik varg VendorSalesRepName;
publik varg VendorFax;
}

publik VendorService () {

//Uncomment the following line if using designed components
//InitializeComponent();
}

privat Shitës[] GenerateTestVendors()
{
Shitës[] resultList;
resultList = i ri Shitës[100];

Shitës v;
v = i ri Shitës();
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 = i ri Shitës();

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 = i ri Shitës();
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;

kthehem resultList;

}

[WebMethod]
publik Shitës GetSpecificVendorById(int vendorId)
{
varg SpVendorSiteName; // Name of the actual MOSS site that hosts the vendor custom list.
varg SpVendorListName; // Name of the actual MOSS list containing vendors.

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

përdorim (SPSite site = i ri SPSite(SpVendorSiteName))
{

përdorim (SPWeb web = site.OpenWeb())
{

SPList currentList = web.Lists[SpVendorListName];

Pështyj specificItem = currentList.Items[vendorId];

kthehem i ri Shitës(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
publik Shitës GetSpecificVendorByVendorName(varg vendorName)
{
varg SpVendorSiteName; // Name of the actual MOSS site that hosts the vendor custom list.
varg SpVendorListName; // Name of the actual MOSS list containing vendors.

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

përdorim (SPSite site = i ri SPSite(SpVendorSiteName))
{
përdorim (SPWeb web = site.OpenWeb())
{

SPList currentList = web.Lists[SpVendorListName];

foreach (Pështyj vendorItem currentList.Items)
{
nëse (vendorItem["Vendor Name"] == zero) vazhdoj;

nëse (vendorItem["Vendor Name"].ToString().Është e barabartë me(vendorName))
kthehem i ri Shitës(vendorItem);
}

Shitës v = i ri Shitës();
v.VendorPhone = "not found: " + vendorName;

kthehem v;

kthehem zero;

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

} // metodë

[WebMethod]
publik Shitës[] GetVendorsOfType (varg lloj filtri)
{

varg SpVendorSiteName; // Name of the actual MOSS site that hosts t
he vendor custom list.
varg SpVendorListName; // Name of the actual MOSS list containing vendors.

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

Shitës[] resultList;
int vendorIndex = 0;
resultList = i ri Shitës[1000];

// Initialize the list with a default friendly message.
Shitës v = i ri Shitës();
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.
#rajon Filter type = "test"
nëse (filterType.Equals("test"))
kthehem GenerateTestVendors();
#endregion

nëse (i vërtetë)
{
përdorim (SPSite site = i ri SPSite(SpVendorSiteName))
{
përdorim (SPWeb web = site.OpenWeb())
{

v = zero;

SPList currentList = web.Lists[SpVendorListName];

// Iterate through all the items in the vendor list.
foreach (Pështyj vendorItem currentList.Items)
{

varg lowerVendorType;

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

nëse (lowerVendorType.Equals(lloj filtri))
{
resultList[vendorIndex ] = i ri Shitës(vendorItem);
}
} // iterating thru all the vendors in the list


kthehem TrimVendorArray(vendorIndex, resultList);
// return resultList;

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

} // if true

kthehem zero;
}

privat Shitës[] TrimVendorArray(int newsize, Shitës[] originalVendorArray)
{
Shitës[] trimmedArray;

nëse (newsize == 0) newsize = 1;
trimmedArray = i ri Shitës[newsize];

int currentCounter = 0;

për (currentCounter = 0; currentCounter < newsize; currentCounter )
{
trimmedArray[currentCounter] = originalVendorArray[currentCounter];
}

kthehem trimmedArray;

}
}

Moss: Vëzhgimet mbi debugging InfoPath

Forma InfoPath server error mesazhet janë të rrejshme.

Gjatë zhvillimit të një forme InfoPath, Unë do të postoj atë në serverin myshk dhe hyni në formularin. Formulari do të fillojë të ngarkesës dhe pastaj të gjenerojë një mesazh gabimi çorientuese duke treguar mua me dritaret log ngjarje për detaje. Në të vërtetë, no message was written to the windows event log. Rather, the message was sent to the MOSS ascii diagnostic log. You can track that down via central services administration.

You need to be quick on your feet. MOSS likes to write to the log file, frequently and verbosely. This can be trimmed but the default log writing behavior is "everything as quickly as possible".

Moss: Përditësimi një listë me porosi

Ka shumë shembuj të mirë të përditësimit të listave porosi nëpërmjet SDK. Këtu është ende një.

Problemi Biznes: Forma InfoPath ka qenë i dizajnuar që i mundëson përdoruesve për të hyrë shkresave blerje online. Shkresë PO numrat duhet të jenë të bazuara në vlerat tradicionale rend numër të plotë dhe llogaritet automatikisht.

Zgjidhja e Biznesit: Krijo një listë me porosi Moss përmban dy kolona: "ControlField" and "ControlValue". The value column contains the next purchase requisition number. Note that the generic "control" naming convention provides for future control fields that may be used as needed.

Zgjidhja teknike: Create a web service accessed by the InfoPath client. The web service returns back the next purchase requisition number and updates the value of the list.

Mësimet e mësuara:

  • When adding this web service as a data source to the InfoPath form, I found it necessary to convert it to a udc and store it into a data connection library.
  • I also found it necessary to enable cross domain scripting via central services administration // application management // form server configuration.
  • The first time the form tried to access the web service, it takes a while and on occasion, it would time out. I fiddled with settings in form server configuration to expand the timeout settings and that seemed to help.

Kodi:

përdorim Sistem;
përdorim System.Web;
përdorim System.Web.Services;
përdorim System.Web.Services.Protocols;
përdorim Microsoft.SharePoint;
përdorim System.Configuration;

[Webservice(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
publik klasë PoService : System.Web.Services.Webservice
{
publik PoService () {

//Uncomment the following line if using designed components
//InitializeComponent();
}

/// <përmbledhje>
/// Obtain the next PO number from the sharepoint po number control list.
/// Increment the PO number in that list.
/// </përmbledhje>
/// <returns></returns>
[WebMethod]
publik varg GetNextPoNumber()
{
varg SpPoControlSiteName; // Name of the actual MOSS site that hosts the PO Control list.
varg SpPoControlListName; // Name of the actual MOSS list containing the Po control.

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

varg nextPoReqNumber = "xyzzy";

përdorim (SPSite site = i ri SPSite(SpPoControlSiteName))
{
përdorim (SPWeb web = site.OpenWeb())
{

SPList currentList = web.Lists[SpPoControlListName];

foreach (Pështyj controlItem currentList.Items)
{

nëse (((varg)controlItem["ControlField"]).Është e barabartë me("NextPoNumber"))
{
nextPoReqNumber = (varg)controlItem["ControlValue"];

int int_nextPoReqNumber;
int_nextPoReqNumber = Convert.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")

kthehem nextPoReqNumber;

}
}