Я не знаю 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