I am trying to take input from a form, and I want to execute a insert query (append query) when a button is clicked.
Here is my Code:
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
Everything works fine, except the column with the date value remains blank after addition of the record.
The textbox format is set to "General Date", and it uses a date picker to select the date.
Your Form_Form1!tbDate value is string, so convert to date. And When your field type is datetime, then make #date1# as 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
You concatenate all values as if they were text but they are not.
You can use this function to correctly convert your values to string expressions:
' 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) You need to wrap date values with #
.
b) Year
and Month
are reserved keywords, consider changing them.
c) Year , Month and Amount should be numeric fields (?), but wrapping them in '
quotes, you pass them as strings.
d) Use a query with parameters.
Query 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";
Calling the query in code:
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
Note:
I've assumed fields ending with '...No' eg EnrollmentNo are numeric.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.