ビジネス シナリオ:
正確な購買依頼をすばやく入力することができますメソッドを提供します。.
ビジネス上の問題:
クライアントはいくつかの百のベンダーとビジネスを行います.
ベンダーは"の種類" 特定. つまり、コンピューター機器をベンダーに販売 (例えば. Dell) またはオフィス用品 (例えば. ステープルズ).
私たち購入依頼選択有効な仕入先を作成するエンドユーザーを有効にする方法?
ビジネス ソリューション:
「タイプ」を介してシステムのベンダーを区別します。.
"タイプを選択するユーザーを有効にします。" 製品の適切なベンダーのフィルター処理されたセットを提供します。.
技術ソリューション:
InfoPath フォームは、オンラインを入力することができます購買依頼に設計されています.
2 つの InfoPath 選択リスト コントロール ベンダーの選定. 最初, ユーザーが「購入タイプ」を選択します。. これは制限のような購入を販売するベンダーのみを格納する 2 番目の選択リスト. これは古典的なカスケード ドロップダウンです。.
ベンダーは、ベンダーなどの属性の名前のカスタム列と MOSS のカスタム リストに格納されています。, アドレスおよび特に「種類」.
カスタムのベンダー リストを反復処理して、InfoPath クライアントを消費するための web サービスを実装します。, 指定の「タイプ」と一致するベンダーのみを返す.
InfoPath フォームから web サービスを呼び出す.
学んだ教訓:
- 最初, このルートに行くが必要です。. InfoPath 内で完全にフィルタ リングを行うし、web サービス機能をここで作成する希望があります。. ただし, フォーム サーバーが必要なフィルタ リング機能を提供しません. 上にルールを置くことができます、"の種類" 選択形式のリストで、並べ替えの再クエリを開く、ベンダー, 我々 は正しく働くためにそれを得ることができません。. したがって, web サービスを実装する必要があります。.
- これは、古典的な"カスケード選択リストです。" 問題は、InfoPath でフォーム サーバー世界とそこには、この問題を解決する方法を説明する多くの良い例があります。.
- ベンダー リスト内の列の空白の値がこのような参照する場合は、空の文字列を返さない: initItem[「ベンダー名"]. 代わりに, null を返します.
いくつかの他のノート:
- 配列を返す[] ベンダーの ArrayList を返すいくつかの困難を持っていたので. InfoPath はそれについて不平を言っていたし、私は、時間またはそれ以上の戦いへの傾斜を持っていなかった. これは、, もちろんです, ベンダーの総数に人工の限界を置く. それも私せざるを得ない、トリムを実装() 配列のメソッドを返すのアイデアを嫌いだからバックアップ 100 null ベンダーの. InfoPath は気にしません。, しかし、私に nagged. (もう一度, これは Arraylist に比べて InfoPath に戦ってより簡単だった).
- GetSpecificVendorByName を実装() 同様の関数, 有益であるかもしれない.
コード:
使用してください。 システム;
使用してください。 System.Web;
使用してください。 System.Web.Services;
使用してください。 System.Web.Services.Protocols;
使用してください。 Microsoft.SharePoint;
使用してください。 System.Configuration;
/// <概要>
/// ベンダー サービス: 関連ベンダーが、今日はフォーム クライアントによって消費されるサービスを提供します。.
///
/// 歴史:
/// ——–
/// 07/24/07: 初期のコーディング, Paul J. Conchango のギャビン.
///
/// </概要>
[Web サービス(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
パブリック クラス VendorService : System.Web.Services.Web サービス
{
/// <概要>
/// MSUSA によって保持されるカスタム sharepoint リストからベンダーを表します.
/// </概要>
パブリック クラス ベンダー
{
パブリック ベンダー() { }
パブリック ベンダー(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["Fax"] == null)) VendorFax = initItem["Fax"].ToString();
場合 (!(initItem["SalesRepName"] == null)) VendorSalesRepName = initItem["SalesRepName"].ToString();
VendorItemId = initItem.ID; // MOSS を使用して管理の一意の ID.
}
パブリック int VendorItemId;
パブリック 文字列 VendorName;
パブリック 文字列 VendorAddress1;
パブリック 文字列 VendorAddress2;
パブリック 文字列 VendorCity;
パブリック 文字列 VendorState;
パブリック 文字列 VendorZip;
パブリック 文字列 VendorPhone;
パブリック 文字列 VendorType;
パブリック 文字列 VendorSalesRepName;
パブリック 文字列 VendorFax;
}
パブリック VendorService () {
//デザインされたコンポーネントを使用している場合、次の行のコメントを解除します。
//InitializeComponent();
}
プライベート ベンダー[] GenerateTestVendors()
{
ベンダー[] resultList;
resultList = 新機能 ベンダー[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";
resultList[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";
resultList[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";
resultList[2] = v;
戻り値 resultList;
}
[WebMethod]
パブリック ベンダー GetSpecificVendorById(int vendorId)
{
文字列 SpVendorSiteName; // ベンダーのカスタム リストをホストする実際の MOSS サイトの名前.
文字列 SpVendorListName; // ベンダーを含む実際の MOSS リストの名前.
SpVendorSiteName = フレーム.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = フレーム.AppSettings["VendorList"].ToString();
使用してください。 (SPSite サイト = 新機能 SPSite(SpVendorSiteName))
{
使用してください。 (SPWeb web サイトを =。OpenWeb())
{
SPList 現時点 web を =。リスト[SpVendorListName];
SPItem 分野 = currentList.Items[vendorId];
戻り値 新機能 ベンダー(品目);
} // spweb の web を使用して site.openweb を =()
} // spsite のサイトを使用して新しい spsite を =("http://localhost/みずほ」)
}
[WebMethod]
// ベンダー名が一意であると仮定します。, ビジネスの観点から
パブリック ベンダー GetSpecificVendorByVendorName(文字列 する)
{
文字列 SpVendorSiteName; // ベンダーのカスタム リストをホストする実際の MOSS サイトの名前.
文字列 SpVendorListName; // ベンダーを含む実際の MOSS リストの名前.
SpVendorSiteName = フレーム.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = フレーム.AppSettings["VendorList"].ToString();
使用してください。 (SPSite サイト = 新機能 SPSite(SpVendorSiteName))
{
使用してください。 (SPWeb web サイトを =。OpenWeb())
{
SPList 現時点 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 をホストする実際の MOSS サイトの名前
彼のベンダーのカスタム リスト.
文字列 SpVendorListName; // ベンダーを含む実際の MOSS リストの名前.
SpVendorSiteName = フレーム.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = フレーム.AppSettings["VendorList"].ToString();
ベンダー[] resultList;
int vendorIndex = 0;
resultList = 新機能 ベンダー[1000];
// 既定のフレンドリーなメッセージでリストを初期化します。.
ベンダー v = 新機能 ベンダー();
v.VendorName = "このリストにベンダーの種類を選択します。";
resultList[0] = v;
// フィルターを簡単に文字列比較後小文字に変換します。.
filterType = filterType.ToLower();
// フィルターの種類が渡された場合は「テスト」, いくつかの単純なデータを生成します。.
#地域 フィルターの種類 ="テスト"
場合 (Equals filterType。("テスト"))
戻り値 GenerateTestVendors();
#endregion
場合 (true)
{
使用してください。 (SPSite サイト = 新機能 SPSite(SpVendorSiteName))
{
使用してください。 (SPWeb web サイトを =。OpenWeb())
{
v = null;
SPList 現時点 web を =。リスト[SpVendorListName];
// 仕入先一覧のすべての項目を反復処理します。.
foreach (SPItem vendorItem で currentList.Items)
{
文字列 lowerVendorType;
lowerVendorType = vendorItem["PurchaseType"].ToString().ToLower();
lowerVendorType = lowerVendorType.Substring(3);
場合 (Equals lowerVendorType。(filterType))
{
resultList[vendorIndex ] = 新機能 ベンダー(vendorItem);
}
} // リスト内のすべてのベンダーを通じて反復処理
戻り値 TrimVendorArray(vendorIndex, resultList);
// resultList を返す;
} // spweb の web を使用して site.openweb を =()
} // spsite のサイトを使用して新しい spsite を =("http://localhost/みずほ」)
} // true の場合
戻り値 null;
}
プライベート ベンダー[] TrimVendorArray(int newsize, ベンダー[] originalVendorArray)
{
ベンダー[] trimmedArray;
場合 (newsize = = 0) newsize = 1;
trimmedArray = 新機能 ベンダー[newsize];
int currentCounter = 0;
ため (currentCounter = 0; currentCounter < newsize; currentCounter )
{
trimmedArray[currentCounter] = originalVendorArray[currentCounter];
}
戻り値 trimmedArray;
}
}