Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.05.2011, 11:21
VINCENT VINCENT вне форума
Прохожий
 
Регистрация: 03.09.2010
Сообщения: 16
Репутация: 12
По умолчанию Макроподстановка или кто как посоветует

подскажите советом

хочу сделать создание таблицы бд *.dbf по определенной схеме

схем для формирования бд ,допустим несколько схем хронятся в таблице настроек NSI

программа обрабатывает таблицу NSI и исходя из нее будет уже формировать бд *.dbf

Сложность заключается в коде для создания *.dbf например
Код:
  
      //begin
      // Add('t_ls', ftInteger,0,false);
      // Add('t_odt', ftDate,0,false);
      // Add('t_osm', ftInteger,0,false);
      // Add('t_key', ftString,20,false);
      // CreateTable;
      //end;
как видно из примера идет создание таблицы с 4 полями если схема будет с 5 полями тогда обработку создания таблицы нужно писать еще одну. и тд.
есть ли возможность макроподстановки кода предаварительно записав его в переменную , чтобы реализовать динамический рост параметров созздания таблицы.
Если есть другой метод решения данной задачи внимательно выслушаю
Ответить с цитированием
  #2  
Старый 26.05.2011, 14:55
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Делать можно двумя путями. Через методы Table или написав динамический SQL запрос. В обоих случаях будет обход таблицы описания. Например:
Код:
for i := 0 to Length(NSI)-1
do Add(NSI[i].Fieldname,NSI[i].DataType,NSI[i].Length,false);
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 26.05.2011, 14:57
Janom Janom вне форума
Начинающий
 
Регистрация: 04.02.2011
Адрес: Москва
Сообщения: 148
Версия Delphi: 7
Репутация: 133
По умолчанию

Код:
Повтор Удален
Ответить с цитированием
  #4  
Старый 27.05.2011, 16:01
VINCENT VINCENT вне форума
Прохожий
 
Регистрация: 03.09.2010
Сообщения: 16
Репутация: 12
По умолчанию

получился вот такой простатит
Код:
procedure TForm1.Create_out_file;
var
integ : Tfieldtype;
begin
  ADO_NSi_Query.Close;
  ADO_NSi_Query.sql.clear;
  ADO_NSi_Query.SQL.add('select '+fiel+' from NSI where (mask_point='''+masks+''')');
  ADO_NSi_Query.Active:= true;
  tm:=0;
  counter:=0;
  while counter < ADO_NSi_Query.FieldCount do           //выкидываем пустые значения и счетаем количество записей
  begin
    if  ADO_NSi_Query.Fields[counter].AsString <> '' then
    begin
      tm:= tm+1;
      counter:=counter+1;
    end
    else
    begin
      counter:=counter+1;
    end;
  end;
   edit3.Text:= inttostr(tm); //проверка
  with TTable.Create(nil) do
  begin
    ADO_CFG_Query.Close;
    ADO_CFG_Query.sql.Clear;
    ADO_CFG_Query.sql.add('select PATH_TO_OUT_FILES from NSI where MASK_POINT= ('''+masks+''') ');
    ADO_CFG_Query.Active:=true;
    DatabaseName:= ADO_CFG_Query.Fields[0].AsString;  //(* alias *)
    ADO_CFG_Query.sql.Clear;
    ADO_CFG_Query.Close;
    TableName:= r[0]+r[1]+r[2]+r[3]+r[4]+r[5];
    TableType     := ttFoxPro;
    if TableName = '' then
    begin
      showMessage('!!!!!!!!!!!!!!!!!!!!!');
    end
    else
    begin
      with FieldDefs do
      begin
        counter:=0;
        counter1:=2;
        counter2:=3;
        while counter < tm do
        begin
          if ADO_NSi_Query.Fields[counter1].AsString = 'FTInteger' then
          begin
            integ:= FTInteger;
          end;
          if ADO_NSi_Query.Fields[counter1].AsString = 'FTString' then
          begin
            integ:= FTString;
          end;
          if ADO_NSi_Query.Fields[counter1].AsString = 'FTDate' then
          begin
            integ:= FTDate;
          end;
          Add(ADO_NSi_Query.FieldsAdd(ADO_NSi_Query.Fields[counter].AsString,integ,ADO_NSi_Query.Fields[counter2].AsInteger,false);
          counter:= counter+4;
          counter1:= counter1+4;
          counter2:= counter2+4
        end;
      CreateTable;
      ADO_NSi_Query.sql.clear;
      ADO_NSi_Query.Close;
      ADO_CFG_Query.sql.Clear;
      ADO_CFG_Query.Close;
      end;
    end;
  end;
end;
сделал так потомучто не могу понять если я поставлю в код
Add(ADO_NSi_Query.FieldsAdd(ADO_NSi_Query.Fields[counter].AsString,ADO_NSi_Query.Fields[counter1].DataType,ADO_NSi_Query.Fields[counter2].AsInteger,false);
создает таблицу и делает тип полей почемуто строковое.
или он так делает так как берет параметр из структуры базы NSI?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:39.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025