काई / InfoPath प्रपत्र सर्वर (InfoPath 2007) ड्रॉप-डाउन सूची प्रदर्शन

अतिरिक्त श्रेणी: InfoPath

सारांश: एक InfoPath 2007 एक MOSS सर्वर पर वितरित प्रपत्र विक्रेताओं एक कस्टम काई सूची करने के लिए बंधे की एक ड्रॉप-डाउन सूची प्रदान करता है. एक विक्रेता के चयन पर, फ़ील्ड मान पाठ फ़ील्ड्स जैसे बिक्री प्रतिनिधि नाम की एक मुट्ठी भर के लिए नियम असाइन करें, पता, शहर, राज्य, ज़िप और फोन. प्रदर्शन भयानक है. हम सूचना है कि प्रदर्शन खराब हो जाता है (एक गैर-रैखिक फैशन में) प्रत्येक अतिरिक्त फ़ील्ड के लिए हम इस तरह से अद्यतन. यानी, अगर हम सिर्फ बिक्री प्रतिनिधि नाम अद्यतन करें, यह लेता है [एक्स] समय की राशि. अगर हम बिक्री प्रतिनिधि अद्यतन, address1, address2, शहर, राज्य, ज़िप, यह लेता है 10 अब बार.

समाधान: एक वेब सेवा लिखें (नमूना कोड पाया जा सकता यहाँ) कि एक विक्रेता के नाम पर पारित किया है और इसे वापस विक्रेता विवरण देता है. तब, इस तरह से फ़ील्ड असाइन करें. हालांकि यह भी लगता है धीमी गति से, प्रदर्शन में कोई discernable अंतर नहीं था जब हम सौंपा 1 फ़ील्ड बनाम 8 फ़ील्ड् स. एक जोड़ा बोनस के रूप में, उपयोगकर्ताओं को मिलता है एक शांत "सर्वर से संपर्क करने" Cylon वे आह्वान और सेवा परिणामों का उपभोग करने के लिए प्रपत्र के लिए प्रतीक्षा करते समय प्रभाव.

काई: अपवाद आ गया. (HRESULT से अपवाद: 0एक्स 80020009 (DISP_E_EXCEPTION))

अद्यतन: हम कभी नहीं फिर से इस समस्या है और यह कभी नहीं सतह का मूल कारण निर्धारित.

हम एक साइट के विकास के कार्यान्वयन के दौरान सूचना है कि अचानक, दो उपयोगकर्ताओं को एक साइट संग्रह का उपयोग करने में असमर्थ रहे हैं. उन खातों को मुख्य साइट के लिए प्रमाणित कर सकते हैं, लेकिन जब एक विशेष साइट संग्रह तक पहुँचने के लिए कोशिश कर रहा, वे सिर्फ एक खाली स्क्रीन मिल. कोई त्रुटियाँ प्रदर्शित, सिर्फ एक सफेद रिक्त पृष्ठ.

हम एक साइट संग्रह व्यवस्थापक के रूप में लॉग इन करें और एक उन उपयोगकर्ताओं की एक साइट व्यवस्थापक और इस समय के रूप में जोड़ने के लिए प्रयास करें, "ठीक" दबाने पर, हम इस संदेश प्राप्त:

अपवाद आ गया. (HRESULT से अपवाद: 0एक्स 80020009 (DISP_E_EXCEPTION))

हम यह शोध कर कुछ समय बिताया और दुर्भाग्य से, कुछ उपयोगी के साथ आया था. नैदानिक लॉग में कुछ संदेश थे, लेकिन यह बिल्कुल उन्हें इस मुद्दे के साथ सहसंबंधी करने के लिए मुश्किल था.

अंत में, हम साइट संग्रह को हटाने और फिर से बनाया है और यह कि इसे हल.

अगर मैं यह पता लगाने क्या इस का भविष्य में कारण, मैं इस पोस्ट अद्यतन हूँ.

काई: कस्टम सूचियों के माध्यम से 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;

}
}