Buwanang Archive: Hulyo 2007

Lumot: Iterating sa pamamagitan ng mga pasadyang mga listahan at bumabalik na-filter na data upang InfoPath

Negosyo Sitwasyon:

Magbigay ng isang pamamaraan na nagbibigay-daan sa mga gumagamit upang ipasok ang tumpak na requisitions pagbili mabilis.

Business problema:

Client ang ginagawa ng negosyo na may ilang daang mga vendor.

Vendors are "type" tiyak. Nangangahulugan ito na ang isang vendor nagbebenta ng computer na kagamitan (e.g. Labak na may gubat) o opisina supplies (e.g. Staples).

Paano namin paganahin ang end user na lumikha requisitions pagbili pumili ng wastong vendor?

Business Solusyon:

Differentiate vendors in the system via "type".

Enable users to select the "type" ng produkto at pagkatapos ay magbigay ng isang filter na hanay ng mga naaangkop na mga tagabenta.

Teknikal na Solusyon:

Isang InfoPath form na ay nai-dinisenyo na nagbibigay-daan sa mga gumagamit upang ipasok ang mga online na pagbili requisitions.

Dalawang InfoPath seleksyon ng mga listahan kontrol vendor seleksyon. Una, 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.

Vendor ay naka-imbak sa isang listahan ng mga custom Moss na may pasadyang hanay para sa mga katangian ng vendor tulad ng pangalan, address and especially "type".

Ipatupad ang isang web serbisyo para sa isang InfoPath client upang ubusin na iterates sa pamamagitan ng mga pasadyang listahan ng vendor, returning only vendors matching a supplied "type".

Tumawag sa diyos ang serbisyo sa web sa pamamagitan ng form InfoPath.

Aralin natutunan:

  • Una, parang ang kinakailangan upang pumunta ito ruta. Gusto ko na mas gusto na gawin ang pag-filter sa loob ng ganap na InfoPath at hindi gumawa ng anumang mga pag-andar ng web service dito. Gayunman, mga form server ay hindi nagbibigay ng mga kinakailangang pag-filter ng kakayahan. We can put a rule onto a the "type" pagpili listahan sa form upang ayusin ng muling buksan ang query vendor, ngunit hindi namin maaaring makakuha ng mga ito upang gumana nang maayos. Samakatwid, iyon ay kinakailangan upang ipatupad ang mga serbisyo sa web.
  • This is a classic "cascading selection list" problema sa InfoPath mundo mga form server at mayroong maraming mga mahusay na mga halimbawa out doon na ipaliwanag kung paano malutas ito.
  • Ang isang blangko ang halaga para sa isang hanay sa listahan ng vendor ay hindi nagbabalik ng isang walang laman na string kapag reference na tulad nito: initItem["Vendor Name"]. Sa halip, ito ay nagbabalik ng null.

Ang ilang mga iba pang mga Tala:

  • Bumalik akong isang array[] ng mga vendor dahil ako ay may ilang mga kahirapan bumabalik isang ArrayList. InfoPath ay nagrereklamo tungkol dito at hindi ko magkaroon ng oras o ang pagkahilig upang labanan sa ibabaw nito. Ito, mangyari pa, naglalagay ng artipisyal na hangganan ang kabuuang bilang ng mga vendor. Mayroon din napilitang akin upang ipatupad ang isang trim() method on the array because I hate the idea of returning back 100’s of null vendors. InfoPath ay hindi mahalaga, ngunit ito nagged sa akin. (Muli, ito ay mas madali kaysa sa pakikipaglaban sa ibabaw InfoPath ArrayLists).
  • Ako ipinatupad ng GetSpecificVendorByName() function na pati na rin, na maaaring may itinuturo.

Ang code:

paggamit Sistema;
paggamit System.Web;
paggamit System.Web.Services;
paggamit System.Web.Services.Protocols;
paggamit Microsoft.SharePoint;
paggamit System.Configuration;

/// <buod>
///
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.
///
/// </buod>
[WebService(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
publiko klase VendorService : System.Web.Services.WebService
{

/// <buod>
/// Represents a vendor from a custom sharepoint list maintained by MSUSA.
/// </buod>
publiko klase Vendor
{
publiko Vendor() { }

publiko Vendor(Magtuhog initItem)
{
kung (! (initItem["Vendor Name"] == sero)) VendorName = initItem["Vendor Name"].ToString();
kung (! (initItem["Address 1"] == sero)) VendorAddress1 = initItem["Address 1"].ToString();
kung (! (initItem["Address 2"] == sero)) VendorAddress2 = initItem["Address 2"].ToString();
kung (! (initItem["City"] == sero)) VendorCity = initItem["City"].ToString();
kung (! (initItem["VendorPhone"] == sero)) VendorPhone = initItem["VendorPhone"].ToString();
kung (! (initItem["PurchaseType"] == sero)) VendorType = initItem["PurchaseType"].ToString();
kung (! (initItem["State"] == sero)) VendorState = initItem["State"].ToString();
kung (! (initItem["Zip"] == sero)) VendorZip = initItem["Zip"].ToString();
kung (!(initItem["Fax"] == sero)) VendorFax = initItem["Fax"].ToString();
kung (!(initItem["SalesRepName"] == sero)) VendorSalesRepName = initItem["SalesRepName"].ToString();

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

publiko int VendorItemId;
publiko pisi VendorName;
publiko pisi VendorAddress1;
publiko pisi VendorAddress2;
publiko pisi VendorCity;
publiko pisi VendorState;
publiko pisi VendorZip;
publiko pisi VendorPhone;
publiko pisi VendorType;
publiko pisi VendorSalesRepName;
publiko pisi VendorFax;
}

publiko VendorService () {

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

pribado Vendor[] GenerateTestVendors()
{
Vendor[] resultList;
resultList = bago Vendor[100];

Vendor v;
v = bago Vendor();
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 = bago Vendor();

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 = bago Vendor();
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;

bumalik resultList;

}

[WebMethod]
publiko Vendor GetSpecificVendorById(int vendorId)
{
pisi SpVendorSiteName; // Name of the actual MOSS site that hosts the vendor custom list.
pisi SpVendorListName; // Name of the actual MOSS list containing vendors.

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

paggamit (SPSite site = bago SPSite(SpVendorSiteName))
{

paggamit (SPWeb web = site.OpenWeb())
{

SPList currentList = web.Lists[SpVendorListName];

Magtuhog specificItem = currentList.Items[vendorId];

bumalik bago Vendor(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
publiko Vendor GetSpecificVendorByVendorName(pisi vendorName)
{
pisi SpVendorSiteName; // Name of the actual MOSS site that hosts the vendor custom list.
pisi SpVendorListName; // Name of the actual MOSS list containing vendors.

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

paggamit (SPSite site = bago SPSite(SpVendorSiteName))
{
paggamit (SPWeb web = site.OpenWeb())
{

SPList currentList = web.Lists[SpVendorListName];

foreach (Magtuhog vendorItem sa currentList.Items)
{
kung (vendorItem["Vendor Name"] == sero) magpatuloy;

kung (vendorItem["Vendor Name"].ToString().Kapantay(vendorName))
bumalik bago Vendor(vendorItem);
}

Vendor v = bago Vendor();
v.VendorPhone = "not found: " + vendorName;

bumalik v;

bumalik sero;

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

} // pamamaraan

[WebMethod]
publiko Vendor[] GetVendorsOfType (pisi uri ng filter)
{

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

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

Vendor[] resultList;
int vendorIndex = 0;
resultList = bago Vendor[1000];

// Initialize the list with a default friendly message.
Vendor v = bago Vendor();
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.
#rehiyon Filter type = "test"
kung (filterType.Equals("test"))
bumalik GenerateTestVendors();
#endregion

kung (totoo)
{
paggamit (SPSite site = bago SPSite(SpVendorSiteName))
{
paggamit (SPWeb web = site.OpenWeb())
{

v = sero;

SPList currentList = web.Lists[SpVendorListName];

// Iterate through all the items in the vendor list.
foreach (Magtuhog vendorItem sa currentList.Items)
{

pisi lowerVendorType;

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

kung (lowerVendorType.Equals(uri ng filter))
{
resultList[vendorIndex ] = bago Vendor(vendorItem);
}
} // iterating thru all the vendors in the list


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

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

} // if true

bumalik sero;
}

pribado Vendor[] TrimVendorArray(int newsize, Vendor[] originalVendorArray)
{
Vendor[] trimmedArray;

kung (newsize == 0) newsize = 1;
trimmedArray = bago Vendor[newsize];

int currentCounter = 0;

para (currentCounter = 0; currentCounter < newsize; currentCounter )
{
trimmedArray[currentCounter] = originalVendorArray[currentCounter];
}

bumalik trimmedArray;

}
}

Lumot: Pagmamasid sa InfoPath pag-debug

InfoPath form na error sa server ang mga mensahe ay nakaliligaw na.

Sa panahon ng pag-unlad ng isang form na InfoPath, Gusto ko itong i-post sa Moss server at ma-access ang form. Ang form na nais simulan i-load at pagkatapos ay bumuo ng isang nakaliligaw na mensahe ng error na nakaturo sa akin ng pag-log bintana ng kaganapan para sa mga detalye. Sa katunayan, walang mga mensahe ay isinulat ng pag-log bintana kaganapan. Sa lalong maliwanag, ang mensahe ay ipinadala sa Moss log ascii diagnostic. Maaari mong subaybayan ang down na sa pamamagitan ng sentro ng serbisyo ng administrasyon.

Kailangan ninyong maging mabilis sa iyong mga paa. Moss may gusto na magsulat sa mga file ng log, madalas at verbosely. This can be trimmed but the default log writing behavior is "everything as quickly as possible".

Lumot: Ina-update ang isang pasadyang listahan

Maraming mga mahusay na mga halimbawa ng mga pag-update ng mga pasadyang mga listahan sa pamamagitan ng SDK. Narito ang isa pang.

Business problema: InfoPath form na ay dinisenyo na nagbibigay-daan sa mga gumagamit upang ipasok ang mga online na pagbili requisitions. Mga numero ng PO pag-uutos ay dapat na tradisyonal na pagkakasunud-sunod batay sa mga halaga ng integer at kinakalkula awtomatikong.

Business Solusyon: Lumikha ng isang pasadyang listahan Moss na naglalaman ng dalawang mga hanay: "ControlField" and "ControlValue". Ang halaga haligi ay naglalaman ng susunod na pagbili bilang pag-uutos. Note that the generic "control" pagbibigay ng pangalan sa convention ay nagbibigay ng para sa hinaharap na mga patlang ng control na maaaring gamitin bilang kinakailangan.

Teknikal na Solusyon: Lumikha ng isang serbisyo sa web access ng mga client InfoPath. Ang web serbisyo ay nagbabalik bumalik sa susunod na pagbili hingi numero at update ang halaga ng listahan.

Aralin natutunan:

  • Kapag idinadagdag ang serbisyo sa web bilang isang pinagmumulan ng data sa form InfoPath, May nakita akong ito kinakailangan upang i-convert ito sa isang udc at mag-imbak ito sa isang library data koneksyon.
  • Din ako nahanap ito na kinakailangan upang paganahin ang krus domain scripting sa pamamagitan ng gitnang mga serbisyo ng administrasyon // application ng pamamahala // form ng configuration ng server.
  • Ang unang pagkakataon na ang form na sinubukan upang ma-access ang mga serbisyo sa web, ito ay tumatagal ng isang sandali at paminsan-minsan, Gusto ito time out. Fiddled ko na may mga setting sa form na configuration ng server upang palawakin ang timeout mga setting at na tila upang matulungan.

Ang code:

paggamit Sistema;
paggamit System.Web;
paggamit System.Web.Services;
paggamit System.Web.Services.Protocols;
paggamit Microsoft.SharePoint;
paggamit System.Configuration;

[WebService(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
publiko klase PoService : System.Web.Services.WebService
{
publiko PoService () {

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

/// <buod>
/// Obtain the next PO number from the sharepoint po number control list.
/// Increment the PO number in that list.
/// </buod>
/// <return></return>
[WebMethod]
publiko pisi GetNextPoNumber()
{
pisi SpPoControlSiteName; // Name of the actual MOSS site that hosts the PO Control list.
pisi SpPoControlListName; // Name of the actual MOSS list containing the Po control.

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

pisi nextPoReqNumber = "xyzzy";

paggamit (SPSite site = bago SPSite(SpPoControlSiteName))
{
paggamit (SPWeb web = site.OpenWeb())
{

SPList currentList = web.Lists[SpPoControlListName];

foreach (Magtuhog controlItem sa currentList.Items)
{

kung (((pisi)controlItem["ControlField"]).Kapantay("NextPoNumber"))
{
nextPoReqNumber = (pisi)controlItem["ControlValue"];

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

bumalik nextPoReqNumber;

}
}