RUS  ENG 

Создание таблицы в БД слоя

Страницы: 1
RSS
Создание таблицы в БД слоя
 
Пытаюсь создать таблицу, но метод CreateTable стабильно возвращает False
Вот тестовый код:

private void button2_Click(object sender, System.EventArgs e)
{
int idb = this.axMapCtrl1.Map.Layers.Active.Bases.Create("Byrky");

ZuluLib.BaseInfo inf = this.axMapCtrl1.Map.Layers.Active.Bases.get_ItemById(idb);

ZB.ZbDatabaseClass BD = new ZB.ZbDatabaseClass();

bool rs = BD.Open(inf.Name); // = True

bool res = BD.CreateTable("Byrky.db", new string[] {"Sys", "Descr"}, new int[] {3,3}, new int[] {0,0}, 1);

}

ZuluServer 6.0.0.3328
 
Метод CreateTable работает только с локальными таблицами.
Для создания таблицы на сервере можно воспользоваться методом CreateTableEx:

ZB.ZbTableDef tbldef = new ZB.ZbTableDefClass();
tbldef.AddField("Sys", zbFieldType.zbftInteger, 0, 0, true);
tbldef.AddField("Descr", zbFieldType.zbftString, 50, 0, false);

ZB.IZbTableInfo tblinf;
bool res = BD.CreateTableEx(null, "Byrky.db", tbldef, true, out tblinf);
 
Вот что нашла про функцию:
Public Overridable Function CreateTableEx(Optional ByVal Source As Object = Nothing, ByVal TableName As String, ByVal TableDef As ZB.ZbTableDef, Optional ByVal bAddToDatabase As Boolean = Nothing, Optional ByRef Table As ZB.IZbTableInfo = Nothing) As Boolean


Вызываю ее так:
Поля = ZuluLib.GetZBTypeByName("ZbTableDefClass");
Поля.AddField("Sys" , 3, 0, 0, true);
Поля.AddField("Descr", 1, 50, 0, false);

ОписаниеТаблицы = null;

Если НЕ БД.CreateTableEx(null, "Byrky.db", Поля, true, null) Тогда
Сообщить("Не удалось создать таблицу бирок!");
Возврат;
КонецЕсли;

Получаю в результате:
Ошибка при вызове метода контекста (CreateTableEx): Типы не совпадают (0)
 
Вызов функции я указал на C# - на чем был написан у Вас пример.
Судя по декларации функции - она на VB.NET, а используете в 1С?
Ошибка это скорее всего в том, как передаются параметры.
Первый параметр метода CreateTableEx имеет тип VARIANT.
Возможно 1С не приводит null к OLE-типу VARIANT.
Кроме того, последний параметр - ссылка (out) на IZbTableInfo.
1С такого по-моему тоже не понимает.
 
На сколько я понимаю, первый и последний параметры не обязательные, но вызов функции без них тоже выдает ошибку, т.е. вызываю так:
БД.CreateTableEx(, "Byrky.db", Поля, true, ) , но ошибка выходит такая же
 
Глубоко 1С мы не знаем, чтобы точно подсказать как правильно указывать параметры по правилам 1С.
В первом параметре можно указать либо какую-либо пустую переменную, допустимо также указать пустую строку.
С последним параметром сложнее. Тип его - [out] IZbTableInfo ** (синтаксис IDL/ODL), т.е. out ссылка на IZbTableInfo.
Насколько я понимаю из наших прошлых исследований, 1С не умеет передавать по ссылке переменную не базового типа (тоже самое было с методом QueryByExample). Возможно придется также как и для метода QueryByExample сделать оболочку для вызова этого метода.
 
Ок, в длл прописала создание таблицы, теперь не могу создать основной запрос

БД.CreateBySingleTable("Byrky.db") возвращает False
 
CreateBySingleTable - старый метод для быстрого создания описателя по локальной таблице. Для работы с сервером не годится. Запрос по созданной таблице добавить в базу можно так:
//В продолжение к моему примеру ранее, после строк
ZB.IZbTableInfo tblinf;
bool res = BD.CreateTableEx(null, "Byrky.db", tbldef, true, out tblinf);

далее:

// Добавляем с базу запрос
ZB.IZbQueryInfo qryinf;
qryinf = BD.Queries.AddNew(ZB.zbQueryType.zbqtVisualQuery, "Основной");

ZB.IZbVisualQuery visqry;
visqry = qryinf.VisualQuery;

// Добавляем таблицу в запрос
ZB.IZbTableRef table;
table = visqry.Tables.Add(tblinf, true);

// Задаем поле связи
visqry.SetBaseField(table, "Sys");

// Для всех полей, кроме первого (Sys) - добавляем поля в запрос
for (int i = 1; i < tbldef.FieldCount; i++)
{
ZB.IZbFieldInfo field;
field = visqry.AddField(table, tbldef.get_FieldName(i));
// Здесь можно каждое поле настроить (польз.имя и т.п.)
}

// В конце сохраняем базу
BD.Save(0);
 
а вот это обязательно:

// Добавляем таблицу в запрос
ZB.IZbTableRef table;
table = visqry.Tables.Add(tblinf, true);

метод CreateTableEx вызывался с флагом добавления таблицы в БД
 
Да, все правильно. CreateTableEx создала таблицу и добавила в базу (т.е. ее можно увидеть в разделе Таблицы). visqry.Tables.Add() добавляет эту таблицу в конкретный запрос (каждая таблица может входить в несколько запросов и запросы могут содержать несколько ссылок на таблицы, в том числе несколько ссылок на одну и ту же таблицу).
 
Сделала по вашему примеру, вот такая ошибка:
Метод объекта не обнаружен (AddNew)
qryinf = БД.Queries.AddNew(1, "Основной");

Смотрю справку у ZbDatabase.Queries действительно нет такого метода
 
Метод AddNew есть в библиотеке, хотя и не описан (исправим). Также как и метод IZbTableRefs.Add.
Вы и сами в этом можете убедиться, добавив эти строчки в Ваш пример на C#. Он работает.
1С напрямую использует библиотеку типов (TypeLib), зарегистрированную с системе ? Или же генерит какую-либо обертку над используемой внешней библиотекой? Если второе, то возможно требуется обновить("переимпортировать") ссылку на Zb.dll.
Страницы: 1