-1

我使用 VBA 代码连接到 sage50 并且应用程序启动 - 没问题。但随后系统要求输入用户名和密码。如何通过 VBA 代码提交此值?

我像这样连接 sage50:

Option Explicit

Sub StartSage50()
    Dim MyAppID
    ' --- Start sage50
    MyAppID = Shell("C:\Program Files (x86)\Sage\Sage50\Lohn\Sage50Lohn.exe", 1) 

' -

End Sub
4

2 回答 2

0

不确定 Sage50 是否使用与 Sage 300 相同的 COM API,但如果是,您需要添加对AccpacCOMAPI类型库的引用。

要连接到 Sage,您需要创建一个AccpacSession对象:

Dim session As AccpacCOMAPI.AccpacSession
Set session = New AccpacCOMAPI.AccpacSession

然后你需要调用它的Init方法:

'Application ID "XY" is reserved for non-SDK applications to use.
Const NonSDKAppId As String = "XY"
Const ProgramName As String = NonSDKAppId & "9999"
Const AppVersion As String = "01A"

session.Init vbNullString, NonSDKAppId, ProgramName, AppVersion

从那里您可以获得可用的组织(Sage 数据库),如下所示:

Dim orgs As Collection
Set orgs = New Collection

Dim index As Long
Dim org As AccpacCOMAPI.AccpacOrganization

For index = 0 To session.Organizations.Count - 1
    With session.Organizations.ItemByIndex(index)
        If .Type = AccpacCOMAPI.ORG_COMPANY Then orgs.Add Array(.DatabaseID, .Name)
    End with
Next

ReDim organizations(0 To orgs.Count - 1, 0 To 1)
Dim itemIndex As Long
Dim item As Variant
For Each item In orgs
    organizations(itemIndex, 0) = item(0)
    organizations(itemIndex, 1) = item(1)
    itemIndex = itemIndex + 1
Next

现在您有一个organizations二维数组,其中一列中包含数据库 ID,另一列中包含描述 - 如果您需要,这非常适合在自定义登录表单上填充 2 列下拉/组合框。Open否则,您可以在会话时对您的凭据进行硬编码:

session.Open "username", "password", "database ID", VBA.DateTime.Now, 0, vbNullString

最后一步是打开DbLink

Dim dblink As AccpacCOMAPI.AccpacDBLink
Set dblink = session.OpenDBLink(AccpacCOMAPI.DBLINK_COMPANY, AccpacCOMAPI.DBLINK_FLG_READWRITE)

从那里开始,您就可以开始了!

Debug.Assert session.IsOpened '<~ should be true now
于 2019-12-19T16:32:42.087 回答
0

我像这样连接 sage50:

Option Explicit

Sub StartSage50()
    Dim MyAppID
    ' --- Start sage50
    MyAppID = Shell("C:\Program Files (x86)\Sage\Sage50\Lohn\Sage50Lohn.exe", 1) 
End Sub
于 2019-12-19T17:16:48.073 回答