【问题标题】:Is it possible to send off info row by row from Access to QuickBooks?是否可以从 Access 到 QuickBooks 逐行发送信息?
【发布时间】:2019-01-10 13:51:44
【问题描述】:

目前我有以下代码,可让我将值插入 QuickBooks 中的特定字段。

我正在尝试将表格中的字段逐行添加到 QuickBooks 中: 见图片前:

例子:

在每一行的末尾有一列用于将条目发送到 QuickBooks。如何修改我的代码以使此功能正常工作?

Public Sub exampleInsert()
Const adOpenStatic = 3
Const adLockOptimistic = 3

Dim oConnection
Dim oRecordset
Dim sMsg
Dim sConnectString
Dim sSQL

sConnectString = "DSN=Quickbooks Data;OLE DB Services=-2;"
sSQL = "Insert into customer (Name, FullName, CompanyName) values ('Testing VB', 'Full Name', 'Test Company Name')"
Set oConnection = CreateObject("ADODB.Connection")
Set oRecordset = CreateObject("ADODB.Recordset")
oConnection.Open sConnectString
oConnection.Execute (sSQL)
sMsg = sMsg & "Record Added"
MsgBox sMsg


Set oRecordset = Nothing
Set oConnection = Nothing
End Sub

更新:

我补充说:

sConnectString = "DSN=Quickbooks Data;OLE DB Services=-2;"
sSQL = "Insert into customer (Name, CompanyName) Select Num, Description From TestTable"
Set oConnection = CreateObject("ADODB.Connection")
Set oRecordset = CreateObject("ADODB.Recordset")
oConnection.Open sConnectString
oConnection.Execute (sSQL)
sMsg = sMsg & "Record Added"
MsgBox sMsg

但我收到错误“无效的表名:TestTable”我怎样才能让这个 SQL 脚本查看我的 Access 表?

【问题讨论】:

  • 你的代码现在可以工作了吗(因为硬编码的值被发送到 QuickBooks)?如果是这样,您只需更新查询以添加表单值。
  • 我可以在我的代码中添加什么来从我的表单值中添加信息?
  • 好的,我已经添加了一些东西,但现在我遇到了错误。可以看看吗?
  • 为什么不将linked tables 与您的 OLE DB Quickbooks DSN 一起使用?

标签: sql vba ms-access


【解决方案1】:

要将表单的当前记录值添加到您的查询中,您只需拉取值(例如Me.txtDescription)。我建议您使用ADODB.Command 对象,这样您就可以参数化您的 SQL 并避免 SQL 注入:

Option Explicit

Const adOpenStatic As Integer = 3
Const adLockOptimistic As Integer = 3
Const CONNECTION_STRING As String = "DSN=Quickbooks Data;OLE DB Services=-2;"

Private Sub Command10_Click()
    Dim cn As ADODB.Connection
    Dim cmd As ADODB.Command
    Dim param As ADODB.Parameter
    Dim sMsg As String

    ' set up ADODOB connection
    Set cn = New ADODB.Connection
    cn.Open CONNECTION_STRING 

    ' set up ADODB command object
    Set cmd = New ADODB.Command
    cmd.ActiveConnection = cn

    ' note that we're using unnamed parameters,
    ' with the ? symbol
    cmd.CommandText = _
            "INSERT INTO customer " & _
            "(Name, CompanyName) " & _
            "VALUES " & _
            "(?, ?)"

    ' add form values as command parameters
    cmd.Parameters.Append cmd.CreateParameter( _
            Type:=adVarChar, _
            Size:=255, _
            value:=Me.txtNumber)

    cmd.Parameters.Append cmd.CreateParameter( _
            Type:=adVarChar, _
            Size:=255, _
            value:=Me.txtDescription)

    ' now that we have the command set up with its params,
    ' we can just execute it:
    cmd.Execute

    sMsg = "Record Added"
    MsgBox sMsg

    Set param = Nothing
    Set cmd = Nothing
    cn.Close: Set cn = Nothing
End Sub

当然,您必须使用文本框的实际名称。

另外,请注意我对您的原始代码所做的一些额外修改:

  • 我定义了Option Explicit。你的代码中可能已经有这个,但如果没有,你需要它。这样,任何使用的变量都必须声明。有关详细信息,请参阅Microsoft Docs
  • 我将您的ADODB 常量移到了您的子目录之外。理想情况下,您可以使用早期绑定并添加 ADODB 库引用(因此您不需要自己定义这些),或者将它们添加到单独的模块中,这样您就可以在任何表单中使用它们。
  • 我还把你的连接字符串作为一个常量添加到了你的 sub 之外。同样,这可能应该在一个单独的模块中(例如modConstants),您可以从项目中的任何位置轻松引用。
  • 我改进了代码的缩进。
  • 我为您的声明明确添加了类型(Dim sSQL as String 而不仅仅是Dim sSQL)。请注意,如果您声明一个没有类型的变量,它默认为 Variant 类型,而不是 String(您想要的)。请参阅Microsoft Docs 了解更多信息。

【讨论】:

  • 现在我收到错误编译错误:未定义用户定义类型
  • @Daniel:你必须add the ADODB references(或切换到后期绑定)
  • 我已经定义了 ADODB 引用,但我现在收到与 cn.Open sConnectString 被突出显示的相同错误
  • @Daniel:您的sConnectstring 是定义为字符串还是变体(即Dim sConnectionString,没有类型)?
  • 我更新了我的答案:如果您更改为 CONNECTION_STRING 常量,您将不得不使用它:cn.Open CONNECTION_STRING
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多