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

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

Аналог оракловой функции NVL в BDE


ssk ©   (2005-10-09 14:46:00) 

Всем привет!
В оракле я с успехом использовал конструкцию

SELECT NVL(MAX(myID)+1, 1) FROM myTable;

но для BDE она не срабатывает. Существует ли аналог NVL в BDE?
Спасибо за ответы.


ssk   (2005-10-10 13:07:00) [1]


> Fay ©   (10.10.05 12:28) [17]
> >> with TTable.Create(nil) do
> >>     begin
> >>       TableName := 'artists';
> >>       Open;
>
> Простите, а Database (или чё там в BDE) не надо?


точно, есть такая штука. это я упустил.


Fay   (2005-10-10 12:28:00) [2]

2 ssk ©   (10.10.05 12:14) [13]
По сырцу (смотрел только main.pas)...

Какая СУБД?

>> // создаем таблицу
>> EXEC_QUERY('CREATE TABLE artists (aID INTEGER, art VARCHAR(20))', False);

Где первичный ключ? Или это всё-таки Oracle и Вы надеетесь на rowid?

>> if RecordCount = 0 then // проверка на пустоту таблицы
IsEmpty ?

>> with TTable.Create(nil) do
>>     begin
>>       TableName := 'artists';
>>       Open;

Простите, а Database (или чё там в BDE) не надо?

>>   // добавляем новый ID
>>   EXEC_QUERY('INSERT INTO artists (aID) SELECT MAX(aID)+1 FROM artists;', False);
>>   // записываем новому ID значение
>>   EXEC_QUERY('UPDATE artists SET art="' + Edit1.Text + '" WHERE aID = (SELECT MAX(aID) FROM artists);', False);
>> end;

Зачем Update ?


Sergey13   (2005-10-10 12:23:00) [3]

2[14] ssk ©   (10.10.05 12:17)
> я не знаю. я ее не выбираю.
Ты предлагаешь мне выбрать? 8-)
Ты просишь конкретного ответа на неконкретный вопрос. Так не бывает.


Курдль   (2005-10-10 12:21:00) [4]

У всякой СУБД есть свой метод получения нового ID.
Даже у одноклеточных типа Paradox, Dbase, FoxPro и т.п. есть автоинкрементные поля, которые автоматически разруливаются движком.
Получать новые ID каким-либо синтетическим путем - категорически не рекомендуется.


ssk   (2005-10-10 12:17:00) [5]

Sergey13 ©   (10.10.05 12:14) [12]
А что? Военная тайна? Или пишем универсальную прогу?


да какая универсальность? я не знаю. я ее не выбираю. лучше расскажи, как правильносделать?


ssk   (2005-10-10 12:14:00) [6]

Fay ©   (10.10.05 09:25) [5]
Можно подробнее?


см. исходник в [10]


Sergey13   (2005-10-10 12:14:00) [7]

2 [10] ssk ©   (10.10.05 12:08)
> нет, не оракл одонозначно.
А что? Военная тайна? Или пишем универсальную прогу?


ssk   (2005-10-10 12:13:00) [8]

Курдль ©   (10.10.05 11:27) [9]
Попробуй IsNull(FIELD_NAME, 0)


попробовал. выдает ошибку Capability not supported
эта же ошибка появляется и при применении NVL.


ssk   (2005-10-10 12:08:00) [9]

Danilka ©   (10.10.05 10:21) [7]

В Оракле, за такой способ генерации ид-шника, следует оторвать руки.
Неужели про сиквенсы ничего не слышал?


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

Sergey13 ©   (10.10.05 10:30) [8]
>но для BDE она не срабатывает.
Это ложь. Срабатывает, если конечно БД по прежнему Оракл.


нет, не оракл одонозначно.

расскажу, что я делаю:
беру Query, DataSource и DBGrid.
все соединяю. потом в Query пишу: CREATE TABLE myTable (aID INTEGER, aMyField VARCHAR(20);
создается таблица.

теперь при добавлении записи мне нужно присвоить ID номер. кроме проверки на NULL и присваивания 1 (а потом MAX(ID)+1) ничего в голову не пришло.
посоветуйте, как правильно надо сделать.

вот ссылка на исходничек 3к
http://www.ucad.pisem.net/delphi_demos/test.zip


Курдль   (2005-10-10 11:27:00) [10]

Попробуй IsNull(FIELD_NAME, 0)


Sergey13   (2005-10-10 10:30:00) [11]

>но для BDE она не срабатывает.
Это ложь. Срабатывает, если конечно БД по прежнему Оракл.


Danilka   (2005-10-10 10:21:00) [12]

ssk ©   (09.10.05 14:46)
Всем привет!
В оракле я с успехом использовал конструкцию

SELECT NVL(MAX(myID)+1, 1) FROM myTable;


В Оракле, за такой способ генерации ид-шника, следует оторвать руки.
Неужели про сиквенсы ничего не слышал?


Desdechado   (2005-10-10 10:17:00) [13]

вообще-то БДЕ - это посредник к СУБД
СУБД какая?


Fay   (2005-10-10 09:25:00) [14]

2 ssk ©   (10.10.05 9:16) [4]
>> решение я нашел

Можно подробнее?


ssk   (2005-10-10 09:16:00) [15]


> Fay ©   (10.10.05 07:59) [3]
> А как вышло, что Вам приходится использовать BDE осенью
> 2005 года?


хотел себе жизнь облегчить. да видать, просчитался немного :-)

З.Ы. что касается темы, то решение я нашел. но оно мне не нравится, хотя и работает.


Fay   (2005-10-10 07:59:00) [16]

2 ssk ©   (09.10.05 21:15) [2]
А как вышло, что Вам приходится использовать BDE осенью 2005 года?


ssk   (2005-10-09 21:15:00) [17]

что ж, плохо. придется изголяться...


Fay   (2005-10-09 17:02:00) [18]

насколько я знаю, такой штуки нет


Наверх

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