Μηνιαία Αρχεία: Ιουλίου 2007

MOSS: Διαδοχικές προσεγγίσεις μέσα σε προσαρμοσμένες λίστες και τα οποία επιστρέφουν τα φιλτραρισμένα δεδομένα για το InfoPath

Επιχειρηματικό σενάριο:

Παρέχει μια μέθοδο που επιτρέπει στους χρήστες να εισαγάγουν ακριβή αγορά επιτάξεις γρήγορα.

Προβλήματος των επιχειρήσεων:

Ο πελάτης συναλλάσσεται με αρκετές εκατοντάδες προμηθευτές.

Οι πωλητές είναι "τύπος" συγκεκριμένες. Αυτό σημαίνει ότι ο πωλητής πωλεί μηχανογραφικού εξοπλισμού (π.χ.. Dell) ή γραφείο προμηθειών (π.χ.. Συνδετήρες).

Πώς θα επιτρέψουμε σε τελικούς χρήστες που δημιουργούν αγορά επιτάξεις επιλέξτε μια έγκυρη προμηθευτή?

Επιχειρηματική λύση:

Διαφοροποιήσει προμηθευτές στο σύστημα μέσω "τύπος".

Επιτρέπουν στους χρήστες να επιλέξετε τον τύπο"" του προϊόντος και στη συνέχεια Δώστε ένα φιλτραρισμένο σύνολο κατάλληλη προμηθευτές.

Τεχνική λύση:

Έχει σχεδιαστεί μια φόρμα του InfoPath που επιτρέπει στους χρήστες να εισέλθουν σε απευθείας σύνδεση αγοράσει επιτάξεις.

Δύο λίστες επιλογής InfoPath ελέγχου επιλογής προμηθευτή. Πρώτη, ο χρήστης επιλέγει ένα «είδος της αγοράς». Αυτό περιορίζει μία δεύτερη λίστα επιλογής να περιέχουν μόνο οι προμηθευτές που πωλούν για αυτόν τον τύπο αγορά. Αυτό είναι ένα κλασικό επικαλυπτόμενα αναπτυσσόμενο.

Προμηθευτές αποθηκεύονται σε μια προσαρμοσμένη λίστα MOSS με προσαρμοσμένων στηλών προμηθευτή χαρακτηριστικά, όπως όνομα, διεύθυνση και ιδιαίτερα "τύπος".

Εφαρμογή μια διαδικτυακή υπηρεσία για ένα πρόγραμμα-πελάτη InfoPath να καταναλώνουν που εκτελεί επαναλήψεις μέσα από τον κατάλογο προμηθευτών συνήθειας, επιστροφή μόνο προμηθευτές που ταιριάζουν ένα παρεχόμενο "τύπος".

Επικαλούνται την υπηρεσία web μέσω της φόρμας του InfoPath.

Διδάγματα:

  • Πρώτη, φαίνεται απαραίτητο να πάτε αυτή η διαδρομή. Θα προτιμούσα να κάνει το φιλτράρισμα εξ ολοκλήρου μέσα από το InfoPath και δεν δημιουργούν οποιαδήποτε λειτουργία υπηρεσιών web εδώ. Ωστόσο, μορφές διακομιστής δεν παρέχει την απαιτούμενη δυνατότητα φιλτραρίσματος. Μπορούμε να θέσουμε έναν κανόνα επάνω σε ένα "τύπος" λίστας επιλογών, με τη μορφή να είδος του να ανοίξει εκ νέου το ερώτημα του προμηθευτή, αλλά δεν μπορούμε να έχουμε να λειτουργήσει σωστά. Ως εκ τούτου, ήταν απαραίτητο να εφαρμόσουν την υπηρεσία web.
  • Αυτό είναι ένα κλασικό "επικαλυπτόμενα λίστας επιλογών" αποτελεί πρόβλημα στο InfoPath το διακομιστή κόσμο και υπάρχουν πολλά καλά παραδείγματα εκεί έξω που εξηγούν πώς να λύσει αυτό.
  • Μια κενή τιμή στήλης στον κατάλογο προμηθευτών δεν επιστρέφει μια κενή συμβολοσειρά όταν αναφέρεται σαν αυτό: initItem["Όνομα προμηθευτή"]. Αντί, επιστρέφει μια τιμή null.

Μερικές άλλες σημειώσεις:

  • Μου επιστρέφουν έναν πίνακα[] προμηθευτές διότι είχα κάποια δυσκολία που επιστρέφει μια ArrayList. InfoPath διαμαρτύρονται για αυτό και δεν έχω το χρόνο και την διάθεση για την καταπολέμηση της πέρα από το. Αυτό, Φυσικά, βάζει ένα τεχνητό όριο προς το συνολικό αριθμό των πωλητών. Επίσης αυτό που ανάγκασε μου για να εφαρμόσει μια περιποίηση() μέθοδος για τον πίνακα, επειδή μισώ την ιδέα της επιστροφής πίσω 100 null προμηθευτών. Το InfoPath δεν ενδιαφέρεται, αλλά αυτό nagged κατά μου. (Και πάλι, Αυτό ήταν πιο εύκολο από αγωνίζονται το InfoPath κατά τη διάρκεια ArrayLists).
  • Εφάρμοσα μια GetSpecificVendorByName() λειτουργία καθώς και, που μπορεί να είναι διαφωτιστικός.

Ο κώδικας:

χρήση Σύστημα;
χρήση System.Web;
χρήση System.Web.Services;
χρήση System.Web.Services.Protocols;
χρήση Microsoft.SharePoint;
χρήση System.Configuration;

/// <Περίληψη>
///
Υπηρεσία του προμηθευτή: Παρέχει προμηθευτή που σχετίζονται με υπηρεσίες που σήμερα καταναλώνονται από μια φόρμα του infopath πελάτη.
///
/// Ιστορία:
/// ——–
/// 07/24/07: Αρχική κωδικοποίηση, Paul J. Gavin του Conchango.
///
/// </Περίληψη>
[WebService(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
δημόσια Κατηγορία VendorService : System.Web.Services.WebService
{

/// <Περίληψη>
/// Αντιπροσωπεύει έναν προμηθευτή από μια λίστα 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; // Μοναδικό αναγνωριστικό διατηρήται μέσω MOSS.
}

δημόσια int VendorItemId;
δημόσια συμβολοσειρά Όνομα προμηθευτή;
δημόσια συμβολοσειρά VendorAddress1;
δημόσια συμβολοσειρά VendorAddress2;
δημόσια συμβολοσειρά VendorCity;
δημόσια συμβολοσειρά VendorState;
δημόσια συμβολοσειρά VendorZip;
δημόσια συμβολοσειρά VendorPhone;
δημόσια συμβολοσειρά VendorType;
δημόσια συμβολοσειρά VendorSalesRepName;
δημόσια συμβολοσειρά VendorFax;
}

δημόσια VendorService () {

//Αποσχολιάστε την ακόλουθη γραμμή, αν χρησιμοποιείτε σχεδιασμένα συστατικά
//InitializeComponent();
}

ιδιωτική Προμηθευτή[] GenerateTestVendors()
{
Προμηθευτή[] λίστα αποτελεσμάτων;
λίστα αποτελεσμάτων = νέα Προμηθευτή[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 = "v1_st";
v.VendorType = "v1_type";
v.VendorZip = "v1_zip";

λίστα αποτελεσμάτων[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";

λίστα αποτελεσμάτων[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";

λίστα αποτελεσμάτων[2] = v;

επιστροφή λίστα αποτελεσμάτων;

}

[WebMethod]
δημόσια Προμηθευτή GetSpecificVendorById(int αναγνωριστικό προμηθευτή)
{
συμβολοσειρά SpVendorSiteName; // Όνομα της πραγματικής τοποθεσίας ΒΡΎΑ που φιλοξενεί την προσαρμοσμένη λίστα πωλητή.
συμβολοσειρά SpVendorListName; // Όνομα της λίστας πραγματική ΒΡΎΑ που περιέχουν προμηθευτές.

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

χρήση (SPSite ιστοσελίδα = νέα SPSite(SpVendorSiteName))
{

χρήση (SPWeb Web = site. Επιθετικό())
{

SPList currentList = web. Λίστες[SpVendorListName];

SPItem specificItem = currentList.Items[αναγνωριστικό προμηθευτή];

επιστροφή νέα Προμηθευτή(specificItem);

} // χρησιμοποιώντας spweb web = site.openweb()
} // χρησιμοποιώντας την ιστοσελίδα spsite = νέα spsite("http://localhost/τελευταίες")

}

[WebMethod]
// Θεωρείται ότι το όνομα του προμηθευτή είναι μοναδικό, από επιχειρηματικής πλευράς
δημόσια Προμηθευτή GetSpecificVendorByVendorName(συμβολοσειρά να)
{
συμβολοσειρά SpVendorSiteName; // Όνομα της πραγματικής τοποθεσίας ΒΡΎΑ που φιλοξενεί την προσαρμοσμένη λίστα πωλητή.
συμβολοσειρά SpVendorListName; // Όνομα της λίστας πραγματική ΒΡΎΑ που περιέχουν προμηθευτές.

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

χρήση (SPSite ιστοσελίδα = νέα SPSite(SpVendorSiteName))
{
χρήση (SPWeb Web = site. Επιθετικό())
{

SPList 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/τελευταίες")

} // μέθοδος

[WebMethod]
δημόσια Προμηθευτή[] GetVendorsOfType (συμβολοσειρά filterType)
{

συμβολοσειρά SpVendorSiteName; // Όνομα της πραγματικής τοποθεσίας ΒΡΎΑ που φιλοξενεί t
ο ίδιος πωλητής προσαρμοσμένη λίστα.
συμβολοσειρά SpVendorListName; // Όνομα της λίστας πραγματική ΒΡΎΑ που περιέχουν προμηθευτές.

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

Προμηθευτή[] λίστα αποτελεσμάτων;
int vendorIndex = 0;
λίστα αποτελεσμάτων = νέα Προμηθευτή[1000];

// Προετοιμασία τον κατάλογο με ένα προεπιλεγμένο μήνυμα φιλικό.
Προμηθευτή v = νέα Προμηθευτή();
v.VendorName = «Επιλέξτε έναν τύπο του προμηθευτή να συμπληρώσετε αυτή τη λίστα.";
λίστα αποτελεσμάτων[0] = v;

// Μετατρέψτε το φίλτρο σε lower case για ευκολότερη σύγκριση συμβολοσειράς αργότερα.
filterType = filterType.ToLower();

// Εάν περάσει τον τύπο φίλτρου είναι "δοκιμή", δημιουργήσει κάποια δοκιμαστικά δεδομένα.
#περιοχή Φίλτρο τύπου = "δοκιμή"
Αν (filterType. ισούται με("δοκιμή"))
επιστροφή GenerateTestVendors();
#endregion

Αν (TRUE)
{
χρήση (SPSite ιστοσελίδα = νέα SPSite(SpVendorSiteName))
{
χρήση (SPWeb Web = site. Επιθετικό())
{

v = τιμή null;

SPList currentList = web. Λίστες[SpVendorListName];

// Επαναλαμβάνεται σε όλα τα στοιχεία στον κατάλογο προμηθευτών.
foreach (SPItem vendorItem σε currentList.Items)
{

συμβολοσειρά lowerVendorType;

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

Αν (lowerVendorType. ισούται με(filterType))
{
λίστα αποτελεσμάτων[vendorIndex ] = νέα Προμηθευτή(vendorItem);
}
} // διαδοχικές προσεγγίσεις μέσα από όλους τους προμηθευτές στη λίστα


επιστροφή TrimVendorArray(vendorIndex, λίστα αποτελεσμάτων);
// επιστρέφει τη λίστα αποτελεσμάτων;

} // χρησιμοποιώντας spweb web = site.openweb()
} // χρησιμοποιώντας την ιστοσελίδα spsite = νέα spsite("http://localhost/τελευταίες")

} // Εάν είναι αληθές

επιστροφή τιμή null;
}

ιδιωτική Προμηθευτή[] TrimVendorArray(int νέα, Προμηθευτή[] originalVendorArray)
{
Προμηθευτή[] trimmedArray;

Αν (νέα == 0) νέα = 1;
trimmedArray = νέα Προμηθευτή[νέα];

int currentCounter = 0;

για (currentCounter = 0; currentCounter < νέα; currentCounter )
{
trimmedArray[currentCounter] = originalVendorArray[currentCounter];
}

επιστροφή trimmedArray;

}
}

MOSS: Παρατηρήσεις σχετικά με τον εντοπισμό σφαλμάτων του InfoPath

Μηνυμάτων σφάλματος διακομιστή φόρμας του InfoPath είναι παραπλανητική.

Κατά την ανάπτυξη μιας φόρμας InfoPath, Θα post σε διακομιστή MOSS και να αποκτήσετε πρόσβαση στη φόρμα. Εντύπου θα αρχίσουν να φορτώσει και στη συνέχεια να δημιουργήσει ένα παραπλανητικό μήνυμα λάθους επισήμανσή μου στο αρχείο καταγραφής συμβάντων των windows για λεπτομέρειες. Στην πραγματικότητα, το μήνυμα δεν ήταν γραμμένο στο αρχείο καταγραφής συμβάντων των windows. Μάλλον, το μήνυμα έχει σταλεί στο MOSS ascii αρχείο καταγραφής διαγνωστικών. Μπορείτε να παρακολουθείτε που μέσω κεντρικών υπηρεσιών διοίκησης.

Θα πρέπει να είναι γρήγορη στα πόδια σας. ΒΡΎΑ που θέλει να γράψει στο αρχείο καταγραφής, συχνά και την λεπτομερή. Αυτό μπορεί να τακτοποιηθεί, αλλά το προεπιλεγμένο αρχείο καταγραφής γραφή συμπεριφορά είναι "τα πάντα όσο το δυνατόν γρηγορότερα".

MOSS: Ενημέρωση μια προσαρμοσμένη λίστα

Υπάρχουν πολλά καλά παραδείγματα του ενημέρωση προσαρμοσμένες λίστες μέσω το SDK. Εδώ είναι ακόμα μια.

Προβλήματος των επιχειρήσεων: Φόρμα InfoPath έχει σχεδιαστεί ότι επιτρέπει στους χρήστες να εισέλθουν σε απευθείας σύνδεση αγοράσει επιτάξεις. PO αναπλήρωσης αριθμοί πρέπει να είναι παραδοσιακό ακολουθία με βάση ακέραιες τιμές και υπολογίζεται αυτόματα.

Επιχειρηματική λύση: Δημιουργήσετε μια προσαρμοσμένη λίστα ΒΡΎΑ που περιέχει δύο στήλες: "ControlField" και "ControlValue". Η στήλη αξία περιέχει τον επόμενο αριθμό αναπλήρωσης αγορά. Σημειώστε ότι το γενικό "ελέγχου" ονομάζοντας σύμβαση προβλέπει μελλοντικές ελέγχου πεδία που μπορούν να χρησιμοποιηθούν, ανάλογα με τις ανάγκες.

Τεχνική λύση: Δημιουργήσετε μια διαδικτυακή υπηρεσία που προσεγγίζεται από τον πελάτη του InfoPath. Η υπηρεσία web που επιστρέφει πίσω τον επόμενο αριθμό αναπλήρωσης αγορά και ενημερώνει την τιμή της λίστας.

Διδάγματα:

  • Κατά την προσθήκη αυτής της υπηρεσίας web ως αρχείο προέλευσης δεδομένων στη φόρμα του InfoPath, Θεώρησε αναγκαίο να μετατρέψει σε μια udc και να το αποθηκεύσετε σε μια βιβλιοθήκη σύνδεσης δεδομένων.
  • Βρήκα επίσης απαραίτητα, ώστε μεταξύ τομέων scripting μέσω κεντρικών υπηρεσιών διοίκησης // διαχείριση εφαρμογών // ρύθμιση παραμέτρων του διακομιστή μορφή.
  • Πρώτη φορά τη μορφή προσπάθησε να αποκτήσετε πρόσβαση στην υπηρεσία web, παίρνει λίγο και περιστασιακά, θα ώρα έξω. Έχω ανακατευτήκατε με τις ρυθμίσεις σε μορφή διαμόρφωση διακομιστή για να αναπτύξετε τις ρυθμίσεις χρονικού ορίου και αυτό φάνηκε να βοηθήσει.

Ο κώδικας:

χρήση Σύστημα;
χρήση System.Web;
χρήση System.Web.Services;
χρήση System.Web.Services.Protocols;
χρήση Microsoft.SharePoint;
χρήση System.Configuration;

[WebService(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
δημόσια Κατηγορία PoService : System.Web.Services.WebService
{
δημόσια PoService () {

//Αποσχολιάστε την ακόλουθη γραμμή, αν χρησιμοποιείτε σχεδιασμένα συστατικά
//InitializeComponent();
}

/// <Περίληψη>
/// Επιδιώξω τον επόμενο αριθμό PO po αριθμός ελέγχου λίστα sharepoint.
/// Προσαύξηση τον αριθμό PO στον εν λόγω κατάλογο.
/// </Περίληψη>
/// <επιστρέφει></επιστρέφει>
[WebMethod]
δημόσια συμβολοσειρά GetNextPoNumber()
{
συμβολοσειρά SpPoControlSiteName; // Όνομα της πραγματικής τοποθεσίας ΒΡΎΑ που φιλοξενεί τη λίστα ελέγχου PO.
συμβολοσειρά SpPoControlListName; // Όνομα της πραγματικής ΒΡΎΑ λίστας που περιέχει το στοιχείο ελέγχου ανά.

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

συμβολοσειρά nextPoReqNumber = "xyzzy";

χρήση (SPSite ιστοσελίδα = νέα SPSite(SpPoControlSiteName))
{
χρήση (SPWeb Web = site. Επιθετικό())
{

SPList currentList = web. Λίστες[SpPoControlListName];

foreach (SPItem controlItem σε currentList.Items)
{

Αν (((συμβολοσειρά)controlItem["ControlField"]).Ισούται με("NextPoNumber"))
{
nextPoReqNumber = (συμβολοσειρά)controlItem["ControlValue"];

int int_nextPoReqNumber;
int_nextPoReqNumber = Μετατροπή.ToInt32(nextPoReqNumber);

int_nextPoReqNumber ;

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

} // Εντόπιση, ανάγνωση και ενημέρωση ο αριθμός Εντολής αγοράς στη λίστα.


} // χρησιμοποιώντας spweb web = site.openweb()
} // χρησιμοποιώντας την ιστοσελίδα spsite = νέα spsite("http://localhost/τελευταίες")

επιστροφή nextPoReqNumber;

}
}