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

Вниз

Как изменять данные в 2-х таблицах малой кровью   Найти похожие ветки 

 
Александр из Перми   (2009-04-28 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 ©   (2009-04-29 00:07) [1]


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

ХП, которая будет
> изменять данные в 2-х таблицах малой кровью


 
Александр из Перми   (2009-04-29 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 ©   (2009-04-29 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 ©   (2009-04-29 08:17) [4]


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

можно еще EXECUTE BLOCK использовать и обойтись без ХП


 
Sergey13 ©   (2009-04-29 08:52) [5]

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

ИМХО, "малой кровью" - это сделать нормальную простую мастер-детальную связку и спокойно редактировать 2 (два) датасета.


 
Anatoly Podgoretsky ©   (2009-04-29 08:59) [6]

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

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


 
Виталий Панасенко   (2009-04-29 12:58) [7]

Если б еще знать, что на самом деле хочет автор...Было бы не плохо


 
Anatoly Podgoretsky ©   (2009-04-29 13:26) [8]

> Виталий Панасенко  (29.04.2009 12:58:07)  [7]

Чего тут непонятного - хочет изменить данные в двух таблицах, через свойство UpdateSQL


 
Виталий Панасенко   (2009-04-29 14:04) [9]


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

Да, не дочитал.. Свинной грипп наверное(тьфу, тьфу, тьфу)..:-). Тогда CachedUpdates + UpdateObject


 
Виталий Панасенко   (2009-04-29 14:09) [10]

И можно без CachedUpdates использовать UpdateObject.. Этих самых UpdateObjectов можно нацеплять на один датасэт немеряно


 
Александр из Перми   (2009-04-29 19:33) [11]


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


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

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


 
AndreyV ©   (2009-04-29 20:21) [12]

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

Ты почитай материал на
http://ibase.ru
Коль с FB занимаешься.


 
turbouser ©   (2009-04-29 20:29) [13]


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

OMG...

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

+1


 
Виталий Панасенко(дом)   (2009-04-30 08:19) [14]


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

Сделай FullRefresh



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

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

Наверх




Память: 0.5 MB
Время: 0.054 c
15-1265621167
12
2010-02-08 12:26
2010.08.27
Кто прав? "особенность работы" и стоимость ее исправления


2-1268827094
Delphist
2010-03-17 14:58
2010.08.27
DBLookupListBox


15-1269116259
Petr V. Abramov
2010-03-20 23:17
2010.08.27
Россия вернула себе первенство в Специальной Олимпиаде


15-1266870707
Pavia
2010-02-22 23:31
2010.08.27
Поисковые алгоритмы.


8-1196327132
DimaTS
2007-11-29 12:05
2010.08.27
Надпись вдоль кривой (например по окружности)