我用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
我用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
不确定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
2D数组,其中一列包含数据库ID,另一列包含描述-如果您要在自定义登录表单上填充2列下拉列表/组合框,这是完美的选择想要一个。否则,您可以在Open
会话时对凭据进行硬编码:
session.Open "username","password","database ID",VBA.DateTime.Now,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
,
我这样连接sage50:
Option Explicit
Sub StartSage50()
Dim MyAppID
' --- Start sage50
MyAppID = Shell("C:\Program Files (x86)\Sage\Sage50\Lohn\Sage50Lohn.exe",1)
End Sub