मासिक अभिलेख: जुलाई 2007

काई: कस्टम सूचियों के माध्यम से iterating और फ़िल्टर किए गए डेटा को InfoPath लौटने

व्यापार परिदृश्य:

एक तरीका है कि उपयोगकर्ताओं को सटीक खरीद माँग शीघ्रता से दर्ज करने के लिए सक्षम बनाता है प्रदान करते हैं.

व्यापार समस्या:

ग्राहक कई सौ विक्रेताओं के साथ व्यापार करता है.

"प्रकार विक्रेताओं रहे हैं" विशिष्ट. इसका मतलब यह है कि एक विक्रेता के कंप्यूटर उपकरण बेचता है (जैसे. डेल) या कार्यालय आपूर्तियाँ (जैसे. स्टेपल).

हम अंत उपयोगकर्ता जो एक मान्य विक्रेता खरीद माँग चुनें बनाएँ कैसे सक्षम करूँ?

व्यापार समाधान:

"प्रकार" के माध्यम से व्यवस्था में विक्रेताओं अंतर.

"प्रकार का चयन करने के लिए उपयोगकर्ताओं को सक्षम करें" उत्पाद की और उसके बाद उपयुक्त विक्रेताओं का कोई फ़िल्टर किए गए सेट प्रदान करते हैं.

तकनीकी समाधान:

किसी InfoPath प्रपत्र डिज़ाइन किया गया है कि सक्षम बनाता है उपयोगकर्ताओं को ऑनलाइन दर्ज करने की माँग खरीद.

विक्रेता चयन दो InfoPath चयन सूची नियंत्रण. प्रथम, उपयोगकर्ता एक "खरीद"प्रकार का चयन करता है. यह सीमा केवल विक्रेताओं है कि बेचने के लिए है कि खरीद के प्रकार होते हैं के लिए एक दूसरा चयन सूची. यह एक क्लासिक कैस्केडिंग ड्रॉप-डाउन है.

विक्रेताओं का नाम जैसे विक्रेता विशेषताओं के लिए कस्टम स्तंभों के साथ एक काई कस्टम सूची में संग्रहीत किए जाते हैं, पते और विशेष रूप से "प्रकार".

को लागू करने कि उपभोग करने के लिए किसी InfoPath क्लाइंट के लिए किसी वेब सेवा को कस्टम विक्रेता सूची के माध्यम से iterates, केवल एक आपूर्ति की "प्रकार" मिलान विक्रेताओं रिटर्निंग.

InfoPath प्रपत्र के द्वारा वेब सेवा आह्वान.

सबक सीखा:

  • प्रथम, यह लगता है कि इस मार्ग से जाना करने के लिए आवश्यक. मैं पूरी तरह से InfoPath के भीतर फ़िल्टरिंग करते हैं और किसी भी वेब सेवा कार्यक्षमता यहाँ पैदा नहीं पसंद होगा. हालांकि, प्रपत्र सर्वर की आवश्यकता फ़िल्टरिंग क्षमता प्रदान नहीं करता है. हम एक नियम पर रख सकते हैं एक "प्रकार" चयन सूची की तरह विक्रेता क्वेरी को पुन: खोलने के लिए के रूप में, लेकिन हम इसे ठीक से काम करने के लिए प्राप्त नहीं कर सकता. इसलिए, यह वेब सेवा को लागू करने के लिए आवश्यक था.
  • यह एक क्लासिक "कैस्केडिंग चयन सूची है" InfoPath में समस्या सर्वर दुनिया रूपों और वहाँ कई अच्छे उदाहरण है कि इस को हल करने के लिए कैसे की व्याख्या कर रहे हैं.
  • विक्रेता सूची में एक स्तंभ के लिए कोई रिक्त मान एक रिक्त स्ट्रिंग जब इस तरह संदर्भित वापस नहीं करता है: initItem["विक्रेता का नाम"]. इसके बजाय, यह एक null रिटर्न.

कुछ अन्य नोट्स:

  • मैं एक सरणी वापस[] विक्रेताओं की क्योंकि मैं कुछ कठिनाई एक ArrayList लौट रहा था. InfoPath इसके बारे में शिकायत कर रहा था और मैं समय या इसे खत्म से लड़ने के लिए झुकाव नहीं है. यह, बेशक, एक कृत्रिम सीमा विक्रेताओं की कुल संख्या पर डालता है. यह भी एक ट्रिम को लागू करने के लिए मुझे मजबूर किया() विधि सरणी पर क्योंकि मैं लौटने के विचार नफरत करता हूँ वापस बातिल विक्रेताओं के 100. InfoPath परवाह नहीं करता, लेकिन यह मुझ पर nagged. (फिर से, यह आसान ArrayLists से अधिक InfoPath से लड़ने की तुलना थी).
  • मैं एक 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
{

/// <सारांश>
/// MSUSA द्वारा अनुरक्षित किसी कस्टम sharepoint सूची से एक विक्रेता का प्रतिनिधित्व करता है.
/// </सारांश>
सार्वजनिक वर्ग विक्रेता
{
सार्वजनिक विक्रेता() { }

सार्वजनिक विक्रेता(SPItem initItem)
{
अगर (! (initItem["विक्रेता का नाम"] == अशक्त)) VendorName = initItem["विक्रेता का नाम"].ToString();
अगर (! (initItem["पता 1"] == अशक्त)) VendorAddress1 = initItem["पता 1"].ToString();
अगर (! (initItem["पता 2"] == अशक्त)) VendorAddress2 = initItem["पता 2"].ToString();
अगर (! (initItem["सिटी"] == अशक्त)) VendorCity = initItem["सिटी"].ToString();
अगर (! (initItem["VendorPhone"] == अशक्त)) VendorPhone = initItem["VendorPhone"].ToString();
अगर (! (initItem["PurchaseType"] == अशक्त)) VendorType = initItem["PurchaseType"].ToString();
अगर (! (initItem["राज्य"] == अशक्त)) VendorState = initItem["राज्य"].ToString();
अगर (! (initItem["ज़िप"] == अशक्त)) VendorZip = initItem["ज़िप"].ToString();
अगर (!(initItem["फ़ैक्स"] == अशक्त)) VendorFax = initItem["फ़ैक्स"].ToString();
अगर (!(initItem["SalesRepName"] == अशक्त)) VendorSalesRepName = initItem["SalesRepName"].ToString();

VendorItemId = initItem.ID; // अद्वितीय ID MOSS के द्वारा बनाए रखा.
}

सार्वजनिक int VendorItemId;
सार्वजनिक स्ट्रिंग VendorName;
सार्वजनिक स्ट्रिंग VendorAddress1;
सार्वजनिक स्ट्रिंग VendorAddress2;
सार्वजनिक स्ट्रिंग VendorCity;
सार्वजनिक स्ट्रिंग VendorState;
सार्वजनिक स्ट्रिंग VendorZip;
सार्वजनिक स्ट्रिंग VendorPhone;
सार्वजनिक स्ट्रिंग VendorType;
सार्वजनिक स्ट्रिंग VendorSalesRepName;
सार्वजनिक स्ट्रिंग VendorFax;
}

सार्वजनिक VendorService () {

//यदि का उपयोग कर निम्न पंक्ति घटक डिज़ाइन uncomment
//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; // कि विक्रेता कस्टम सूची को होस्ट करता है वास्तविक काई साइट का नाम.
स्ट्रिंग SpVendorListName; // वास्तविक काई विक्रेताओं से युक्त सूची का नाम.

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

का उपयोग कर (SPSite साइट = नई SPSite(SpVendorSiteName))
{

का उपयोग कर (SPWeb वेब साइट =। OpenWeb())
{

SPList currentList वेब =। सूचियाँ[SpVendorListName];

SPItem specificItem = currentList.Items[vendorId];

वापस जाएँ नई विक्रेता(specificItem);

} // spweb वेब का उपयोग = site.openweb()
} // spsite साइट का उपयोग करके नए spsite =("http://लोकलहोस्ट mizuho")

}

[WebMethod]
// विक्रेता नाम अद्वितीय है यह मान लिया गया, एक व्यापार के नजरिए से
सार्वजनिक विक्रेता GetSpecificVendorByVendorName(स्ट्रिंग हो)
{
स्ट्रिंग SpVendorSiteName; // कि विक्रेता कस्टम सूची को होस्ट करता है वास्तविक काई साइट का नाम.
स्ट्रिंग SpVendorListName; // वास्तविक काई विक्रेताओं से युक्त सूची का नाम.

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

का उपयोग कर (SPSite साइट = नई SPSite(SpVendorSiteName))
{
का उपयोग कर (SPWeb वेब साइट =। OpenWeb())
{

SPList currentList वेब =। सूचियाँ[SpVendorListName];

foreach (SPItem vendorItem में currentList.Items)
{
अगर (vendorItem["विक्रेता का नाम"] == अशक्त) «««;

अगर (vendorItem["विक्रेता का नाम"].ToString().के बराबर होती है(हो))
वापस जाएँ नई विक्रेता(vendorItem);
}

विक्रेता v = नई विक्रेता();
v.VendorPhone = "पाया नहीं: " + हो;

वापस जाएँ v;

वापस जाएँ अशक्त;

} // spweb वेब का उपयोग = site.openweb()
} // spsite साइट का उपयोग करके नए spsite =("http://लोकलहोस्ट 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 = अशक्त;

SPList currentList वेब =। सूचियाँ[SpVendorListName];

// विक्रेता सूची में सभी आइटम्स के माध्यम से पुनरावृति.
foreach (SPItem vendorItem में currentList.Items)
{

स्ट्रिंग lowerVendorType;

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

अगर (बराबरी lowerVendorType.(filterType))
{
resultList[vendorIndex ] = नई विक्रेता(vendorItem);
}
} // सूची में सभी विक्रेताओं के माध्यम से iterating


वापस जाएँ TrimVendorArray(vendorIndex, resultList);
// resultList वापसी;

} // spweb वेब का उपयोग = site.openweb()
} // spsite साइट का उपयोग करके नए spsite =("http://लोकलहोस्ट mizuho")

} // अगर यह सच है

वापस जाएँ अशक्त;
}

निजी विक्रेता[] 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 प्रपत्र के विकास के दौरान, मैं इसे MOSS सर्वर करने के लिए पोस्ट होता है और प्रपत्र तक पहुँच. प्रपत्र लोड और फिर मेरे विवरण के लिए windows इवेंट लॉग को इंगित करते हुए एक भ्रामक त्रुटि संदेश जनरेट करने के लिए शुरू होगा. वास्तव में, कोई संदेश windows ईवेंट लॉग करने के लिए लिखा गया था. बल्कि, काई ascii नैदानिक लॉग करने के लिए संदेश भेजा गया था. आप कि केंद्रीय सेवाओं के प्रशासन के माध्यम से नीचे ट्रैक कर सकते हैं.

तुम अपने पैरों पर जल्दी करने की जरूरत. काई को लॉग फ़ाइल में लिखने के लिए पसंद करती है, बार-बार और verbosely. यह छंटनी की जा कर सकते हैं, लेकिन डिफ़ॉल्ट लॉगऑन व्यवहार लेखन है "सब कुछ जल्द से जल्द".

काई: किसी कस्टम सूची अद्यतन करना

एसडीके के माध्यम से कस्टम सूचियों को अद्यतन करने का बहुत अच्छा उदाहरण हैं. यहाँ है अभी तक एक और.

व्यापार समस्या: InfoPath प्रपत्र डिज़ाइन किया गया है कि सक्षम बनाता है उपयोगकर्ताओं को ऑनलाइन दर्ज करने की माँग खरीद. PO पारंपरिक अनुक्रम संख्या होना चाहिए माँग पूर्णांक मानों के आधार और स्वचालित रूप से परिकलित.

व्यापार समाधान: एक कस्टम काई दो स्तंभों वाली सूची बनाएँ: "ControlField" और "ControlValue". मान स्तंभ जिसमें अगले खरीद माँग संख्या. के सामान्य नियंत्रण"कि ध्यान दें" नामकरण परिपाटी भविष्य नियंत्रण क्षेत्रों कि जरूरत के रूप में इस्तेमाल किया जा सकता के लिए प्रदान करता है.

तकनीकी समाधान: InfoPath ग्राहक द्वारा पहुँचा एक वेब सेवा बनाएँ. वेब सेवा वापस अगले खरीद माँग संख्या देता है और मूल्य सूची का अद्यतन करता है.

सबक सीखा:

  • जब इस वेब सेवा किसी डेटा स्रोत के रूप में InfoPath प्रपत्र के लिए जोड़ने, मैंने पाया यह यह करने के लिए एक udc कनवर्ट करें और उसे किसी डेटा कनेक्शन लायब्रेरी में संग्रहीत करने के लिए आवश्यक.
  • मैं भी इसे केंद्रीय सेवाओं के प्रशासन के माध्यम से पार डोमेन स्क्रिप्टिंग को सक्षम करने के लिए आवश्यक पाया // अनुप्रयोग प्रबंधन // प्रपत्र सर्वर कॉन्फ़िगरेशन.
  • पहली बार प्रपत्र वेब सेवा का उपयोग करने की कोशिश की, यह एक समय लेता है और इस अवसर पर, यह समय के बाहर होता. मुझे मध्यांतर सेटिंग्स का विस्तार करें करने के लिए सेटिंग्स के साथ प्रपत्र सर्वर कॉन्फ़िगरेशन में fiddled और मदद करने के लिए लग रहा था कि.

कोड:

का उपयोग कर प्रणाली;
का उपयोग कर 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
//InitializeComponent();
}

/// <सारांश>
/// अगले पो संख्या से sharepoint पो संख्या नियंत्रण सूची प्राप्त करें.
/// उस सूची में वेतन वृद्धि पो संख्या.
/// </सारांश>
/// <रिटर्न></रिटर्न>
[WebMethod]
सार्वजनिक स्ट्रिंग GetNextPoNumber()
{
स्ट्रिंग SpPoControlSiteName; // वास्तविक काई साइट पो नियंत्रण सूची होस्ट का नाम.
स्ट्रिंग SpPoControlListName; // वास्तविक काई पो नियंत्रण वाली सूची का नाम.

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

स्ट्रिंग nextPoReqNumber = "xyzzy";

का उपयोग कर (SPSite साइट = नई SPSite(SpPoControlSiteName))
{
का उपयोग कर (SPWeb वेब साइट =। OpenWeb())
{

SPList 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://लोकलहोस्ट mizuho")

वापस जाएँ nextPoReqNumber;

}
}