Страница 1 из 1

FB 2.1.1. Как считать параметры поля

Добавлено: 07 фев 2009, 20:37
allzero
Здравствуйте!

Господа, не подскажете, как в FB считать параметры поля таблицы(конкретно интересуют тип поля и его длина , т.е. Numeric(5,2) varchar(5)) как они были заданы при его создании?

P.S. Expert это делать умеет. Я пытался найти в rdb$*, но видно не судьба... :(

Re: FB 2.1.1. Как считать параметры поля

Добавлено: 08 фев 2009, 13:58
Dimitry Sibiryakov
Раз не смог найти сам и LangRef не помог, значит действительно не судьба.

Re: FB 2.1.1. Как считать параметры поля

Добавлено: 08 фев 2009, 14:48
kdv
www.ibase.ru/devinfo/sysqry.htm

поиском надо, поиском. только это не "параметры поля", вернее такой термин почти никто не использует.

Re: FB 2.1.1. Как считать параметры поля

Добавлено: 09 фев 2009, 09:44
allzero
To kdv: Спасибо.

Re: FB 2.1.1. Как считать параметры поля

Добавлено: 09 фев 2009, 23:10
allzero
К сожалению я рано порадовался...
Вопрос остаётся, так как F.RDB$FIELD_TYPE(описание типа вроде можно взять из другой системной таблицы - что-то вроде $rdb_field_type) вроде не подразумевает описание Numeric и т.п. а в IBExpert показывается именно тип и длина поля, какие я задал при создании таблицы, а я хочу видеть именно их. Или я чего-то не понимаю?

Re: FB 2.1.1. Как считать параметры поля

Добавлено: 09 фев 2009, 23:19
belov-evgenii
allzero писал(а):... а в IBExpert показывается именно тип и длина поля, какие я задал при создании таблицы, а я хочу видеть именно их. Или я чего-то не понимаю?
Он их через компоненты доступа скорее всего определяет

Re: FB 2.1.1. Как считать параметры поля

Добавлено: 09 фев 2009, 23:58
hvlad
RDB$TYPES

Re: FB 2.1.1. Как считать параметры поля

Добавлено: 10 фев 2009, 09:28
allzero
В RDB$TYPES НЕТУ(К ПРИМЕРУ) Numeric!!!!
А ibexpert его показывает.

Re: FB 2.1.1. Как считать параметры поля

Добавлено: 10 фев 2009, 09:29
allzero
belov-evgenii писал(а):
allzero писал(а):... а в IBExpert показывается именно тип и длина поля, какие я задал при создании таблицы, а я хочу видеть именно их. Или я чего-то не понимаю?
Он их через компоненты доступа скорее всего определяет
Это как?

Re: FB 2.1.1. Как считать параметры поля

Добавлено: 10 фев 2009, 10:23
kdv
В RDB$TYPES НЕТУ(К ПРИМЕРУ) Numeric!!!!
А ibexpert его показывает.
тогда учи datadef.pdf на тему числовых типов данных. Лезешь в потроха - будь добр ознакомиться с документацией.

Re: FB 2.1.1. Как считать параметры поля

Добавлено: 10 фев 2009, 13:07
allzero
kdv писал(а):
В RDB$TYPES НЕТУ(К ПРИМЕРУ) Numeric!!!!
А ibexpert его показывает.
тогда учи datadef.pdf на тему числовых типов данных. Лезешь в потроха - будь добр ознакомиться с документацией.
ОК. Буду учить.
Я там найду что-нить кроме того, что Numeric и некоторые другие - это "виртуальные" типы и на самом деле их не существует?
Но вопрос ведь в другом - как всё-таки Expert показывает описание поля именно как Numeric, а не какой-нибудь Short?

Re: FB 2.1.1. Как считать параметры поля

Добавлено: 10 фев 2009, 13:29
WildSery
allzero писал(а):Но вопрос ведь в другом - как всё-таки Expert показывает описание поля именно как Numeric, а не какой-нибудь Short?
Читай, читай. Всё написано.

Re: FB 2.1.1. Как считать параметры поля

Добавлено: 10 фев 2009, 13:54
kdv
Но вопрос ведь в другом - как всё-таки Expert показывает описание поля именно как Numeric, а не какой-нибудь Short?
ну так посмотри на конретный столбец в сист. таблицах.

Re: FB 2.1.1. Как считать параметры поля

Добавлено: 10 фев 2009, 22:06
allzero
kdv писал(а):
Но вопрос ведь в другом - как всё-таки Expert показывает описание поля именно как Numeric, а не какой-нибудь Short?
ну так посмотри на конретный столбец в сист. таблицах.
Да вроде уже дырки в этих системных таблах протёр. Не вижу я ни в одной записи слова Numeric! Не вижу!

Re: FB 2.1.1. Как считать параметры поля

Добавлено: 11 фев 2009, 02:12
kdv
так и не написано там numeric. интересно, как можно пялиться на данные, и не понимать что там.
1. numeric и decimal это почти одно и то же, чем отличается - написано в datadef.pdf
2. берешь например employee.fdb, таблицу employee.
там есть salary - numeric(10,2). Объявлено как домен, но это не важно. В rdb$relation_fields, как видишь, есть только ссылка на rdb$fields (как домен или как rdb$nnn) - rdb$field_source, сам тип описан в rdb$fields. Идем туда:

rdb$field_length = 8 - это значит int64 (8 байт)
rdb$field_scale = -2 - это масштаб (numeric(precision, scale))
rdb$field_type = 16 - см. rdb$types, в отношении rdb$field_type это int64, как я и сказал чуть выше про field_length. В первом диалекте для numeric/decimal тип может быть 27 (double precision) или 10 (float).
rdb$field_precision = 10 - это точность (numeric(precision, scale))

Вот и все. numeric(10, 2). Охренительно сложно? :)
я это все не помню, разумеется, посмотрел прямо сейчас.

то есть, в сист. таблицах numeric и decimal отличить невозможно. Поэтому инструменты, извлекающие метаданные, сообщают об этом типе как о numeric. Потому что decimal это "чуть больше, чем numeric", но только при объявлении. При хранении он уже не "чуть больше", а такой, какой есть. Соответственно - numeric.

p.s. если rdb$field_precision = 0, то это целочисленный тип - smallint, integer, bigint. Если меньше нуля, то это numeric с точностью и масштабом.
Код формирования списка типов столбцов таблицы на дельфях занимает примерно 20 строк.

Re: FB 2.1.1. Как считать параметры поля

Добавлено: 11 фев 2009, 09:12
allzero
OK. Всем спасибо. Буду писать эти 20 строк. Принцип понятен, теперь непосредственно велосипед. А никто уже не делал подобного(всё-таки не люблю изобретать велосипеды)? :)

Re: FB 2.1.1. Как считать параметры поля

Добавлено: 11 фев 2009, 21:37
kdv
я делал. и много кто еще делал, кто выводит структуру таблицы в виде текста.
но это коммерческий код. Так что даже 20 строк case по rdb$field_type - увы, приводить не буду.

Re: FB 2.1.1. Как считать параметры поля

Добавлено: 12 фев 2009, 09:26
allzero
kdv писал(а):я делал. и много кто еще делал, кто выводит структуру таблицы в виде текста.
но это коммерческий код. Так что даже 20 строк case по rdb$field_type - увы, приводить не буду.
ОК. А за консультацию спасибо.