Использование доступа 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

person P.Harrison    schedule 15.06.2016    source источник
comment
*потому что мне нужно войти в систему только один раз за сеанс, если это правильный термин   -  person P.Harrison    schedule 15.06.2016
comment
покажите строку подключения и код подключения   -  person dbmitch    schedule 15.06.2016
comment
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 успешно открыт rs.Close sagedb.CloseSet rs = Nothing   -  person P.Harrison    schedule 16.06.2016
comment
Вы можете отредактировать свой пост и ввести этот тип информации между тегами кода, чтобы всем было легче увидеть и оценить.   -  person dbmitch    schedule 16.06.2016


Ответы (2)


Я не знаю Sage 50, но я работал с Sage 300 API, который предположительно похож; вы можете/должны сохранить экземпляр вашего сеанса Sage и поддерживать его в рабочем состоянии до тех пор, пока вам нужно активное соединение Sage.

Интерфейс сеанса, с которым я работал, должен быть инициализирован, а затем открыт; ваш код должен предоставить строковый дескриптор, appID, имя программы и версию приложения для инициализации, а затем, когда вы открываете сеанс, вам нужен идентификатор пользователя, пароль и имя базы данных.

Вот интерфейс оболочки С#, который я использую (ссылаясь на 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, все работает; начните с того, чтобы заставить работать жестко закодированные учетные данные, а затем разработайте стратегию их параметризации.

person Mathieu Guindon    schedule 15.06.2016
comment
Спасибо, Мэт, я посмотрю и попробую некоторые из ваших предложений. я думаю, что строка подключения будет работать: DSN=SageAccountsVer20;uid=xxx;pwd=xxx; кажется, что я видел много. Я буду держать вас в курсе, как я получаю действительно ценю помощь. - person P.Harrison; 16.06.2016

Это может объяснить, почему вы каждый раз запрашиваете информацию для входа. Я думаю, вы используете два открытия, но только одно связано с вашей строкой 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
person dbmitch    schedule 16.06.2016