Использование access vba для передачи входа через переменные для автоматизации входа в Sage Line 50 ver20
Так что мне удалось подключить Sage к моей базе данных доступа, и это здорово, но каждый раз, когда я закрываю базу данных и открываю ее снова, мне приходится снова входить в систему вручную, есть ли способ сохранить эти данные в 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
2 ответа
Я не знаю Sage 50, но я работал с Sage 300 API, который, вероятно, похож; Вы можете / должны хранить экземпляр вашего сеанса Sage и поддерживать его в течение всего времени, пока вам нужно соединение Sage.
Интерфейс сеанса, с которым я работал, необходимо инициализировать, а затем открыть; ваш код должен содержать дескриптор строки, appID, имя программы и версию приложения для инициализации, а затем, когда вы открываете сеанс, вам нужны ID пользователя, пароль и имя базы данных.
Вот интерфейс оболочки C#, который я использую (ссылаясь на COM API Sage), который показывает, как передаются значения:
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