Бизнес сценарий:
Осигури метод, който позволява на потребителите да въвеждат точни покупка искания бързо.
Бизнес проблем:
Клиентът прави бизнес с няколко стотин доставчици.
Доставчици са "тип" специфични. Това означава, че даден доставчик продава компютърна техника (e.g. Dell) или офис консумативи (e.g. Скоби).
Как правя ние давам възможност на крайните потребители, които създават покупка искания изберете валиден доставчик?
Бизнес решение:
Диференцират доставчици в системата чрез "тип".
Разреши на потребителите да изберете типа на"" на продукта и след това предоставят филтриран набор от подходящи доставчици.
Техническо решение:
Формуляр на InfoPath е проектиран, че позволява на потребителите да въведете онлайн покупка искания.
Две InfoPath избор списъци контрол производители на избора. Първо, потребителят избира тип"покупка". Това ограничава втората селекция списък да съдържа само доставчици, които продават за този тип на покупка. Това е класически каскадни падащото.
Доставчиците се съхраняват в Мос потребителски списък с колони по избор за доставчик атрибути като име, адрес и особено "тип".
Реализиране уеб услуга на InfoPath клиент да консумират това повтаря през потребителски доставчик списък, връщане само доставчици съвпадение на предоставения "тип".
Се позове на уеб услугата чрез формуляр на InfoPath.
Поуките:
- Първо, изглежда необходимо да отида този път. Бих предпочел да направим за филтриране изцяло в InfoPath и не създават никакви уеб услуга функционалност тук. Въпреки това, формуляри сървър не предоставя необходимата възможност за филтриране. Можем да сложим правило върху "тип" избор списък във формуляра да сортиране на повторно отваряне заявка за доставчик, но не можем да го да работи правилно. Следователно, Това е необходимо за изпълнение на уеб услугата.
- Това е класически "каскадни селекция списък" проблем в InfoPath формира свят и има много добри примери, там, които обясняват как да реши този.
- Празна стойност за една колона в списъка на доставчиците не връща празен низ когато посочен като този: initItem["Име на доставчик"]. Вместо това, Връща null.
Някои други бележки:
- Аз върне масив[] на доставчиците, защото имах някои трудности при връщане ArrayList. InfoPath е оплакват от нея и не са имали време или склонност да се борят над него. Това, Разбира се, поставя една изкуствена граница на общия брой на доставчици. Тя също ме принудени да приложат отрежете() метод на масива защото аз мразя идеята за връщане обратно 100 на null доставчици. InfoPath не му пука, но той разпитва в мен. (Отново, Това е по-лесно, отколкото борбата InfoPath над ArrayLists).
- Аз приложени GetSpecificVendorByName() функция, както и, които могат да бъдат поучителни.
Код:
използване на Система;
използване на System.Web;
използване на System.Web.Services;
използване на System.Web.Services.Protocols;
използване на Microsoft.SharePoint;
използване на System.Configuration;
/// <Резюме>
/// Продавач услуги: Предоставя доставчика, свързани с услуги, които днес са консумирани от формуляр на infopath клиент.
///
/// История:
/// ——–
/// 07/24/07: Първоначално кодиране, Paul J. Гавин на Conchango.
///
/// </Резюме>
[Уеб услугата(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
обществени клас VendorService : System.Web.Services.Уеб услугата
{
/// <Резюме>
/// Представлява доставчик от потребителски sharepoint списък, поддържан от MSUSA.
/// </Резюме>
обществени клас Доставчик
{
обществени Доставчик() { }
обществени Доставчик(SPItem initItem)
{
Ако (! (initItem["Име на доставчик"] == Null)) VendorName = initItem["Име на доставчик"].ToString();
Ако (! (initItem["Адрес 1"] == Null)) VendorAddress1 = initItem["Адрес 1"].ToString();
Ако (! (initItem["Адрес 2"] == Null)) VendorAddress2 = initItem["Адрес 2"].ToString();
Ако (! (initItem["Сити"] == Null)) VendorCity = initItem["Сити"].ToString();
Ако (! (initItem["VendorPhone"] == Null)) VendorPhone = initItem["VendorPhone"].ToString();
Ако (! (initItem["PurchaseType"] == Null)) VendorType = initItem["PurchaseType"].ToString();
Ако (! (initItem["Държава"] == Null)) VendorState = initItem["Държава"].ToString();
Ако (! (initItem["Zip"] == Null)) VendorZip = initItem["Zip"].ToString();
Ако (!(initItem["Факс"] == Null)) VendorFax = initItem["Факс"].ToString();
Ако (!(initItem["SalesRepName"] == Null)) VendorSalesRepName = initItem["SalesRepName"].ToString();
VendorItemId = initItem.ID; // Уникален ИД, поддържани чрез Мос.
}
обществени 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 =
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.Update() currentList = web. Списъци[SpVendorListName];
SPItem specificItem = currentList.Items[vendorId];
връщане нов Доставчик(specificItem);
} // използване на spweb web = site.openweb()
} // използвайки spsite сайт = нови spsite("http://Localhost/mizuho")
}
[WebMethod]
// Предполага, че името на доставчика е уникален, от бизнес гледна точка
обществени Доставчик GetSpecificVendorByVendorName(низ бъде)
{
низ SpVendorSiteName; // Името на действителната Мос сайт, който подслонява доставчик списък.
низ SpVendorListName; // Името на списъка за действителната Мос, съдържащи доставчици.
SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings["VendorList"].ToString();
използване на (SPSite сайт = нов SPSite(SpVendorSiteName))
{
използване на (SPWeb уеб = сайт. OpenWeb())
{
Splist.Update() currentList = web. Списъци[SpVendorListName];
foreach (SPItem vendorItem в currentList.Items)
{
Ако (vendorItem["Име на доставчик"] == Null) «««;
Ако (vendorItem["Име на доставчик"].ToString().Е равно(бъде))
връщане нов Доставчик(vendorItem);
}
Доставчик v = нов Доставчик();
v.VendorPhone = "не е намерен: " + бъде;
връщане v;
връщане Null;
} // използване на spweb web = site.openweb()
} // използвайки spsite сайт = нови spsite("http://Localhost/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 = Null;
Splist.Update() currentList = web. Списъци[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 web = site.openweb()
} // използвайки spsite сайт = нови spsite("http://Localhost/mizuho")
} // Ако е вярно
връщане Null;
}
частни Доставчик[] TrimVendorArray(INT newsize, Доставчик[] originalVendorArray)
{
Доставчик[] trimmedArray;
Ако (newsize == 0) newsize = 1;
trimmedArray = нов Доставчик[newsize];
INT currentCounter = 0;
за (currentCounter = 0; currentCounter < newsize; currentCounter )
{
trimmedArray[currentCounter] = originalVendorArray[currentCounter];
}
връщане trimmedArray;
}
}