簡體   English   中英

從文本框中將日期輸入輸入到MS Access VBA中的查詢中

[英]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) YearMonth是保留關鍵字,請考慮對其進行更改。

c) YearMonthAmount應該是數字字段(?),但是將它們用'引號引起來,則將它們作為字符串傳遞。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM