1

Access 2003 VBA を使用して、製造 BOM の再帰データを処理しています。メイン テーブルに静的スコープを持たせるクラス モジュールを作成しました。これにより、再帰が単純化されているように思えます。これにより、BOM をトラバースするときにレベルをカウントダウンしたりカウントアップしたりする必要がなくなります。同じレコードセットを重複して開いているわけではありません。代わりにたくさんフィルタリングしています。

これを開始した後、オブジェクト リレーション モデリングについて読み、レコードセットではなくレコードをインスタンス化することにしました。次に、そのレコードのフィールドをプロパティにすることができます。多くの作業と多くの勝利のスリルを味わった後、Access はテーブルベースであるため、このアプローチには利点がないことに気付きました。

私のクラスモジュールは以前と同じように役立ちます。私の質問は、以下の 2 つの代替バージョンについてです。最初のものは 2 つのインスタンス (親、子) を使用します。2 つ目は 1 つを使用し、それを再利用します。明らかに、最初のものは ORM の影響を受けています。

これらのいずれかを選択する理由はありますか? また、最後のイタリック体の行に注意してください。それが必要ない場合 (親に関するこれ以上の情報は必要ないため)、答えは変わりますか? 一般的に私の考えを手伝ってくれる人はいますか?

(私はレコードセットを閉じますが、クラス インスタンスは閉じないことに注意してください。私の理解では、VBA インスタンスはそれ自体を閉じており、それを許可することは受け入れられている慣行です。私は疑似コードを新しいレベルの疑似レベルに引き上げたようです...目標は明快さです。できます。)

    バージョン 1
    プロパティ サブ ReviewPart ( Parent_Part_ID )

    Parent_Part_ID を取得
    クラスのインスタンスを作成 --> レコードセットを取得
    フィルター クラス レコードセット ( Parent_Part_ID )
    エクスプロイトクラスのレコードセット
    Parent_Part_ID に子があるかどうかを確認する
    そうであれば:
       Childs のレコードセットを開く
       お子様ごとに
         Child_Part_ID を取得
         クラスのインスタンスを作成 --> レコードセットを取得
         フィルター クラス レコードセット ( Child_Part_ID )
         エクスプロイトクラスのレコードセット
         Child_Part_ID に子があるかどうかを確認する
         そうであれば:  
           インスタンスの新しい ReviewPart ( Child_Part_ID )
         さもないと:
         何もない; 進め
       次の子
       Childs のレコードセットを閉じる
    さもないと:
       進め
    Exploit Class レコードセット (依然として親を指している)
 
バージョン 2 プロパティ サブ ReviewPart ( Parent_Part_ID ) Parent_Part_ID を取得 クラスのインスタンスを作成 --> レコードセットを取得 フィルター クラス レコードセット ( Parent_Part_ID ) エクスプロイトクラスのレコードセット Parent_Part_ID に子があるかどうかを確認する そうであれば: Childs のレコードセットを開く お子様ごとに Child_Part_ID を取得 クラスのインスタンスを作成 --> レコードセットを取得 フィルター クラス レコードセット ( Child_Part_ID ) エクスプロイトクラスのレコードセット Child_Part_ID に子があるかどうかを確認する そうであれば: インスタンスの新しい ReviewPart ( Child_Part_ID ) さもないと: 何もない; 進め 次の子 Childs のレコードセットを閉じる さもないと: 進め フィルタ クラス レコードセット ( Parent_Part_ID ) エクスプロイト クラス レコードセット (依然として親を指している)
4

2 に答える 2

1

msdatashape プロバイダーと SHAPE 構文を使用して、階層的な ADO レコードセットを生成することを検討しましたか?

于 2009-08-10T11:20:16.050 に答える