Re: Прошу помощи знатоков SQL

Form1.dtpBirthday.DateTime := SQLDateTimeToDateTime( SQLExecute ('SELECT contact.birthday FROM contact WHERE id='+Form1.TableGrid2.sqlValue) );
Dmitry.

27 (edited by kunar80 2015-07-31 12:02:11)

Re: Прошу помощи знатоков SQL

Сделал пример для наглядности того, что мне хотелось бы получить.
А хотелось бы, чтобы при клике по строке грида и при навигации по гриду в компонентах формы отображались не только имя и Мемо, но также дата рождения (проблемы описаны выше) и группа (находится в другой таблице).

Post's attachments

Attachment icon Employees TableGrid and other components.rar 6.04 kb, 469 downloads since 2015-07-31 

Не боги горшки лепят!

Re: Прошу помощи знатоков SQL

Готово.

Post's attachments

Attachment icon Employees TableGrid and other components_fixed.zip 7.94 kb, 493 downloads since 2015-07-31 

Dmitry.

29 (edited by kunar80 2015-07-31 14:24:32)

Re: Прошу помощи знатоков SQL

DriveSoft wrote:

Готово.

СПАСИБО!!!!!
По ходу ещё. А если в таблице group кроме поля group есть ещё текстовое поле, например zzz, как и его значение вывести в edZzz на форму?

Не боги горшки лепят!

Re: Прошу помощи знатоков SQL

Добавил в пример

Post's attachments

Attachment icon Employees TableGrid and other components_fixed2.zip 8.37 kb, 498 downloads since 2015-07-31 

Dmitry.

Re: Прошу помощи знатоков SQL

Спасибо, Дмитрий! Такой мудрёный скрипт - ни за что сам не сделал бы...

Не боги горшки лепят!

32 (edited by kunar80 2015-08-03 12:29:57)

Re: Прошу помощи знатоков SQL

Прошу помощи в написании запроса.

SELECT
task.taskname,
strftime('%d.%m.%Y',task.dateEnd),
subtask.subtaskname,
strftime('%d.%m.%Y',subtask.dateEnd)

FROM task

LEFT OUTER JOIN subtask ON subtask.id_task=task.id

WHERE
task.status=1;
subtask.status=1;

ORDER BY strftime('%d.%m.%Y',task.dateEnd), strftime('%d.%m.%Y',subtask.dateEnd)

Сейчас у меня не выполняется второе условие. Нужно, чтобы в таблице были показаны все те задачи, статус которых равен 1 и только те подзадачи (а их у задачи может и не быть), статус которых равен 1. Если подзадача уже выполнена, т.е. её статус равен 0, то отбираться запросом она не должна.
На рисунке: субзадача "Найти первый орешек" выполнена и имеет статус = 0, поэтому в результат запроса попасть она не должна.

Post's attachments

Attachment icon 2015-08-03_152303.jpg 50.46 kb, 319 downloads since 2015-08-03 

Не боги горшки лепят!

Re: Прошу помощи знатоков SQL

SELECT
task.taskname,
strftime('%d.%m.%Y',task.dateEnd),
subtask.subtaskname,
strftime('%d.%m.%Y',subtask.dateEnd)

FROM task

LEFT OUTER JOIN subtask ON subtask.id_task=task.id

WHERE
task.status=1 AND subtask.status=1

ORDER BY strftime('%d.%m.%Y',task.dateEnd), strftime('%d.%m.%Y',subtask.dateEnd)

если в SQL запросе встречается точка с запятой, это означает конец запроса, и все что написано дальше, будет проигнорировано.

Dmitry.

34 (edited by kunar80 2015-08-04 12:59:07)

Re: Прошу помощи знатоков SQL

DriveSoft wrote:
WHERE
task.status=1 AND subtask.status=1

Такая запись предполагает, что выполняться должны одновременно оба условия. В таком случае в результат не попадают задачи, не имеющие подзадач.
Нужно, чтобы было ИЛИ-ИЛИ.
Т.е.:
1) Есть task у которого task.status=1, но не содержащий подзадач subtask;
2) Есть task у которого task.status=1, включающий в себя подзадачи со статусами как subtask.status=1 так и subtask.status=0;
3) Есть task у которого task.status=0, но не содержащий подзадач subtask;
4) Есть task у которого task.status=0, включающий в себя подзадачи со статусами subtask.status=0;
В результате должны быть отобраны 1) и 2). Но у 2) только те subtask, статус которых subtask.status=1.
Пробовал вместо AND записать OR, но результата никакого - отбирает все записи подряд, и выполненные и не выполненные.

Не боги горшки лепят!

35 (edited by kunar80 2015-08-04 15:42:11)

Re: Прошу помощи знатоков SQL

По описанной выше проблеме сделал пример.
В грид формы frmAll должны отбираться только те записи, у которых в названии обозначено НА КОНТРОЛЕ.

Post's attachments

Attachment icon Задача-Субзадача_fixed.rar 13.34 kb, 501 downloads since 2015-08-04 

Не боги горшки лепят!

Re: Прошу помощи знатоков SQL

Даже в EXCEL это решаемо. А тут сутки бьюсь, и всё никак. Неужели нет решения?

Не боги горшки лепят!

Re: Прошу помощи знатоков SQL

Как только появится время, я посмотрю.

Dmitry.

Re: Прошу помощи знатоков SQL

Попробуйте пожалуйста данный SQL запрос

SELECT
task.taskname,
strftime('%d.%m.%Y',task.dateEnd),
subtask.subtaskname,
strftime('%d.%m.%Y',subtask.dateEnd)

FROM task

LEFT OUTER JOIN subtask ON subtask.id_task=task.id

WHERE
((SELECT Count(*) FROM subtask sub WHERE sub.id_task=task.id AND sub.status=1) > 0 OR task.status=1) AND (subtask.status <> 0 OR subtask.status IS NULL )


ORDER BY strftime('%d.%m.%Y',task.dateEnd), strftime('%d.%m.%Y',subtask.dateEnd)
Dmitry.

Re: Прошу помощи знатоков SQL

Это оно! Спасибо огромное, Дмитрий!

Не боги горшки лепят!

Re: Прошу помощи знатоков SQL

Очень прошу посмотреть скрипт. Что в последней строке не так?

procedure frmAddPhases_ComboBox1_OnChange (Sender: string);
Var
sDate: string;
c: string;
begin
frmAddPhases.Edit1.Text := SQLExecute ('SELECT phasesFactor FROM proceduresPhase WHERE id='+frmAddPhases.ComboBox1.sqlValue);
frmAddPhases.DateTimePicker2.DateTime := frmAddTender.DateTimePicker2.DateTime;

sDate := frmAddPhases.DateTimePicker2.sqlDateTime;
c := frmAddPhases.Edit1.sqlValue;
if sDate <> '' then frmAddPhases.DateTimePicker1.DateTime := SQLDateTimeToDateTime((sDate)+(c)) else frmAddPhases.DateTimePicker1.Checked := False;
end;

Дата в DateTimePicker1 должна быть на 28 дней отличаться от даты в DateTimePicker2.

Post's attachments

Attachment icon 2015-08-16_175809.jpg 15.77 kb, 265 downloads since 2015-08-16 

Не боги горшки лепят!

Re: Прошу помощи знатоков SQL

Достаточно данного скрипта

procedure Form1_DateTimePicker1_OnChange (Sender: string);
begin
    Form1.DateTimePicker2.DateTime := Form1.DateTimePicker1.DateTime + 28;
    Form1.DateTimePicker2.Checked := Form1.DateTimePicker1.Checked;
end;
Dmitry.

42 (edited by kunar80 2015-08-17 14:49:54)

Re: Прошу помощи знатоков SQL

Дмитрий, это не то. Каждому значению, выбранному в комбобоксе, соответствует своё зачение, попадающее в Edit1. Для этой записи - это - 28 дней, для другой, например, + 7 дней, для третьей ещё какое-то...

Не боги горшки лепят!

Re: Прошу помощи знатоков SQL

Тогда так

procedure Form1_DateTimePicker1_OnChange (Sender: string);
begin
    Form1.DateTimePicker2.DateTime := Form1.DateTimePicker1.DateTime + Form1.Edit1.Value;
    Form1.DateTimePicker2.Checked := Form1.DateTimePicker1.Checked;
end;
Dmitry.

Re: Прошу помощи знатоков SQL

DriveSoft wrote:

Тогда так

Спасибо, Дмитрий! Наконец-то добрался до своего проекта. Благодаря Вам работает.

Не боги горшки лепят!

45 (edited by kunar80 2015-08-20 19:19:52)

Re: Прошу помощи знатоков SQL

Подскажите пожалуйста, как правильно записать условие SQL отчёта, чтобы из разных таблиц отбирались записи только относящиеся к выбранному в гриде значению. Записал так, но даёт ошибку:

WHERE procedures.id=IntToStr(Form1.TableGrid1.dbItemID);

Без этого условия отчёт работает, но отбирает всё подряд.

Не боги горшки лепят!

Re: Прошу помощи знатоков SQL

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

WHERE procedures.id={TableGrid1};
Dmitry.

Re: Прошу помощи знатоков SQL

ID вычисляет, но не работает.
Без условия работает, но собирает все записи.
Скрипт такой:

SELECT
procedures.rozkrittiaDate,
procedures.proceduresSUM,
subjectProcedure.subjectName,
strftime('%d.%m.%Y',procedures.rozkrittiaDate),
phases.phase,
strftime('%d.%m.%Y',phases.dateEnd),
phases.status,
(CASE WHEN phases.status=1 then 'НА КОНТРОЛІ' WHEN phases.status=0 then 'ВИКОНАНО' else '' end)
FROM procedures

LEFT OUTER JOIN phases ON phases.id_procedures=procedures.id
LEFT OUTER JOIN subjectProcedure ON procedures.id_subjectProcedure=subjectProcedure.id

ORDER BY strftime('%d.%m.%Y',phases.dateEnd)

WHERE procedures.id={TableGrid1};
Не боги горшки лепят!

Re: Прошу помощи знатоков SQL

Приложите пожалуйста данный проект с описанием, на какой форме данный отчет.

Dmitry.

Re: Прошу помощи знатоков SQL

Попробуйте такой запрос

SELECT
procedures.rozkrittiaDate,
procedures.proceduresSUM,
subjectProcedure.subjectName,
strftime('%d.%m.%Y',procedures.rozkrittiaDate),
phases.phase,
strftime('%d.%m.%Y',phases.dateEnd),
phases.status,
(CASE WHEN phases.status=1 then 'НА КОНТРОЛІ' WHEN phases.status=0 then 'ВИКОНАНО' else '' end)
FROM phases

LEFT OUTER JOIN procedures ON procedures.id=phases.id_procedures
LEFT OUTER JOIN subjectProcedure ON procedures.id_subjectProcedure=subjectProcedure.id

WHERE procedures.id={TableGrid1}

ORDER BY strftime('%d.%m.%Y',phases.dateEnd)
Dmitry.

Re: Прошу помощи знатоков SQL

Спасибо, Дмитрий. Этот запрос работает

Не боги горшки лепят!