Форум: "Базы";
Текущий архив: 2003.07.17;
Скачать: [xml.tar.bz2];
Внизкак сделать специфические столбцы в QReport е Найти похожие ветки
← →
Valeriya (2003-06-24 08:37) [0]Уважаемые специалисты ! Требуется сделать отчёт, в котором в столбцах отображаются выборочно значения полей, примерно такого вида:
фамилия: | вид аттест-и(1) |вид аттест-и(2) |вид аттест-и(n) |
....(Fam1) | Date_att | Date_att |
....(Fam2) | | Date_att | Date_att
....(Fam3) | Date_att | | Date_att
Date_att - поле БД
← →
ЮЮ (2003-06-24 09:16) [1]procedure TForm1.QRDBText1Print(sender: TObject; var Value: String);
begin
if <не надо печатать> then Value := "";
end;
Или написать запрос, возвращающий значения именно таким образом.
Но для этого надо знать структуру таблиц
← →
Valeriya (2003-06-24 09:27) [2]Надо обязательно запрос, т.к. неизвестно, где будут значения, а где нет. Главная база Work из неё берётся ID_work, Date_att - берётся из подчинённой базы - Att_work (где есть ID_work,ID_att и Date_att). Work -> Att_work (ID_work)
← →
ЮЮ (2003-06-24 09:31) [3]А как определяется вид аттестации?
← →
ЮЮ (2003-06-24 09:32) [4]И какая БД? И возможно ли несколько записей по одному виду аттестации. Если да, то как их выводить?
← →
Valeriya (2003-06-24 09:41) [5]Вид аттестации нах-ся в справочнике видов аттестации. В базе Att_work собирается вся инфа о прохождении челом аттестации. Он естественно аттестуется не один раз, но нужна последняя дата по каждому виду аттестации, по которому он аттестовался. Получится, что у каждого человека в отчёте будет не более одной даты для каждого вида аттестации.
← →
Семен Сорокин (2003-06-24 09:44) [6]Valeriya © (24.06.03 09:41)
Пока Вы не представите полную структуру учавствующих в запросе таблиц и тип СУБД, Вам никто ничего не подскажет.
← →
Valeriya (2003-06-24 09:53) [7]Тип - Paradox
Структура такая:
БД Work БД Att_work БД Vid_att
ID_work -> ID_work Vid_att
Fam ID_att <- ID_att
Name Date_att ...
... ...
← →
Johnmen (2003-06-24 10:05) [8]То есть, фактически, нужна кросс-таблица (по-моему так это называется)...
Придется использовать что-то наподобие временной таблицы в памяти и формировать ее "ручками".
← →
Семен Сорокин (2003-06-24 10:10) [9]сначала такой запрос
SELECT w.*, v.* FROM work AS w, vid_att AS v
а потом пробегая по всем строкам
SELECT date_att FROM att_work WHERE id_work=:id_work AND id_att=:id_att
← →
Valeriya (2003-06-24 10:16) [10]У меня есть временная таблица, куда всё скидывается из запроса:
SELECT Att_work.ID_att, W.ID_work, W.ID_podr, Sp_rul.ID_att, Sp_rul.Name_short, Sp_rul.Name_att, W.ID_prof, Att_work.Date_att
FROM "Sp_rul.db" Sp_rul
INNER JOIN "Att_work.DB" Att_work
ON (Att_work.ID_att = Sp_rul.ID_att)
INNER JOIN "Work.DB" W
ON (W.ID_work = Att_work.ID_work)
WHERE (W.ID_podr in ("+inttostr(aPodr)+"))";
AND (Att_work.ID_att in ("+aVidAtt+")) AND (Att_work.Date_att=(SELECT max(Att_work.Date_att) FROM "Att_work.DB" Att_work WHERE (W.ID_work = Att_work.ID_work)))";
← →
Семен Сорокин (2003-06-24 10:18) [11]проблема значит в том как реализовать переменное количество столбцов в отчете, а не сам запрос? я так понял?
← →
Valeriya (2003-06-24 10:34) [12]Не, проблема в том, как разместить даты
← →
Семен Сорокин (2003-06-24 10:38) [13]Не, проблема в том, как разместить даты
Не использовать DB-компоненты, а юзать обычный TQRLabel+OnBeforePrint
← →
Valeriya (2003-06-24 10:58) [14]Извините, можно чуть рассказать как это можно сделать, плиз
← →
Семен Сорокин (2003-06-24 11:14) [15]Valeriya © (24.06.03 10:58)
У QRBand"а есть событие OnBeforePrint, которое происходит на момент непосредственно перед печатью, также это событие есть у каждого TQRLabel"а:
1. на OnBeforePrint QRBand"а выполнять запрос и вытаскивать date_att для каждой аттестации - заполнять
2. На OnBeforePrint каждого QRLabel"а заносить его Caption из заьитого ранее массива данных
← →
Valeriya (2003-06-24 11:19) [16]Ну это понятно, а КАК их заполнять - в цикле или как ещё?
← →
Anatoly Podgoretsky (2003-06-24 11:34) [17]Цикл не требуестя, работать с событием OnNeedData, но основная проблема у тебя будет не с этим, а с конечной шириной листа, сумеешь поместить все свои колонки?
Если нет то придется перейти к много проходному формированию отчетов, столько раз сколько листов потребуется по ширине и в данном случае массив данных самое то, поскольку обеспечит одну единственную выборку и повторяемость.
Пример по OnNeedData есть в справке и в примерах по Quick Report, формирование листов чисто дизайнерская и простая алгоритмическая работа, в основном сведется к формированию заголовков листа и/или к заголовкам колонок.
Есть еще более мощный, но одновременно и более сложный путь, это динамическое формирование отчетов, об этом написано в фирменной документации по QR2 и QR3. Но это более для профессионалов.
← →
Valeriya (2003-06-24 11:50) [18]Спасибо большое, буду разбираться.
← →
ЮЮ (2003-06-25 04:24) [19]Вчера с ответом не успел: Интенет отключили. Советов, гляжу, тебе надавали проедостаточно. Но, учитывая, что нет варианта, как получить информацию в одном запросе (может в дальнейшем пригодится :-), предложу и свой:
Для Local SQL будет так (при условии, что кол-во видов аттестации не очень велико и не меняется очень стремительно :-).
При этом полагаем, что запись в Att_work с большим ID_att соответствует более поздней дате (это значительно упростит запрос).
Для каждого вида аттестации создаём файл attN.sql:
SELECT ID_Work, Max(ID_att)
FROM Att_work, Vid_att
WHERE (Att_work.ID_Att = Vid_att.ID_ATT) and (Vid_att.Vid_att = <n>)
GROUP BY ID_Work
Каждый из этих запросов вернёт не более одной (предполагаем, что последнюю, см. выше) запись для каждого значения ID_Work.
Наконец.
SELECT Work.*, att1.Date_att Date1, ... , attN.Date_att DateN
FROM Work
LEFT JOIN "att1.sql" att1 on Work.ID = att1.ID_work
...
LEFT JOIN "attN.sql" attn on Work.ID = attn.ID_work
Это запрос можно формировать и динамически, анализируя наличие файлов вида attN.sql в базе
P.S. В структуре не понятен тип связи Att_work.ID_Att <-> Vid_att.ID_Att. И что является ключевым полем в Att_work? Поэтому предложенные запросы могут оказаться не совсем верными :-(
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.07.17;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c