  | 
				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 Откуда: ИНТЕГРО
  | 
		 | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		Петр Кузнецов
 
 
  Зарегистрирован: 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 Откуда: ИНТЕГРО
  | 
		 | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		Динар
 
 
  Зарегистрирован: 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 | 	  
 
 
но поля не добавляются..что делать! 
 
пысы: я человек еще "зеленый" в этом деле =) | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		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", "вера" | 	 
  _________________ С уважением, Руслан Гадеев
 
Видео уроки ИнГео
 
Документация ИнГео
 
Обновления ИнГео
 
Интегропедия | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		Динар
 
 
  Зарегистрирован: 28.06.2009 Сообщения: 6
 
  | 
		
			
				 Добавлено: Ср 08 Июл 2009 18:34    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				| спасибо большое, уже разобрался...решил приблизительно так как вы и написали =) | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять приложения в этом форуме Вы можете скачивать файлы в этом форуме
  | 
   
 
		 |