ExcelレポートをSQLAnywhereデータベースからSQLServer2008R2 Expressデータベースへのデータへのアクセスから変換していますが、実行するとエラーが発生し続けます。ユーザーは、売上高の動きを比較したいいくつかの項目を入力し、ボタンを押してマクロを実行します。マクロはアイテムを取得し、SQLクエリ文字列を作成し、結果を取得して表示します。
これは古いDBで完全に機能しました。SQL Serverで、マクロを実行すると、役に立たない「400」エラーが発生します。コードをステップスルーすると、「With ActiveSheets.QueryTables.Add(...)」セグメントの最後で、その時点で「ランタイムエラー「1004」」がスローされます。SQLServerまたはOLEDB接続でサポートされていない構文について何かがあると思いますが、それが何であるかを確認できれば気になります。
生成されたSQLクエリのDebug.Printを実行しましたが、SQLServerStudioのクエリウィンドウにコピーして貼り付けると完全に実行されます。「select*from DEPT_TAB」のような単純なものにクエリを置き換えると、マクロで正常に実行されます。テーブルの作成も正常に実行されますが、INSERTステートメントの追加に関する何かがそれをスローします。
マクロコードは次のとおりです。
Sub SalesHistory()
' Runs SQL from sheet and places into report
' declare method variables
Dim sSQL As String
Dim sConn As String
Dim N1 As Integer
Dim LR As Integer
' create connection string for SQL Server Express
sConn = "OLEDB;Provider=SQLOLEDB;" & _
"Data Source=192.168.0.29\SQLEXPRESS;" & _
"Initial Catalog=STORESQL;" & _
"User ID=xxxxx;Password=xxxxx;Trusted_Connection=False;"
' stop screen updating while running
Application.ScreenUpdating = False
' select SQL sheet and get number of rows in column A
Sheets("SQL").Select
LR = Range("A" & Rows.Count).End(xlUp).Row
' loop through column A and create SQL command string
For N1 = 1 To LR
sSQL = sSQL & " " & Range("A" & N1).Value
Next N1
' test print sSQL
Debug.Print sSQL
' select Main sheet, clear report, and activate for new results
Sheets("Main").Select
Range("$A$2:$D$51").ClearContents
Sheets("Main").Activate
' use QueryTables.Add() to get data from server
With ActiveSheet.QueryTables.Add(Connection:=sConn, Destination:=Range("A2))
.CommandText = sSQL
.Name = "Movement"
.FieldNames = False
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlOverwriteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With
' HERE IS WHERE THE ERROR IS THROWN
' restart ScreenUpdating
Application.ScreenUpdating = True
End Sub
ワークシートからのクエリは次のとおりです。
-- declare variables
DECLARE @StartDate DATE;
DECLARE @Location CHAR(3);
SET @StartDate = '07/29/2012';
SET @Location = 'PAL';
-- create temp table for holding results
CREATE TABLE #tmp_ItemMove (
UPC CHAR(13) NULL,
Brand CHAR(32) NULL,
Descriptor CHAR(32) NULL,
Sales INT NULL);
-- insert zero values for each item so that they always show up in final report
INSERT INTO #tmp_ItemMove
SELECT OBJ.F01, OBJ.F155, OBJ.F29, 0
FROM OBJ_TAB OBJ
WHERE OBJ.F01 LIKE '' OR
OBJ.F01 LIKE '' OR
OBJ.F01 LIKE '' OR
OBJ.F01 LIKE '' OR
OBJ.F01 LIKE '';
-- insert sales information into temp table
INSERT INTO #tmp_ItemMove
SELECT OBJ.F01, OBJ.F155, OBJ.F29,
CASE WHEN TRS.F67=0 THEN TRS.F64 ELSE TRS.F67 END
FROM
RPT_ITM_D TRS JOIN OBJ_TAB OBJ ON TRS.F01=OBJ.F01
JOIN TLZ_TAB TLZ ON TRS.F1034=TLZ.F1034
JOIN LNK_TAB LNK ON TRS.F1056=LNK.F1056 AND TRS.F1057=LNK.F1057 AND LNK.F1000=@Location
WHERE (OBJ.F01 LIKE '' OR
OBJ.F01 LIKE '' OR
OBJ.F01 LIKE '' OR
OBJ.F01 LIKE '' OR
OBJ.F01 LIKE '') AND
TRS.F254 >= @StartDate AND
TRS.F1034 BETWEEN 3 AND 4;
-- get final report
-- sum sales history for each item and display
SELECT MAX(UPC),
MAX(Brand),
MAX(Descriptor),
SUM(Sales)
FROM #tmp_ItemMove
GROUP BY UPC, Brand, Descriptor
ORDER BY SUM(Sales) DESC, Brand, UPC;
DROP TABLE #tmp_ItemMove;
どんな助けでもありがたいです、ありがとう。