|
▼pon さん:
こんにちは。
>レコード件数は、
> 117819件
> 117820件
> とかになります
うーん、残念です。
> よくわかりませんが、CPUのせいではないような気はしますが・・・・
当方もはっきりとした論拠がある訳ではありませんが、
メモリ256MB のPC で不安定だったクエリが
メモリを1Gに増設した所、安定した経験があります。
> 敷居が高いけど今回は
> SQL Server Express Edition + ADP にしようかな・・・
元データがSQLServerにあるのでしたら
クエリ部分をViewとしてSQLServer側に保存し、
AccessからはViewを見に行く方法もありますね。
Q01仕様 はSQLServer側でViewとして保存
Q02JOBリ は自MDB側でワークテーブルとして保存
両者を結合させるのであれば
単純なテーブル同士の等価結合になる為、
Accessの負担が軽くなるかと思われます。
以下、MDBのバックアップを取ってから試してみて下さい。
Sub ワークテーブルを使用()
Dim DB As DAO.Database
Dim strSQL As String
Dim QD As DAO.QueryDef
Set DB = CurrentDb
On Error Resume Next
strSQL = "Drop Table WT01仕様"
DB.Execute strSQL
strSQL = "Drop Table WT02JOBリ"
DB.Execute strSQL
DB.CreateQueryDef "Q03JOB仕リ", "SELECT 1"
On Error GoTo 0
strSQL = " SELECT LT仕様.*, [仕区C]*1000+[仕様C] AS tmp " _
& " INTO WT01仕様 " _
& " FROM LT仕様;"
DB.Execute strSQL, dbFailOnError
strSQL = " SELECT T単価.*, " _
& " 1000+[仕様C1] AS S1, " _
& " 2000+[仕様C2] AS S2, " _
& " 3000+[仕様C3] AS S3, " _
& " 4000+[仕様C4] AS S4, " _
& " 5000+[仕様C5] AS S5, " _
& " 6000+[仕様C6] AS S6, " _
& " 7000+[仕様C7] AS S7 " _
& " INTO WT02JOBリ " _
& " FROM T単価;"
DB.Execute strSQL, dbFailOnError
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 & " 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仕リ"
End Sub
クエリ部分をワークテーブルに保存する様にし、
Q03JOB仕リ を書き換えております。
これで件数が安定する様でしたら
計算させながらの結合の所に問題がありそうですね。
(SELECT 〜 INTO 句でテーブルを作っている為に
Index が外れておりますので
結果表示が遅い場合にはワークテーブルに Index を設定して下さい)
> ふと、クエリ結果件数が毎度異なるなんて
> バグぽっい動きみたいな気もしなくは無いですが、どうなんでしょう・・・・
Accessの弱点として、データベースエンジンである
Jet Database Engine の安定性が良くない事があげられます。
テーブル同士を素直に繋ぐSQLであれば
それほど問題が起きる事はないのですが
不等価結合 (T_1.Field1 <> T_2.Field1) や
複雑なサブクエリを用いると
固まってしまったり、Accessそのものが落ちてしまったりと
不安定な動きをする事が多々あります。
今回は
>デザイン ビューで、連結式
> T単価.仕様C1+1000=T1.仕区C*1000+T1.仕様C を表示できません。
の様に、フィールドを計算させながら結合している箇所が
問題になってそうですね。
もちろん、より安定したツールを手に入れる為に
お金や時間を掛けるのは正しい方法だと思いますが
Accessへの負担を減らし安定させるのも
1つの手だと考えております。
|
|