На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается для обсуждения вопросов использования баз данных, за исключением составления запросов на SQL. Для этого выделен специальный раздел. Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Chow, Bas, MIF
  
> Delphi+BDE. Создание числовых полей
    Я не понял. Создаю объект TTable. Выставляю параметры в Инспекторе объектов:
      TableType:=ttFoxPro
      FieldDefs[0]:
            Name:=SID
            DataType:=ftWord
      FieldDefs[1]:
            Name:=FNAME
            DataType:=ftString
            Size:=20
    Запускаю. В рантайме делаю CreateTable. В *.dbf создаются поля N(6) и C(20). В инспекторе делаю <Fields->Add All Fields>. Что я вижу?
      FieldDefs[0]:
            Name:=SID
            DataType:=ftFloat <<--!!
      FieldDefs[1]:
            Name:=FNAME
            DataType:=ftString
            Size:=20
    То же самое происходит если DataType:=ftSmallInt, ftInteger, любое целочисленное. Хоть я проставляю тип полей в инспекторе, хоть в рантайме через AddFieldDef. Все равно формируется поле типа "N", которое делфи считает вещественным.
    А потом в рантайме появляется ексепт: что-то типа "Float отсутствует, actual Integer".
    Далее. Если создаю *.dbf в Fox'e, поля при загрузке в инспекторе числовые поля также коверкаются. Кроме Integer. Но и с Integer беда. Если создаю новую таблицу (CreateTable'ом), то вместо поля I(4) /как было после Fox'a/, появляется N(11).
    Помню долбался с этим в 5 делфи. И тогда либо после создания нового файла правил байты в заголовке, либо вообще создавал файл "вручную". Делфи-то их понимал(а,о ?) как надо. Но почему бы не создать сразу как просят? Причем проблема почему-то только с числовыми полями, остальные создаются нормально.
    О, еще вспомнил (насчет править "ручками"). Были проблемы с удалеными *.cdx. Если в заголовке прописано, что должен быть индекс, а его нет, то BDE открывать файл отказывался (т. е. и реиндекс сделать не мог). Самое простое, что удалось придумать - обнулять 28 байт. Есть способ лучше?
    ВОПРОС: Как заставить BDE делать ТРЕБУЕМУЮ структуру таблиц (числовые поля)? И , может кто знает, как отсоединить отсутсутствующий индексный файл программно (не копаясь в заголовке *.dbf)?
      Используй кверю "Create Table" - работает корректнее и типы делает именно такие как ты укажешь, так как выполнять будет драйвер напрямую, а не через трансляцию через VCL.
        Цитата Vit, 18.03.03, 17:13:43
        Используй кверю "Create Table" - работает корректнее и типы делает именно такие как ты укажешь, так как выполнять будет драйвер напрямую, а не через трансляцию через VCL.


        Может я не так понял, но попробывал так:

        Var DBPath:ShortString;
        ........

        Procedure CreatTWithSQL(MyTable:TTable);
        Var
           MyQry:TQuery;
        Begin
        ...
         MyTable.DatabaseName:=DBPath;
         If Not(MyTable.Exists) Then
           Begin
             MyQry:=TQuery.Create(nil);
             MyQry.DatabaseName:=DBPath;
             MyQry.SQL.Clear;
             MyQry.SQL.Add('CREATE TABLE '+MyTable.TableName+'.dbf');

        //        MyQry.SQL.Add('(SID INTEGER NOT NULL,');
        //        MyQry.SQL.Add('FNAME CHAR(20) CHARACTER SET WIN1251 COLLATE PXW_CYRL);');

             MyQry.SQL.Add('(SID INTEGER,');
             MyQry.SQL.Add('FNAME CHAR(20));');
             MyQry.ExecSQL;
             MyQry.Free;
           End;
        ...
        End;

        Если пишу "MyQry.SQL.Add('CREATE TABLE '+MyTable.TableName+'.dbf')", то ВСЕГДА создается файл с именем "dbf.DD" независимо от TableName  (у MyTable стоит TableType:=ttFoxPro и расширение в TableName не укзано),
        а если пишу "MyQry.SQL.Add('CREATE TABLE '+MyTable.TableName)", то создается файл "<TableName>.DD" (т. е. имя правильное, но файл Paradox, а мне надо Foxpro), .
        Я подозреваю, что PARADOX получается от того, что DEFAULT DRIVER в BDE - это PARADOX.
        Как создать файл Foxpro не меняя DEFAULT DRIVER в BDE? Или Vit не то имел ввиду, говоря "Используй кверю"?

          У меня вот это в Д6 работает
          CurrentDir := GetCurrentDir();
          with TableRadio do begin
            Active := False;
            DatabaseName := CurrentDir;
            TableName := 'SpisRadio';
            TableType := ttFoxPro;
            with FieldDefs do begin
               Clear;
               Add('LS',ftString,6,False);
               Add('FIO',ftString,30, False);
               ...
             end;
             CreateTable;
           end;
            Ты присваиваешь путь, а надо Alias. Что в параметрах Alias будет стоять, такой тип и создаст кверя. Alias в данном случае должен иметь параметры:  Type=Standard, Default Driver = FOXPRO (можно попробовать использовать и DSN от ODBC - его тоже в Run-time при желании можно создать, а работать с ним через BDE). Через объект session можешь легко создать временный Alias и его использовать, по завершении сессии этот Alias автоматически прекратит существование.
            Сообщение отредактировано: Vit -
              priklad'у:
              Цитата priklad, 19.03.03, 14:43:08
              У меня вот это в Д6 работает
              ...
                   Clear;
                   Add('LS',ftString,6,False);
                   Add('FIO',ftString,30, False);
                   ...
                 end;
                 CreateTable;
               end;


              Неужели из ftString ftInteger получится? Попробую.

              Vit'у:
              В том то и дело, что не люблю я алиасы. Помню как-то давно мучился и что-то до сих к ним предубеждение. Возможно, я не прав. Все равно спасибо! То-же попробую.

              Пока ждал ответ с форума, поковырял BDE API и порешал проблему через DbiCreateTable.
              Довольно гибкие параметры передаются в эту функцию. Всё, что хотел - получается!
              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0230 ]   [ 14 queries used ]   [ Generated: 18.05.24, 17:22 GMT ]