powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / В чем моя ошибка???
5 сообщений из 5, страница 1 из 1
В чем моя ошибка???
    #32345500
Olga aka ovod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мастера, помогите! Я уже описывала это в одном своем сообщении. Но повторюсь. Есть БД типа paradox. Есть кадровая программа и в ней - форма отпусков по подразделению. Пользователь выбирает период дат, и по кнопке обновить в поле DBGrid выводится список сотрудников, которые имели отпуск в этот период и те, которые были приняты на работу в этот же период(не важно, были они в отпуске или нет).
Я сделала отчет и в его запросе пишу следующее:

select s.tabno, s.namef,s.namio, s.div, s.part, s.adiv, s.apart, o.dupr, o.dclr, o.perd, s.dcont,
(sum(o.dayall)-sum(o.dayreal)) as ostat , sum(o.dayreal) as smday, sum(o.nday) as kompen
from "state.db" s
left join "otp.db" o on (o.Tabno=s.tabno)

group by s.div, s.part, s.adiv, s.apart,s.tabno, s.namef,s.namio, o.dupr, o.dclr, o.perd, s.dcont
order by s.namef,s.namio, s.dcont


Здесь
state.db - это таблица, в которой содержатся все данные о сотрудниках
otp.db - таблица, где содержатся данные об отпусках

s.tabno - табельный номер сотрудника;
s.namef,s.namio - ФИО
s.div, s.part, s.adiv, s.apart - дивизион, отдел, альт. дивизион, альт. отдел
o.dupr - начало отпуска
o.dclr - окончание отпуска
o.perd - период отпуска
s.dcont - дата принятия сотрудника на работу

Но если так писать запрос, то при этом выводятся сотрудники, у которых был отпуск, а также все сотрудники, которые есть на этом предприятии. Они не попадают в период заданной даты. Получается так, что в DBGrid они у меня выводятся правильно, а в отчете - нет.
В чем моя ошибка? Как мне необходимо изменить запрос для поставленной задачи? Подскажите, пожалуйста!
...
Рейтинг: 0 / 0
В чем моя ошибка???
    #32345547
Фотография TheOne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Протестировать у себя не могу, но попробуй такой вариант:

select s.tabno, s.namef,s.namio, s.div, s.part, s.adiv, s.apart, o.dupr, o.dclr, o.perd, s.dcont,
(sum(o.dayall)-sum(o.dayreal)) as ostat , sum(o.dayreal) as smday, sum(o.nday) as kompen
from
"state.db" s left join "otp.db" o on (o.Tabno=s.tabno)
where
((o."dupr" >= :StartDate) and (o."dupr" <= :EndDate)) or
((s."dcont" >= :StartDate) and (s."dcont" <= :EndDate))

:StartDate, :EndDate это паремтры. Можно использовать ParamByName или можете вместо них просто строковые констатны вставить ("mm-dd-yyyy"), кому как нравиться.
...
Рейтинг: 0 / 0
В чем моя ошибка???
    #32345691
Nikles
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы писали
Код: plaintext
1.
2.
from  "state.db"  s 
left join  "otp.db"  o on (o.Tabno=s.tabno) 


Запрос возвращает ВСЕХ сотрудников потому что LEFT JOIN - это вариант внешнего объединения при котором у вас выбираются ВСЕ записи из ведущей таблицы (state.db) и записи из второй таблицы (otp.db) удовлетворяющие заданному условию объединения (o.Tabno=s.tabno). Для получения правильного результа попробуйте написать так:
Код: plaintext
1.
2.
3.
4.
from  "otp.db"  o, "state.db"  s 
WHERE (o.Tabno=s.tabno) AND 
( (o.dupr BETWEEN (:StartDate,:EndDate) AND o.dclr BETWEEN (:StartDate,:EndDate)) 
OR  (s.dcont BETWEEN (:StartDate,:EndDate)) )

либо, что эквивалентно, используйте для объединения таблиц INNER JOIN.
...
Рейтинг: 0 / 0
В чем моя ошибка???
    #32345813
grigorii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделай вместо
LEFT JOIN
INNER JOIN
для того чтобы выбрать отпускников

потом
Union

и select для прибывших на работу
...
Рейтинг: 0 / 0
В чем моя ошибка???
    #32345836
Olga aka ovod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем, кто ответил! Все получилось.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / В чем моя ошибка???
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]