2009-07-14 15 views
1

私は、Access 2003 VBAを使用してBOMを作成するための再帰データを処理しています。メインテーブルに静的スコープを持たせるためのクラスモジュールを作成しました。これは再帰を単純化するようです - BOMをトラバースするとレベルが下がったり上がったりすることがなくなります。私は重複して同じレコードセットを開いているわけではありません。私は代わりに多くをフィルタリングしています。クラスインスタンスの適切な使用

これを実行した後、私はObject-Relation Modelingについて読んで、レコードセットではなくレコードをインスタンス化することに決めました。そのレコードのフィールドはプロパティになります。たくさんの仕事と多くの間違いがあったのですが、私はこのアプローチには利点がないことを認識しました。なぜなら、Accessはテーブルベースだからです。

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

これらのいずれかを選択する理由はありますか?また、最後にイタリック体があることに注意してください。私がそれを必要としないなら(私は親についてもっと情報を必要としないので)、それは答えを変えますか?誰でも私の考えを全般的に手助けすることはできますか?

(私はレコードセットを閉じますが、クラスインスタンスは閉じないことに注意してください。私の理解は、VBAインスタンスが閉じて、それを許可するということです。透明性があり、それが動作を期待しています。)

 
    VERSION 1 
    Property Sub ReviewPart (Parent_Part_ID) 

    Get Parent_Part_ID 
    Create instance of Class --> Get recordset 
    Filter Class recordset (Parent_Part_ID) 
    Exploit Class recordset 
    See if Parent_Part_ID has Childs 
    If it does: 
     Open recordset of Childs 
     For each Child 
     Get Child_Part_ID 
     Create instance of Class --> Get recordset 
     Filter Class recordset (Child_Part_ID) 
     Exploit Class recordset 
     See if Child_Part_ID has Childs 
     If it does: 
      Instance New ReviewPart (Child_Part_ID) 
     Otherwise: 
     Nothing; Move On 
     Next Child 
     Close recordset of Childs 
    Otherwise: 
     Move On 
    Exploit Class recordset (still points to parent) 

         
 
VERSION 2 Property Sub ReviewPart (Parent_Part_ID) Get Parent_Part_ID Create instance of Class --> Get recordset Filter Class recordset (Parent_Part_ID) Exploit Class recordset See if Parent_Part_ID has Childs If it does: Open recordset of Childs For each Child Get Child_Part_ID Create instance of Class --> Get recordset Filter Class recordset (Child_Part_ID) Exploit Class recordset See if Child_Part_ID has Childs If it does: Instance New ReviewPart (Child_Part_ID) Otherwise: Nothing; Move On Next Child Close recordset of Childs Otherwise: Move On Filter Class recordset (Parent_Part_ID) Exploit Class recordset (still points to parent)
+0

回答に感謝します(7/19現在)。しかし、私の無知はまだ改善されていません。私は「受け入れる」ボタンを押しています。私はその質問にどうやって質問するかについて、より多くのことを学ぶことを希望します。 – Smandoli

+0

Google Groupsに「BOMクラスモジュールグループ:*アクセス*」を問い合わせるときに得られるスレッドをいくつか調べましたか?このトピックはアクセスグループの多年草ですが、必ずしもクラスモジュールに取り組まれているわけではありません(ただし、そうすべきです)。 –

答えて

1

1は、単にあなたが興味を持っていると簡単に関連付けるレコードにルートレコードに始めることができるよう、前者は、あなたのプログラマの観点から、使用の優れた使いやすさを与えているようです開始したレコードのプロパティにアクセスするだけです。

一方、後者は、現在のレコードに関連する可能性があるすべてのレコードを悲観的にロードしていないので、より効率的であるように見えます。

使いやすさを維持しながら、第2の効率に近づく助けるかもしれない最初のアプローチへの潜在的な最適化のカップル:それらが必要だとして

  • は唯一の子レコードをロードします。 Get/Setアクセサを使用すると、親レコードがDBから取得されたときにすべてではなく、ただちに読み込むことができます。
  • 代わりに、JOINを使用して、単一のクエリの一部として一度にすべての子データを取得します。これにより、すべてのデータが事前にロードされますが、実質的に取得するために実行する必要があるクエリの数が減ります。

希望はそれです。

+0

"必要に応じて子レコードをロードするだけです。Get/Setアクセサーを使用すると、ジャストインタイムでロードすることができます...これはORMになります。そのようなアプローチを手配しますが、テーブル指向であるため利点がありません。私の試みは、私がRGORMと呼んだRube Goldberg ORMの結果となりました。あなたの洞察? ....... "JOINを使用してすべての子データを一度に取得する" - はい、これはRGORMの解体のもう1つのステップです。この問題を解決するのを待っているのはすべてです。 – Smandoli

1

msdatashapeプロバイダとSHAPE構文を使用してhierarchical ADO recordsetsを生成すると考えましたか?

+0

いいえ私はしていません。リンクありがとうございました。私はすぐにこれを評価することはできませんが、私は、技術者がコメントや投票でチャイムできることを知っている他の人に願っています。 – Smandoli