こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

複数フィールドの 総当たりの、組み合わせを、得たい

お世話になります。

データベースソフト上の、話し
ですが、

複数ある、フィールドの
各データに、ついて
総当たりの、組み合わせを
元に
演算に、より
最終的な、データを
生成し
データベースと、して
扱いたい
と、思います。

ですが
総当たり、させる
方法が、解りません。

検索では
SQLを、扱う
必要が、ある
とか

SQL等
言語を、使用せず
出来る、方法は
あるで、しょうか?

もし、無いなら
やり方の、解説を
賜りたく、思います。

どうぞ、ご指南
お願い、致します。


具体的には

例えばの、話
楕円立体の、体積を
得て
ACCESS、librabase、等の
データベースソフトで、
任意体積に、なる
組み合わせを、精査する
と、します。

此の、時
やはり
値群、各々
X、Y、Z、
に、ついて
各々に、フィールドを
生成した
と、します。

此の、際
結果は、クエリで
4/3*X*Y*Z
と、
した、上で
条件絞り込みで
= N        ※(N|Nは、任意値)
と、でも
すれば、良い
で、しょうが

が、此の
フィールドを、総当たりさせる
方法が、解らない
の、です。

宜しく
お願い、致します

投稿日時 - 2017-08-05 04:43:36

QNo.9359445

困ってます

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

質問の意図をはきちがえていなければ、ですが。

なかなかレスがつかないようですが。

ただ単に総当りの組合せをつくりだすならば、
それほど難しいことではないと思うのですが。
一応、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


回答の不備、疑問などがあれば補足してください。

投稿日時 - 2017-08-06 16:51:15

お礼

有難うございます。

此は
VBAで、しょうか?

やはり、あの
何時もの
クエリーの
インターフェースの、範囲
だけでは、叶わず
プログラミングが、必要
なのですね

アクセスの、VBAは
余り
見た事が.無い
の.ですが

DAO.Recordset
と.言う型の
Classモジュールを、使用して
実現している
と、言う認識で
有っていますか?

投稿日時 - 2017-08-06 17:56:52

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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というプロパティです。

投稿日時 - 2017-08-07 00:49:38

お礼

有難うございます。

実は、今
機械設計で、戯れている
の、ですが

どの様な、設計でも
変動させ得る
パラメーターの、量は
通常、
多岐に、わたります。

其れこそ、
本気で、やれば
数ミリ毎に
厚さの、パラメーター変更を
手掛け
形状決定する
等も
考え、得ります

数式の、変形レベルでは
変化する
項の、数が
多すぎまして

結果
幾つかの、項に
関しては
定石だより、南無三、決め打ち、
と、なる
傾向に、ある
其の様に、感じます

其処で、
パラメーターと、結果の、
データベースを
作れた、場合

結果から
最も、思わしいものを
選べれば
意思決定が、楽になる
此の、様に
思った
の、です

さて、
そんな中

お話より
とても
期待が、持てた
反面

此を
本格的に、すると
データ量が、半端なさそう
で、あり

ワークステーションClassでも
足りるか、どうか
疑問が、もたげます


まぁ、何はともあれ
VBA の、下地は
私には、在るので

テーブル等、
データベース特有の、もの達の
深層概念の、
理解を、して
もう少し
戯れて、みようかな
と、思います。

此からも
お手を、煩わせる
で、しょうが
宜しく
お願い、致します。

p.s.
何処か、
データベース処理に、関して
抑えて、おくと
良い
と、
お考えに、なられる
ウエブページは
有りますで、しょうか?

投稿日時 - 2017-08-07 06:42:40

ANo.2

すみません。NO1の回答で、
コードの中で、

Set rs3 = db.OpenRecordset("TBL組合せ2", dbOpenDynaset)

となっていましたが、これを

Set rs3 = db.OpenRecordset("TBL組合せ", dbOpenDynaset)

としてください。テーブル名にいらない数字が末尾についていまして。
ほかには不具合はないと思いますが。

投稿日時 - 2017-08-06 17:25:02

お礼

お心遣い、
感謝します。

投稿日時 - 2017-08-06 17:57:19

あなたにオススメの質問