SAMANŲ / InfoPath formų serveris (Programa InfoPath 2007) Išplečiamajame sąraše veiklos

Papildoma kategorija: Programa InfoPath

Santrauka: Programos InfoPath 2007 formos į MOSS serverio suteikia išplečiamajame sąraše tiekėjų susieta su pasirinktinį MOSS sąrašą. Pasirenkant tiekėjas, taisykles laukų reikšmės priskirti sauja teksto srityse pvz., pardavimo atstovo vardas, Adresas, miesto, valstybės, pašto ir telefono. Efektyvumas yra siaubinga. Pastebime, kad rezultatus bus dar blogiau (ne linijiniu būdu) už kiekvieną papildomą lauką mes atnaujiname tokiu būdu. T. y., Jei mes tik atnaujinti pardavimo atstovo vardas, reikia [x] kiek laiko. Jei mes atnaujinti pardavimo atstovas, address1, Adresas2, miesto, valstybės, zip, reikia 10 kartus ilgiau.

Tirpalas: Rašyti interneto paslauga (mėginio kodą gali būti nustatyta čia) kad perduodama vardu tiekėjas ir jis grįžta atgal tiekėjo informacija. Tada, priskirti laukus tokiu būdu. Nors tai atrodo, pernelyg lėtai, ten buvo ne visuomet būdavo pastebimas skirtumo charakteristikų, kai mes priskirtas 1 srityje palyginti su 8 laukai. Kaip papildoma priemoka, vartotojams gauti cool "susisiekti su serverio" Cylon o jie laukia formą remtis ir vartoti paslaugų rezultatų poveikis.

SAMANŲ: Įvyko išimtis. (Išimtis iš HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

NAUJINIMAS: Mes niekada nustatomas pagrindinλ problema ir ji niekada paviršiaus dar kartą.

Mes pranešimas įgyvendinant vystymosi svetainę, kad staiga, du vartotojai negalite prieiti prie svetainių rinkinio. Tų sąskaitų gali autentifikuoti į pagrindinę svetainę, Tačiau kai bandote prieiti ypač svetainių rinkinio, jie tiesiog tuščias ekranas. Rodomas klaidų, tik baltojo tuščią puslapį.

Mes prisijungti kaip svetainių rinkinio administratorius ir bandykite pridėti vienas iš šių vartotojų svetainės administratoriaus ir šiuo metu, po paspaudus "OK", mes gauti šį pranešimą:

Įvyko išimtis. (Išimtis iš HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

Mes praleido šiek tiek laiko tai tiria ir Deja, ne sugalvoti nieko naudingo. Ten buvo keletas pranešimų diagnostikos žurnale, bet tai buvo sunku tiksliai koreliuoja su šia problema.

Galiausiai, Mes naikinti svetainių rinkinio ir sukuriamas iš naujo ir kad išspręsti.

Jeigu aš suprasti, ką padarė tai ateityje, I atnaujinti šį pranešimą.

SAMANŲ: Iterating per pasirinktinius sąrašus ir grįžta filtruotus duomenis į InfoPath

Verslo scenarijus:

Pateikti metodą, kuris leidžia vartotojams greitai įvesti tikslią pirkimo paraiškas.

Verslo problemas:

Klientas turi verslo ryšių su keli šimtai pardavėjai.

Pardavėjai yra "tipo" konkrečių. Tai reiškia, kad tiekėjas parduoda kompiuterinę įrangą (pvz.. Dell) ar raštinės reikmenys (pvz.. Kabės).

Kaip mes leisti galutiniams vartotojams, kurie sukurti pirkimo paraiškas pasirinkti galiojantį tiekėją?

Pervežimų:

Atskirti pardavėjai sistemoje per "tipo".

Leisti vartotojams pasirinkti "" produkto ir tada – nustatyti filtruoto tinkamų tiekėjų.

Techninis sprendimas:

Programos InfoPath forma buvo suprojektuotas taip, kad leidžia vartotojams įvesti internete pirkimo paraiškos.

Du InfoPath pasirinkimo sąrašuose kontroliuoti tiekėjų atrankos. Pirmosios, kad vartotojas galėtų pasirinkti "pirkimų tipo". Tai riboja antrąjį atrankos sąrašą turi būti tik pirkimo tipo pardavusių tiekėjų. Tai yra klasikinis pakopinių išskleid.

Pardavėjai yra saugomi MOSS pasirinktinį sąrašą su pasirinktinius stulpelius tiekėjo požymiai, kaip antai pavadinimas, Adresas ir ypač "tipo".

Įgyvendinti tinklo tarnybos, programa InfoPath kliento vartoti kad kartojasi per pasirinktinio tiekėjų sąrašas, grįžta tik tiekėjų atitikimo per teikiamoms "tipo".

Remtis tinklo tarnybos per "InfoPath" forma.

Pamokas:

  • Pirmosios, atrodo, kad reikia eiti šiuo keliu. Aš būtų norėjusi daryti filtravimo visiškai programą InfoPath ir negali sukurti jokių žiniatinklio tarnybos funkcines galimybes čia. Tačiau, formų serveris nepateikia reikalinga filtravimo galimybes. Mes galime įdėti į paprastai a tipo"" pasirinkimų sąrašo forma tarsi iš naujo atidaryti tiekėjo užklausa, bet mes negalime gauti ji tinkamai veiktų. Todėl, reikėjo įgyvendinti tinklo tarnybos.
  • Tai klasikinis "pakopinių pasirinkimo sąrašas" problema su InfoPath formų serveris pasaulyje ir yra daug gerų pavyzdžių iš ten, kuriose aiškinama, kaip išspręsti šią.
  • Tuščią stulpelį tiekėjo sąrašo reikšmę negrąžina tuščia eilutė kai nuorodos panašaus: initItem["Tiekėjo pavadinimas"]. Vietoj, jis grįžta į nulinę.

Kai kurios kitos pastabos:

  • Aš sugrįšiu masyvas[] tiekėjų nes aš turėjo tam tikrų sunkumų grįžimas į ArrayList, skirto. Programa InfoPath buvo skundą apie tai ir aš neturėjo laiko ar noro kovoti per jį. Tai, žinoma, dirbtinis riba užsideda tiekėjų skaičius. Ji taip pat priversta man įgyvendinti apdaila() metodas masyvą nes aš nekenčiu idėja grįžti atgal 100 yra neapibrėžtas tiekėjų. InfoPath nerūpi, bet tai nagged man. (Dar kartą, tai buvo lengviau nei kovos su InfoPath per ArrayLists).
  • Aš įgyvendinti, GetSpecificVendorByName() funkcija taip pat, kuri gali būti naudinga.

Kodas:

naudojant Sistemos;
naudojant System.Web;
naudojant System.Web.Services;
naudojant System.Web.Services.Protocols;
naudojant Microsoft.SharePoint;
naudojant System.Configuration;

/// <santrauka>
///
Tiekėjo paslaugos: Numatyta tiekėjo susijusių paslaugų kuri šiandien suvartoja infopath kliento formos.
///
/// Istorija:
/// ——–
/// 07/24/07: Pradinio kodavimo, Paul J. Gavin, Conchango.
///
/// </santrauka>
[WebService(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
visuomenės klasės VendorService : System.Web.Services.WebService
{

/// <santrauka>
/// Yra palaikoma MSUSA pasirinktines sharepoint sąraše tiekėjui.
/// </santrauka>
visuomenės klasės Tiekėjo
{
visuomenės Tiekėjo() { }

visuomenės Tiekėjo(SPItem initItem)
{
Jei (! (initItem["Tiekėjo pavadinimas"] == neapibrėžtas)) VendorName = initItem["Tiekėjo pavadinimas"].ToString();
Jei (! (initItem["Adresas 1"] == neapibrėžtas)) VendorAddress1 = initItem["Adresas 1"].ToString();
Jei (! (initItem["Adresas 2"] == neapibrėžtas)) VendorAddress2 = initItem["Adresas 2"].ToString();
Jei (! (initItem["City"] == neapibrėžtas)) VendorCity = initItem["City"].ToString();
Jei (! (initItem["VendorPhone"] == neapibrėžtas)) VendorPhone = initItem["VendorPhone"].ToString();
Jei (! (initItem["PurchaseType"] == neapibrėžtas)) VendorType = initItem["PurchaseType"].ToString();
Jei (! (initItem["Valstybė"] == neapibrėžtas)) VendorState = initItem["Valstybė"].ToString();
Jei (! (initItem["Zip"] == neapibrėžtas)) VendorZip = initItem["Zip"].ToString();
Jei (!(initItem["Fakso"] == neapibrėžtas)) VendorFax = initItem["Fakso"].ToString();
Jei (!(initItem["SalesRepName"] == neapibrėžtas)) VendorSalesRepName = initItem["SalesRepName"].ToString();

VendorItemId = initItem.ID; // Unikalus ID numeris išlaikomas per MOSS.
}

visuomenės LC VendorItemId;
visuomenės eilutė VendorName;
visuomenės eilutė VendorAddress1;
visuomenės eilutė VendorAddress2;
visuomenės eilutė VendorCity;
visuomenės eilutė VendorState;
visuomenės eilutė VendorZip;
visuomenės eilutė VendorPhone;
visuomenės eilutė VendorType;
visuomenės eilutė VendorSalesRepName;
visuomenės eilutė VendorFax;
}

visuomenės VendorService () {

//Anuliuoti šią eilutę jei naudojant suprojektuoti
//InitializeComponent();
}

privačių Tiekėjo[] GenerateTestVendors()
{
Tiekėjo[] resultList;
resultList = naujas Tiekėjo[100];

Tiekėjo v;
v = naujas Tiekėjo();
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 = naujas Tiekėjo();

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 = naujas Tiekėjo();
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;

grįžti resultList;

}

[WebMethod]
visuomenės Tiekėjo GetSpecificVendorById(LC teikėjo ID)
{
eilutė SpVendorSiteName; // Faktinį MOSS svetainėje, kurioje yra tiekėjo pasirinktinį sąrašą, pavadinimas.
eilutė SpVendorListName; // Tikrasis MOSS sąrašą, kuriame yra pardavėjai pavadinimas.

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

naudojant (SPSite svetainės = naujas SPSite(SpVendorSiteName))
{

naudojant (SPWeb interneto = svetainėje. OpenWeb())
{

SPList currentList = interneto. Sąrašai[SpVendorListName];

SPItem specificItem = currentList.Items[teikėjo ID];

grįžti naujas Tiekėjo(specificItem);

} // naudojant spweb interneto = site.openweb()
} // naudojant spsite svetainės = naujas spsite("http://localhost/mizuho")

}

[WebMethod]
// Daroma prielaida, kad tiekėjo pavadinimas yra unikalus, Žvelgiant iš verslo perspektyvos
visuomenės Tiekėjo GetSpecificVendorByVendorName(eilutė būti)
{
eilutė SpVendorSiteName; // Faktinį MOSS svetainėje, kurioje yra tiekėjo pasirinktinį sąrašą, pavadinimas.
eilutė SpVendorListName; // Tikrasis MOSS sąrašą, kuriame yra pardavėjai pavadinimas.

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

naudojant (SPSite svetainės = naujas SPSite(SpVendorSiteName))
{
naudojant (SPWeb interneto = svetainėje. OpenWeb())
{

SPList currentList = interneto. Sąrašai[SpVendorListName];

foreach (SPItem vendorItem į currentList.Items)
{
Jei (vendorItem["Tiekėjo pavadinimas"] == neapibrėžtas) toliau;

Jei (vendorItem["Tiekėjo pavadinimas"].ToString().Yra lygi(būti))
grįžti naujas Tiekėjo(vendorItem);
}

Tiekėjo v = naujas Tiekėjo();
v.VendorPhone = "not found: " + būti;

grįžti v;

grįžti neapibrėžtas;

} // naudojant spweb interneto = site.openweb()
} // naudojant spsite svetainės = naujas spsite("http://localhost/mizuho")

} // metodas

[WebMethod]
visuomenės Tiekėjo[] GetVendorsOfType (eilutė filterType)
{

eilutė SpVendorSiteName; // Tikrasis MOSS svetainės, kurioje yra t pavadinimas
jis tiekėjo pasirinktinį sąrašą.
eilutė SpVendorListName; // Tikrasis MOSS sąrašą, kuriame yra pardavėjai pavadinimas.

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

Tiekėjo[] resultList;
LC vendorIndex = 0;
resultList = naujas Tiekėjo[1000];

// Inicijuoti sąrašą su numatytuoju pranešimu, draugiškas.
Tiekėjo v = naujas Tiekėjo();
v.VendorName = "Pasirinkite tiekėjo tipo užpildyti šį sąrašą.";
resultList[0] = v;

// Konvertuoti filtrą į mažąją lengviau vėliau palyginimui eilutė.
filterType = filterType.ToLower();

// Jei filtro tipas yra "testas", kai paprastas duomenų.
#regionas Filtras, filtro tipas = "testas"
Jei (filterType. lygu("bandymas"))
grįžti GenerateTestVendors();
#endregion

Jei (tiesa)
{
naudojant (SPSite svetainės = naujas SPSite(SpVendorSiteName))
{
naudojant (SPWeb interneto = svetainėje. OpenWeb())
{

v = neapibrėžtas;

SPList currentList = interneto. Sąrašai[SpVendorListName];

// Kartoti per visų prekių tiekėjų sąrašas.
foreach (SPItem vendorItem į currentList.Items)
{

eilutė lowerVendorType;

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

Jei (lowerVendorType. sudaro(filterType))
{
resultList[vendorIndex ] = naujas Tiekėjo(vendorItem);
}
} // Iteracja per visų tiekėjų sąraše


grįžti TrimVendorArray(vendorIndex, resultList);
// grįžti resultList;

} // naudojant spweb interneto = site.openweb()
} // naudojant spsite svetainės = naujas spsite("http://localhost/mizuho")

} // Jei tai tiesa

grįžti neapibrėžtas;
}

privačių Tiekėjo[] TrimVendorArray(LC newsize, Tiekėjo[] originalVendorArray)
{
Tiekėjo[] trimmedArray;

Jei (newsize == 0) newsize = 1;
trimmedArray = naujas Tiekėjo[newsize];

LC currentCounter = 0;

(currentCounter = 0; currentCounter < newsize; currentCounter )
{
trimmedArray[currentCounter] = originalVendorArray[currentCounter];
}

grįžti trimmedArray;

}
}

SAMANŲ: Pastabas dėl InfoPath derinimo

InfoPath formą serverio klaidų pranešimai yra klaidinanti.

Programuodami InfoPath formos, Norėčiau įdėti jį į MOSS serverio ir patekti į formą. Forma būtų pradėti įkelti ir neverta klaidinanti klaidos pranešimas man žymiklį ant windows įvykių žurnalo išsamią informaciją. tiesą sakant, nėra pranešimų buvo parašyta, kad windows įvykių žurnale. O, pranešimas buvo išsiųstas į MOSS ascii diagnostikos žurnalą. Jums gali, stebėti per centrinių tarnybų administracija.

Jūs turite būti greitai ant kojų. SAMANŲ mėgsta rašyti į žurnalo failą, dažnai ir verbosely. Tai gali būti apipjaustyta bet jis numatytąjį raštu elgesys yra "viskas kuo greičiau".

SAMANŲ: Atnaujinti pasirinktinį sąrašą

Yra nemažai pavyzdžių, atnaujinimą pasirinktiniais sąrašais per SDK. Štai dar vienas.

Verslo problemas: InfoPath šablonas buvo sukurtas taip kad leidžia vartotojams įvesti internete pirkimo paraiškos. PO paraiškų skaičius turėtų būti tradicinis seka pagal sveikojo skaičiaus reikšmes ir apskaičiuojama automatiškai.

Pervežimų: Kurti pasirinktinį MOSS sąrašą, kuriame yra dviejų stulpelių: "ControlField" ir "ControlValue". Reikšmės stulpelyje yra kitą pirkimo paraiškos numeris. Atkreipkite dėmesį, kad bendras "kontrolės" vardų suteikimo konvencija numato būsimus tikrinimus laukus, kurie gali būti naudojami kaip reikalingas.

Techninis sprendimas: Sukurti interneto paslauga prieinama InfoPath kliento. Tinklo tarnybos grąžina atgal kitą pirkimo paraiškos numerį ir atnaujina sąrašą vertės.

Pamokas:

  • Kai įtraukti šios žiniatinklio tarnybos kaip duomenų šaltinį į "InfoPath" forma, Radau jį reikia konvertuoti į a udc ir laikyti jį į duomenų ryšių biblioteka.
  • Man taip pat atrodė būtina, kad kirsti domenų scenarijų per centrinių tarnybų administracija // programos tvarkymo // formos serverio konfigūracijos.
  • Pirmą kartą formą bandė prieigai prie interneto paslauga, ji mano, o ir kartais, tai laiko. Aš fiddled su formos serverio konfigūracijos parametrus plėsti paskirtojo laiko pabaigos parametrai ir, atrodė, kad padėtų.

Kodas:

naudojant Sistemos;
naudojant System.Web;
naudojant System.Web.Services;
naudojant System.Web.Services.Protocols;
naudojant Microsoft.SharePoint;
naudojant System.Configuration;

[WebService(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
visuomenės klasės PoService : System.Web.Services.WebService
{
visuomenės PoService () {

//Anuliuoti šią eilutę jei naudojant suprojektuoti
//InitializeComponent();
}

/// <santrauka>
/// Gauti kitą PO numerį iš sharepoint po skaičiaus kontrolės sąrašo.
/// Prieaugio PO numeris į tą sąrašą.
/// </santrauka>
/// <Grąžina></Grąžina>
[WebMethod]
visuomenės eilutė GetNextPoNumber()
{
eilutė SpPoControlSiteName; // Tikrasis MOSS svetainės, kurioje yra PO teisių sąrašo pavadinimas.
eilutė SpPoControlListName; // Tikrasis MOSS sąrašą, kuriame yra Po kontrolės, pavadinimas.

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

eilutė nextPoReqNumber = "xyzzy";

naudojant (SPSite svetainės = naujas SPSite(SpPoControlSiteName))
{
naudojant (SPWeb interneto = svetainėje. OpenWeb())
{

SPList currentList = interneto. Sąrašai[SpPoControlListName];

foreach (SPItem controlItem į currentList.Items)
{

Jei (((eilutė)controlItem["ControlField"]).Yra lygi("NextPoNumber"))
{
nextPoReqNumber = (eilutė)controlItem["ControlValue"];

LC int_nextPoReqNumber;
int_nextPoReqNumber = Konvertuoti.ToInt32(nextPoReqNumber);

int_nextPoReqNumber ;

controlItem["ControlValue"] = int_nextPoReqNumber;
controlItem.Update();
}

} // Rasti, skaitymo ir atnaujinimo PO skaičių sąraše.


} // naudojant spweb interneto = site.openweb()
} // naudojant spsite svetainės = naujas spsite("http://localhost/mizuho")

grįžti nextPoReqNumber;

}
}