maandelikse Argiewe: Julie 2007

MOSS: Iterating deur middel van persoonlike lyste en die terugkeer van gefilterde inligting te Path

Besigheid scenario:

Verskaf 'n metode wat in staat stel om gebruikers akkurate aankoop rekwisisies te vinnig gaan.

Besigheid probleem:

Die kliënt doen besigheid met 'n paar honderd verkopers.

Verskaffers is "tipe" spesifieke. Dit beteken dat 'n ondernemer verkoop rekenaartoerusting (bijv. Dell) of die kantoor verskaf (bijv. Staples).

Hoe kan ons eindgebruikers wat aankoop rekwisisies skep, kies 'n geldige ondernemer?

Business Solution:

Onderskei verkopers in die stelsel via "tipe".

Gebruikers in staat stel om die "tipe te kies" van die produk en dan 'n gefilterde stel van geskikte verskaffers.

Tegniese oplossing:

'N Path vorm ontwerp wat in staat stel om gebruikers aanlyn aankoop rekwisisies in te voer.

Twee die Path seleksie lyste beheer verskaffer seleksie. Eerste, die gebruiker kies 'n "aankoop tipe". This limits a second selection list to contain only vendors that sell for that purchase type. This is a classic cascading drop-down.

Ondernemers word gestoor in 'n Moss persoonlike lys met persoonlike kolomme vir die verkoper eienskappe soos naam, adres en veral "tipe".

Implementering van 'n web diens vir 'n Path kliënt te vernietig wat deur die persoonlike verkoper lys iterate, terugkeer enigste verskaffers wat ooreenstem met 'n gegewe "tipe".

Roep die web diens via die Path vorm.

Lesse wat geleer:

  • Eerste, blyk dit noodsaaklik om hierdie roete te gaan. Ek sou verkies het om die filter heeltemal binne Path te doen en nie 'n web diens funksionaliteit hier. Egter, vorms bediener het nie die vereiste filter vermoë. Ons kan 'n reël op 'n "tipe" seleksie lys in die vorm van heropen die verkoper navraag te sorteer, maar ons kan nie dit kry om behoorlik te werk. Daarom, was dit nodig om die web te implementeer.
  • Dit is 'n klassieke "cascade keuse lys" probleem in die Path vorms bediener wêreld en daar is baie goeie voorbeelde daar buite wat verduidelik hoe om dit op te los.
  • 'N leë waarde vir 'n kolom in die verkoper lys nie terug 'n leë string wanneer verwys soos hierdie: initItem["Vendor Name"]. In plaas daarvan, dit gee 'n leë.

Sommige ander notas:

  • Ek weer 'n skikking[] verskaffers, want ek het 'n paar probleme wat terugkeer 1 Array List. Path kla oor dit en ek het nie die tyd of die neiging om te veg oor. Dit, natuurlik, sit 'n kunsmatige beperking op die aantal verskaffers. Dit het my ook verplig om 'n trim te implementeer() method on the array because I hate the idea of returning back 100’s of null vendors. Path beteken nie omgee nie, maar dit neul by my. (Weer, Dit was makliker as om te baklei Path oor ArrayLists).
  • Ek 1 GetSpecificVendorByName geïmplementeer() funksie sowel, wat kan leersaam wees.

Die kode:

die gebruik van Stelsel;
die gebruik van System.Web;
die gebruik van System.Web.Services;
die gebruik van System.Web.Services.Protocols;
die gebruik van Microsoft.SharePoint;
die gebruik van System.Configuration;

/// <opsomming>
///
Vendor Service: Provides vendor related services which today are consumed by an infopath client form.
///
/// History:
/// ——–
/// 07/24/07: Initial coding, Paul J. Gavin of Conchango.
///
/// </opsomming>
[WebService(Namespace = "Http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
openbare klas VendorService : System.Web.Services.WebService
{

/// <opsomming>
/// Represents a vendor from a custom sharepoint list maintained by MSUSA.
/// </opsomming>
openbare klas Vendor
{
openbare Vendor() { }

openbare Vendor(SPItem initItem)
{
indien (! (initItem["Vendor Name"] == nul)) VendorName = initItem["Vendor Name"].ToString();
indien (! (initItem["Address 1"] == nul)) VendorAddress1 = initItem["Address 1"].ToString();
indien (! (initItem["Address 2"] == nul)) VendorAddress2 = initItem["Address 2"].ToString();
indien (! (initItem["Stad"] == nul)) VendorCity = initItem["Stad"].ToString();
indien (! (initItem["VendorPhone"] == nul)) VendorPhone = initItem["VendorPhone"].ToString();
indien (! (initItem["PurchaseType"] == nul)) VendorType = initItem["PurchaseType"].ToString();
indien (! (initItem["Staat"] == nul)) VendorState = initItem["Staat"].ToString();
indien (! (initItem["Zip"] == nul)) VendorZip = initItem["Zip"].ToString();
indien (!(initItem["Faks"] == nul)) VendorFax = initItem["Faks"].ToString();
indien (!(initItem["SalesRepName"] == nul)) VendorSalesRepName = initItem["SalesRepName"].ToString();

VendorItemId = initItem.ID; // Unique ID maintained via MOSS.
}

openbare int VendorItemId;
openbare string VendorName;
openbare string VendorAddress1;
openbare string VendorAddress2;
openbare string VendorCity;
openbare string VendorState;
openbare string VendorZip;
openbare string VendorPhone;
openbare string VendorType;
openbare string VendorSalesRepName;
openbare string VendorFax;
}

openbare VendorService () {

//Uncomment the following line if using designed components
//InitializeComponent();
}

private Vendor[] GenerateTestVendors()
{
Vendor[] resultList;
resultList = nuwe Vendor[100];

Vendor v;
v = nuwe Vendor();
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 = nuwe Vendor();

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 = nuwe Vendor();
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;

terugkeer resultList;

}

[WebMethod]
openbare Vendor GetSpecificVendorById(int vendorId)
{
string SpVendorSiteName; // Name of the actual MOSS site that hosts the vendor custom list.
string SpVendorListName; // Name of the actual MOSS list containing vendors.

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

die gebruik van (SPSite site = nuwe SPSite(SpVendorSiteName))
{

die gebruik van (SPWeb web = site.OpenWeb())
{

SPList currentList = web.Lists[SpVendorListName];

SPItem specificItem = currentList.Items[vendorId];

terugkeer nuwe Vendor('n 'specificItem);

} // using spweb web = site.openweb()
} // using spsite site = new spsite("Http://localhost / Mizuho ")

}

[WebMethod]
// Assumes that the vendor name is unique, from a business perspective
openbare Vendor GetSpecificVendorByVendorName(string Vendor)
{
string SpVendorSiteName; // Name of the actual MOSS site that hosts the vendor custom list.
string SpVendorListName; // Name of the actual MOSS list containing vendors.

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

die gebruik van (SPSite site = nuwe SPSite(SpVendorSiteName))
{
die gebruik van (SPWeb web = site.OpenWeb())
{

SPList currentList = web.Lists[SpVendorListName];

foreach (SPItem vendorItem in currentList.Items)
{
indien (vendorItem["Vendor Name"] == nul) voortgaan;

indien (vendorItem["Vendor Name"].ToString().Equals(Vendor))
terugkeer nuwe Vendor(vendorItem);
}

Vendor v = nuwe Vendor();
v.VendorPhone = "not found: " + Vendor;

terugkeer v;

terugkeer nul;

} // using spweb web = site.openweb()
} // using spsite site = new spsite("Http://localhost / Mizuho ")

} // metode

[WebMethod]
openbare Vendor[] GetVendorsOfType (string filterType)
{

string SpVendorSiteName; // Name of the actual MOSS site that hosts t
he vendor custom list.
string SpVendorListName; // Name of the actual MOSS list containing vendors.

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

Vendor[] resultList;
int vendorIndex = 0;
resultList = nuwe Vendor[1000];

// Initialize the list with a default friendly message.
Vendor v = nuwe Vendor();
v.VendorName = "Select a vendor type to populate this list.";
resultList[0] = v;

// Convert the filter to lower case for easier string comparison later.
filterType = filterType.ToLower();

// If the filter type passed is "test", generate some simple data.
#streek Filter type = "test"
indien (filterType.Equals("Toets"))
terugkeer GenerateTestVendors();
#endregion

indien (waar)
{
die gebruik van (SPSite site = nuwe SPSite(SpVendorSiteName))
{
die gebruik van (SPWeb web = site.OpenWeb())
{

v = nul;

SPList currentList = web.Lists[SpVendorListName];

// Iterate through all the items in the vendor list.
foreach (SPItem vendorItem in currentList.Items)
{

string lowerVendorType;

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

indien (lowerVendorType.Equals(filterType))
{
resultList[vendorIndex ] = nuwe Vendor(vendorItem);
}
} // iterating thru all the vendors in the list


terugkeer TrimVendorArray(vendorIndex, resultList);
// return resultList;

} // using spweb web = site.openweb()
} // using spsite site = new spsite("Http://localhost / Mizuho ")

} // if true

terugkeer nul;
}

private Vendor[] TrimVendorArray(int newsize, Vendor[] originalVendorArray)
{
Vendor[] trimmedArray;

indien (newsize == 0) newsize = 1;
trimmedArray = nuwe Vendor[newsize];

int currentCounter = 0;

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

terugkeer trimmedArray;

}
}

MOSS: Waarnemings op Path debugging

Path vorm bediener fout boodskappe is misleidend.

Tydens die ontwikkeling van 'n Path vorm, Ek sal dit pos aan MOSS bediener en toegang tot die vorm. Die vorm sal begin om te laai en dan genereer 'n misleidende fout boodskap wys my na die vensters event log vir besonderhede. In werklikheid, geen boodskap is geskryf om die Windows event log. Eerder, die boodskap is gestuur na die mos ascii diagnostiese log. Jy kan dop wat af via sentrale Dienste Administrasie.

Jy moet vinnig op jou voete. MOSS daarvan hou om te skryf aan die log lêer, gereeld en verbosely. This can be trimmed but the default log writing behavior is "everything as quickly as possible".

MOSS: Opdatering van 'n persoonlike lys

Daar is baie goeie voorbeelde van die opdatering van persoonlike lyste via die SDK. Hier is nog 'n.

Besigheid probleem: Path vorm ontwerp wat gebruikers in staat stel aanlyn aankooprekwisisies te betree. PO rekwisisienommers moet tradisionele volgorde gebaseerde heelgetalwaardes en bereken outomaties.

Business Solution: Skep 'n persoonlike MOSS lys met twee kolomme: "ControlField" and "ControlValue". Die waarde kolom bevat die volgende aankoop rekwisisienommer. Note that the generic "control" naamkonvensie maak voorsiening vir die toekoms beheer velde wat gebruik kan word as dit nodig is.

Tegniese oplossing: Skep 'n web diens verkry word deur die Path kliënt. Die web diens terug terug die volgende aankooprekwisisie nommer en updates die waarde van die lys.

Lesse wat geleer:

  • Wanneer jy hierdie web diens as 'n data bron aan die Path vorm, Ek het gevind dat dit nodig is om dit te omskep in 'n UDC en stoor dit in 'n data verband biblioteek.
  • Ek het ook gevind dat dit nodig is om kruis domein script via sentrale Dienste Administrasie // aansoek bestuur // vorm bediener verstellings.
  • Die eerste keer wat die vorm het probeer om die web om toegang te verkry, dit neem 'n rukkie en op die geleentheid, sou dit 'n afsnytyd. Ek vroetel met instellings in vorm bediener verstellings die time-out instellings uit te brei en in die oë te help.

Die kode:

die gebruik van Stelsel;
die gebruik van System.Web;
die gebruik van System.Web.Services;
die gebruik van System.Web.Services.Protocols;
die gebruik van Microsoft.SharePoint;
die gebruik van System.Configuration;

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

//Uncomment the following line if using designed components
//InitializeComponent();
}

/// <opsomming>
/// Obtain the next PO number from the sharepoint po number control list.
/// Increment the PO number in that list.
/// </opsomming>
/// <opbrengste></opbrengste>
[WebMethod]
openbare string GetNextPoNumber()
{
string SpPoControlSiteName; // Name of the actual MOSS site that hosts the PO Control list.
string SpPoControlListName; // Name of the actual MOSS list containing the Po control.

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

string nextPoReqNumber = "Xyzzy";

die gebruik van (SPSite site = nuwe SPSite(SpPoControlSiteName))
{
die gebruik van (SPWeb web = site.OpenWeb())
{

SPList currentList = web.Lists[SpPoControlListName];

foreach (SPItem controlItem in currentList.Items)
{

indien (((string)controlItem["ControlField"]).Equals("NextPoNumber"))
{
nextPoReqNumber = (string)controlItem["ControlValue"];

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

int_nextPoReqNumber ;

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

} // Locating, reading and updating the PO number in the list.


} // using spweb web = site.openweb()
} // using spsite site = new spsite("Http://localhost / Mizuho ")

terugkeer nextPoReqNumber;

}
}