0

私は基本的にVBAコードと保存されたクエリを介してMSAccessで同じクエリを持っています。これは基本的に同じクエリですが、VBAコードには、修飾されて含まれる必要がある2つのレコードがありません。保存されたクエリは、同じデータセットと、VBAが返さない2つの「欠落している」レコードを返します。

保存されたクエリSQL:

SELECT ID.Company, CU.GroupCode, CU.CustID, CU.Name, ST.ShipToNum, ST.Name, IH.InvoiceDate, IH.InvoiceNum, ID.ProdCode, ID.PartNum
FROM ((((PUB_InvcDtl AS ID INNER JOIN PUB_InvcHead AS IH ON (ID.CustNum = IH.CustNum) AND (ID.InvoiceNum = IH.InvoiceNum) AND (ID.Company = IH.Company)) LEFT JOIN PUB_Part AS PT ON (ID.Company = PT.Company) AND (ID.PartNum = PT.PartNum)) LEFT JOIN PUB_ShipTo AS ST ON (ID.CustNum = ST.CustNum) AND (ID.ShipToNum = ST.ShipToNum) AND (ID.Company = ST.Company)) LEFT JOIN V_Customer AS CU ON (ID.Company = CU.Company) AND (ID.CustNum = CU.CustNum)) LEFT JOIN ProdCodeCommRate AS PCC ON ID.ProdCode = PCC.ProdCode
WHERE (((ID.Company)="BTN") AND ((IH.InvoiceDate) Between #1/1/2013# And #1/31/2013#) AND ((ID.ProdCode) In ('2100','2110','2200','2210','2300','2400','2405','2500','2600','2701','2702','2709','2710','2800','2901','2902','2903')) AND ((ID.PartNum)<>''));

VBAクエリ:

"SELECT ID.Company, CU.GroupCode, CU.CustID, CU.Name AS CustName, ST.ShipToNum, ST.Name AS ShipToName, IH.InvoiceDate, IH.InvoiceNum, ID.InvoiceLine, ID.PartNum, " & _
        "ID.ProdCode, PCC.CommRate, ID.PricePerCode, PT.PartDescription, ID.IUM, PT.CostMethod, ID.UnitPrice, ID.OurShipQty, ID.ExtPrice, ID.Discount, [ExtPrice]-[Discount] AS NetPrice, " & _
        "ID.LbrUnitCost, ID.BurUnitCost, ID.MtlUnitCost, ID.SubUnitCost, [LbrUnitCost]+[BurUnitCost]+[MtlUnitCost]+[SubUnitCost] AS TotUnitCost, " & _
        "([LbrUnitCost]+[BurUnitCost]+[MtlUnitCost]+[SubUnitCost])*[OurShipQty] AS ExtTotCost, IH.OpenInvoice, getSalesRep([IH].[SalesRepList],1,ID.Company) AS SalesRep1, ID.RepRate1, " & _
        "ID.RepSplit1, getSalesRep([IH].[SalesRepList],2,ID.Company) AS SalesRep2, ID.RepRate2, ID.RepSplit2, getSalesRep([IH].[SalesRepList],3,ID.Company) AS SalesRep3, " & _
        "ID.RepRate3, ID.RepSplit3 " & _
        "FROM (((((PUB_InvcDtl AS ID " & _
        "INNER JOIN PUB_InvcHead AS IH ON (ID.CustNum = IH.CustNum) AND (ID.InvoiceNum = IH.InvoiceNum) AND (ID.Company = IH.Company)) " & _
        "LEFT JOIN PUB_Part AS PT ON (ID.Company = PT.Company) AND (ID.PartNum = PT.PartNum))" & _
        "LEFT JOIN PUB_ShipTo AS ST ON (ID.CustNum = ST.CustNum) AND (ID.ShipToNum = ST.ShipToNum) AND (ID.Company = ST.Company))" & _
        "LEFT JOIN V_Customer AS CU ON (ID.Company = CU.Company) AND (ID.CustNum = CU.CustNum))" & _
        "LEFT JOIN ProdCodeCommRate AS PCC ON ID.ProdCode = PCC.ProdCode)" & _
        "WHERE ((ID.Company)=[Forms]![frmSalesMgnAnalysis]![cboComp]) AND ((ID.PartNum)<>'') AND " & _
        "((IH.InvoiceDate) Between [Forms]![frmSalesMgnAnalysis]![dtStart] And [Forms]![frmSalesMgnAnalysis]![dtEnd]) AND " & _
        "((ID.ProdCode) IN ('2100','2110','2200','2210','2300','2400','2405','2500','2600','2701','2702','2709','2710','2800','2901','2902','2903'))" & _
        "ORDER BY ID.ProdCode, IH.InvoiceDate, CU.Name;"

このフォームでは、会社、開始日と終了日、およびProdCodesの入力フィールドを使用しています。ProdCodesは、ProdCode、Desc、およびCompany(VBA側のテーブルにあります)を含むフォームのリストボックスにあります。このVBAコードは、2つの欠落しているレコードを除いて、必要なすべてのレコードを返します。上記のProdCodeVBAテーブルに参加するかどうかに関係なく、WHERE ID.ProdCode IN(個別に選択...)などを使用してWHEREで個別に選択します。

アイデア?前もって感謝します!!!

4

1 に答える 1

1

WHERE句は同一ではありません(括弧が両方のクエリ間で同じ場所にないという点で)。ID.PartNum<>''特に条項の一部に問題があるのではないかと思います。

VBAコードにブレークポイントを設定して、VBAクエリの実際に解釈された出力(パラメーター値を含む)を取得してみてください。そのSQLステートメントを新しいクエリウィンドウ(SQLビュー)にコピーしてから、デザイナーを調べて、Accessがステートメントをどのように解釈しているかを確認します。

VBAクエリのwhere句を一致させて、引数の同じ順序と括弧の数を一致させることもできますが、VBAクエリをいじくり回す前に、最初にデザイナーを使用して仮説を証明\反証する方が簡単な場合があります。

多くの場合、このような問題では、ステートメントを削除して徐々に追加し直し、問題が発生している場所を正確に見つけるのは試行錯誤の問題ですが、括弧の使用法は私が調査を開始する場所です。

于 2013-02-27T20:14:41.423 に答える