[英]Taking Date input into a query in MS Access VBA from TextBox
我正在嘗試從表單中獲取輸入,並且我想在單擊按鈕時執行插入查詢(追加查詢)。
這是我的代碼:
Private Sub Command103_Click()
Dim enrollment As String
enrollment = Form_Form1!tbEnrollment
Dim amount As String
amount = Form_Form1!tbAmount
Dim year As Integer
year = Form_Form1!tbYear
Dim date1 As Date
date1 = Form_Form1!tbDate
Dim month As Integer
month = Form_Form1!cbMonth
Dim sqlqry As String
Dim db As DAO.Database
Set db = CurrentDb
sqlqry = "INSERT INTO StudentFeeMonthly( StudentID, FeeMonth, FeeYear, Amount, DateOfPayment, ReceiptNo ) SELECT TOP 1 (SELECT DISTINCT StudentDetails.StudentID FROM StudentDetails WHERE StudentDetails.EnrollmentNo = '" & enrollment & "') AS Expr1, '" & month & "' AS Expr2, '" & year & "' AS Expr3, '" & amount & "' AS Expr4, '" & date1 & "' AS Expr5, ""Hello"" AS Expr6 FROM StudentFeeMonthly;"
MsgBox (sqlqry)
db.Execute sqlqry
MsgBox ("done")
End Sub
一切正常,除了在添加記錄后,帶有日期值的列保持空白。
文本框格式設置為“常規日期”,並使用日期選擇器選擇日期。
您的Form_Form1!tbDate值為字符串,因此請轉換為日期。 並且當您的字段類型為datetime時,將#date1#設置為Expr5“。
Private Sub Command103_Click()
Dim enrollment As String
enrollment = Form_Form1!tbEnrollment
Dim amount As String
amount = Form_Form1!tbAmount
Dim year As Integer
year = Form_Form1!tbYear
Dim date1 As Date
date1 = DateValue(Form_Form1!tbDate)
Dim month As Integer
month = Form_Form1!cbMonth
Dim sqlqry As String
Dim db As DAO.Database
Set db = CurrentDb
sqlqry = "INSERT INTO StudentFeeMonthly( StudentID, FeeMonth, FeeYear, Amount, DateOfPayment, ReceiptNo ) SELECT TOP 1 (SELECT DISTINCT StudentDetails.StudentID FROM StudentDetails WHERE StudentDetails.EnrollmentNo = '" & enrollment & "') AS Expr1, '" & month & "' AS Expr2, '" & year & "' AS Expr3, '" & amount & "' AS Expr4, #" & date1 & "# AS Expr5, ""Hello"" AS Expr6 FROM StudentFeeMonthly;"
MsgBox (sqlqry)
db.Execute sqlqry
MsgBox ("done")
End Sub
您將所有值串聯在一起,就好像它們是文本,但不是。
您可以使用此函數將值正確轉換為字符串表達式:
' Converts a value of any type to its string representation.
' The function can be concatenated into an SQL expression as is
' without any delimiters or leading/trailing white-space.
'
' Examples:
' SQL = "Select * From TableTest Where [Amount]>" & CSql(12.5) & "And [DueDate]<" & CSql(Date) & ""
' SQL -> Select * From TableTest Where [Amount]> 12.5 And [DueDate]< #2016/01/30 00:00:00#
'
' SQL = "Insert Into TableTest ( [Street] ) Values (" & CSql(" ") & ")"
' SQL -> Insert Into TableTest ( [Street] ) Values ( Null )
'
' Trims text variables for leading/trailing Space and secures single quotes.
' Replaces zero length strings with Null.
' Formats date/time variables as safe string expressions.
' Uses Str to format decimal values to string expressions.
' Returns Null for values that cannot be expressed with a string expression.
'
' 2016-01-30. Gustav Brock, Cactus Data ApS, CPH.
'
Public Function CSql( _
ByVal Value As Variant) _
As String
Const vbLongLong As Integer = 20
Const SqlNull As String = " Null"
Dim Sql As String
Dim LongLong As Integer
#If Win32 Then
LongLong = vbLongLong
#End If
#If Win64 Then
LongLong = VBA.vbLongLong
#End If
Select Case VarType(Value)
Case vbEmpty ' 0 Empty (uninitialized).
Sql = SqlNull
Case vbNull ' 1 Null (no valid data).
Sql = SqlNull
Case vbInteger ' 2 Integer.
Sql = Str(Value)
Case vbLong ' 3 Long integer.
Sql = Str(Value)
Case vbSingle ' 4 Single-precision floating-point number.
Sql = Str(Value)
Case vbDouble ' 5 Double-precision floating-point number.
Sql = Str(Value)
Case vbCurrency ' 6 Currency.
Sql = Str(Value)
Case vbDate ' 7 Date.
Sql = Format(Value, " \#yyyy\/mm\/dd hh\:nn\:ss\#")
Case vbString ' 8 String.
Sql = Replace(Trim(Value), "'", "''")
If Sql = "" Then
Sql = SqlNull
Else
Sql = " '" & Sql & "'"
End If
Case vbObject ' 9 Object.
Sql = SqlNull
Case vbError ' 10 Error.
Sql = SqlNull
Case vbBoolean ' 11 Boolean.
Sql = Str(Abs(Value))
Case vbVariant ' 12 Variant (used only with arrays of variants).
Sql = SqlNull
Case vbDataObject ' 13 A data access object.
Sql = SqlNull
Case vbDecimal ' 14 Decimal.
Sql = Str(Value)
Case vbByte ' 17 Byte.
Sql = Str(Value)
Case LongLong ' 20 LongLong integer (Valid on 64-bit platforms only).
Sql = Str(Value)
Case vbUserDefinedType ' 36 Variants that contain user-defined types.
Sql = SqlNull
Case vbArray ' 8192 Array.
Sql = SqlNull
Case Else ' Should not happen.
Sql = SqlNull
End Select
CSql = Sql & " "
End Function
a)您需要使用#
來包裝日期值。
b) Year
和Month
是保留關鍵字,請考慮對其進行更改。
c) Year , Month和Amount應該是數字字段(?),但是將它們用'
引號引起來,則將它們作為字符串傳遞。
d)使用帶有參數的查詢。
查詢SQL:
PARAMETERS
[prmEnrollmentNo] Long,
[prmFeeMonth] Long,
[prmFeeYear] Long,
[prmAmount] IEEESingle,
[prmDateOfPayment] DateTime;
INSERT INTO StudentFeeMonthly (StudentID, FeeMonth, FeeYear, Amount, DateOfPayment, ReceiptNo)
SELECT (SELECT DISTINCT StudentDetails.StudentID
FROM StudentDetails
WHERE StudentDetails.EnrollmentNo=[prmEnrollmentNo]),
[prmFeeMonth],
[prmFeeYear],
[prmAmount],
[prmDateOfPayment],
"Hello";
在代碼中調用查詢:
With CurrentDb().QueryDefs("YourInsertQueryName")
.Parameters("[prmEnrollmentNo]").Value = enrollment
.Parameters("[prmFeeMonth]").Value = Month 'change it
.Parameters("[prmFeeYear]").Value = Year 'change it
.Parameters("[prmAmount]").Value = amount
.Parameters("[prmDateOfPayment]").Value = date1
.Execute dbFailOnError
End With
注意:
我假設以'... No'結尾的字段,例如EnrollmentNo是數字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.