SQL 语法问题超出了问题原因的想法

问题描述 投票:0回答:1

我在使用 Access 查询时遇到一些问题。 我想做的是执行一个查询,其中读取控件,由一个组合框和两个文本框组成,制定 SQL 查询,然后导出到 csv 文件。 第一个示例制定 SQL 字符串,并使用

DoCmd.RunSQL
语句,并且导致错误。

这是我迄今为止的代码:

Option Explicit
    
    
Private Sub Cmd_SaveToFile_Click()
    
    'read combo box and two text boxes into variables
    Dim Str_SQL As String
    Dim str_Keyword As String
    Dim Str_StartDate As String
    Dim str_EndDate As String
    Dim null_SetUp As Boolean
            
    null_SetUp = False
    'set focus to Cmb_Keyword so we can read it
    Cmb_Keyword.SetFocus
    If Cmb_Keyword.Text = "" Then
        null_SetUp = True
    Else
        str_Keyword = Cmb_Keyword.Text
    End If
            
    'set focus to StartDate so we can read it
    Txt_StartDate.SetFocus
    If Txt_StartDate.Text = "" Then
        null_SetUp = True
    Else
        Str_StartDate = Txt_StartDate
    End If
            
    'Set focus to EndDate so we can read it
    Txt_EndDate.SetFocus
    If Txt_EndDate.Text = "" Then
        null_SetUp = True
    Else
        str_EndDate = Txt_EndDate
    End If
        
    If (null_SetUp = True) Then
        MsgBox "Controls not filled out"
    Else
        Str_SQL = "SELECT Tbl_Journal.Keyword, Tbl_Journal.Date_Time, Tbl_Journal.Journal_Entry, Tbl_Journal.ID "
        Str_SQL = Str_SQL & "FROM Tbl_Journal "
        'Str_SQL = Str_SQL & "WHERE (((Tbl_Journal.Keyword) = 'Daily Journal')) "
        'Str_SQL = Str_SQL & " And ((Tbl_Journal.Date_Time) > " & Str_StartDate & ") "
        'Str_SQL = Str_SQL & " And ((Tbl_Journal.Date_Time) <  " & str_EndDate & ")) "
        MsgBox Str_SQL
        
        DoCmd.SetWarnings False
        DoCmd.RunSQL Str_SQL
        'DoCmd.OpenQuery "Query1"  This works but I want it to read the controls.
        DoCmd.SetWarnings True
           
    End If
        
            
End Sub

我收到的错误消息是

RunSQL 操作需要一个由 SSQL 语句组成的参数。

我尝试过不同的配置,但我很困惑。 我什至注释掉了一些行来缩短我的 SQL 语句,以解决发生的问题。

我的想法是阅读 Recordset 操作。 关于为什么会发生这种情况有什么想法吗?

sql ms-access
1个回答
0
投票

根据评论,您的目标似乎是使用表单控件来指定一组可以导出为 CSV 文件的数据。

在这种情况下,我建议有一个更简单的方法来解决这个问题。 创建引用表单控件的查询并使用 DoCmd.TransferText 导出查询。

这是我的简单查询,Query1,它仅引用一个表单控件,一个组合框:

SELECT t1.ID, t1.some_text, t1.Date_Time
FROM tblOne AS t1
WHERE t1.some_text=Forms!Form1!cboTextKey;

然后在我的表单的Cmd_SaveToFile命令按钮的单击事件过程中,我可以检查组合是否包含合适的值,如果包含则导出查询数据:

Private Sub Cmd_SaveToFile_Click()
    Const cstrQuery As String = "Query1"
    Dim strFolder As String
    Dim strFullPath As String

    If Len(Nz(Me.cboTextKey.Value, vbNullString)) = 0 Then
        ' the combo value is either Null or an empty string
        MsgBox "Control not filled out"
    Else
        ' the output CSV file will be in the same folder as the current
        ' database; and the file name will be the query name plus ".csv";
        strFolder = CurrentProject.Path & Chr(92)
        strFullPath = strFolder & cstrQuery & ".csv"
        DoCmd.TransferText acExportDelim, , cstrQuery, strFullPath, True
    End If
End Sub

因此,您需要扩展该示例以处理 3 个表单控件,并且可能需要更改文件名和位置逻辑。 但我仍然认为没有必要在每次运行代码时使用

Recordset
或创建或修改 SQL 语句。 只需创建一个命名查询并将其导出即可。

© www.soinside.com 2019 - 2024. All rights reserved.