শৈবাল / InfoPath ফরম সার্ভার (InfoPath 2007) ড্রপ ডাউন তালিকা কর্মক্ষমতা

অতিরিক্ত বিভাগ: InfoPath

সংক্ষিপ্ত: একটি InfoPath 2007 একটি MOSS সার্ভার স্থাপন ফরম একটি কাস্টম MOSS তালিকার সাথে সংযুক্ত বিক্রেতারা একটি ড্রপ ডাউন তালিকা প্রস্তুত করা হয়. বিক্রেতা নির্বাচনের উপর, নিয়ম যেমন বিক্রয় প্রতিনিধির নামের টেক্সট ক্ষেত্রের একটি থাবা আপনি যদি ক্ষেত্রের মান ধার্য, ঠিকানা, শহর, রাষ্ট্র, জিপ ও ফোন. পারফরমেন্স ভয়ঙ্কর. আমরা পারফরম্যান্স খারাপ যে পায় বিজ্ঞপ্তি (একটি অ রৈখিক ফ্যাশন) প্রতিটি অতিরিক্ত ক্ষেত্রের জন্য আমরা এই ভাবে আপডেট. অর্থাত, আমরা শুধু বিক্রয় প্রতিনিধির নাম আপডেট যদি, এটা লাগে [X] সময় পরিমাণ. আমরা বিক্রয় প্রতিনিধির আপডেট যদি, address1, address2, শহর, রাষ্ট্র, জিপ, এটা লাগে 10 বার আর.

সমাধান: একটি ওয়েব পরিষেবা লিখুন (নমুনা কোড পাওয়া যাবে এখানে) বিক্রেতা নামে পাস এবং এটা ফেরত বিক্রেতা বিবরণ ফেরৎ পাঠানো হয় যে. তারপর, ক্ষেত্র এই ভাবে ধার্য. এই অত্যন্ত ধীর বলে মনে হয়, যদিও, আমরা নিয়োগ যখন কর্মক্ষমতা কোন discernable পার্থক্য আছে ছিল 1 যদি ক্ষেত্রের কিছু r বনাম 8 ক্ষেত্র. একটি যোগ বোনাস হিসাবে, users get a cool "contacting the server" Cylon তারা পরিষেবা ফলাফল ডাকা এবং গ্রাস ফর্ম জন্য অপেক্ষা করার সময় প্রভাব.

শৈবাল: ব্যতিক্রম ঘটেছে. (HRESULT থেকে ব্যতিক্রম: 0x80020009 (DISP_E_EXCEPTION))

আপডেট: আমরা এই সমস্যার মূল কারণ নির্ধারিত না এবং এটি আবার থাকবে না.

আমরা একটি উন্নয়ন সাইট যে হঠাৎ বাস্তবায়নের সময় বিজ্ঞপ্তি, দুই ব্যবহারকারীদের একটি সাইট সংগ্রহে অ্যাক্সেস করতে না পারেন. যারা অ্যাকাউন্ট মূল সাইট থেকে নিজেকে এ প্রমাণীকৃত করতে পারেন, কিন্তু একটি নির্দিষ্ট সাইট সংগ্রহে অ্যাক্সেস করার চেষ্টা করার সময়, তারা শুধু একটি ফাঁকা পর্দা পেতে. প্রদর্শিত কোনো ধরনের ত্রুটি, শুধু একটি সাদা খালি পাতা.

আমাদের একটি সাইট সংগ্রহে প্রশাসক হিসাবে লগ ইন করুন এবং একটি সাইট অ্যাডমিন হিসাবে যারা ব্যবহারকারীদের কেউ যোগ করার চেষ্টা করুন এবং এই সময়, upon pressing "OK", আমরা এই বার্তা পেতে:

ব্যতিক্রম ঘটেছে. (HRESULT থেকে ব্যতিক্রম: 0x80020009 (DISP_E_EXCEPTION))

আমরা এই এবং দুর্ভাগ্যবশত গবেষণা কিছু সময় অতিবাহিত, দরকারী কিছু সঙ্গে আসা পর্যন্ত করা হয়নি. ডায়গনিস্টিক লগ ইন কয়েকটি বার্তা ছিল, কিন্তু এটা ঠিক এই সমস্যার সাথে তাদের সম্পর্কিত কঠিন ছিল.

শেষ পর্যন্ত, আমরা সাইটে সংগ্রহে মোছার চেষ্টা এবং এটি পুনরায় তৈরি করা এবং যে এটি মীমাংসিত.

আমি ভবিষ্যতে এই হত কি জিনিসটা যদি, আমি এই পোস্টে আপডেট করব.

শৈবাল: কাস্টম তালিকা মাধ্যমে Iterating এবং InfoPath আপনি ফিল্টার তথ্য ফিরে

ব্যবসা দৃশ্যকল্প:

ব্যবহারকারীদের দ্রুত সঠিক ক্রয় requisitions প্রবেশ করতে সক্ষম হবেন যে একটি পদ্ধতি প্রদান.

ব্যবসায় সমস্যা:

ক্লায়েন্ট কয়েক শত বিক্রেতাদের সাথে ব্যবসা আছে.

Vendors are "type" নির্দিষ্ট. এটি একটি বিক্রেতার কম্পিউটার সরঞ্জাম বিক্রি করে যে অর্থ (e.g. ডেল) বা অফিসে সরবরাহ (e.g. Staples).

কিভাবে আমরা ক্রয় requisitions তৈরি যারা অন্তিম ব্যবহারকারীদের একটি বৈধ বিক্রেতা নির্বাচন সক্রিয় করবো?

ব্যবসা সমাধান:

Differentiate vendors in the system via "type".

Enable users to select the "type" পণ্য এবং তারপর উপযুক্ত বিক্রেতাদের একটি ফিল্টার সেট প্রদান করে.

প্রযুক্তি সমাধান:

একটি 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".

কাস্টম বিক্রেতার তালিকা মাধ্যমে iterates যে গ্রাস একটি InfoPath ক্লায়েন্টের জন্য একটি ওয়েব পরিষেবা বাস্তবায়ন, 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"]. পরিবর্তে, এটি একটি নাল ফেরৎ.

অন্য কিছু নোট:

  • আমি একটি অ্যারের ফিরে[] বিক্রেতারা আমি একটি ArrayList ফিরে কিছু অসুবিধা ছিল, কারণ. InfoPath এটা সম্পর্কে অভিযোগ ছিল এবং আমি এটা উপর যুদ্ধ সময় বা বাঁক আছে কি না. এই, স্বভাবত, বিক্রেতারা মোট সংখ্যার উপর একটি কৃত্রিম সীমা রাখে. এটি একটি ছাঁটা বাস্তবায়ন সম্পর্কে বাধ্য() method on the array because I hate the idea of returning back 100’s of null vendors. InfoPath গ্রাহ্য না করে, কিন্তু এটা আমার nagged. (আবার, এই ArrayLists ওভার InfoPath যুদ্ধ চেয়ে সহজ ছিল).
  • আমি একটি 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.
/// </সারাংশ>
জনসাধারণের বর্গ Vendor
{
জনসাধারণের Vendor() { }

জনসাধারণের Vendor(বিদ্বেষ 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();
}

ব্যক্তিগত Vendor[] GenerateTestVendors()
{
Vendor[] resultList;
resultList = নতুন Vendor[100];

Vendor v;
v = নতুন 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 = নতুন 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 = নতুন 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;

প্রত্যাবর্তন resultList;

}

[WebMethod]
জনসাধারণের Vendor 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];

প্রত্যাবর্তন নতুন 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
জনসাধারণের Vendor 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];

foreach (বিদ্বেষ vendorItem মধ্যে currentList.Items)
{
যদি (vendorItem["Vendor Name"] == শূন্য) অগ্রসর;

যদি (vendorItem["Vendor Name"].ToString().সমান(vendorName))
প্রত্যাবর্তন নতুন Vendor(vendorItem);
}

Vendor v = নতুন Vendor();
v.VendorPhone = "not found: " + vendorName;

প্রত্যাবর্তন v;

প্রত্যাবর্তন শূন্য;

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

} // পদ্ধতি

[WebMethod]
জনসাধারণের Vendor[] GetVendorsOfType (স্ট্রিং filterType)
{

স্ট্রিং 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();

Vendor[] resultList;
int-এ vendorIndex = 0;
resultList = নতুন Vendor[1000];

// Initialize the list with a default friendly message.
Vendor v = নতুন 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.
#অঞ্চল 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.
foreach (বিদ্বেষ vendorItem মধ্যে currentList.Items)
{

স্ট্রিং lowerVendorType;

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

যদি (lowerVendorType.Equals(filterType))
{
resultList[vendorIndex ] = নতুন Vendor(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

প্রত্যাবর্তন শূন্য;
}

ব্যক্তিগত Vendor[] TrimVendorArray(int-এ newsize, Vendor[] originalVendorArray)
{
Vendor[] trimmedArray;

যদি (newsize == 0) newsize = 1;
trimmedArray = নতুন Vendor[newsize];

int-এ currentCounter = 0;

জন্য (currentCounter = 0; currentCounter < newsize; currentCounter )
{
trimmedArray[currentCounter] = originalVendorArray[currentCounter];
}

প্রত্যাবর্তন trimmedArray;

}
}

শৈবাল: InfoPath ডিবাগিং নেভিগেশন পর্যবেক্ষণ

InfoPath ফর্ম সার্ভার ত্রুটি বার্তা বিভ্রান্তিকর হয়.

একটি InfoPath ফর্ম নির্মাণের সময়, আমি MOSS সার্ভারে এটি পোস্ট এবং ফর্ম অ্যাক্সেস করতে হবে. ফর্ম বিস্তারিত জানার জন্য আমার জানালা ইভেন্ট লগ নির্দেশকারী একটি ভুল ত্রুটির বার্তা লোড করা হয় এবং তারপর নির্মাণ করা শুরু হবে. বাস্তবিকই, কোন পাঠান উইন্ডোজ ইভেন্ট লগ করা হবে ছিল. বরং, পাঠান MOSS ASCII ডায়গনিস্টিক লগ পাঠানো হয়েছে. কেন্দ্রিয় সেবা প্রশাসনের মাধ্যমে নিচে যে ট্র্যাক করতে পারে.

আপনি আপনার পায়ের উপর দ্রুত হতে হবে. MOSS লগ ফাইল লিখতে সার্চইঞ্জিন, ঘন ঘন এবং verbosely. This can be trimmed but the default log writing behavior is "everything as quickly as possible".

শৈবাল: একটি কাস্টম তালিকা আপডেট করার প্রণালী

SDK-র মাধ্যমে কাস্টম তালিকা আপডেট করার অনেক ভাল উদাহরণ আছে. এখানে এখনো হয় অন্য.

ব্যবসায় সমস্যা: InfoPath ফর্ম ব্যবহারকারীদের অনলাইন ক্রয় requisitions প্রবেশ করতে সক্ষম হবেন যে ডিজাইন করা হয়েছে. ডাকঘর অধিযাচন সংখ্যা ঐতিহ্যগত ক্রম ভিত্তিক পূর্ণসংখ্যা মান হতে হবে এবং স্বয়ংক্রিয়ভাবে হিসাব করা উচিত.

ব্যবসা সমাধান: দুই কলাম ধারণকারী একটি কাস্টম MOSS তালিকা তৈরি করুন: "ControlField" and "ControlValue". মান কলাম পরের ক্রয় অধিযাচন সংখ্যা উপস্থিত রয়েছে. Note that the generic "control" প্রচলিত রীতি অনুযায়ী নামকরণের প্রয়োজন হিসাবে ব্যবহার করা যেতে পারে যে ভবিষ্যতে নিয়ন্ত্রণ ক্ষেত্র জন্য উপলব্ধ.

প্রযুক্তি সমাধান: InfoPath ক্লায়েন্ট ব্যবহার করতে একটি ওয়েব পরিষেবা তৈরি করুন. ওয়েব সার্ভিস পরের ক্রয় অধিযাচন সংখ্যা এবং আপডেটের তালিকা মূল্য ফেরৎ.

শিখেছি পাঠ:

  • InfoPath ফরমের একটি তথ্য উৎস হিসেবে এই ওয়েব পরিষেবা যোগ করার সময়, 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.

কোড:

ব্যবহার সিস্টেম;
ব্যবহার 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.
/// </সারাংশ>
/// <returns></returns>
[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];

foreach (বিদ্বেষ 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;

}
}