2013-11-22 178 views
2

我在8年內沒有與Access合作過 - 我相信我已經忘記了比我所知道的更多。有人要求我修改報告,以便當前顯示所有圖紙的圖紙列表將列出特定客戶(或所有客戶)的圖紙。MS Access:如何過濾非報告字段的報告?

我找到了報告使用的嵌套查詢,並修改了內部查詢以接受參數(第一個錯誤?)。然後,我添加了一個新表單來顯示客戶名稱並檢索關聯的主鍵customerId。現在我需要將表單中的客戶ID填入報表。 DoCmd.OpenReport並添加一個whereCmd似乎不匹配where參數的條件。

所以,我刪除了查詢中的參數,並試圖指定條件。只有外部查詢不知道customerId是什麼。我是否需要在內部查詢中以及在外部查詢中公開這些內容,然後纔將它用於最終報告中,以便我可以在where子句中對其進行過濾?

他們有其他示例代碼在表單中使用VBA在啓動報表之前重新生成查詢(添加任何過濾條件)。當然,這不可能是推薦的做法,可以嗎?

+0

*「...在啓動報告之前重新生成一個查詢(添加任何過濾條件)」*該查詢是否被用作報告的記錄源? – HansUp

+0

報告的記錄來源是外部查詢,是的。但是它是由外部查詢調用的內部查詢,它能夠識別客戶。該信息不是內部結果中的字段,因此在外部不可用,因此我不認爲我可以對其進行過濾。 – knockNrod

+0

從我讀到的,過濾器是首選的參數查詢。好吧,我添加了它,我會把它取出來。但是我無法讓過濾器工作,我相信這是因爲它不是報告記錄源中的字段。那麼,如果我將該字段添加到內部查詢和外部查詢的字段列表中,它是否必須在報告中使用?如果報告中沒有使用它,我是否仍然可以對其進行過濾? – knockNrod

回答

2

在報告的記錄源中包含過濾器字段。然後,您可以在打開報告時過濾該字段。

DoCmd.OpenReport "rptFoo", View:=acViewPreview, _ 
    WhereCondition:="[id]=1" 

使用的記錄源字段WhereCondition沒有受到任何報告的控件來顯示......只要它存在於記錄源可以在WhereCondition使用。

0

我會把它放在OpenArgs的報告中。從您的形式,這樣做:

DoCmd.OpenReport strReportName, , , , , Me.CustomerID 

然後,在報告的Load事件,閱讀OpenArgs並改變報表的記錄:

Me.RecordSource = "SELECT * FROM MyTable WHERE CustomerID = '" & Me.OpenArgs & "'" 

這是「aircode」,將可能需要一點調整,但它應該讓你真的很接近。顯然,如果CustomerID是一個INT字段,請從報告「載入」事件中的SQL中刪除單引號。

+1

我懷疑如果OP使用'WhereCondition'參數不能使它工作,那麼他們不太可能使用'OpenArgs'做得更好。 –

+0

我懷疑我在調用where條件錯誤,但我沒有看到open args如何幫助。它可以在不提示用戶的情況下傳遞參數值嗎?然後有所有的文章說,不要在報告中做參數和形成記錄來源。星期一我會試一試。 – knockNrod

+0

是的,傳遞OpenArgs不會提示用戶任何東西,你只是通過代碼傳遞變量,所以它都在幕後。 –