2013-10-03 25 views
1

一位朋友的訪問,我一直進展不大想了幾個小時的得到我們正在設計一個項目的發票系統的一段代碼的權利。更新一個字段依賴於日期範圍與VisualBasic中和SQL

我們正在嘗試將字段InvoiceNo更新爲一個值(在VisualBasic代碼中早先制定),其中CustomerNo是特定值並且FinishDate在兩個日期之間。起初,我試圖使用TO_DATE,但後來我們意識到,在Access使用的SQL(經過大量搜索之後)方面並不相同。

這一直是我一直在使用,只是測試,並得到一些工作,然後翻譯成的VisualBasic,並把我們的變量的簡單陳述。閱讀起來有點容易,所以我想我會提供它。

UPDATE tblJob SET tblJob.InvoiceNo = '8' WHERE tblJob.CustomerNo = '1' AND (tblJob.FinishDate BETWEEN cdate(format('08/09/2013', '##/##/####')) AND cdate(format('03/10/2013', '##/##/####'))); 

我看過幾個例子,我們的日期是沒有正斜槓的。所以我試了一下,也沒有工作。

下面是已經走出了這一切的VisualBasic中的代碼,這是完全一樣的,但使用一些變量,而不是我一直在使用我們的測試設定值。

DoCmd.RunSQL ("UPDATE tblJob SET tblJob.InvoiceNo = '" & newInvoiceNo & "' WHERE tblJob.CustomerNo = '" & VbCustNo & "' AND (tblJob.FinishDate BETWEEN cdate(format('" & Forms![frmMainMenu][txtFirstDate] & "', '##/##/####')) AND cdate(format('" & Forms![frmMainmenu][txtEndDate] & "', '##/##/####')));") 

我們不得不看看:Convert a string to a date in Access,它讓我們意識到,這是CDATE(格式()),而不是TO_DATE,因爲它是Oracle。但是,我們似乎無法讓它正常運行,任何幫助將不勝感激。

+0

如果您的日期格式爲mm/dd/yyyy,您可以使用#字符,如BETWEEN#08/09/2013#和#03/10/2013#訪問將會看到這是一個日期 – engineersmnky

+0

@engineersmky謝謝,但我們使用dd/mm/yyyy,但我猜測它不會以相同的方式工作? –

+0

你可以隨時使用'DateSerial'這是'DateSerial(年,月,日)'所以,像'DateSerial(右([YourDate],4),MID([YourDate],3,2),左([YourDate] ,2)'。這將以正確的格式返回一個日期對象,這就是我如何正確處理格式化的字符串日期。 – engineersmnky

回答

1

如果您將從一個Access應用程序會話中運行的查詢,可以讓數據庫引擎使用Access表達服務抓住你的形式從文本框中的值。

Dim db As DAO.Database 
Dim strUpdate As String 
strUpdate = "UPDATE tblJob" & vbCrLf & _ 
    "SET InvoiceNo = '" & newInvoiceNo & "'" & vbCrLf & _ 
    "WHERE CustomerNo = '" & VbCustNo & "'" & vbCrLf & _ 
    "AND FinishDate BETWEEN Forms!frmMainMenu!txtFirstDate AND Forms!frmMainmenu!txtEndDate;" 
Debug.Print strUpdate 
Set db = CurrentDb 
db.Execute strUpdate, dbFailOnError 
Set db = Nothing 

但是,如果你喜歡修建從這些文本框字面日期值到您的UPDATE語句,你可以使用Format()

"AND FinishDate BETWEEN " & _ 
Format(Forms!frmMainmenu!txtFirstDate, "\#yyyy-m-d\#") & _ 
" AND " & Format(Forms!frmMainmenu!txtEndDate, "\#yyyy-m-d\#") & ";" 

無論哪種方式,使用字符串變量來保存你的UPDATE聲明給你一個機會來檢查你問的數據庫引擎來執行完成的語句。

您可以查看Debug.Print在立即窗口中輸出(帶CTL去那裏)。對於疑難解答,您可以從那裏複製語句文本,然後將其粘貼到新的Access查詢的SQL視圖中。

+0

感謝你的迴應,我把你的第一組代碼,它沒有正確運行並吐出錯誤「運行時錯誤‘3464’:條件表達式中數據類型不匹配」。這是一樣的,我們一直得到 我然後試圖你的第二個解決方案,我們得到了相同的錯誤 –

+0

什麼「InvoiceNo」,「CustomerNo」和「FinishDate」字段的數據類型?根據你問題中的例子,我推測它們分別是文本,文本和日期/時間。 – HansUp

+0

當您複製'Debug.Print'輸出並將其粘貼到Access查詢設計器中的新查詢的SQL視圖中時,您是否可以確定避免該錯誤所需的更改? – HansUp