Monatliche Archive: Juli 2007

MOOS: Benutzerdefinierte Listen durchlaufen und die Rückkehr gefilterter Datenfilterungs in InfoPath

Business-Szenario:

Stellen Sie eine Methode, die Benutzern ermöglicht, genaue Bestellanforderungen schnell eingeben.

Geschäftsproblem:

Der Client ist mit mehreren hundert Anbietern.

Anbieter sind "Typ" spezifische. Dies bedeutet, dass ein Anbieter EDV-Anlagen verkauft (zB. Dell) oder Bürotechnik (zB. Staples).

Wie aktiviere wir Endbenutzer, die Einkauf Bestellanforderungen wählen Sie einen gültigen Anbieter erstellen?

Business-Lösung:

Anbietern zu unterscheiden, in das System über "Typ".

Ermöglichen Sie es Benutzern, den "auswählen" Produkt und geben Sie dann eine gefilterte Menge von geeigneten Anbietern.

Technische Lösung:

Ein InfoPath-Formular wurde entwickelt, dass ermöglicht Benutzern online eingeben Bestellanforderungen kaufen.

Zwei InfoPath-Auswahllisten Steuern Anbieterauswahl. Erste, der Benutzer wählt ein "Kauf". Dies schränkt eine zweite Auswahlliste nur Lieferanten enthalten, die für diesen Kauf zu verkaufen. Dies ist ein klassisches cascading Drop-down.

Anbieter sind in einer MOSS benutzerdefinierte Liste mit benutzerdefinierten Spalten für Anbieter Attribute wie Name gespeichert., Adresse und vor allem "Typ".

Implementieren eines Webdienstes für ein InfoPath-Client zu konsumieren durchläuft der benutzerdefinierten Anbieter-Liste, Rückgabe nur Lieferanten, die passend mitgelieferten "Typs".

Den Webdienst über das InfoPath-Formular aufrufen.

Lessons Learned:

  • Erste, Es erscheint notwendig, diesen Weg zu gehen. Ich hätte es vorgezogen, zu tun, die Filterung komplett in InfoPath und nicht erstellen Sie hier Funktionalität für die Web service. Jedoch, Formularserver bietet keine erforderlichen Filterfunktion. Wir setzen in der Regel auf eine "Typ" Auswahlliste im Formular irgendwie die Kreditor-Abfrage erneut öffnen, aber wir können es richtig funktioniert nicht. Daher, Es war notwendig, um die Implementierung des Webservice.
  • Dies ist eine klassische "kaskadierende Auswahlliste" Problem in der InfoPath forms Server-Welt und es gibt viele gute Beispiele gibt, die erklären, wie dieses Problem zu lösen.
  • Ein leerer Wert für eine Spalte in der Liste der Anbieter gibt eine leere Zeichenfolge wie folgt verwiesen nicht zurück.: initItem["Herstellernamen"]. Stattdessen, Es gibt Null zurück.

Einige andere Hinweise:

  • Ich zurückgibt ein Array[] der Anbieter weil ich hatte einige Schwierigkeiten, die Rückgabe ArrayList. InfoPath klagte darüber, und ich habe nicht die Zeit oder Lust, darüber zu kämpfen. Dies, Natürlich, stellt eine künstliche Beschränkung auf die Gesamtzahl der Anbieter. Es hielt auch mich, ein Trimm zu implementieren() Methode auf dem Array weil ich hasse die Idee der Rückkehr zurück 100 null Anbieter. InfoPath ist es egal, aber es nörgelte mich an. (Wieder, Das war einfacher als Arraylisten InfoPath streiten).
  • Ich habe implementiert eine GetSpecificVendorByName() Funktion sowie, Das könnte durchaus aufschlussreich sein.

Der code:

Verwendung System;
Verwendung System.Web;
Verwendung System.Web.Services;
Verwendung System.Web.Services.Protocols;
Verwendung Microsoft.SharePoint;
Verwendung System.Configuration;

/// <Zusammenfassung>
///
Hersteller-Service: Stellt, dass Anbieter, die im Zusammenhang mit Dienstleistungen, die heute durch ein Infopath-Clientformular verbraucht werden.
///
/// Geschichte:
/// ——–
/// 07/24/07: Anfängliche Codierung, Paul J. Gavin von Conchango.
///
/// </Zusammenfassung>
[WebService(Namespace = "http://www.Conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
öffentliche Klasse VendorService : System.Web.Services.WebService
{

/// <Zusammenfassung>
/// Stellt einen Anbieter aus einer benutzerdefinierten Sharepoint-Liste verwaltet von MSUSA.
/// </Zusammenfassung>
öffentliche Klasse Hersteller
{
öffentliche Hersteller() { }

öffentliche Hersteller(SPItem initItem)
{
If (! (initItem["Herstellernamen"] == NULL)) Herstellername = InitItem["Herstellernamen"].ToString();
If (! (initItem["Adresse 1"] == NULL)) VendorAddress1 = InitItem["Adresse 1"].ToString();
If (! (initItem["Adresse 2"] == NULL)) VendorAddress2 = InitItem["Adresse 2"].ToString();
If (! (initItem["City"] == NULL)) VendorCity = InitItem["City"].ToString();
If (! (initItem["VendorPhone"] == NULL)) VendorPhone = InitItem["VendorPhone"].ToString();
If (! (initItem["PurchaseType"] == NULL)) VendorType = InitItem["PurchaseType"].ToString();
If (! (initItem["Staat"] == NULL)) VendorState = InitItem["Staat"].ToString();
If (! (initItem["Zip"] == NULL)) VendorZip = InitItem["Zip"].ToString();
If (!(initItem["Fax"] == NULL)) VendorFax = InitItem["Fax"].ToString();
If (!(initItem["SalesRepName"] == NULL)) VendorSalesRepName = InitItem["SalesRepName"].ToString();

VendorItemId = initItem.ID; // Eindeutige ID gepflegt über Moos.
}

öffentliche int VendorItemId;
öffentliche Zeichenfolge Herstellername;
öffentliche Zeichenfolge VendorAddress1;
öffentliche Zeichenfolge VendorAddress2;
öffentliche Zeichenfolge VendorCity;
öffentliche Zeichenfolge VendorState;
öffentliche Zeichenfolge VendorZip;
öffentliche Zeichenfolge VendorPhone;
öffentliche Zeichenfolge VendorType;
öffentliche Zeichenfolge VendorSalesRepName;
öffentliche Zeichenfolge VendorFax;
}

öffentliche VendorService () {

//Kommentieren Sie, dass die folgende Zeile verwenden Komponenten ausgelegt
//InitializeComponent();
}

Privat Hersteller[] GenerateTestVendors()
{
Hersteller[] Ergebnisliste;
Ergebnisliste = Neu Hersteller[100];

Hersteller v;
V = Neu Hersteller();
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";

Ergebnisliste[0] = v;

V = Neu Hersteller();

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

Ergebnisliste[1] = v;

V = Neu Hersteller();
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";

Ergebnisliste[2] = v;

Rückkehr Ergebnisliste;

}

[WebMethod]
öffentliche Hersteller GetSpecificVendorById(int vendorId)
{
Zeichenfolge SpVendorSiteName; // Name des tatsächlichen MOSS-Website, die die benutzerdefinierte Liste Anbieter hostet.
Zeichenfolge SpVendorListName; // Name der eigentlichen MOSS Liste mit Anbietern.

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

Verwendung (SPSite Website = Neu SPSite(SpVendorSiteName))
{

Verwendung (SPWeb Web = Site. OpenWeb())
{

SPList CurrentList = Web. Listen[SpVendorListName];

SPItem SpecificItem = currentList.Items[vendorId];

Rückkehr Neu Hersteller(specificItem);

} // mit Spweb Web = site.openweb()
} // Nutzung Spsite Site = neue Spsite("http://Localhost/Mizuho")

}

[WebMethod]
// Setzt voraus, dass der Kreditorname eindeutig ist, aus betriebswirtschaftlicher Sicht
öffentliche Hersteller GetSpecificVendorByVendorName(Zeichenfolge werden)
{
Zeichenfolge SpVendorSiteName; // Name des tatsächlichen MOSS-Website, die die benutzerdefinierte Liste Anbieter hostet.
Zeichenfolge SpVendorListName; // Name der eigentlichen MOSS Liste mit Anbietern.

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

Verwendung (SPSite Website = Neu SPSite(SpVendorSiteName))
{
Verwendung (SPWeb Web = Site. OpenWeb())
{

SPList CurrentList = Web. Listen[SpVendorListName];

foreach (SPItem vendorItem im currentList.Items)
{
If (vendorItem["Herstellernamen"] == NULL) weiter;

If (vendorItem["Herstellernamen"].ToString().Entspricht(werden))
Rückkehr Neu Hersteller(vendorItem);
}

Hersteller V = Neu Hersteller();
v.VendorPhone = "nicht gefunden: " + werden;

Rückkehr v;

Rückkehr NULL;

} // mit Spweb Web = site.openweb()
} // Nutzung Spsite Site = neue Spsite("http://Localhost/Mizuho")

} // Methode

[WebMethod]
öffentliche Hersteller[] GetVendorsOfType (Zeichenfolge filterType)
{

Zeichenfolge SpVendorSiteName; // Namen der tatsächlichen MOSS-Website, die t hostet
benutzerdefinierte Liste der He-Anbieter.
Zeichenfolge SpVendorListName; // Name der eigentlichen MOSS Liste mit Anbietern.

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

Hersteller[] Ergebnisliste;
int VendorIndex = 0;
Ergebnisliste = Neu Hersteller[1000];

// Die Liste mit einer Standardnachricht freundlich zu initialisieren.
Hersteller V = Neu Hersteller();
v.VendorName = "Wählen Sie einen Hersteller um diese Liste zu füllen.";
Ergebnisliste[0] = v;

// Konvertieren Sie den Filter in Kleinbuchstaben für später einfacher String-Vergleiche.
FilterType = filterType.ToLower();

// Wenn der Filtertyp übergeben wird "test", einige einfachen Daten generieren.
#Gebiet Filter Typ = "test"
If (Equals FilterType.("test"))
Rückkehr GenerateTestVendors();
#endregion

If (wahr)
{
Verwendung (SPSite Website = Neu SPSite(SpVendorSiteName))
{
Verwendung (SPWeb Web = Site. OpenWeb())
{

V = NULL;

SPList CurrentList = Web. Listen[SpVendorListName];

// Durchlaufen Sie aller Elemente in der Liste der Anbieter.
foreach (SPItem vendorItem im currentList.Items)
{

Zeichenfolge lowerVendorType;

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

If (Gleich LowerVendorType.(filterType))
{
Ergebnisliste[VendorIndex ] = Neu Hersteller(vendorItem);
}
} // Iteration über alle Anbieter in der Liste


Rückkehr TrimVendorArray(vendorIndex, Ergebnisliste);
// Ergebnisliste zurückkehren;

} // mit Spweb Web = site.openweb()
} // Nutzung Spsite Site = neue Spsite("http://Localhost/Mizuho")

} // Wenn der Wert true

Rückkehr NULL;
}

Privat Hersteller[] TrimVendorArray(int newSize, Hersteller[] originalVendorArray)
{
Hersteller[] trimmedArray;

If (NewSize == 0) NewSize = 1;
TrimmedArray = Neu Hersteller[newSize];

int CurrentCounter = 0;

für (CurrentCounter = 0; currentCounter < newSize; CurrentCounter )
{
trimmedArray[currentCounter] = originalVendorArray[currentCounter];
}

Rückkehr trimmedArray;

}
}

MOOS: Beobachtungen über das Debuggen von InfoPath

InfoPath-Formular-Server-Fehlermeldungen sind irreführend.

Während der Entwicklung eines InfoPath-Formulars, Ich würde per post an MOSS-Server und Zugriff auf das Formular. Form würde anfangen zu laden und erstellen Sie dann eine irreführende Fehlermeldung zeigt mir in das Windows-Ereignisprotokoll Weitere Informationen. Tatsächlich, keine Nachricht wurde in das Windows-Ereignisprotokoll geschrieben.. Eher, die Nachricht wurde in das diagnostische MOSS Ascii-Protokoll gesendet.. Sie können das über die zentrale Dienste-Verwaltung aufspüren.

Sie müssen schnell auf den Beinen sein. MOSS gerne in die Protokolldatei schreiben, häufig und ausf├╝hrlich. Dies kann getrimmt werden, aber das Standardprotokoll schreiben Verhalten ist "alles so schnell wie möglich".

MOOS: Aktualisieren einer benutzerdefinierten Liste

Es gibt viele gute Beispiele für benutzerdefinierte Listen über das SDK aktualisieren. Hier ist noch eine weitere.

Geschäftsproblem: InfoPath-Formular wurde entwickelt, dass ermöglicht Benutzern online eingeben Bestellanforderungen kaufen. PO Requisition, Zahlen sollten traditionelle Sequenz basierten ganzzahlige Werte und automatisch berechnet.

Business-Lösung: Erstellen einer benutzerdefinierten MOSS-Liste mit zwei Spalten: "ControlField" und "ControlValue". Die Wertspalte enthält die nächste Bestellanforderungsnummer. Beachten Sie, dass das generische Modell "control" Namenskonvention bietet für zukünftige Kontrolle-Felder, die verwendet werden können, je nach Bedarf.

Technische Lösung: Erstellen Sie einen Webdienst abgerufen von InfoPath-client. Der Webdienst gibt wieder die nächste Bestellanforderungsnummer und aktualisiert den Wert der Liste.

Lessons Learned:

  • Wenn Sie diesen Webdienst als Datenquelle zum InfoPath-Formular hinzufügen, Ich hielt es für notwendig, in eine udc konvertieren und speichern Sie es in einer Datenverbindungsbibliothek.
  • Ich fand auch das notwendigen Cross Domain scripting über zentrale Dienste-Verwaltung // Anwendungsverwaltung // Formular-Server-Konfiguration.
  • Zum ersten Mal versucht, das Formular Zugriff auf den Webdienst, Es dauert eine Weile und gelegentlich, Es wäre Zeit. Ich manipuliert mit Einstellungen in Formular-Server-Konfiguration um die Timeouteinstellungen zu erweitern und das schien zu helfen.

Der code:

Verwendung System;
Verwendung System.Web;
Verwendung System.Web.Services;
Verwendung System.Web.Services.Protocols;
Verwendung Microsoft.SharePoint;
Verwendung System.Configuration;

[WebService(Namespace = "http://www.Conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
öffentliche Klasse PoService : System.Web.Services.WebService
{
öffentliche PoService () {

//Kommentieren Sie, dass die folgende Zeile verwenden Komponenten ausgelegt
//InitializeComponent();
}

/// <Zusammenfassung>
/// Erhalten Sie die nächste PA-Nummer in der Steuerelementliste Sharepoint po Nummer.
/// Erhöhen Sie die PA-Nummer in der Liste.
/// </Zusammenfassung>
/// <Gibt zurück></Gibt zurück>
[WebMethod]
öffentliche Zeichenfolge GetNextPoNumber()
{
Zeichenfolge SpPoControlSiteName; // Name des tatsächlichen MOSS-Website, die die PO Steuerelementliste hostet.
Zeichenfolge SpPoControlListName; // Name der eigentlichen MOSS-Liste, das Po-Steuerelement enthält.

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

Zeichenfolge NextPoReqNumber = "xyzzy";

Verwendung (SPSite Website = Neu SPSite(SpPoControlSiteName))
{
Verwendung (SPWeb Web = Site. OpenWeb())
{

SPList CurrentList = Web. Listen[SpPoControlListName];

foreach (SPItem controlItem im currentList.Items)
{

If (((Zeichenfolge)controlItem["ControlField"]).Entspricht("NextPoNumber"))
{
NextPoReqNumber = (Zeichenfolge)controlItem["ControlValue"];

int int_nextPoReqNumber;
Int_nextPoReqNumber = Konvertieren.ToInt32(nextPoReqNumber);

Int_nextPoReqNumber ;

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

} // Auffinden von, Lesen und aktualisieren die PA-Nummer in der Liste.


} // mit Spweb Web = site.openweb()
} // Nutzung Spsite Site = neue Spsite("http://Localhost/Mizuho")

Rückkehr nextPoReqNumber;

}
}