Список форумов www.integro.ru www.integro.ru
ЦСИ ИНТЕГРО
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Как правильно создать таблицу?

 
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков
Предыдущая тема :: Следующая тема  
Автор Сообщение
Петр Кузнецов



Зарегистрирован: 21.07.2008
Сообщения: 9

СообщениеДобавлено: Ср 13 Авг 2008 11:09    Заголовок сообщения: Как правильно создать таблицу? Ответить с цитатой

Добрый день!

Я немного запутался, мне необходимо добавить(создать таблицу и записать данные) семантику ко вновь созданному слою, пишу так:

Код:

var
  aSemTab: IIngeoSemTable;
  aSemDBTab: IIngeoSemDbTables;
  aSemDBTable: IIngeoSemDbTable;
begin
    // -- Создать таблицу в БД --
    aSemDBTab:= FIngeo.ActiveDb.SemDbTables as IIngeoSemDbTables;
    aSemDBTable:= aSemDBTab.Add('tab1');

    // Добавить поля
    aSemDBTable.Fields.Add( 'iID_MO',  inftSmallInt,  0, 0, 0 );
    aSemDBTable.Fields.Add( 'sName_MO',inftString,   35, 0, 0 );
    aSemDBTable.Fields.Add( 'fFactor', inftFloat,     0, 0, 2 );
    aSemDBTable.Fields.Add( 'fFactor_step', inftFloat,     0, 0, 2 );
    aSemDBTable.Fields.Add( 'fF_step_col', inftFloat,     0, 0, 2 );

    // Добавить индексы
    aSemDBTable.Indexes.Add('iID_MO', 'iID_MO', inixPrimary);
{1} aSemDBTable.Update;

    // -- Сопоставить таблицу со слоем --
    aSemTab:= aNewLayer.SemTables.Add;
    aSemTab.Name:= 'Таблица1';
    aSemTab.SemDbTableName:= 'tab1';
    aSemTab.LinkType:= inltOneToOne;
{2} aSemTab.FieldInfos.Add('iID_MO','Поле 1','','','');
{3} aSemTab.FieldInfos.Add('sName_MO','Поле 2','','','');
{4} aSemTab.FieldInfos.Add('fFactor','Поле 3','','','');
{5} aSemTab.FieldInfos.Add('fFactor_step','Поле 4','','','');
{6} aSemTab.FieldInfos.Add('fF_step_col','Поле 5','','','');
    aSemTab.Update;

    // Добавить тестовые данные
{7}aSemTab.SemDbTable.InsertData
( 'iID_MO,sName_MO,fFactor,fFactor_step,fF_step_col','1001,"Строка",0.0,0.0,0.0', 0 );
{8}aSemTab.SemDbTable.Update;
end;


Код выполняется без ошибок, физические таблицы 'tab1.db', 'tab1.px', 'tab1.val' появляются

И еще вопросы по приведенному коду:

1. Таблица создается в строке {1} но при просмотре через проводник ИнГЕО нет системного(неизменяемого) поля ID.

2. При выполнении строк {2-6}, при просмотре через проводник ИнГЕО Наименования полей остаются типа 'sName_MO' а не 'Поле 2'

3. В строках {7,8} полагаю происходит добавление записи в таблицу, но при просмотре семантики через ИнГЕО('Показать окно свойств объекта') пораждается исключительная ситуация "000100026D1 Недопустимое значение для поля типа целое iID_MO"

4. тоже самое по п. 3 но через 'Показать табличные данные активного слоя' пораждается исключительная ситуация 'Table: Field 'ID' not found'
видимо согласуется с п.1.

Прошу помочь!
Заранее благодарен!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Петр Кузнецов



Зарегистрирован: 21.07.2008
Сообщения: 9

СообщениеДобавлено: Ср 13 Авг 2008 12:45    Заголовок сообщения: Ответить с цитатой

п.1 проблему решил, просто даю такое поле сначала:

Код:

aSemDBTable.Fields.Add( 'ID',  inftString,  12, 0, 0 );


и делаю его первичным индексом, тогда ингео его нормально считает системным...

п.2. снимается, все заработало после внесения изменений по п.1.

п.3, п.4. снимаются, соответственно

Однако появились другие проблемки:

Тестовый слой вместе с созданной таблицей удаляю из ИнГЕО, пишет таблица tab1 - занята, удалить все равно? говорю да! слой удаляется но физически таблица остается, естественно при запуске аддона в след раз пишет, что таблица существует.
Закрываю Ингео, удаляю вручную файлы таблицы, запускаю аддон, все равно пишет, "не могу создать таблицу, таблица tab1 - занята".

Я неправильно удаляю? Еще где-то в базе надо подправить? почему ингео "помнит" удаленные таблицы?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Ср 13 Авг 2008 20:41    Заголовок сообщения: Ответить с цитатой

На википедию добавлена статья - как правильно создавать семантические таблицы:

http://www.integro.ru/wiki/index.php?title=%D0%98%D0%BD%D0%93%D0%B5%D0%BE:API0003

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Петр Кузнецов



Зарегистрирован: 21.07.2008
Сообщения: 9

СообщениеДобавлено: Чт 14 Авг 2008 11:14    Заголовок сообщения: Ответить с цитатой

Спасибо, исправил свой код, однако проблема с 'Table is busy' осталась(см.мой пред. пост)

И еще вопрос теперь я вставляю в свою таблицу семантику
Код:

  anAddressTable.SemDbTable.InsertData( 'ID,Street,Number','"00010001320D","strrt",25', 0 );
  anAddressTable.Update;


запись появляется в таблице, вопрос: Как связать эту запись с обектом в слое? или как правильно добавить запись к объекту?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Чт 14 Авг 2008 14:04    Заголовок сообщения: Ответить с цитатой

На википедии добавлена статья - как правильно создавать пространственные объекты:

http://www.integro.ru/wiki/index.php?title=%D0%98%D0%BD%D0%93%D0%B5%D0%BE:API0002

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Динар



Зарегистрирован: 28.06.2009
Сообщения: 6

СообщениеДобавлено: Вс 28 Июн 2009 22:54    Заголовок сообщения: Ответить с цитатой

решил отписать тут, не создавая новой темы
вобщем нужно добавить новые поля уже в существующую таблицу

Код:
option explicit
sub field
dim i
for i=0 to application.activeprojectview.selectedlayerview.layer.semtables.count -1
application.activeprojectview.selectedlayerview.layer.semtables.item(i).semdbtable.fields.add "wera", inftString, 50, 0, 0
application.activeprojectview.selectedlayerview.layer.semtables.item(i).semdbtable.update
next
end sub


но поля не добавляются..что делать!
пысы: я человек еще "зеленый" в этом деле =)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
RuslanG



Зарегистрирован: 10.07.2005
Сообщения: 171
Откуда: ИНТЕГРО

СообщениеДобавлено: Ср 08 Июл 2009 14:35    Заголовок сообщения: Ответить с цитатой

Посмотрите обновленную статью Создание семантической таблицы слоя.
В вашем случае пригодится следующий код:
Код:
option explicit

sub AddFieldToAllTablesFrom(aLayerID, aFieldName, aFieldCaption)
   dim aLayer, aSemTable
   set aLayer = ActiveDb.LayerFromID(aLayerID)
   for each aSemTable in aLayer.SemTables      
      aSemTable.SemDbTable.Fields.Add aFieldName, inftString, 100, 0, 0
      aSemTable.FieldInfos.Add aFieldName, aFieldCaption, "", "", ""
      aSemTable.SemDbTable.Update
      aSemTable.Update
   next
end sub

dim aLayerId
aLayerId = ActiveProjectView.SelectedLayerView.Layer.ID
AddFieldToAllTablesFrom aLayerID, "wera", "вера"

_________________
С уважением, Руслан Гадеев
Видео уроки ИнГео
Документация ИнГео
Обновления ИнГео
Интегропедия
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Динар



Зарегистрирован: 28.06.2009
Сообщения: 6

СообщениеДобавлено: Ср 08 Июл 2009 18:34    Заголовок сообщения: Ответить с цитатой

спасибо большое, уже разобрался...решил приблизительно так как вы и написали =)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков Часовой пояс: GMT + 5
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете добавлять приложения в этом форуме
Вы можете скачивать файлы в этом форуме


© phpBB Group
Русская поддержка phpBB