Тип поля таблицы БД

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
gritv
Посетитель
Сообщения: 34
Зарегистрирован: 09 авг 2005, 18:42
Откуда: Воронеж

Тип поля таблицы БД

Сообщение gritv »

Подскажите, кто знает, функцию для определения типа поля таблицы базы данных.
Deinis
Местный житель
Сообщения: 783
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва
Контактная информация:

Re: Тип поля таблицы БД

Сообщение Deinis »

gritv писал(а):Подскажите, кто знает, функцию для определения типа поля таблицы базы данных.
В общем взял я за основу исходник функции, выложенный на этом форуме. Правда, тот постинг был давно (еще до перевода форума на новый движок) и возможно уже потерялось (я его сам не нашел, хотел дать ссылку).
Поэтому привожу свой пример, правда из так и не законченного проекта

Код: Выделить всё

            IF ( GetFirst X$Files = tsOK ) // позиционирование на таблицу
              { // Message('X$Files.XF$Name="'+X$Files.XF$Name+'"') ;
                // создадим файл и получим его дескриптор (который не должен быть равен 0 !!!)
                hDBF := DBFOpen( FileName , stCreate ) ;
                IF ( hDBF = 0 )
                  then { // если возникла какая-то ошибка
                         Message('Ошибка создания DBF-файла "' + FileName + '"'#13 + 'Работать дальше отказываюсь!!!' , Error );
                         Abort ;
                       }
                  else { // если ошибок не было
                         // цикл по полям подцепленной таблицы
                         _Loop X$Fields
                            {
                              Var CurDBFDataType : integer ;
                              CurDBFDataType := 0 ; // значение по умолчанию
                              CurDBFDataType := GetDBFDataType(X$Fields.XE$DataType) ;
                              IF ( CurDBFDataType <> 0 )
                                then DBFAddField( hDBF , X$Fields.XE$Name ,  CurDBFDataType , X$Fields.XE$Size , GetDBFQuant(X$Fields.XE$DataType) ) ;
                                else {
                                       Message('ОШИБКА!!! Мне неизвестен тип данных №"' + string(X$Fields.XE$DataType) + '" поля '
                                               + '"' + X$Fields.XE$Name + '" (' + X$Fields.XE$Title + ')' +
                                               + ' таблицы "' + X$Files.XF$Name + '" (' + X$Files.XF$Title + ')'
                                               + ' в БД "Галактика!!!"' , Error) ;
                                       Message('Дальше работать отказываюсь!!! Обратитесь к разработчику интерфейса!!!' , Warning) ;
                                       Abort ;
                                     }
                            } // _Loop X$Fields
!                         DBFClose(hDBF) ;
                       }
              }
А вот и сама функция (или функции - я ужо и не помню, чего хотел точно сделать)

Код: Выделить всё

Function GetDBFDataType( CurDataType : byte ) : integer ;
 {
   GetDBFDataType := 0 ; // значение по умолчанию
   // Галактика может работать с 4 типами данных для DBF
   // dbChar = 67
   // dbDate = 68
   // dbLog  = 76
   // dbMemo = 77
   // dbNum  = 78
   case CurDataType of
      0 : GetDBFDataType := 0      ; // 'Void ',
      1 : GetDBFDataType := dbLog  ; // 'Boolean ',
      2 : GetDBFDataType := dbChar ; // 'Char ',
      3 : GetDBFDataType := dbNum  ; // 'Byte ',
      4 : GetDBFDataType := dbNum  ; // 'Word ',
      5 : GetDBFDataType := dbNum  ; // 'Integer ',
      6 : GetDBFDataType := dbNum  ; // 'LongInt ',
      7 : GetDBFDataType := dbDate ; // 'Date ',
      8 : GetDBFDataType := dbChar ; // 'Time ',
      9 : GetDBFDataType := 0      ; // 'Pointer ',
     10 : GetDBFDataType := dbNum  ; // 'Single ',
     11 : GetDBFDataType := dbNum  ; // 'Double ',
     12 : GetDBFDataType := dbChar ; // 'String ',
     13 : GetDBFDataType := 0      ; // 'ZString ',
     14 : GetDBFDataType := dbMemo ; // 'LVar ',
     15 : GetDBFDataType := 0      ; // 'Buffer ',
     16 : GetDBFDataType := 0      ; // 'AutoInc ',
     17 : GetDBFDataType := dbChar ; // 'Comp ',
     18 : GetDBFDataType := dbChar ; // 'DateTime ',
     19 : GetDBFDataType := 0      ; // 'Array ',
     20 : GetDBFDataType := 0      ; // 'TabArray ',
     21 : GetDBFDataType := 0      ; // 'Record ',
     22 : GetDBFDataType := 0      ; // 'Reference',
     23 : GetDBFDataType := 0      ; // 'AnyArray 
   end; // case CurDataType of ...
 } // Function GetDBFDataType

Function GetDBFQuant( CurDataType : byte ) : integer ;
 {
   GetDBFQuant := 0 ; // значение по умолчанию
   // известны 4 типа данных для DBF
   // dbChar = 67
   // dbDate = 68
   // dbLog  = 76
   // dbMemo = 77
   // dbNum  = 78
   case CurDataType of
      0 : GetDBFQuant :=  0 ; // 'Void ',
      1 : GetDBFQuant :=  0 ; // 'Boolean ',
      2 : GetDBFQuant :=  0 ; // 'Char ',
      3 : GetDBFQuant :=  0 ; // 'Byte ',
      4 : GetDBFQuant :=  0 ; // 'Word ',
      5 : GetDBFQuant :=  0 ; // 'Integer ',
      6 : GetDBFQuant :=  0 ; // 'LongInt ',
      7 : GetDBFQuant :=  0 ; // 'Date ',
      8 : GetDBFQuant :=  0 ; // 'Time ',
      9 : GetDBFQuant :=  0 ; // 'Pointer ',
     10 : GetDBFQuant :=  0 ; // 'Single ',
     11 : GetDBFQuant := 10 ; // 'Double ',
     12 : GetDBFQuant :=  0 ; // 'String ',
     13 : GetDBFQuant :=  0 ; // 'ZString ',
     14 : GetDBFQuant :=  0 ; // 'LVar ',
     15 : GetDBFQuant :=  0 ; // 'Buffer ',
     16 : GetDBFQuant :=  0 ; // 'AutoInc ',
     17 : GetDBFQuant :=  0 ; // 'Comp ',
     18 : GetDBFQuant :=  0 ; // 'DateTime ',
     19 : GetDBFQuant :=  0 ; // 'Array ',
     20 : GetDBFQuant :=  0 ; // 'TabArray ',
     21 : GetDBFQuant :=  0 ; // 'Record ',
     22 : GetDBFQuant :=  0 ; // 'Reference',
     23 : GetDBFQuant :=  0 ; // 'AnyArray 
   end; // case CurDataType of ...
 } // Function GetDBFQuant
[/code]
Ответить