20

久しぶりの視聴者初ポスター。Excel のフロントエンドを備えたデータベース アプリケーションに取り組んでいます。したがって、VBA を使用して MySQL データベースにアクセスしています。私が使用しているドライバーは ODBC ドライバー (Windows) であり、他の多くのクエリが適切に機能するため、データベースへの有効な接続があります。

私がやろうとしているのは、すべてを 1 つの大規模なステートメントに結合しようとするのではなく、一連の SQL ステートメントから結果を返すことです (これはおそらく機能しますが、維持/理解が困難です)。ドライバーの構文エラーを抑制するフラグFLAG_MULTI_STATEMENTS = 67108864を接続文字列に追加しました。

しかし、今、次を実行すると:

queryDB.Open SQLquery, conn

recordset (queryDB)明らかなエラーなしで閉じたままです。SQL ステートメントはここにあります。

VBA に返されないエラーが発生している可能性があるため、ここで何か助けていただければ幸いです。

:SQLステートメントは、そのステートメントを貼り付けることができるので機能しphpMyAdmin、正しい(空ではない)結果を返します。ステートメントが具体的に問題であるかどうかはわかりませんが、おそらくCREATE TEMPORARY TABLE ...一般的に複数のステートメントの使用または使用です。

また、ドライバーが各SQLステートメントの結果を返そうとしていると思いますが、VBAは最初か何かしか取得していません...

EDIT : 今後の参考のための sql ステートメント。

CREATE TEMPORARY TABLE tmpOrders AS
SELECT
o.customerName,
SUM(o.Sales) AS Sales,
SUM(TotalFobCost + TotalLandedCost + TotalLocalCost + TotalCmtCost) AS TotalCost,
YEAR(o.deliveryDate) AS YEAR,
MONTH(o.deliveryDate) AS MONTH
FROM devere_costing.orders_fixed_extras AS o
WHERE o.orderApproved = TRUE
AND o.orderCanceled = FALSE
AND o.deliveryDate BETWEEN '2014-01-01' AND '2014-03-31'
GROUP BY customerName, YEAR, MONTH
ORDER BY YEAR ASC, MONTH ASC, customerName ASC;

CREATE TEMPORARY TABLE tmpProj AS
SELECT p.customerName,
   IF(p.MONTH > 9, p.YEAR, p.YEAR - 1) AS TrueYear,
   1 + ((p.MONTH + 2) MOD 12) AS TrueMonth,
   SUM(p.actualSalesInvoiced) AS salesInvoiced,
   SUM(p.budget) AS budget
FROM devere_costing.sales_projection_data AS p
GROUP BY p.customerName, p.YEAR, p.MONTH
HAVING TrueYear BETWEEN YEAR('2014-01-01') AND YEAR('2014-03-31')
AND TrueMonth BETWEEN MONTH('2014-01-01') AND MONTH('2014-03-31');

CREATE TEMPORARY TABLE tmpLeft AS
SELECT
IF(o.customerName IS NULL, p.customerName, o.customerName) AS customerName,
p.budget AS TotalBudget,
o.Sales AS Sales,
p.salesInvoiced,
0 AS varianceToBudget,
o.TotalCost,
0 AS directMargin,
0 AS directMarginPercent,
IF(o.YEAR IS NULL, p.TrueYear, o.YEAR) AS YEAR,
IF(o.MONTH IS NULL, p.TrueMonth, o.MONTH) AS MONTH
FROM tmpOrders AS o
LEFT JOIN tmpProj AS p
ON (o.customerName = p.customerName
AND o.YEAR = p.TrueYear
AND o.MONTH = p.TrueMonth);

CREATE TEMPORARY TABLE tmpRight AS
SELECT
IF(o.customerName IS NULL, p.customerName, o.customerName) AS customerName,
p.budget AS TotalBudget,
o.Sales AS Sales,
p.salesInvoiced,
0 AS varianceToBudget,
o.TotalCost,
0 AS directMargin,
0 AS directMarginPercent,
IF(o.YEAR IS NULL, p.TrueYear, o.YEAR) AS YEAR,
IF(o.MONTH IS NULL, p.TrueMonth, o.MONTH) AS MONTH
FROM tmpOrders AS o
RIGHT JOIN tmpProj AS p
ON (o.customerName = p.customerName
AND o.YEAR = p.TrueYear
AND o.MONTH = p.TrueMonth);

(SELECT * FROM tmpLeft) UNION DISTINCT (SELECT * FROM tmpRight);

私は自分の質問に答えました!

秘密はここにあります:

したがって、複数のレコードセットが返されたという点で、私は正しかったです。必要なデータを見つけるために、それらを繰り返し処理する必要がありました。コレクションは索引付けされていないため、それぞれを検索する必要があります。私の場合、すべての sql ステートメントはレコードセットを返しません (そのため、レコードセットを開こうとしたときに、レコードセットが閉じられたままになりました)。唯一の例外は、レコードを返す最後の sql ステートメントです。私のループは次のようになります。

Dim rs As ADODB.Recordset
Set rs = queryDB(Sql)

' Loop through returned recordsets to find the data
Do
    If Not rs Is Nothing Then
        If rs.State = adStateOpen Then
            ' we have an open recordset.  This means that the final select statement
            ' has returned this data.
            Exit Do
        Else
            ' Otherwise iterate through to the next recordset
            Set rs = rs.NextRecordset
        End If
    Else
        MsgBox "No recordset returned by sql statement"
        GoTo ExitCode
    End If
Loop
4

1 に答える 1