Конференция "Базы" » Работа с NavigatorButtons в cxGrid
 
  • Наталья (04.08.10 17:11) [0]
    База Oracle. Это получилось сделать.
    Теперь возник такой вопрос. Я в TUpdateSql вешаю запрос:

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

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

    update error.

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

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

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

    > insert into
    и
    > update error.

    противоречие однако, не находите?
  • Sergey13 © (04.08.10 17:16) [2]
    > [0] Наталья   (04.08.10 17:11)

    И при чем тут "NavigatorButtons в cxGrid"?
  • Игорь Шевченко © (04.08.10 17:37) [3]

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


    правильно вываливается. UpdateSQL не понимает таких операторов, насколько я помню
  • Игорь Шевченко © (04.08.10 17:39) [4]
    я к тому, что UpdateSQL считает, что у него все параметры будут входными, а в приведенном операторе параметр :gtpid - выходной.
  • Наталья (04.08.10 17:57) [5]
    >И при чем тут "NavigatorButtons в cxGrid"?

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

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

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

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

    Спасибо.
  • Игорь Шевченко © (04.08.10 18:23) [6]

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


    например, не использовать returning
  • Наталья (05.08.10 09:36) [7]
    Попробую переформулировать.

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

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

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

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

    Подскажите, пожалуйста, как можно решить эту задачу?
  • Виталий Панасенко (05.08.10 09:43) [8]

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

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

    1. Новое значение ключа можно сгенерировать заранее и вставлять его в запросе явно.
    2. Готовить запись заранее, чтобы не нужно было ее после вставки редактировать
    3. Переоткрывать датасет после вставки и позиционирование на новую запись - это конечно совсем изврат, но...
  • Наталья (05.08.10 10:46) [10]
    > а БДЕ это умеет делать?

    Ну а зачем тогда в Delphi есть свойство AutoGenerateValue со значением arAutoInc.
    Может, для его использования нужно еще что-то настраивать?
  • Игорь Шевченко © (05.08.10 11:31) [11]

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


    для Парадокса, например. Но не для оракла.
  • 12 © (06.08.10 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 не указываем, сам поставится
 
Конференция "Базы" » Работа с NavigatorButtons в cxGrid
Есть новые Нет новых   [134432   +20][b:0][p:0.001]