简体   繁体   中英

Taking Date input into a query in MS Access VBA from TextBox

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM