MOSS / InfoPath Forms Server (InfoPath 2007) prestaties van de drop-down lijst

Aanvullende categorie: InfoPath

Samenvatting: Een InfoPath 2007 formulier geïmplementeerd op een server MOSS biedt een drop-down lijst van leveranciers die zijn gekoppeld aan een aangepaste lijst MOSS. Bij het selecteren van een leverancier, regels toewijzen veldwaarden aan een handvol tekstvelden zoals de naam van de verkoper, adres, stad, staat, zip en telefoon. Prestaties is verschrikkelijk. We merken dat de prestaties slechter (in een niet-lineaire mode) voor elk extra veld bijwerken we op deze manier. H.D., Als we gewoon de naam verkoper bijwerken, het duurt [x] hoeveelheid tijd. Als we sales rep updaten, adres1, Adres2, stad, staat, zip, het duurt 10 keer langer.

Oplossing: Schrijven van een webservice (code van de steekproef kan worden gevonden Hier) dat wordt doorgegeven in de naam van een leverancier en is het resultaat terug de leverancier details. Vervolgens, de velden op deze manier toewijzen. Hoewel dit te lijkt vertragen, Er was geen waarneembaar verschil in prestaties wanneer wij toegewezen 1 veld versus 8 velden. Als een toegevoegde bonus, gebruikers krijgen een koele "contact opnemen met de server" Cylon effect terwijl ze wachten voor het formulier beroepen en consumeren de service resultaten.

MOSS: Uitzondering is opgetreden. (Uitzondering op HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

UPDATE: Wij vastbesloten nooit de oorzaak van dit probleem en het nooit oppervlakte weer.

We merken dat plotseling tijdens de uitvoering van een site ontwikkeling, twee gebruikers hebben geen toegang tot een siteverzameling. Deze accounts kunnen worden geverifieerd naar de belangrijkste site, maar wanneer het proberen om toegang tot een bepaalde site-collectie, ze krijgen gewoon een leeg scherm. Geen fouten weergegeven, gewoon een witte lege pagina.

Wij als een site collectie admin inloggen en probeert toe te voegen een van die gebruikers als een site admin en deze keer, op op "OK" te drukken, We krijgen deze boodschap:

Uitzondering is opgetreden. (Uitzondering op HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

We enige tijd dit onderzoeken en helaas, niet komen met iets nuttigs. Er waren sommige berichten in diagnoselogboek van het, maar het was moeilijk om precies het correleren van hen met dit probleem.

In het einde, wij de siteverzameling wordt verwijderd en opnieuw gemaakt en dat het opgelost.

Als ik erachter te komen veroorzaakt wat dit in de toekomst, Ik zal deze post bijwerken.

MOSS: Aangepaste lijsten doorlopen en gefilterde gegevens terug te keren naar InfoPath

Bedrijfsscenario:

Bieden een methode waarmee gebruikers snel invoeren van nauwkeurige aankoop vorderingen.

Bedrijfsprobleem:

De cliënt doet zaken met meerdere honderden leveranciers.

Leveranciers zijn "type" specifieke. Dit betekent dat een leverancier computerapparatuur verkoopt (bijvoorbeeld. Dell) of kantoorbenodigdheden (bijvoorbeeld. Nietjes).

Hoe we eindgebruikers die aankoop vorderingen Selecteer een geldige leverancier maken inschakelen?

Zakelijke oplossing:

Onderscheiden van leveranciers in het systeem via "type".

Gebruikers om te selecteren van het type"in staat stellen" van product en geef vervolgens een gefilterde set van passende leveranciers.

Technische oplossing:

Een InfoPath-formulier is ontworpen dat stelt gebruikers in staat om online vorderingen kopen.

Twee InfoPath selectie lijsten beheren leverancier selectie. Eerste, de gebruiker selecteert een type"inkoop". Dit houdt in dat een tweede selectielijst bevatten alleen leveranciers die voor dat type Inkoop verkopen. Dit is een klassieke trapsgewijze keuzelijst.

Leveranciers worden opgeslagen in een aangepaste lijst van MOSS met aangepaste kolommen voor leverancier kenmerken zoals naam, adres en vooral "type".

Uitvoering van een webservice voor een InfoPath-client om te consumeren die een iteratie uitgevoerd via de aangepaste leveranciersoverzicht, alleen leveranciers overeenkomt met een meegeleverde "type" terug te keren.

Aanroepen van de webservice via het InfoPath-formulier.

Geleerde lessen:

  • Eerste, het lijkt noodzakelijk om deze route te gaan. Ik zou liever om te doen de filtering volledig binnen InfoPath en niet het maken van een web service functionaliteit hier. Echter, formulieren server voorziet niet in de vereiste filterfunctie. Kunnen we een regel op een het type"" keuzelijst in het formulier in om de soort van de leverancier query opnieuw te openen, maar we kan niet krijgen om goed te werken. Daarom, het was nodig voor de uitvoering van de webservice.
  • Dit is een klassieke "trapsgewijze keuzelijst" probleem in de InfoPath forms server wereld en er zijn vele goede voorbeelden die er waarin wordt uitgelegd hoe dit op te lossen.
  • Een lege waarde voor een kolom in het leveranciersoverzicht geeft geen resultaat een lege tekenreeks wanneer verwezen als dit: initItem["De naam van de verkoper"]. In plaats daarvan, het geeft als resultaat een null.

Sommige andere notities:

  • Ik retourneren een matrix[] van leveranciers omdat ik had grote moeite terug te keren een ArrayList. InfoPath was klagen over het en ik heb niet de tijd of de neiging om te vechten over het. Dit, Natuurlijk, Zet een kunstmatige limiet op het totale aantal leveranciers. Het ook gedwongen mij te voeren een trim() methode op de array omdat ik haat het idee van terugkeer terug 100's van null leveranciers. InfoPath schelen niet, maar het gezeurd op mij. (Weer, Dit was makkelijker dan InfoPath vechten over ArrayLists).
  • Ik heb een GetSpecificVendorByName geïmplementeerd() functie, die kan worden leerzaam.

De code:

met behulp van Systeem;
met behulp van System.Web;
met behulp van System.Web.Services;
met behulp van System.Web.Services.Protocols;
met behulp van Microsoft.SharePoint;
met behulp van System.Configuration;

/// <Samenvatting>
///
Service leverancier: Biedt leverancier gerelateerde services die vandaag de dag worden verbruikt door een infopath-formulier voor client.
///
/// Geschiedenis:
/// ——–
/// 07/24/07: Eerste codering, Paul J. Gavin van Conchango.
///
/// </Samenvatting>
[WebService(Namespace = 'http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
openbare klasse VendorService : System.Web.Services.WebService
{

/// <Samenvatting>
/// Hiermee geeft u een leverancier uit een aangepaste sharepoint-lijst onderhouden door MSUSA.
/// </Samenvatting>
openbare klasse Leverancier
{
openbare Leverancier() { }

openbare Leverancier(SPItem initItem)
{
Als (! (initItem["De naam van de verkoper"] == Null)) Leveranciersnaam = initItem["De naam van de verkoper"].ToString();
Als (! (initItem["Adres 1"] == Null)) VendorAddress1 = initItem["Adres 1"].ToString();
Als (! (initItem["Adres 2"] == Null)) VendorAddress2 = initItem["Adres 2"].ToString();
Als (! (initItem["City"] == Null)) VendorCity = initItem["City"].ToString();
Als (! (initItem["VendorPhone"] == Null)) VendorPhone = initItem["VendorPhone"].ToString();
Als (! (initItem["PurchaseType"] == Null)) VendorType = initItem["PurchaseType"].ToString();
Als (! (initItem["State"] == Null)) VendorState = initItem["State"].ToString();
Als (! (initItem["Zip"] == Null)) VendorZip = initItem["Zip"].ToString();
Als (!(initItem["Fax"] == Null)) VendorFax = initItem["Fax"].ToString();
Als (!(initItem["SalesRepName"] == Null)) VendorSalesRepName = initItem["SalesRepName"].ToString();

VendorItemId = initItem.ID; // Unieke ID onderhouden via MOSS.
}

openbare int VendorItemId;
openbare tekenreeks Leveranciersnaam;
openbare tekenreeks VendorAddress1;
openbare tekenreeks VendorAddress2;
openbare tekenreeks VendorCity;
openbare tekenreeks VendorState;
openbare tekenreeks VendorZip;
openbare tekenreeks VendorPhone;
openbare tekenreeks VendorType;
openbare tekenreeks VendorSalesRepName;
openbare tekenreeks VendorFax;
}

openbare VendorService () {

//Uncomment de volgende regel als gebruikt ontworpen onderdelen
//InitializeComponent();
}

privé Leverancier[] GenerateTestVendors()
{
Leverancier[] Resultaten;
Resultaten = Nieuw Leverancier[100];

Leverancier v;
v = Nieuw Leverancier();
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";

Resultaten[0] = v;

v = Nieuw Leverancier();

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";

Resultaten[1] = v;

v = Nieuw Leverancier();
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";

Resultaten[2] = v;

terugkeer Resultaten;

}

[WebMethod]
openbare Leverancier GetSpecificVendorById(int vendorId)
{
tekenreeks SpVendorSiteName; // Naam van de werkelijke MOSS-site die als host optreedt van de aangepaste lijst van de leverancier.
tekenreeks SpVendorListName; // Naam van de werkelijke MOSS lijst met leveranciers.

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

met behulp van (SPSite site = Nieuw SPSite(SpVendorSiteName))
{

met behulp van (SPWeb Web = site. OpenWeb())
{

SPList currentList = web. Lijsten[SpVendorListName];

SPItem specificItem = currentList.Items[vendorId];

terugkeer Nieuw Leverancier(specificItem);

} // met behulp van spweb web = site.openweb()
} // gebruik van spsite site = nieuwe spsite('http://localhost/mizuho")

}

[WebMethod]
// Wordt ervan uitgegaan dat de naam van de verkoper uniek is, vanuit een zakelijk perspectief
openbare Leverancier GetSpecificVendorByVendorName(tekenreeks worden)
{
tekenreeks SpVendorSiteName; // Naam van de werkelijke MOSS-site die als host optreedt van de aangepaste lijst van de leverancier.
tekenreeks SpVendorListName; // Naam van de werkelijke MOSS lijst met leveranciers.

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

met behulp van (SPSite site = Nieuw SPSite(SpVendorSiteName))
{
met behulp van (SPWeb Web = site. OpenWeb())
{

SPList currentList = web. Lijsten[SpVendorListName];

foreach (SPItem vendorItem in currentList.Items)
{
Als (vendorItem["De naam van de verkoper"] == Null) «««;

Als (vendorItem["De naam van de verkoper"].ToString().Is gelijk aan(worden))
terugkeer Nieuw Leverancier(vendorItem);
}

Leverancier v = Nieuw Leverancier();
v.VendorPhone = 'niet gevonden: " + worden;

terugkeer v;

terugkeer Null;

} // met behulp van spweb web = site.openweb()
} // gebruik van spsite site = nieuwe spsite('http://localhost/mizuho")

} // methode

[WebMethod]
openbare Leverancier[] GetVendorsOfType (tekenreeks filterType)
{

tekenreeks SpVendorSiteName; // Naam van de werkelijke MOSS-site die als host optreedt van t
Hij leverancier aangepaste lijst.
tekenreeks SpVendorListName; // Naam van de werkelijke MOSS lijst met leveranciers.

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

Leverancier[] Resultaten;
int vendorIndex = 0;
Resultaten = Nieuw Leverancier[1000];

// De lijst met een vriendelijke standaardbericht initialiseren.
Leverancier v = Nieuw Leverancier();
v.VendorName = "Selecteer een leveranciertype om deze lijst te vullen.";
Resultaten[0] = v;

// Het filter converteren naar kleine letters voor later gemakkelijker tekenreeksvergelijking.
filterType = filterType.ToLower();

// Als u het filtertype doorgegeven is "test", sommige eenvoudige gegevens genereren.
#regio Filtertype = "test"
Als (filterType. is gelijk aan("test"))
terugkeer GenerateTestVendors();
#endregion

Als (True)
{
met behulp van (SPSite site = Nieuw SPSite(SpVendorSiteName))
{
met behulp van (SPWeb Web = site. OpenWeb())
{

v = Null;

SPList currentList = web. Lijsten[SpVendorListName];

// Alle items in het leveranciersoverzicht doorlopen.
foreach (SPItem vendorItem in currentList.Items)
{

tekenreeks lowerVendorType;

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

Als (lowerVendorType. is gelijk aan(filterType))
{
Resultaten[vendorIndex ] = Nieuw Leverancier(vendorItem);
}
} // doorlopen door alle leveranciers in de lijst


terugkeer TrimVendorArray(vendorIndex, Resultaten);
// retourneren van de resultaten;

} // met behulp van spweb web = site.openweb()
} // gebruik van spsite site = nieuwe spsite('http://localhost/mizuho")

} // Als de waarde true

terugkeer Null;
}

privé Leverancier[] TrimVendorArray(int newsize, Leverancier[] originalVendorArray)
{
Leverancier[] trimmedArray;

Als (newsize == 0) newsize = 1;
trimmedArray = Nieuw Leverancier[newsize];

int currentCounter = 0;

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

terugkeer trimmedArray;

}
}

MOSS: Opmerkingen over InfoPath foutopsporing

InfoPath formulier server-foutberichten zijn misleidend.

Tijdens de ontwikkeling van een InfoPath-formulier, Ik zou post-it naar MOSS server en toegang tot het formulier. Het formulier zou beginnen te laden en genereer vervolgens een misleidende foutbericht wijzen mij naar het windows-gebeurtenislogboek voor details. Eigenlijk, geen bericht werd geschreven naar het windows-gebeurtenislogboek. Eerder, het bericht werd verzonden naar het diagnoselogboek van het mos ascii. U kunt die sporen via centrale diensten administratie.

U wilt snel op uw voeten. MOSS houdt om te schrijven naar het logbestand opgeven, vaak en verbosely. Dit kan worden getrimd maar het standaardlogboek schrijven gedrag is "alles zo snel mogelijk".

MOSS: Een aangepaste lijst bijwerken

Er zijn vele goede voorbeelden van aangepaste lijsten via de SDK bijwerken. Hier is nog een andere.

Bedrijfsprobleem: InfoPath-formulier is ontworpen dat stelt gebruikers in staat om online vorderingen kopen. PO inkoopvoorstel getallen moet bestaan uit traditionele reeks gebaseerd integerwaarden en automatisch berekend.

Zakelijke oplossing: Een aangepaste MOSS lijst met twee kolommen maken: "ControlField" en "ControlValue". De kolom waarde bevat de volgende aankoop inkoopvoorstel nummer. Merk op dat het algemene "control" naamgevingsconventie voorziet in toekomstige controle velden die kunnen worden gebruikt als nodig.

Technische oplossing: Een webservice toegankelijk door de InfoPath-client maken. De webservice retourneert terug de volgende aankoop inkoopvoorstel nummer en de waarde van de lijst bijgewerkt.

Geleerde lessen:

  • Wanneer deze webservice als gegevensbron toevoegen aan de InfoPath-formulier, Ik vond het nodig om te converteren naar een udc en opslaan in een bibliotheek met gegevensverbindingen.
  • Ik vond het ook nodig om te schakelen tussen domeinen scripts via centrale diensten administratie // Toepassingsbeheer // de configuratie van de server van het formulier.
  • De eerste keer het formulier probeert te openen van de webservice, het duurt een tijdje en bij gelegenheid, het zou tijd out. Rommelde ik met instellingen in de configuratie van de server van het formulier uit te breiden van de time-outinstellingen en welk toelijken voor steun.

De code:

met behulp van Systeem;
met behulp van System.Web;
met behulp van System.Web.Services;
met behulp van System.Web.Services.Protocols;
met behulp van Microsoft.SharePoint;
met behulp van System.Configuration;

[WebService(Namespace = 'http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
openbare klasse PoService : System.Web.Services.WebService
{
openbare PoService () {

//Uncomment de volgende regel als gebruikt ontworpen onderdelen
//InitializeComponent();
}

/// <Samenvatting>
/// De volgende PO-nummer te verkrijgen door de sharepoint po nummer control list.
/// _ / / Verhogen de PO-nummer in die lijst.
/// </Samenvatting>
/// <geeft als resultaat></geeft als resultaat>
[WebMethod]
openbare tekenreeks GetNextPoNumber()
{
tekenreeks SpPoControlSiteName; // Naam van de werkelijke MOSS-site die als host optreedt van de PO Control list.
tekenreeks SpPoControlListName; // Naam van de werkelijke MOSS lijst waarin het besturingselement Po.

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

tekenreeks nextPoReqNumber = "xyzzy";

met behulp van (SPSite site = Nieuw SPSite(SpPoControlSiteName))
{
met behulp van (SPWeb Web = site. OpenWeb())
{

SPList currentList = web. Lijsten[SpPoControlListName];

foreach (SPItem controlItem in currentList.Items)
{

Als (((tekenreeks)controlItem["ControlField"]).Is gelijk aan("NextPoNumber"))
{
nextPoReqNumber = (tekenreeks)controlItem["ControlValue"];

int int_nextPoReqNumber;
int_nextPoReqNumber = Converteren.ToInt32(nextPoReqNumber);

int_nextPoReqNumber ;

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

} // Zoeken, lezen en bijwerken van de PO-nummer in de lijst.


} // met behulp van spweb web = site.openweb()
} // gebruik van spsite site = nieuwe spsite('http://localhost/mizuho")

terugkeer nextPoReqNumber;

}
}