Главная | О сайте | ROM-Mail | Форум | Статьи | Программы | OLAP | Ссылки |
|
||||||||||||||
Проблема установки значения DSO-объектам из среды 1С и пути ее решения.
При использовании DSO (Decision Support Objects) из среды программы 1С:Предприятие 7.7 мы сразу же сталкиваемся с проблемой ограничений 1С при работе с OLE-объектами. Дело в том, что из среды 1С можно изменить/установить только свойства OLE-объекта, имеющие базовый тип (строка, число, дата). В случае же, если в качестве значения свойству необходимо установить ссылку на другой OLE-объект мы имеем проблему.Рассмотрим следующий пример...
// создаем объекты средствами DSO
dso=СоздатьОбъект("DSO.Server");
dso.Connect
("LocalHost");
// создаем новую базу данных
NewDatabase=dso.MDStores.AddNew("NewDatabase");
// создаем новый источник данных
NewDatasource=NewDatabase.DataSources.AddNew("NewDatasource");
NewDatasource.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\Program Files\Microsoft Analysis Services\Samples\FoodMart
2000.mdb;JET OLEDB:SFP=True;";
NewDatasource.Update();
// создаем новое измерение
NewDimension=NewDatabase.Dimensions.AddNew("NewDimension");
До этого момента все шло вполне нормально. Но уже следующая строка вызовет исключительную ситуацию,
(DSO: Object doesn't support this action)
т.к. среда 1С не позволяет присвоить ссылку на объект
NewDimension.Datasource=NewDatasource;
Суть проблемы заключается в "неумении" увеличить счетчик ссылок на объект, т.к. в 1С нет оператора подобного например, оператору Set в Visul Basic или аналогичных операторов в других языках программирования.
Обойти вышеизложенное ограничение 1С можно несколькими способами. Например, написать внешнюю компоненту, которая будет выполнять "правильное" присвоение значения или же реализовать задачу в другой программной среде (Visual Basic, Delphi, Visual C++). Однако, такое решение подойдет не всем, поэтому рассмотрим альтернативное решение проблемы. В качестве инструмента нам будут необходимы библиотеки V7Plus.dll от фирмы "1С", 1cpp.dll от Дмитрия Гусева aka Deb и класс "OLAPSupport" (описание, реализация) для 1С++ написанный мной.
// создаем объекты средствами DSO
dso=СоздатьОбъект("DSO.Server");
dso.Connect
("LocalHost");
// создаем новую базу данных
NewDatabase=dso.MDStores.AddNew("NewDatabase");
// создаем новый источник данных
NewDatasource=NewDatabase.DataSources.AddNew("NewDatasource");
NewDatasource.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\Program Files\Microsoft Analysis Services\Samples\FoodMart
2000.mdb;JET OLEDB:SFP=True;";
NewDatasource.Update();
// создаем новое измерение
NewDimension=NewDatabase.Dimensions.AddNew("NewDimension");
//NewDimension.Datasource=NewDatasource;
// предыдущая строка как мы уже знаем вызовет исключительную ситуацию,
поэтому пропустим установку атрибута
NewDimension.FromClause="product";
NewDimension.JoinClause="";
NewLevel=NewDimension.Levels.AddNew("NewLevel");
NewLevel.MemberKeyColumn = """product"".""brand_name""";
NewLevel.ColumnSize = 255;
NewLevel.EstimatedSize = 1;
NewDimension.Update();
// установим атрибут Datasource с помощью класса OLAPSupport
dsoSupport=СоздатьОбъект("OLAPSupport");
dsoSupport.Подключиться();
Db=dsoSupport.ПолучитьОбъект("NewDatabase","Database",);
Dimension=dsoSupport.ПолучитьОбъект("NewDimension","Dimension",Db);
Dimension.ДобавитьСвойство("DataSource","NewDatasource");
dsoSupport.Записать(Dimension);
Проверяем результат, атрибут успешно установлен.