• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:複数フィールドの 総当たりの、組み合わせを、得たい)

複数フィールドの総当たり組み合わせをデータベースで生成する方法

このQ&Aのポイント
  • データベースソフト上で、複数のフィールドについて総当たりの組み合わせを元に最終的なデータを生成する方法について教えてください。
  • SQLを使用せずに総当たりを実現する方法はありますか?具体的には、ACCESSやlibrabaseといったデータベースソフトを使用し、任意の体積になる組み合わせを精査したいです。
  • フィールドを総当たりする方法が分からないので、解説をお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

質問の意図をはきちがえていなければ、ですが。 なかなかレスがつかないようですが。 ただ単に総当りの組合せをつくりだすならば、 それほど難しいことではないと思うのですが。 一応、Accessでつくってみます。当然、他の 言語でもテキストファイルのデータをテキスト ファイルへの書き出しはできると思います。 ただし、いずれの言語を利用するにもデータを 行ったり来たりする細かな気配りがほんの少し 必要となりますが。 以下のような同じ構造同じデータを持つテーブルを 二つ用意します。つまり一方はコピーです。 それぞれ、テーブル名を 「TBL行位置」、「TBL行位置」 とします。テーブル名には何の意味もありません。 ID・・・数値型 名称・・テキスト型 ID    名称 1    名古屋 2    大阪 3    京都 4    神戸 5    福岡 この二つのテーブルを元に以下のような、 データをつくります。そのデータを収める テーブル名を「TBL組合せ」とします。 No・・・数値型 相手1・・テキスト型 相手2・・テキスト型 No   相手1  相手2 1   名古屋  大阪 2   名古屋  京都 3   名古屋  神戸 4   名古屋  福岡 5   大阪   京都 6   大阪   神戸 7   大阪   福岡 8   京都   神戸 9   京都   福岡 10   神戸   福岡 以下のコードを標準モジュールに貼り付け 実行します。 なお、DAOを使用しているので、コード表で DAOのチェックを確認してください。    Microsoft DAO xx Object Library Sub test()   Dim db As DAO.Database   Dim rs1 As DAO.Recordset   Dim rs2 As DAO.Recordset   Dim rs3 As DAO.Recordset   Dim i As Long   Dim bk As Variant   Set db = CurrentDb   Set rs1 = db.OpenRecordset("TBL行位置")   Set rs2 = db.OpenRecordset("TBL列位置")   Set rs3 = db.OpenRecordset("TBL組合せ2", dbOpenDynaset)   i = 0   'テーブルの検索位置の初期化   rs1.MoveFirst   rs2.MoveFirst   'rs2のレコード位置情報をbkに格納   bk = rs2.Bookmark   Do Until rs1.EOF     'rs2のBookmarkプロパティにbkの値を格納     'rs2のレコードの位置をbkの値で移動     rs2.Bookmark = bk     Do Until rs2.EOF       '自分自身との組合せを除いて       If rs1!位置ID <> rs2!位置ID Then         i = i + 1         rs3.AddNew         rs3!No = i         rs3!相手1 = rs1!名称         rs3!相手2 = rs2!名称         rs3.Update       End If       rs2.MoveNext     Loop     rs1.MoveNext     'rs2のBookmarkプロパティにbkの値を格納     'レコードの位置を各レコードの検索開始位置に移動     rs2.Bookmark = bk     '各レコードの検索開始位置からレコードを一つ移動     rs2.MoveNext     '移動したレコードのBookmarkの値をbkに格納     'rs1のレコードを移動させたときに組合せ重複を     '避けるために検索の出発点のrs2のレコードの     '位置を設定するために利用     If Not rs2.EOF Then       bk = rs2.Bookmark     End If   Loop   rs1.Close: Set rs1 = Nothing   rs2.Close: Set rs2 = Nothing   rs3.Close: Set rs3 = Nothing End Sub 回答の不備、疑問などがあれば補足してください。

Nouble
質問者

お礼

有難うございます。 此は VBAで、しょうか? やはり、あの 何時もの クエリーの インターフェースの、範囲 だけでは、叶わず プログラミングが、必要 なのですね アクセスの、VBAは 余り 見た事が.無い の.ですが DAO.Recordset と.言う型の Classモジュールを、使用して 実現している と、言う認識で 有っていますか?

その他の回答 (2)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

No1,No2です。 テーブルを二つ用意するよりも、SQLでテーブルを メモリ上にもってもいいかもしれません。 たとえば、提示したコードで、 Dim db As DAO.Database Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset Dim rs3 As DAO.Recordset Dim i As Long Dim bk As Variant Dim strSQL As String strSQL = "select * from TBL行位置" Set db = CurrentDb Set rs1 = db.OpenRecordset("TBL行位置") Set rs2 = db.OpenRecordset(strSQL) Set rs3 = db.OpenRecordset("TBL組合せ", dbOpenDynaset) のようにすれば、実テーブルは一つですみます。ただ、テーブルの データが膨大だとメモリを圧迫するかもしれません。データを格納する 「TBL組合せ」というテーブルは必要ですが。 補足について。 クエリはほぼ99%実データがないと何ともできません。 したがって、このようにデータを構築するならば、 VBA、VB、C言語などのプログラムが必要となります。 DAO.Recordsetというのは、DAOというミドルウエアに 属するRecordsetオブジェクトを使うのでDAOの提供する 各種の関数などを使いますよ、という宣言をしているような ものです。たとえば、C言語の #include <stdio.h> のような宣言と同じです。 したがって、 >DAO.Recordsetと.言う型のClassモジュールを、使用して >実現していると、言う認識で有っていますか? について、Classとしていいのかわかりませんが、DAOもモジュールの かたまりですから、そのような解釈でいいのでは、と思います。 実際に、総当りのプログラムがどこかに転がっているか WEBで調べてみましたが、まともなコードはありませんでした。 どの言語にしても中途半端なものでした。国内外ともにです。 なお、実際の運用はどのようにされるかわかりませんが、 総当りの組合せができるということは、各フィールドの データを比較するなり、データ同士を演算に使用して 値をだすなり、自由にできるということですから、 Accessの機能も捨てたものでもありません。その 大きなポイントが、Bookmarkというプロパティです。

Nouble
質問者

お礼

有難うございます。 実は、今 機械設計で、戯れている の、ですが どの様な、設計でも 変動させ得る パラメーターの、量は 通常、 多岐に、わたります。 其れこそ、 本気で、やれば 数ミリ毎に 厚さの、パラメーター変更を 手掛け 形状決定する 等も 考え、得ります 数式の、変形レベルでは 変化する 項の、数が 多すぎまして 結果 幾つかの、項に 関しては 定石だより、南無三、決め打ち、 と、なる 傾向に、ある 其の様に、感じます 其処で、 パラメーターと、結果の、 データベースを 作れた、場合 結果から 最も、思わしいものを 選べれば 意思決定が、楽になる 此の、様に 思った の、です さて、 そんな中 お話より とても 期待が、持てた 反面 此を 本格的に、すると データ量が、半端なさそう で、あり ワークステーションClassでも 足りるか、どうか 疑問が、もたげます ね まぁ、何はともあれ VBA の、下地は 私には、在るので テーブル等、 データベース特有の、もの達の 深層概念の、 理解を、して もう少し 戯れて、みようかな と、思います。 此からも お手を、煩わせる で、しょうが 宜しく お願い、致します。 p.s. 何処か、 データベース処理に、関して 抑えて、おくと 良い と、 お考えに、なられる ウエブページは 有りますで、しょうか?

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

すみません。NO1の回答で、 コードの中で、 Set rs3 = db.OpenRecordset("TBL組合せ2", dbOpenDynaset) となっていましたが、これを Set rs3 = db.OpenRecordset("TBL組合せ", dbOpenDynaset) としてください。テーブル名にいらない数字が末尾についていまして。 ほかには不具合はないと思いますが。

Nouble
質問者

お礼

お心遣い、 感謝します。

関連するQ&A