MOSS / InfoPath フォームのサーバー (InfoPath 2007) ドロップ ダウン リストのパフォーマンス

追加カテゴリ: InfoPath

概要: InfoPath 2007 MOSS のカスタム リストに関連付けられたベンダーのドロップ ダウン リストを提供するフォーム MOSS サーバーに展開するには. 仕入先を選択します。, ルールは、一握りのセールス担当者名などのテキスト フィールドにフィールドの値を割り当てる, アドレス, 都市, 状態, 郵便番号と電話. パフォーマンスは恐ろしいです。. 我々 のパフォーマンスが悪化に気づく (非直線に) それぞれの追加フィールドにこのようにを更新します。. すなわち, 私達はちょうど場合営業担当者名を更新します。, かかる [x] 時間の量. もし我々 は営業担当者を更新, 住所 1, 住所 2, 都市, 状態, zip, かかる 10 長い時間.

ソリューション: Web サービスを作成します。 (サンプル コードを見つけることができます。 ここで) 仕入先の名前、渡され、バック ベンダーの詳細が返されます. [, この方法をフィールドに割り当てる. これはあまりにも思えるが低下します。, 差はなかった discernable のパフォーマンスで我々 が割り当てられたとき 1 対フィールド 8 フィールド. 追加ボーナスとして, ユーザーは、クールな"サーバーに接続を取得します。" サイロン 効果を呼び出すし、サービスの結果を処理するフォームを待っている間.

MOSS: 例外が発生しました. (HRESULT からの例外: 0x 80020009 (DISP_E_EXCEPTION))

更新プログラム: 我々 は再びこの問題とそれは決して表面の根本原因を決定.

我々 開発サイトの実装時に、突然の通知します。, 2 人のユーザーがサイト コレクションにアクセスすることはありません。. それらのアカウントのメインのサイトに認証することができます。, しかし、特定のサイト コレクションにアクセスしようとするとき, 彼らは、空白のスクリーンをちょうど得る. エラー表示なし, ちょうど白い空白のページ.

我々 は、サイト コレクションの管理者としてログインし、それらのユーザーの 1 つは、サイト管理者とこの時間として追加しようとしました。, 「OK」を押す時に, このメッセージを取得します。:

例外が発生しました. (HRESULT からの例外: 0x 80020009 (DISP_E_EXCEPTION))

これを研究に時間を費やして、残念ながら, 何の役に立つが来なかった. 診断ログにいくつかのメッセージがあった。, しかし、正確にこの問題に相関するは難しかった.

最後に, サイト コレクションを削除して、それとは、再作成されますそれを解決.

私は把握する場合この将来の原因は何, 私はこのポストが更新されます。.

MOSS: カスタム リストを反復処理して、InfoPath にフィルター選択されたデータを返す

ビジネス シナリオ:

正確な購買依頼をすばやく入力することができますメソッドを提供します。.

ビジネス上の問題:

クライアントはいくつかの百のベンダーとビジネスを行います.

ベンダーは"の種類" 特定. つまり、コンピューター機器をベンダーに販売 (例えば. 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;

}
}

MOSS: InfoPath のデバッグに関する観察

InfoPath フォームのサーバー エラー メッセージは誤解を招く.

InfoPath フォームの開発中に, MOSS サーバーにポストし、フォームにアクセスします. フォームのロードを詳細については、windows イベント ログに私を指して誤解を招くエラー メッセージを生成する開始は. 実際, メッセージが windows イベント ログに書き込まれません. むしろ, モス ascii 診断ログにメッセージが送信されました. セントラル サービスの管理機能を通じてを追跡できます。.

あなたの足に迅速にする必要があります。. MOSS のログ ファイルへの書き込みが好きです。, くどくどと頻繁に. これをトリミングすることができますが、デフォルトのログに書き込み動作が"すべてできるだけ早く".

MOSS: カスタム リストを更新

カスタム リスト、SDK を更新するには、多くの良い例です。. ここではもう.

ビジネス上の問題: InfoPath フォーム在庫要求をオンラインの入力を可能に購入しています. PO 番号伝統的なシーケンスする必要があります要求整数値に基づいて、自動的に計算.

ビジネス ソリューション: 2 つの列を含む、カスタムの MOSS リストを作成します。: "ControlField" 「調整」. [値] 列に、次の購入注文番号が含まれています. 一般的な"制御することに注意してください。" 必要に応じて使用することがあります将来のコントロール フィールドの名前付け規則を提供します.

技術ソリューション: InfoPath クライアントによってアクセスされる web サービスを作成します。. Web サービスの次の購入注文番号を返すし、リストの値を更新.

学んだ教訓:

  • InfoPath フォームにデータ ソースとしてこの web サービスを追加するとき, Udc を変換し、データ接続ライブラリに格納する必要があると見つけた.
  • 私はまたそれ経由中央サービス管理でクロス ドメイン スクリプティングを有効にする必要があります。 // アプリケーション構成の管理 // フォーム サーバーの構成.
  • 初めてフォーム web サービスにアクセスしようとしました。, しばらく時間がかかり、機会に, それは時間を. タイムアウト設定を展開しますフォーム サーバー構成では設定をいじって、それに役立つように見えた.

コード:

使用してください。 システム;
使用してください。 System.Web;
使用してください。 System.Web.Services;
使用してください。 System.Web.Services.Protocols;
使用してください。 Microsoft.SharePoint;
使用してください。 System.Configuration;

[Web サービス(Namespace = "http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
パブリック クラス PoService : System.Web.Services.Web サービス
{
パブリック PoService () {

//デザインされたコンポーネントを使用している場合、次の行のコメントを解除します。
//InitializeComponent();
}

/// <概要>
/// Sharepoint po 番号コントロール リストから次の PO 番号を取得します。.
/// そのリスト内の PO 番号をインクリメントします。.
/// </概要>
/// <返します></返します>
[WebMethod]
パブリック 文字列 GetNextPoNumber()
{
文字列 SpPoControlSiteName; // PO 制御リストをホストする実際の MOSS サイトの名前.
文字列 SpPoControlListName; // Po コントロールを含む実際の MOSS リストの名前.

SpPoControlSiteName = フレーム.AppSettings["PoControlListHostingSite"].ToString();
SpPoControlListName = フレーム.AppSettings["PoControlList"].ToString();

文字列 nextPoReqNumber = "xyzzy";

使用してください。 (SPSite サイト = 新機能 SPSite(SpPoControlSiteName))
{
使用してください。 (SPWeb web サイトを =。OpenWeb())
{

SPList 現時点 web を =。リスト[SpPoControlListName];

foreach (SPItem controlItem currentList.Items)
{

場合 (((文字列)controlItem["ControlField"]).等しい("NextPoNumber"))
{
nextPoReqNumber = (文字列)controlItem[「調整"];

int int_nextPoReqNumber;
int_nextPoReqNumber = 変換.ToInt32(nextPoReqNumber);

int_nextPoReqNumber ;

controlItem[「調整"] = int_nextPoReqNumber;
controlItem.Update();
}

} // 検索, 読み取りと一覧内の PO 番号を更新.


} // spweb の web を使用して site.openweb を =()
} // spsite のサイトを使用して新しい spsite を =("http://localhost/みずほ」)

戻り値 nextPoReqNumber;

}
}