|
▼小僧 さん:
ありがとうございます
大変遅くなりました
>当方もはっきりとした論拠がある訳ではありませんが、
>メモリ256MB のPC で不安定だったクエリが
>メモリを1Gに増設した所、安定した経験があります。
そうなんですか
未経験だったので勉強になります
ありがとうございました
>クエリ部分をワークテーブルに保存する様にし、
>Q03JOB仕リ を書き換えております。
>これで件数が安定する様でしたら
>計算させながらの結合の所に問題がありそうですね。
では
安定して動作することが出来ました
速度もそこそこ速いです・・・・が・・・・
ただ、下記よくわかりません
わかりにくいと思いますがよろしくお願い致します
頂いたコード実行すると
QD.SQL = strSQL '←でstop
実行時エラー '3131':
FROM 句の構文エラーです。
となってしまいました
そこでクエリに直接SQLを貼ってみましたが同じでした
---------------------------------------------
不具合SQLは(ご提示コードで作成されるクエリ)
SELECT WT02JOBリ.*
, WT01仕様.名称
WT01仕様_1.名称
, WT01仕様_2.名称
,WT01仕様_3.名称
, WT01仕様_4.名称
,WT01仕様_5.名称
, WT01仕様_6.名称
FROM (((((((((WT02JOBリ
LEFT JOIN LT部位
ON WT02JOBリ.部C = LT部位.部C)
LEFT JOIN LT名
ON (WT02JOBリ.区C = LT名.区C)
AND (WT02JOBリ.工種3C = LT名.工種3C)
AND (WT02JOBリ.工種2C = LT名.工種2C)
AND (WT02JOBリ.工種1C = LT名.工種1C))
LEFT JOIN LT単位
ON WT02JOBリ.単位C = LT単位.単位C)
LEFT JOIN WT01仕様
ON (WT02JOBリ.S1 = WT01仕様.tmp)
AND (WT02JOBリ.工種1C = WT01仕様.工種C))
LEFT JOIN WT01仕様 AS WT01仕様_1
ON (WT02JOBリ.S2 = WT01仕様_1.tmp)
AND (WT02JOBリ.工種1C = WT01仕様_1.工種C))
LEFT JOIN WT01仕様 AS WT01仕様_2
ON (WT02JOBリ.S3 = WT01仕様_2.tmp)
AND (WT02JOBリ.工種1C = WT01仕様_2.工種C))
LEFT JOIN WT01仕様 AS WT01仕様_3
ON (WT02JOBリ.S4 = WT01仕様_3.tmp)
AND (WT02JOBリ.工種1C = WT01仕様_3.工種C))
LEFT JOIN WT01仕様 AS WT01仕様_4
ON (WT02JOBリ.S5 = WT01仕様_4.tmp)
AND (WT02JOBリ.工種1C = WT01仕様_4.工種C))
LEFT JOIN WT01仕様 AS WT01仕様_5
ON (WT02JOBリ.S6 = WT01仕様_5.tmp)
AND (WT02JOBリ.工種1C = WT01仕様_5.工種C))
LEFT JOIN WT01仕様 AS WT01仕様_6
ON (WT02JOBリ.S7 = WT01仕様_6.tmp)
AND (WT02JOBリ.工種1C = WT01仕様_6.工種C);
---------------------------------------------
動いたSQLは
SELECT WT02JOBリ.*
, WT01仕様.名称
,WT01仕様_1.名称
, WT01仕様_2.名称
,WT01仕様_3.名称
, WT01仕様_4.名称
,WT01仕様_5.名称
, WT01仕様_6.名称
FROM (((((((((WT02JOBリ
LEFT JOIN LT部位
ON WT02JOBリ.部C = LT部位.部C)
LEFT JOIN LT名
ON (WT02JOBリ.区C = LT名.区C)
AND (WT02JOBリ.工種3C = LT名.工種3C)
AND (WT02JOBリ.工種2C = LT名.工種2C)
AND (WT02JOBリ.工種1C = LT名.工種1C))
LEFT JOIN LT単位
ON WT02JOBリ.単位C = LT単位.単位C)
LEFT JOIN WT01仕様
ON (WT02JOBリ.S1 = WT01仕様.tmp)
AND (WT02JOBリ.工種1C = WT01仕様.工種C))
LEFT JOIN WT01仕様 AS WT01仕様_1
ON (WT02JOBリ.S2 = WT01仕様_1.tmp)
AND (WT02JOBリ.工種1C = WT01仕様_1.工種C))
LEFT JOIN WT01仕様 AS WT01仕様_2
ON (WT02JOBリ.S3 = WT01仕様_2.tmp)
AND (WT02JOBリ.工種1C = WT01仕様_2.工種C))
LEFT JOIN WT01仕様 AS WT01仕様_3
ON (WT02JOBリ.S4 = WT01仕様_3.tmp)
AND (WT02JOBリ.工種1C = WT01仕様_3.工種C))
LEFT JOIN WT01仕様 AS WT01仕様_4
ON (WT02JOBリ.S5 = WT01仕様_4.tmp)
AND (WT02JOBリ.工種1C = WT01仕様_4.工種C))
LEFT JOIN WT01仕様 AS WT01仕様_5
ON (WT02JOBリ.S6 = WT01仕様_5.tmp)
AND (WT02JOBリ.工種1C = WT01仕様_5.工種C))
LEFT JOIN WT01仕様 AS WT01仕様_6
ON (WT02JOBリ.S7 = WT01仕様_6.tmp)
AND (WT02JOBリ.工種1C = WT01仕様_6.工種C);
違う場所は
18行目の
LEFT JOIN LT単位
の場所だけです
頂いたコードでは不具合から抜け出せず
下記のようにして
動くSQLを20:以下で直張りしたら動作確認できました
DB.Execute strSQL, dbFailOnError
GoTo 20:
strSQL = ""
strSQL = strSQL & " SELECT WT02JOBリ.*, WT01仕様.名称, "
strSQL = strSQL & " WT01仕様_1.名称, WT01仕様_2.名称, "
strSQL = strSQL & " WT01仕様_3.名称, WT01仕様_4.名称, "
strSQL = strSQL & " WT01仕様_5.名称, WT01仕様_6.名称 "
strSQL = strSQL & " FROM (((((((((WT02JOBリ "
strSQL = strSQL & " LEFT JOIN LT部位 ON WT02JOBリ.部C = LT部位.部C) "
strSQL = strSQL & " LEFT JOIN LT名 ON (WT02JOBリ.区C = LT名.区C) "
strSQL = strSQL & " AND (WT02JOBリ.工種3C = LT名.工種3C) "
strSQL = strSQL & " AND (WT02JOBリ.工種2C = LT名.工種2C) "
strSQL = strSQL & " AND (WT02JOBリ.工種1C = LT名.工種1C)) "
'strSQL = strSQL & " LEFT JOIN LT単位 "
'strSQL = strSQL & " LEFT JOIN LT単位"
'strSQL = strSQL & "LEFT JOIN LT単位"
strSQL = strSQL & " LEFT JOIN LT単位 "
strSQL = strSQL & " LEFT JOIN WT01仕様 "
strSQL = strSQL & " ON (WT02JOBリ.S1 = WT01仕様.tmp) "
strSQL = strSQL & " AND (WT02JOBリ.工種1C = WT01仕様.工種C)) "
strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_1 "
strSQL = strSQL & " ON (WT02JOBリ.S2 = WT01仕様_1.tmp) "
strSQL = strSQL & " AND (WT02JOBリ.工種1C = WT01仕様_1.工種C)) "
strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_2 "
strSQL = strSQL & " ON (WT02JOBリ.S3 = WT01仕様_2.tmp) "
strSQL = strSQL & " AND (WT02JOBリ.工種1C = WT01仕様_2.工種C)) "
strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_3 "
strSQL = strSQL & " ON (WT02JOBリ.S4 = WT01仕様_3.tmp) "
strSQL = strSQL & " AND (WT02JOBリ.工種1C = WT01仕様_3.工種C)) "
strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_4 "
strSQL = strSQL & " ON (WT02JOBリ.S5 = WT01仕様_4.tmp) "
strSQL = strSQL & " AND (WT02JOBリ.工種1C = WT01仕様_4.工種C)) "
strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_5 "
strSQL = strSQL & " ON (WT02JOBリ.S6 = WT01仕様_5.tmp) "
strSQL = strSQL & " AND (WT02JOBリ.工種1C = WT01仕様_5.工種C)) "
strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_6 "
strSQL = strSQL & " ON (WT02JOBリ.S7 = WT01仕様_6.tmp) "
strSQL = strSQL & " AND (WT02JOBリ.工種1C = WT01仕様_6.工種C);"
20:
strSQL = ""
strSQL = strSQL & " SELECT WT02JOBリ.* "
strSQL = strSQL & " , WT01仕様.名称 "
strSQL = strSQL & " ,WT01仕様_1.名称 "
strSQL = strSQL & " , WT01仕様_2.名称 "
strSQL = strSQL & " ,WT01仕様_3.名称 "
strSQL = strSQL & " , WT01仕様_4.名称 "
strSQL = strSQL & " ,WT01仕様_5.名称 "
strSQL = strSQL & " , WT01仕様_6.名称 "
strSQL = strSQL & " FROM (((((((((WT02JOBリ "
strSQL = strSQL & " LEFT JOIN LT部位 "
strSQL = strSQL & " ON WT02JOBリ.部C = LT部位.部C) "
strSQL = strSQL & " LEFT JOIN LT名 "
strSQL = strSQL & " ON (WT02JOBリ.区C = LT名.区C) "
strSQL = strSQL & " AND (WT02JOBリ.工種3C = LT名.工種3C) "
strSQL = strSQL & " AND (WT02JOBリ.工種2C = LT名.工種2C) "
strSQL = strSQL & " AND (WT02JOBリ.工種1C = LT名.工種1C)) "
strSQL = strSQL & " LEFT JOIN LT単位 "
strSQL = strSQL & " ON WT02JOBリ.単位C = LT単位.単位C) "
strSQL = strSQL & " LEFT JOIN WT01仕様 "
strSQL = strSQL & " ON (WT02JOBリ.S1 = WT01仕様.tmp) "
strSQL = strSQL & " AND (WT02JOBリ.工種1C = WT01仕様.工種C)) "
strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_1 "
strSQL = strSQL & " ON (WT02JOBリ.S2 = WT01仕様_1.tmp) "
strSQL = strSQL & " AND (WT02JOBリ.工種1C = WT01仕様_1.工種C)) "
strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_2 "
strSQL = strSQL & " ON (WT02JOBリ.S3 = WT01仕様_2.tmp) "
strSQL = strSQL & " AND (WT02JOBリ.工種1C = WT01仕様_2.工種C)) "
strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_3 "
strSQL = strSQL & " ON (WT02JOBリ.S4 = WT01仕様_3.tmp) "
strSQL = strSQL & " AND (WT02JOBリ.工種1C = WT01仕様_3.工種C)) "
strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_4 "
strSQL = strSQL & " ON (WT02JOBリ.S5 = WT01仕様_4.tmp) "
strSQL = strSQL & " AND (WT02JOBリ.工種1C = WT01仕様_4.工種C)) "
strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_5 "
strSQL = strSQL & " ON (WT02JOBリ.S6 = WT01仕様_5.tmp) "
strSQL = strSQL & " AND (WT02JOBリ.工種1C = WT01仕様_5.工種C)) "
strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_6 "
strSQL = strSQL & " ON (WT02JOBリ.S7 = WT01仕様_6.tmp) "
strSQL = strSQL & " AND (WT02JOBリ.工種1C = WT01仕様_6.工種C); "
Set QD = DB.QueryDefs("Q03JOB仕リ")
QD.SQL = strSQL
QD.Close
Set QD = Nothing
DoCmd.OpenQuery "Q03JOB仕リ"
うまく再現できているか不明ですが
空白等に問題があるのでしょうか?
(文字面的には差異は無いのですが・・・・)
また、頂いたコードには不具合は無いと思いますが
このようなエラーが出てしまう原因が掴めませんでした
アドバイス有りましたらよろしくお願い致します
動作だけは確認できました
ワークテーブル?ってあいまいなイメージしかありませんでしたが
作業用に用意するテーブルのことだったんですね。
>Q01仕様 はSQLServer側でViewとして保存
>Q02JOBリ は自MDB側でワークテーブルとして保存
>両者を結合させるのであれば
>単純なテーブル同士の等価結合になる為、
>Accessの負担が軽くなるかと思われます。
アドバイスありがとうございます
こちらについては、理解できました
上記Qわかりにくいと思いますが
何か有りましたらよろしくお願い致します
|
|