[英]Using access vba to pass the login via variables to automate the login to Sage Line 50 ver20
因此,我設法將 Sage 連接到我的 Access 數據庫,這很棒,但是每次我關閉數據庫並再次打開它時,我都必須再次手動登錄,是否可以將這些數據存儲在 Access 中? 無論是通過變量還是表,因為顯然訪問可以將登錄信息保存在某處,因為我只需要登錄一次。
編輯 - 添加登錄連接詳細信息
Sub login_Click()
Dim sagedb As Database
Dim accessdb As Database
Dim rs As Recordset
Dim strConnect As String
Set sagedb = OpenDatabase("Directory")
strConnect = "DSN=SageAccountsVer20;uid=xxx;pwd=xxx;"
Set accessdb = OpenDatabase("", False, False, strConnect)
accessdb.Close
Set accessdb = Nothing
Set rs = sagedb.OpenRecordset("dbo_authors")
Debug.Print rs(0)
Debug.Print "Recordset Opened Successfully"
rs.Close
sagedb.Close
Set rs = Nothing
我不知道 Sage 50,但我使用過 Sage 300 API,這大概是相似的; 您可以/應該存儲 Sage 會話的實例,並在需要 Sage 連接時保持活動狀態。
我使用過的會話接口需要初始化,然后打開; 你的代碼需要提供一個字符串句柄、一個appID、一個程序名和一個要初始化的應用程序版本,然后當你打開會話時你需要一個用戶名、一個密碼和一個數據庫名。
這是我正在使用的 C# 包裝器接口(參考 Sage 的 COM API),它顯示了值是如何傳遞的:
public interface ISession : IDisposable
{
void Init(string handle, SageAppInfo info);
void Open(SageCredential credential, DateTime timestamp, int flags = 0);
IDbLink OpenDbLink(DBLinkType type, DBLinkFlags flags);
IEnumerable<string> Errors { get; }
}
public class SessionWrapper : ISession
{
private readonly ISessionComInterop _session;
public SessionWrapper(ISessionComInterop session)
{
_session = session;
}
public void Init(string handle, SageAppInfo info)
{
_session.Init(handle, info.AppId, info.ProgramName, info.AppVersion);
}
public void Open(SageCredential credential, DateTime timestamp, int flags = 0)
{
_session.Open(credential.UserId, credential.Password, credential.DatabaseName, timestamp, flags);
}
public IDbLink OpenDbLink(DBLinkType type, DBLinkFlags flags)
{
return new DbLinkWrapper(_session.OpenDBLink(type, flags));
}
public IEnumerable<string> Errors
{
get
{
for (var i = 0; i < _session.Errors.Count; i++)
{
yield return string.Format("[{0}] {1} ({2})", _session.Errors[i].Code, _session.Errors[i].Message, _session.Errors[i].Source);
}
}
}
public void Dispose()
{
_session.Dispose();
}
}
當然,VBA 實現會大不相同,但重要的部分是:
_session.Open(credential.UserId, credential.Password, credential.DatabaseName, timestamp, flags);
我的調用代碼如下所示:
_session.Init(string.Empty, _info);
_session.Open(_credential, DateTime.Now);
_db = _session.OpenDbLink(DBLinkType.Company, DBLinkFlags.ReadWrite);
因此,讓您的代碼提供UserId
、 Password
、 DatabaseName
、時間戳以及您需要的任何DBLinkFlags
; 您的 VBA 代碼可能如下所示:
mySession.Open APP_USERID, APP_PWD, APP_TESTDB, Now, DBLinkFlags.ReadWrite
其中mySession
是一個全局對象變量,那么APP_USERID
來自何處完全取決於您。 在.Open
調用中對它們進行硬編碼,使它們成為代碼中的常量,或者使它們成為代碼中的變量並將值存儲在您的 Access 數據庫或外部 xml 配置文件中,任何事情都可以; 首先讓硬編碼憑證工作,然后找出一個策略來參數化它們。
這可能解釋了為什么每次都會提示您輸入登錄信息。 我認為您正在使用兩個打開 - 但只有一個與您的 connxn 字符串連接。
這工作更好嗎?
Dim sagedb As Database
Dim rs As Recordset
Dim strConnect As String
strConnect = "DSN=SageAccountsVer20;uid=xxx;pwd=xxx;"
Set sagedb = OpenDatabase("Directory", False, False, strConnect)
Set rs = sagedb.OpenRecordset("dbo_authors")
Debug.Print rs(0)
Debug.Print "Recordset Opened Successfully"
rs.Close
sagedb .Close
Set sagedb = Nothing
sagedb.Close
Set rs = Nothing
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.