Конференция "Базы" » Как изменять данные в 2-х таблицах малой кровью [D7, Firebird 2.0]
 
  • Александр из Перми (28.04.09 19:50) [0]
    FIBPlus 6.8.5
    Ehlib 4

    2 таблицы :
      PEOPLES(MAN_ID(PK),SURNAME,NAME)
      DOCUMENTS(DOC_ID(PK),MAN_ID(FK),DOC_TYPE,DOC_DATA)

    Используя левое внешнее соединение получаю нужный результат, соединяю две таблицы
    Датасет TpFIBDataset SelectSQL:
    SELECT
    PEOPLES.MAN_ID,
    PEOPLES.SURNAME,
    PEOPLES.NAME,
    DOCUMENTS.DOC_TYPE,
    DOCUMENTS.DOC_DATA
    FROM PEOPLES LEFT OUTER JOIN DOCUMENTS ON PEOPLES.MAN_ID=DOCUMENTS.MAN_ID


    Но по глупости, попытавшись в UpdateSQL модифицировать 2 таблицы сразу и почитав кое чего понял что здесь это невозможно.
    Пытался прописать в UpdateSQL 2 запроса (один после другого), тоже не получилось.
    Подскажите элегантный и правильный выход (хранить в одной таблице не предлогать :))
  • turbouser © (29.04.09 00:07) [1]

    > Александр из Перми   (28.04.09 19:50)  

    ХП, которая будет
    > изменять данные в 2-х таблицах малой кровью
  • Александр из Перми (29.04.09 05:00) [2]
    как мне модифицировать запись с текущим значением MAN_ID в обоих таблицах именно силами датасета?

    естественно запрос прописываемый мной в UpdateSQL

    UPDATE PEOPLES
    SET
    SURNAME = :SURNAME,
    NAME = :NAME
    WHERE
    MAN_ID = :OLD_MAN_ID


    даже не собирается модифицировать данные в DOCUMENTS.

    Так же как и запрос
    UPDATE DOCUMENTS
    SET
    DOC_TYPE = :DOC_TYPE,
    DOC_DATA = :DOC_DATA,
    WHERE
    MAN_ID = :OLD_MAN_ID
    не собирается модифицировать PEOPLES.

    Наверное можно в 2 захода как то, но что мне прописать в запросе UpdateSQL в датасете. Какое типовое решение существует
  • turbouser © (29.04.09 08:05) [3]
    CREATE PROCEDURE PEOPLES_DOCUMENTS(
    SURNAME varchar(999),
    NAME varchar(999),
    OLD_MAN_ID varchar(999),
    DOC_TYPE varchar(999),
    DOC_DATA varchar(999),
    )
    AS
    BEGIN

    UPDATE PEOPLES
    SET
    SURNAME = :SURNAME,
    NAME = :NAME
    WHERE
    MAN_ID = :OLD_MAN_ID
    UPDATE DOCUMENTS
    SET
    DOC_TYPE = :DOC_TYPE,
    DOC_DATA = :DOC_DATA,
    WHERE
    MAN_ID = :OLD_MAN_ID
    END



    и в UpdateSQL в датасете:
    EXECUTE PROCEDURE PEOPLES_DOCUMENTS(:SURNAME,:NAME,:OLD_MAN_ID,:DOC_TYPE,:DOC_DATA)

  • turbouser © (29.04.09 08:17) [4]

    > Александр из Перми   (29.04.09 05:00) [2]

    можно еще EXECUTE BLOCK использовать и обойтись без ХП
  • Sergey13 © (29.04.09 08:52) [5]
    > [0] Александр из Перми   (28.04.09 19:50)

    ИМХО, "малой кровью" - это сделать нормальную простую мастер-детальную связку и спокойно редактировать 2 (два) датасета.
  • Anatoly Podgoretsky © (29.04.09 08:59) [6]
    > Александр из Перми  (29.04.2009 5:00:02)  [2]

    Нефиг редактировать в гриде, а потом стойко преодолевать трудности. Перейди на нормальную работу с запросами и транзакциями.
  • Виталий Панасенко (29.04.09 12:58) [7]
    Если б еще знать, что на самом деле хочет автор...Было бы не плохо
  • Anatoly Podgoretsky © (29.04.09 13:26) [8]
    > Виталий Панасенко  (29.04.2009 12:58:07)  [7]

    Чего тут непонятного - хочет изменить данные в двух таблицах, через свойство UpdateSQL
  • Виталий Панасенко (29.04.09 14:04) [9]

    > Anatoly Podgoretsky ©   (29.04.09 13:26) [8]

    Да, не дочитал.. Свинной грипп наверное(тьфу, тьфу, тьфу)..:-). Тогда CachedUpdates + UpdateObject
  • Виталий Панасенко (29.04.09 14:09) [10]
    И можно без CachedUpdates использовать UpdateObject.. Этих самых UpdateObjectов можно нацеплять на один датасэт немеряно
  • Александр из Перми (29.04.09 19:33) [11]

    > Нефиг редактировать в гриде, а потом стойко преодолевать
    > трудности. Перейди на нормальную работу с запросами и транзакциями.
    >


    я не в гриде редактирую, в гриде меня ужасно раздражет. В ДБ-контролах. В гриде все запрещено, только отображение. Просто хотелось научиться пользоваться компонентами Delphi в стиле быстрой разработки для работы с БД. Писал раньше под MySQL на PHP, под MySQL на Delphi через API, на Delphi под SQLite тоже через API. Сейчас изучаю Firebird, до хранимых процедур пока не добрался, но не отрицаю такого, если метод эффективный изучу вскоре. В SQL более менее ориентируюсь, а вот механизмы работы знаю пока слабовато.

    С UpdateObject получилось, но приходится родительский датасет переоткрывать, чтоб видеть изменения. Скорей всего с тразакциями что то не то. Использую 1 на чтение и 1 на запись. Может UpdateObject пустить в еще одной? Про Кэшапдетс ничего незнаю,почитаю маны по FIBPlus, возникнут вопросы, задам. Всем  спасибо
  • AndreyV © (29.04.09 20:21) [12]
    > [11] Александр из Перми   (29.04.09 19:33)

    Ты почитай материал на
    http://ibase.ru
    Коль с FB занимаешься.
  • turbouser © (29.04.09 20:29) [13]

    > Александр из Перми   (29.04.09 19:33) [11]

    OMG...

    > AndreyV ©   (29.04.09 20:21) [12]

    +1

  • > С UpdateObject получилось, но приходится родительский датасет
    > переоткрывать, чтоб видеть изменения. Скорей всего с тразакциями
    > что то не то. Использую 1 на чтение и 1 на запись. Может
    > UpdateObject пустить в еще одной? Про Кэшапдетс ничего незнаю,
    > почитаю маны по FIBPlus, возникнут вопросы, задам. Всем
    >  спасибо

    Сделай FullRefresh
 
Конференция "Базы" » Как изменять данные в 2-х таблицах малой кровью [D7, Firebird 2.0]
Есть новые Нет новых   [134473   +33][b:0][p:0.001]