2

データを入力するフォームがあります。並べ替え順、開始日、終了日。

データが入力されると、レポートが生成されます。しかし、エラーが発生します。

エラー: 「Microsoft Access データベース エンジンは、'[Forms]![AuditPTETotals]![startDate]' を有効なフィールド名または式として認識しません。

これは、別のクエリ (AuditPTETotalsDateRange) によって取得されたデータを使用する私のクロス集計 (AuditPTETotals_CrosstabDateRange) クエリです。

TRANSFORM Sum(AuditPTETotalsDateRange.PTEtotal) AS SumOfPTEtotal
SELECT AuditPTETotalsDateRange.companyName, AuditPTETotalsDateRange.regNum,    Sum(AuditPTETotalsDateRange.PTEtotal) AS [Total Of PTEtotal]
FROM AuditPTETotalsDateRange
GROUP BY AuditPTETotalsDateRange.companyName, AuditPTETotalsDateRange.regNum
PIVOT AuditPTETotalsDateRange.description;

これは AuditPTETotalsDateRange です

    SELECT CUSTOMER.regNum, CUSTOMER.companyName, ScrapTireType.description, ScrapTireType.PTEamount, ScrapCollectionTireType.amount, ScrapCollection.PTEtotal, ScrapCollection.Date
FROM (ScrapCollection INNER JOIN CUSTOMER ON ScrapCollection.regNum = CUSTOMER.regNum) INNER JOIN (ScrapTireType INNER JOIN ScrapCollectionTireType ON (ScrapTireType.scrapTireTypeID = ScrapCollectionTireType.scrapTireTypeID) AND (ScrapTireType.scrapTireTypeID = ScrapCollectionTireType.scrapTireTypeID)) ON ScrapCollection.scrapCollectionID = ScrapCollectionTireType.scrapCollectionID
WHERE (((ScrapCollection.Date) Between [Forms]![AuditPTETotals]![startDate] And [Forms]![AuditPTETotals]![endDate]));

クエリでフォーム フィールドを参照するのと同様の方法でこのアプローチを使用しましたが、今回は何が間違っているのかわかりません。助けてください。

ありがとうございました

4

2 に答える 2

1

解決策を見つけました!コントロールで日付/時刻形式を使用していました。パラメータの実際の形式を台無しにしていたと思います。代わりに、通常のテキスト ボックスを使用して定型入力を設定しました。出来た。

于 2012-06-07T00:12:15.193 に答える
0

作業しているフォームにボタンを作成し、その Click イベントに以下を追加します。MyReportNameを実際のレポート名 に変更してください。次のコードでは、 MyReportNameが 2 回表示されます。

On Error Resume Next
DoCmd.Close acReport, "MyReportName"
DoCmd.DeleteObject acQuery, "AuditPTETotalsDateRange"
On Error GoTo Err_cmd_Click

Dim strSQL, strSQL1 As String
Dim qdef As DAO.QueryDef

strSQL = "SELECT CUSTOMER.regNum, CUSTOMER.companyName, ScrapTireType.description, ScrapTireType.PTEamount, ScrapCollectionTireType.amount, ScrapCollection.PTEtotal, ScrapCollection.Date " & _
         "FROM (ScrapCollection INNER JOIN CUSTOMER ON ScrapCollection.regNum = CUSTOMER.regNum) INNER JOIN (ScrapTireType INNER JOIN ScrapCollectionTireType ON (ScrapTireType.scrapTireTypeID = ScrapCollectionTireType.scrapTireTypeID) AND (ScrapTireType.scrapTireTypeID = ScrapCollectionTireType.scrapTireTypeID)) ON ScrapCollection.scrapCollectionID = ScrapCollectionTireType.scrapCollectionID " & _
         "WHERE (((ScrapCollection.Date) Between #" & [Forms]![AuditPTETotals]![startDate] & "# And #" & [Forms]![AuditPTETotals]![endDate] & "#))"

strSQL1 = "TRANSFORM Sum(AuditPTETotalsDateRange.PTEtotal) AS SumOfPTEtotal " & _
          "SELECT AuditPTETotalsDateRange.companyName, AuditPTETotalsDateRange.regNum, Sum(AuditPTETotalsDateRange.PTEtotal) AS [Total Of PTEtotal] " & _
          "FROM AuditPTETotalsDateRange " & _
          "GROUP BY AuditPTETotalsDateRange.companyName, AuditPTETotalsDateRange.regNum " & _
          "PIVOT AuditPTETotalsDateRange.description"

Set qdef = CurrentDb.CreateQueryDef("AuditPTETotalsDateRange", strSQL)
Set qdef = CurrentDb.CreateQueryDef("AuditPTETotals_CrosstabDateRange", strSQL1)
DoCmd.OpenReport "MyReportName", acViewPreview

Exit_cmd_Click:
    Exit Sub
Err_cmd_Click:
    MsgBox Err.Description
    Resume Exit_cmd_Click

次に、フォームの On Close イベントに次を追加します。

On Error Resume Next
DoCmd.DeleteObject acQuery, "AuditPTETotalsDateRange"

ボタンをクリックすると、AuditPTETotalsDateRange が削除されてから再作成されます。また、フォームを閉じると、AuditPTETotalsDateRange クエリが削除されます。とにかくフォームが開いているときにのみクエリが必要になるため、これは問題ありません。レポートのレコード ソースを AuditPTETotals_CrosstabDateRange に設定します。

上記のコードを機能させるには、Microsoft DAO xx Object Libraryへの参照を設定する必要があります。参照セットがすでにある場合があります。xx はバージョンを表します。どのバージョンでも動作するはずです。

編集

うまくいかない場合に備えて、これらすべての変更を行う前に、元のレポートをコピーすることをお勧めします。レポートのフィールドからデータ ソースを削除して、バインドを解除してみてください。次に、open イベントに関するレポートに次のコードを追加します。

Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("AuditPTETotals_CrosstabDateRange", dbOpenDynaset)

On Error Resume Next
[txtdata1].ControlSource = rs.Fields(4).Name
[txtData2].ControlSource = rs.Fields(5).Name
[txtData3].ControlSource = rs.Fields(6).Name
//And etc for as many fields as you have on report

同様の方法で、ページ ヘッダーに列見出しを割り当てることもできます。ラベルを機能させるには、バインドされていないテキスト ボックスに変更する必要があります。次のコードをページ ヘッダーの On Format イベントに追加します。

Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("AuditPTETotals_CrosstabDateRange", dbOpenDynaset)

On Error Resume Next
[txtColHeading1].value = rs.Fields(4).Name
[txtColHeading2].value = rs.Fields(5).Name
[txtColHeading3].value = rs.Fields(6).Name
//And etc for as many fields as you have on report

これにより、どの列が表示されるかを確実に知らなくても、レポートを実行できます。コード内の名前と一致するようにコントロールに名前を付けるか、その逆を行ってください。

于 2012-06-04T13:29:45.520 に答える