Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

numeric(11,0) [D5, IB6.x]


GanibalLector ©   (2004-06-14 19:38:00) 

Предположим,что в некой таблице существует поле tel - numeric(11,0).И есть хранимая процедура,которая добавляет(ну,или изменят) эту таблицу.Так вот,а как писать в Delphi,при таком формате поля???
Следует отметить,что в DataType у него ftLargeint .
Что я только не пробовал и strtofloat и strtoint64 и просто число.Никак!!!Всегда ошибка-Unsupported feature.Вот,единственное,что проходит
IBStoredProc1.ParamByName('tel'):=null
но мне это не подходит.Что посоветуете???
З.Ы. alter не предлагать.


kaif   (2004-06-15 02:00:00) [1]

Наконец, есть еще последний вариант. Самый странный, но он обязательно сработает. Используй метод AsCurrency.
Итак:
AsBCD или AsCurrency. Оба метода дадут тебе до 15 десятичных знаков точности. Но AsBCD как-то лучше смотрится в данном случае. Просто я не помню, работает ли он с объектами типа "параметр хранимой процедуры". Вот с объектами класса TIBBCDField он точно работает.


kaif   (2004-06-15 01:50:00) [2]

Кажется, я нашел подходящее решение. Используй метод AsBCD. Если не сработает с numeric(11,0) измени тип поля на decimal(11,0).
 Метод AsBCD гарантирует, что все числа будут иметь формат int64. И этот метод поддерживается компонентами IBX очень хорошо. Я его сам часто использую. Просто он не пришел мне сразу в голову, так как мне кажется, что эту задачу (хранение номеров телефонов) не стоит так решать, а стоит отделить все префиксы от номера и хранить их в отдельных полях:
 1. Используется ли выход на междугороднюю линию
 2. Код города
 3. Номер
 Примерно так, как сделано в настройке модема в Windows.
 Хотя - дело хозяйское. Задача полностью известна лишь тебе.


app   (2004-06-14 22:29:00) [3]

GanibalLector ©   (14.06.04 22:00) [12]
Имя скопировано из справки, начиная с Д5


kaif   (2004-06-14 22:12:00) [4]

Попробуй как AsVariant. Может последние IBX схавают. И еще потыкай исходный текст IBXв части реализации методов типа ParamByName в TIBCustomDataSet. Там наверняка много интересного найдешь, может быть и хвосты, как эту проблему с largeint решать. Я бы сам посмотрел, но нет текста сейчас под рукой.
 А насчет того чтобы не делать его varchar-ом я бы еще подумал...
Я бы все же разделил код города и номер.
Смотри, например, мой мобильный федеральный номер при наборе с города звучит так:
8-911-XXX-XX-XX
А при наборе с мобильного звучит так:
+7-911-XXX-XX-XX
Так что если ты его запишешь в свою базу как
8911XXXXXXX
возможно, он и поместится, как numeric(11,0).
Но я бы подумал все же, прежде, чем поступать именно так. Особенно если завтра объявят о переходе с 8 на 7 при наборе с городского телефона.
Или если ты захочешь выдрать все вологодские номера, как ты SQL-запрос будешь писать? Или если захочешь построить отчет-пирог типа:
SELECT CITY_CODE, COUNT(*)
FROM PHONES
GROUP BY CITY_CODE

а иногда полезно бывает делать такие запросы. Особенно, когда заказчик с ножом к горлу пристает. Если в информации скрыта структура, лучше ее выявить. А то зачем вообще все эти базы данных, поля и индексы? Возьми поле BLOBи пиши туда хоть 300-разрядный номер телефона.


GanibalLector   (2004-06-14 22:00:00) [5]

>Есть свойство AsLargeInt
У мя Undeclared Identifier т.е. нету  AsLargeInt.

З.Ы. Ну ладно,пусть хоть decimal.И как его писать?asvariant?
Уж больно не хочется делать телефон varchar-ом.


jack128   (2004-06-14 21:42:00) [6]


> Дык уже.

то что я тебе кинул - этот последний апдейт для Delphi5(!!!) (для старших версий Делфи есть более поздние апдейты). Больше, насколько я знаю, Delphi5 разработчиком IBX НЕ поддерживается.

> а потому,что decimal=numeric


> И автор рекомендует numeric
:-)) Задать бы вопрос этому автору (чую - это Ковязин и Востриков), если это одно и тоже, то почему именно нумерик?


Анатолий Подгорецкий   (2004-06-14 21:37:00) [7]

Есть свойство AsLargeInt


GanibalLector   (2004-06-14 21:33:00) [8]

>Что в этом поле должно храниться?
Ну да телефон
>Почему выбран именно этот странный тип данных, а не decimal, к >примеру?
а потому,что decimal=numeric!!!В киге написано,не я выдумал.И автор рекомендует numeric.Вот я и решил...


kaif   (2004-06-14 21:21:00) [9]

Честно говоря у меня такое подозрение, что это номер телефона.
 Я бы не стал его делать как numeric(11,0). Так как потом я попросту не знал бы как SQL-запросом получить все "московские номера". Так что тот, кто решил использовать такие странные типы полей пусть и объясняет, как он дальшен собирается с ними работать. Тем более, что никакой разницы между int64 и numeric(11,0) я вообще не вижу. Так что здесь много бессознательного программирования, а когда имеется такое дело, то каждую секунду будут новые прооблемы.
 Давайте по-порядку.
 1. Что в этом поле должно храниться?
 2. Почему выбран именно этот странный тип данных, а не decimal, к примеру?


GanibalLector   (2004-06-14 21:19:00) [10]

>А Вы уже попробовали или пока предполагаете?
Пробовал конечно.

>А AsInt64 есть такой метод?
Не,такого нет.


kaif   (2004-06-14 21:17:00) [11]

И это IbstoredProc1.ParamByName('P_A5').asinteger:=80679217355;
приведет к ошибке!!!


А Вы уже попробовали или пока предполагаете?
А AsInt64 есть такой метод? У меня нет под рукой Delphi сейчас.


Anatoly Podgoretsky   (2004-06-14 21:02:00) [12]

kaif ©   (14.06.04 19:57) [1]
Не может это нормально работать, поскольку интегер это примерно 2E9


GanibalLector   (2004-06-14 21:00:00) [13]

М-да,но !!! numeric(11,0) предполагает,что у меня число отнють не integer.

И это IbstoredProc1.ParamByName('P_A5').asinteger:=80679217355;
приведет к ошибке!!!
Так что,asinteger не выход из ситуации.


GanibalLector   (2004-06-14 20:57:00) [14]

2 kaif
Спасибо.
А вообще,странно,это все :
IbstoredProc1.ParamByName('P_A5').asinteger:=4;//работает
IbstoredProc1.ParamByName('P_A5').value:=4;//не работает

2 Johnmen
>Следовательно в обязательном порядке апдейтить IBX.
Дык уже.


Johnmen   (2004-06-14 20:17:00) [15]

Понятно. Если большое целое, то значит 3 диалект.
Следовательно в обязательном порядке апдейтить IBX.


kaif   (2004-06-14 19:57:00) [16]

Я только что воспроизвел эту ситуацию. Действительно, поле Largeint. Я попробовал метод AsInteger. Нормально работает.


Наверх

Титульная страница Поиск, карта сайта Написать письмо