Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Работа с NavigatorButtons в cxGrid   Найти похожие ветки 

 
Наталья   (2010-08-04 17:11) [0]

База Oracle. Это получилось сделать.
Теперь возник такой вопрос. Я в TUpdateSql вешаю запрос:

insert into NPATS_GTP
 (NAME, NPATSID)
values
 (:NAME, :NPATSID)
returning gtpid into :gtpid

чтобы вернул первичный ключ-поле для дальнейшего его использования. Но вываливается ошибка

update error.

Подскажите, пржалуйста, как правильно использовать предложение returning или есть какой другой способ?

Спасибо.


 
Sergey13 ©   (2010-08-04 17:16) [1]

> [0] Наталья   (04.08.10 17:11)
> База Oracle. Это получилось сделать.

Так Oracle - это ваше? Круто! 8-)

> insert into
и
> update error.

противоречие однако, не находите?


 
Sergey13 ©   (2010-08-04 17:16) [2]

> [0] Наталья   (04.08.10 17:11)

И при чем тут "NavigatorButtons в cxGrid"?


 
Игорь Шевченко ©   (2010-08-04 17:37) [3]


> Но вываливается ошибка
>
> update error.


правильно вываливается. UpdateSQL не понимает таких операторов, насколько я помню


 
Игорь Шевченко ©   (2010-08-04 17:39) [4]

я к тому, что UpdateSQL считает, что у него все параметры будут входными, а в приведенном операторе параметр :gtpid - выходной.


 
Наталья   (2010-08-04 17:57) [5]

>И при чем тут "NavigatorButtons в cxGrid"?

Использую именно этот грид и его панель с кнопками.

> insert into
> update error.
>противоречие однако, не находите?

При нажатии на кнопку + (добавить запись), в список добавляется запись и в базу тоже, тут же пытаюсь редактировать эту же запись, но вылетает ошибка, вот где update, не понимает, что нужно вернуть индекс и по нему редактировать.

> я к тому, что UpdateSQL считает, что у него все параметры будут входными
А как можно сделать, что б понимал? Или как-то обойти это непонимание?

Спасибо.


 
Игорь Шевченко ©   (2010-08-04 18:23) [6]


> А как можно сделать, что б понимал? Или как-то обойти это
> непонимание?


например, не использовать returning


 
Наталья   (2010-08-05 09:36) [7]

Попробую переформулировать.

Используется BDE, отказаться от него нельзя, т.к. многое придется переделывать.
Имеется СУБД Oracle. В ней создана база.
В Oracle организовано автоинкрементное добавление записи для того.
Запись в таблицу добавляется, но редактировать не удается, т.к. похоже, что на клиентсую сторону не возвращается автоинкрементный ключ.

А реализовано так:
В TUpdateSql в событии Insert создаю запрос:

insert into NPATS_GTP
 (NAME, NPATSID)
values
 (:NAME, :NPATSID)
returning gtpid into :gtpid

Такое ощущение, что TUpdateSql не обрабатывает предложение returning.

Подскажите, пожалуйста, как можно решить эту задачу?


 
Виталий Панасенко   (2010-08-05 09:43) [8]


> Запись в таблицу добавляется, но редактировать не удается,
>  т.к. похоже, что на клиентсую сторону не возвращается автоинкрементный
> ключ.
>

а БДЕ это умеет делать?


 
Sergey13 ©   (2010-08-05 10:00) [9]

> [7] Наталья   (05.08.10 09:36)
> Подскажите, пожалуйста, как можно решить эту задачу?

1. Новое значение ключа можно сгенерировать заранее и вставлять его в запросе явно.
2. Готовить запись заранее, чтобы не нужно было ее после вставки редактировать
3. Переоткрывать датасет после вставки и позиционирование на новую запись - это конечно совсем изврат, но...


 
Наталья   (2010-08-05 10:46) [10]

> а БДЕ это умеет делать?

Ну а зачем тогда в Delphi есть свойство AutoGenerateValue со значением arAutoInc.
Может, для его использования нужно еще что-то настраивать?


 
Игорь Шевченко ©   (2010-08-05 11:31) [11]


> Ну а зачем тогда в Delphi есть свойство AutoGenerateValue
> со значением arAutoInc.


для Парадокса, например. Но не для оракла.


 
12 ©   (2010-08-06 08:53) [12]

Автоинкремент в O делается через последовательности, вроде
Хоть и боюсь, что ИШ убъет, но может как то так?

 oqLoadPrice.SQL.Text := "select PRICE_ID.NEXTVAL as IdPrice from dual";
 oqLoadPrice.Open;
 IdPrice := oqLoadPrice.FieldByName("IdPrice").AsInteger;
 oqLoadPrice.Close;


потом
 oqLoadPrice.SQL.Text := " Insert into price                                                                    "+
                         "        ( id_price,  subscriber_id,  start_data,  stop_data,  address,  phone, ready) "+
                         " values (:id_price, :subscriber_Id, :start_data, :stop_data, :address, :phone, :ready)";
 oqLoadPrice.ParamByName("id_price").AsInteger := IdPrice;


где
create sequence PRICE_ID
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1


или если не надо получить id в программу
create or replace trigger tg_GenerateFILIALID
before insert ON FILIAL
for each row
begin
 select FILIAL_ID.NEXTVAL
 into :new.ID_FILIAL
 from dual;
end tg_GenerateFILIALID;

и тогда
вставляем в таблицу, id не указываем, сам поставится



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.05 c
15-1330351343
Тенерман
2012-02-27 18:02
2013.03.22
Данные -> TShiftState.


15-1348730620
Jeer
2012-09-27 11:23
2013.03.22
Приподнимая завесу..


15-1354292775
Очень Злой
2012-11-30 20:26
2013.03.22
Оптимизировать код


15-1345453443
Дмитрий С
2012-08-20 13:04
2013.03.22
Мастер-класс по микроконтроллерам.


2-1346240265
Wadimka
2012-08-29 15:37
2013.03.22
В чем может быть проблема?