Topic: Объединить по условию MasterData

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

Есть две таблицы Dogovor, BDp (между собой они не связаны, но связанны с главной таблицей Client)
в таблицу Dogovor заносятся данные по договору человека который заключается на определенный срок, две даты к примеру с 01.01.2021 по 12.12.2021
в таблицу BDp заносятся данные по должности человека которую он занимал в периоде дат, должность к примеру Специалист две даты с 01.01.2021 по 06.06.2021

Dogovor
DateN             DateEnd
01.01.2021    12.12.2021
13.12.2021    31.12.2021

BDp
Name                DateNN         DateEEnd
Специалист     01.01.2021    06.2021
Инженер          07.06.2021    12.12.2021
Специалист    13.12.2021     31.12.2021

Соответственно чтобы автоматизировать и выгружать весь список таблицы BDp для человека в отчет... Я в отчете создал Subreport4 куда поместил MasterData5 с DataSet BDp, также в Subreport4 поместил MasterData6 с DataSet Dogovor.
Всё выводит верно, сначала все строки с таблицы BDp потом все строки с таблицы Dogovor. Но я хочу фильтровать строки, чтобы отчет получился примерно так:

01.01.2021    12.12.2021
Специалист     01.01.2021    06.2021
Инженер          07.06.2021    12.12.2021
13.12.2021    31.12.2021
Специалист    13.12.2021     31.12.2021

Я думаю это надо делать через code в fastreport, но я даже не имею примера для образца как это сделать

можно в отчете MasterData вписать условие

 [IIF(<Dogovor."DateN"><='<BDp."DateNN">', <Dogovor."DateN">, <BDp."Name">)]

но так как таблицы не связанны между собой не знаю как быть...

в отчет все данные подгружаются скриптом

2 (edited by sparrow 2021-09-09 20:45:22)

Re: Объединить по условию MasterData

Добрый,

начало понятно а потом нет ).
Но это хорошо. Хорошо, что вы сами понимаете.

Вопрос: а что вам мешает связать все таблицы Dogovor, BDp (Client) если они связаны через Client?
Связать не значит выводить все данные, а только нужные вам.
И фильтровать тогда можно по любым критериям. Человек, специалист, инженер, даты. Опись, протокол, сдал, принял.)

Вы ж все равно формируете SQL запросом в скрипте. JOIN таблицы между собой и вперед.

SELECT BDp.position
FROM Client 
LEFT JOIN Dogovor ON  Dogovor.xxx=Client.xxx
LEFT JOIN BDp ON  BDp.xxx=Client.xxx
WHERE Client='Сеня'
AND Dogovor.date >= '2012-01-01'
...

Re: Объединить по условию MasterData

sparrow wrote:

Добрый,

начало понятно а потом нет ).
Но это хорошо. Хорошо, что вы сами понимаете.

Вопрос: а что вам мешает связать все таблицы Dogovor, BDp (Client)? Связать не значит выводить все данные, а только нужные вам.
И фильтровать тогда можно по любым критериям. Человек, специалист, инженер, даты. Опись, протокол, сдал, принял.)

Вы ж все равно формируете SQL запросом в скрипте. JOIN таблицы между собой и вперед.

Да вот даже не знаю на счет связи с таблицей, но я честно сказать даже не пробовал этот вариант (но в уме держу), просто в отчете в строке с договором первая и вторая колонка объеденные между собой, а в строке с должностью эти две колонки разделены между собой...
поэтому если делать связь и через условие если, то в строке с договором будет один столбец пустой.

Щас ковыряю FastReport Pascal

procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
begin
   MasterData6.Visible := <Dogovor."DateN"> <= <BDp."DateNN">;
   MasterData5.Visible := <Dogovor."DateN"> > <BDp."DateNN">;           
end;


этот код, правильно понимает какие строки надо задействовать, только вот он их вообще убирает. Мне бы не убрать а передвинуть в нужном порядке

Re: Объединить по условию MasterData

Это конечно не шахматы, но решать проблемные вопросы вслепую ... неа.

Все, что могу посоветовать вам это для начала проверить какие данные (в каком порядке данные) передаются в Репорт.
Когда вы увидите, что результат тот, ковыряйте Репорт.

5 (edited by eugene1995miroshnikov 2021-09-09 21:18:38)

Re: Объединить по условию MasterData

sparrow wrote:

Это конечно не шахматы, но решать проблемные вопросы вслепую ... неа.

Все, что могу посоветовать вам это для начала проверить какие данные (в каком порядке данные) передаются в Репорт.
Когда вы увидите, что результат тот, ковыряйте Репорт.

запрос на таблицу BDp

SQLQuery('SELECT BDp.Id, BDp.DateNN AS DATEDOLJ, strftime("%d.%m.%Y",BDp.DateNN), strftime("%d.%m.%Y",BDp.BDpEEnd), BDp.Name, FROM BDp WHERE BDp.id_Client='+IntToStr(Form1.gridClient.dbItemID), BDp);

запрос на таблицу Dogovor

SQLQuery('SELECT Dogovor.DateN AS DATEDOGOVOR, strftime("%d.%m.%Y г.",Dogovor.DateN), strftime("%d.%m.%Y г.",Dogovor.DateEnd), Dogovor.Prikaz, strftime("%d.%m.%Y г.",Dogovor.PrikazDate), Dogovor.PrikazNumber, DogovorType.DogovorType FROM Dogovor LEFT JOIN DogovorType ON Dogovor.id_DogovorType=DogovorType.id WHERE Dogovor.id_Client='+IntToStr(Form1.gridClient.dbItemID), Dogovor);
    

порядок передается для каждой в отдельности таблицы верный, по дате возрастание от начальной даты (BDp.DateNN, Dogovor.DateN), если я сделаю связь между ними как мне в запросе правильный порядок задать?

6 (edited by sparrow 2021-09-09 22:29:21)

Re: Объединить по условию MasterData

eugene1995miroshnikov wrote:

если я сделаю связь между ними как мне в запросе правильный порядок задать?

У вас есть поле id_Client на основе которого можно объединить две таблицы . Третью таблицу уже не нужно.
Порядок сортировки записей ORDER BY (указываете через запятую по каким полям сортировать).

как пример можно получить таблицу:

id_Client, Фамилия, ДатаКонтрСтарт, ДатаКонтрФиниш, Приказ, Должность, ДатаСтартДолжн, ДатаФинишДолжн ...

Потребуется сортировка ORDER BY id_Client, ДатаКонтрСтарт, ДатаСтартДолжн

Возможно порядок сортировки прийдется изменить для других полей.
Точно прийдется.
Забыл что у вас везде strftime(). Оставляем эти поля но добавляем в выборку еще даты без strftime() и по ним сортируем.

Я думаю вам помогли бы и с Репортом и запросом, если бы вы показали проект или пример на основе проекта.
Возможно все гораздо проще решается.

а то получается


-Вы знаете, когда едет то стучит вот так: тук-тук-тук
-Послушаем
-А еще бензином пахнет
-Понюхаем
-А еще..
-Вы гараж то откройте..., а где машина?

"Берегись автомобиля!" (С)