MUSKO / InfoPath Forma Servilo (InfoPath 2007) Falo-malsupren enlistigi elfaron

Suplementa kategorio: InfoPath

Resuma: InfoPath 2007 Formi deplojiĝita al MUSKA servilo provizas falon-malsupren enlistigi de vendistoj ligita al laŭmenda MUSKA listo. Al elektanta vendiston, Reguloj asignas kampajn valorojn al iometo de tekstaj kampoj kiel venda deputito nomo, Adreso, Urbo, Stato, zipo kaj telefono. Elfaro estas horora. Ni rimarkas ke elfaro akiras pli malbonan (En ne-linia modo) Por ĉiu suplementa kampo ni ĝisdatigas ĉi tiun vojon. T.e., Se ni nur ĝisdatigas la vendan deputitan nomon, Ĝi prenas [X] Kvanto de tempo. Se ni ĝisdatigas vendan deputiton, Address1, Address2, Urbo, Stato, Zipo, Ĝi prenas 10 Oble pli longa.

Solvo: Skribi araneaĵan servon (Ekzempla kodo povas esti trovita Ĉi tie) Kiu estas pasita en la nomo de vendisto kaj ĝi revenas reen la vendistajn detalojn. Tiam, Asigni la kampojn ĉi tiu vojo. Kvankam tio ĉi ankaŭ ŝajnas malrapida, Estis ne discernable diferenco en elfaro kiam ni asignis 1 Kampo kontraŭ 8 Kampoj. Kiel plia gratifiko, Uzantoj akiras freŝan "kontaktanta la servilon" Cylon Realigi dum ili atendas por la formo alvoki kaj konsumi la servajn rezultojn.

MUSKO: Escepto okazis. (Escepto de HRESULT: 0X80020009 (DISP_E_ESCEPTO))

ĜISDATIGO: Ni neniam determinis la radikan aferon de ĉi tiu problemo kaj ĝi neniam supriĝi denove.

Ni rimarkas dum efektivigo de evoluada ejo ke subite, Du uzantoj estas nekapablaj aliri ejan kolekton. Tiuj kontoj povas aŭtentikigi al la ĉefa ejo, Sed kiam provanta aliri apartan ejan kolekton, Ili nur akiras malplenan ekranon. Neniuj eraroj montris, Nur blanka malplena #pa?o.

Ni ensalutas kiel eja kolekto admin kaj provo aldoni unu el tiuj uzantoj kiel ejo admin kaj #?i tiu tempo, Al premanta "OK", Ni akiras #?i tiu #mesa?o:

Escepto okazis. (Escepto de HRESULT: 0X80020009 (DISP_E_ESCEPTO))

Ni elspezis iun tempon esploranta #tio ?i kaj #beda?rinde, Didn?? Venita supre kun io ajn utila. Estis kelkaj #mesa?o en la diagnoza #?tipo, Sed ?i estis malfacile al #?uste correlate ili kun #?i tiu afero.

En la fino, Ni foriganta la ejan kolekton kaj re-kreita ?in kaj ke solvis ?in.

Se mi elkalkulas kion kaŭzis tion ĉi en estonteco, Mi ĝisdatigos ĉi tiun poŝton.

MUSKO: Iterating tra laŭmendaj listoj kaj revenanta filtrita datumon al InfoPath

Komerca Scenaro:

Provizi metodon kiu ebligas uzantojn eniri precizan aĉeton rekvizicias rapide.

Komerca problemo:

La kliento faras komercan kun pluraj cent vendistoj.

Vendistoj estas "tipo" Specifa. Tio ĉi signifas ke vendisto vendas komputilan ekipaĵon (Ekz. Dell) Aŭ oficejaj provizoj (Ekz. Konstantaĵoj).

Kiel ni ebligas finaj uzantoj kiu kreas #a?eto rekviziciojn elektas validan vendiston?

Komerca Solvo:

Diferencigi vendistojn en la sistemo tra "tipo".

Ebligi uzantojn elekti la "tipon" De produkto kaj tiam provizi filtrita aron de konvenaj vendistoj.

Teknika Solvo:

InfoPath formo estis desegnita ke ebligas uzantojn eniri enretajn #a?eto rekviziciojn.

Du InfoPath elektaj listoj kontrola vendisto elekto. Unue, La uzanto elektas "#a?eto tipon". Tio ĉi limigas duan elektan liston enhavi nurajn vendistojn kiu vendas por tiu aĉeta tipo. Tio ĉi estas klasika kaskada falo-malsupren.

Vendistoj estas entenita en MUSKO #la?menda listo kun #la?menda kolumnoj por vendistaj ecoj kiel nomo, Adreso kaj precipe "tipo".

Efektivigi #aranea?o servon por InfoPath kliento konsumi ke iterates tra la #la?menda vendista listo, Revenanta nurajn vendistojn egalanta provizita "tipon".

Alvoki la araneaĵan servon tra la InfoPath formo.

Lecionoj Lernis:

  • Unue, Ĝi ŝajnas necesa iri ĉi tiun vojon. Mi estus preferinta fari la filtrantan tute ene de InfoPath kaj ne krei ajnan araneaĵan servan funkcion ĉi tie. Tamen, Forma servilo ne provizas la postulatan filtrantan kapablon. Ni povas meti regulon al la "tipo" Elekta listo en la formo ordigi de re-malfermi la vendistan demandon, Sed ni ne povas akiri ĝin labori konvene. Sekve, Ĝi estis necesa efektivigi la araneaĵan servon.
  • Tio ĉi estas klasika "kaskada elekta listo" Problemo en la InfoPath forma servilo mondo kaj estas multaj bonaj ekzemploj tie ke klarigas kiel solvi tion ĉi.
  • Malplena valoro por kolumno en la vendista listo ne revenas senhoman ŝnuron kiam referencita tiel: InitItem["Vendista Nomo"]. Male, ?i revenas null.

Kelkaj aliaj Notoj:

  • Mi revenas aron[] De vendistoj #?ar mi havis iun malfacilecon revenanta ArrayList. InfoPath estis plendanta pri ?i kaj mi didn?? Havas la tempon #a? la inklinon batali super ?i. Tio ĉi, Nature, Metas artefaritan limon sur la totala nombro de vendistoj. ?i #anka? devigis min efektivigi bonordan() Metodo sur la aro ĉar mi malamas la ideon reveni reen 100-a de null vendistoj. InfoPath doesn?? Prizorgo, Sed ?i nagged #?e mi. (Denove, #Tio ?i estis pli facila ol batalanta InfoPath super ArrayLists).
  • Mi efektivigis GetSpecificVendorByName() Funkcii #anka?, Kiu povas esti instrua.

La kodo:

Uzanta Sistemo;
Uzanta Sistemo.Araneaĵo;
Uzanta Sistemo.Araneaĵo.Servoj;
Uzanta Sistemo.Araneaĵo.Servoj.Protokoloj;
Uzanta Microsoft.SharePoint;
Uzanta Sistemo.Konfiguracio;

/// <Resuma>
///
Vendista Servo: Provizas vendiston rilatita servojn kiu hodiaŭ estas konsumita de infopath klienta formo.
///
/// Historio:
/// ——–
/// 07/24/07: Komenca kodiĝo, Paul J. Gavin de Conchango.
///
/// </Resuma>
[WebService(Namespace = "Http://Www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
Publika Klaso VendorService : Sistemo.Araneaĵo.Servoj.WebService
{

/// <Resuma>
/// Reprezentas vendiston de laŭmenda sharepoint listo daŭrigita de MSUSA.
/// </Resuma>
Publika Klaso Vendisto
{
Publika Vendisto() { }

Publika Vendisto(SPItem InitItem)
{
Se (! (InitItem["Vendista Nomo"] == Null)) VendorName = initItem["Vendista Nomo"].ToString();
Se (! (InitItem["Trakti 1"] == Null)) VendorAddress1 = initItem["Trakti 1"].ToString();
Se (! (InitItem["Trakti 2"] == Null)) VendorAddress2 = initItem["Trakti 2"].ToString();
Se (! (InitItem["Urbo"] == Null)) VendorCity = initItem["Urbo"].ToString();
Se (! (InitItem["VendorPhone"] == Null)) VendorPhone = initItem["VendorPhone"].ToString();
Se (! (InitItem["PurchaseType"] == Null)) VendorType = initItem["PurchaseType"].ToString();
Se (! (InitItem["Stato"] == Null)) VendorState = initItem["Stato"].ToString();
Se (! (InitItem["Zipo"] == Null)) VendorZip = initItem["Zipo"].ToString();
Se (!(InitItem["Telefaksilo"] == Null)) VendorFax = initItem["Telefaksilo"].ToString();
Se (!(InitItem["SalesRepName"] == Null)) VendorSalesRepName = initItem["SalesRepName"].ToString();

VendorItemId = initItem.IDENTIGAĴO; // Unika IDENTIGAĴO daŭrigita tra MUSKO.
}

Publika Int VendorItemId;
Publika Ŝnuro VendorName;
Publika Ŝnuro VendorAddress1;
Publika Ŝnuro VendorAddress2;
Publika Ŝnuro VendorCity;
Publika Ŝnuro VendorState;
Publika Ŝnuro VendorZip;
Publika Ŝnuro VendorPhone;
Publika Ŝnuro VendorType;
Publika Ŝnuro VendorSalesRepName;
Publika Ŝnuro VendorFax;
}

Publika VendorService () {

//Uncomment la sekvanta linio se uzanta desegnita erojn
//InitializeComponent();
}

Privata Vendisto[] GenerateTestVendors()
{
Vendisto[] ResultList;
ResultList = Nova Vendisto[100];

Vendisto V;
V = Nova Vendisto();
V.VendorAddress1 = "V1_address1";
V.VendorAddress2 = "V1_address2";
V.VendorCity = "V1_urbo";
V.VendorName = "V1_vendorname";
V.VendorPhone = "V1_vendorphone";
V.VendorState = "V1_st";
V.VendorType = "V1_tipo";
V.VendorZip = "V1_zipo";

ResultList[0] = V;

V = Nova Vendisto();

V.VendorAddress1 = "V2_address1";
V.VendorAddress2 = "V2_address2";
V.VendorCity = "V2_urbo";
V.VendorName = "V2_vendorname";
V.VendorPhone = "V2_vendorphone";
V.VendorState = "V2_st";
V.VendorType = "V2_tipo";
V.VendorZip = "V2_zipo";

ResultList[1] = V;

V = Nova Vendisto();
V.VendorAddress1 = "V3_address1";
V.VendorAddress2 = "V3_address2";
V.VendorCity = "V3_urbo";
V.VendorName = "V3_vendorname";
V.VendorPhone = "V3_vendorphone";
V.VendorState = "V3_st";
V.VendorType = "V3_tipo";
V.VendorZip = "V3_zipo";

ResultList[2] = V;

Reveno ResultList;

}

[WebMethod]
Publika Vendisto GetSpecificVendorById(Int VendorId)
{
Ŝnuro SpVendorSiteName; // Nomo de la reala MUSKA ejo kiu gastigas la vendiston laŭmenda listo.
Ŝnuro SpVendorListName; // Nomo de la reala MUSKA listo enhavanta vendistojn.

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

Uzanta (SPSite Ejo = Nova SPSite(SpVendorSiteName))
{

Uzanta (SPWeb Araneaĵa = ejo.OpenWeb())
{

SPList CurrentList = araneaĵo.Listoj[SpVendorListName];

SPItem SpecificItem = currentList.Eroj[VendorId];

Reveno Nova Vendisto(SpecificItem);

} // Uzanta spweb araneaĵa = ejo.Openweb()
} // Uzanta spsite ejo = nova spsite("Http://Localhost/mizuho")

}

[WebMethod]
// Supozas ke la vendista nomo estas unika, De komerca perspektivo
Publika Vendisto GetSpecificVendorByVendorName(Ŝnuro VendorName)
{
Ŝnuro SpVendorSiteName; // Nomo de la reala MUSKA ejo kiu gastigas la vendiston laŭmenda listo.
Ŝnuro SpVendorListName; // Nomo de la reala MUSKA listo enhavanta vendistojn.

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

Uzanta (SPSite Ejo = Nova SPSite(SpVendorSiteName))
{
Uzanta (SPWeb Araneaĵa = ejo.OpenWeb())
{

SPList CurrentList = araneaĵo.Listoj[SpVendorListName];

Foreach (SPItem VendorItem Je CurrentList.Eroj)
{
Se (VendorItem["Vendista Nomo"] == Null) #Da?ri;

Se (VendorItem["Vendista Nomo"].ToString().Egaluloj(VendorName))
Reveno Nova Vendisto(VendorItem);
}

Vendisto V = Nova Vendisto();
V.VendorPhone = "Ne fondi: " + VendorName;

Reveno V;

Reveno Null;

} // Uzanta spweb araneaĵa = ejo.Openweb()
} // Uzanta spsite ejo = nova spsite("Http://Localhost/mizuho")

} // Metodo

[WebMethod]
Publika Vendisto[] GetVendorsOfType (Ŝnuro FilterType)
{

Ŝnuro SpVendorSiteName; // Nomo de la reala MUSKA ejo kiu gastigas t
Li vendisto laŭmenda listo.
Ŝnuro SpVendorListName; // Nomo de la reala MUSKA listo enhavanta vendistojn.

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

Vendisto[] ResultList;
Int VendorIndex = 0;
ResultList = Nova Vendisto[1000];

// Initialize la listo kun defaŭlta amika mesaĝo.
Vendisto V = Nova Vendisto();
V.VendorName = "Elekti vendistan tipon loĝi ĉi tiun liston.";
ResultList[0] = V;

// Transformi la filtrilon malaltigi kazon por pli facila ŝnura komparo poste.
FilterType = filterType.ToLower();

// Se la filtrila tipo pasita estas "testo", Produkti iun simplan datumon.
#Regiono Filtrila tipo = "testo"
Se (FilterType.Egaluloj("Testo"))
Reveno GenerateTestVendors();
#Endregion

Se (Vera)
{
Uzanta (SPSite Ejo = Nova SPSite(SpVendorSiteName))
{
Uzanta (SPWeb Araneaĵa = ejo.OpenWeb())
{

V = Null;

SPList CurrentList = araneaĵo.Listoj[SpVendorListName];

// Iterate tra ĉiuj la eroj en la vendista listo.
Foreach (SPItem VendorItem Je CurrentList.Eroj)
{

Ŝnuro LowerVendorType;

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

Se (LowerVendorType.Egaluloj(FilterType))
{
ResultList[VendorIndex ] = Nova Vendisto(VendorItem);
}
} // Iterating thru ĉiuj la vendistoj en la listo


Reveno TrimVendorArray(VendorIndex, ResultList);
// Revena resultList;

} // Uzanta spweb araneaĵa = ejo.Openweb()
} // Uzanta spsite ejo = nova spsite("Http://Localhost/mizuho")

} // Se vera

Reveno Null;
}

Privata Vendisto[] TrimVendorArray(Int Newsize, Vendisto[] OriginalVendorArray)
{
Vendisto[] TrimmedArray;

Se (Newsize == 0) Newsize = 1;
TrimmedArray = Nova Vendisto[Newsize];

Int CurrentCounter = 0;

Por (CurrentCounter = 0; CurrentCounter < Newsize; CurrentCounter )
{
TrimmedArray[CurrentCounter] = OriginalVendorArray[CurrentCounter];
}

Reveno TrimmedArray;

}
}

MUSKO: Rimarkoj sur InfoPath elpuriganta

InfoPath forma servilo eraraj mesaĝoj estas erarigantaj.

Dum evoluado de InfoPath formo, Mi poŝtus ĝin al MUSKA servilo kaj aliri la formon. La formo komencus ŝarĝi kaj tiam produkti erarigan eraran mesaĝon indikanta min al la fenestra eventa ŝtipo por detaloj. Fakte, Neniu mesaĝo estis skribita al la fenestra eventa ŝtipo. Prefere, La mesaĝo estis sendita al la MUSKO ascii diagnoza ŝtipo. Vi povas spuri ke malsupren tra centra serva administro.

Vi devas esti rapide sur viaj piedoj. MUSKO ŝatas skribi al la ŝtipa dosiero, Ofte kaj verbosely. Tio ĉi povas esti bonordigita sed la defaŭlta ŝtipo skribanta konduton estas "ĉio kiel rapide kiel ebla".

MUSKO: Ĝisdatiganta laŭmendan liston

Estas multaj bonaj ekzemploj ĝisdatigi laŭmendajn listojn tra la SDK. Ĉi tie estas ankoraŭ alia.

Komerca problemo: InfoPath formo estis desegnita ke ebligas uzantojn eniri enretajn aĉetajn rekviziciojn. POa Rekvizicio nombroj devus esti tradicia sinsekvo bazita integralajn valorojn kaj kalkulita aŭtomate.

Komerca Solvo: Krei laŭmendan MUSKAN liston enhavanta du kolumnojn: "ControlField" Kaj "ControlValue". La valora kolumno enhavas la sekvantan aĉetan rekvizician nombron. Noti ke la kolektiva "kontrolo" Nomanta kongreson provizas por estontaj kontrolaj kampoj kiu povas esti uzita kiel devita.

Teknika Solvo: Krei araneaĵan servon alirita de la InfoPath kliento. La araneaĵa servo revenas reen la sekvantan aĉetan rekvizician nombron kaj ĝisdatigas la valoron de la listo.

Lecionoj Lernis:

  • Kiam aldonanta ĉi tiun araneaĵan servon kiel datuma fonto al la InfoPath formo, Mi trovis ĝin necesa transformi ĝin al udc kaj enteni ĝin en datuma konekta biblioteko.
  • Mi ankaŭ trovis ĝin necesa ebligi transversan domajnon scripting tra centra serva administro // Aplika administrado // Forma servilo konfiguracio.
  • La unua tempo la formo provita aliri la araneaĵan servon, Ĝi prenas momenton kaj sur okazo, Ĝi volus tempon ekstere. Mi ludadis kun fiksoj en forma servilo konfiguracio vastigi la timeout fiksoj kaj ke ŝajnita helpi.

La kodo:

Uzanta Sistemo;
Uzanta Sistemo.Araneaĵo;
Uzanta Sistemo.Araneaĵo.Servoj;
Uzanta Sistemo.Araneaĵo.Servoj.Protokoloj;
Uzanta Microsoft.SharePoint;
Uzanta Sistemo.Konfiguracio;

[WebService(Namespace = "Http://Www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
Publika Klaso PoService : Sistemo.Araneaĵo.Servoj.WebService
{
Publika PoService () {

//Uncomment la sekvanta linio se uzanta desegnita erojn
//InitializeComponent();
}

/// <Resuma>
/// Akiri la sekvantan POan nombron de la sharepoint po nombro kontrola listo.
/// Pliigo la POa nombro en tiu listo.
/// </Resuma>
/// <Revenoj></Revenoj>
[WebMethod]
Publika Ŝnuro GetNextPoNumber()
{
Ŝnuro SpPoControlSiteName; // Nomo de la reala MUSKA ejo kiu gastigas la POan Kontrolan liston.
Ŝnuro SpPoControlListName; // Nomo de la reala MUSKA listo enhavanta la Po kontrolo.

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

Ŝnuro NextPoReqNumber = "Xyzzy";

Uzanta (SPSite Ejo = Nova SPSite(SpPoControlSiteName))
{
Uzanta (SPWeb Araneaĵa = ejo.OpenWeb())
{

SPList CurrentList = araneaĵo.Listoj[SpPoControlListName];

Foreach (SPItem ControlItem Je CurrentList.Eroj)
{

Se (((Ŝnuro)ControlItem["ControlField"]).Egaluloj("NextPoNumber"))
{
NextPoReqNumber = (Ŝnuro)ControlItem["ControlValue"];

Int Int_nextPoReqNumber;
Int_nextPoReqNumber = Transformi.ToInt32(NextPoReqNumber);

Int_nextPoReqNumber ;

ControlItem["ControlValue"] = Int_nextPoReqNumber;
ControlItem.Ĝisdatigo();
}

} // Troviĝanta, Leganta kaj ĝisdatiganta la POan nombron en la listo.


} // Uzanta spweb araneaĵa = ejo.Openweb()
} // Uzanta spsite ejo = nova spsite("Http://Localhost/mizuho")

Reveno NextPoReqNumber;

}
}