Re: Прошу помощи знатоков SQL
Form1.dtpBirthday.DateTime := SQLDateTimeToDateTime( SQLExecute ('SELECT contact.birthday FROM contact WHERE id='+Form1.TableGrid2.sqlValue) );
My Visual Database → Russian → Прошу помощи знатоков SQL
Form1.dtpBirthday.DateTime := SQLDateTimeToDateTime( SQLExecute ('SELECT contact.birthday FROM contact WHERE id='+Form1.TableGrid2.sqlValue) );
Сделал пример для наглядности того, что мне хотелось бы получить.
А хотелось бы, чтобы при клике по строке грида и при навигации по гриду в компонентах формы отображались не только имя и Мемо, но также дата рождения (проблемы описаны выше) и группа (находится в другой таблице).
Готово.
Готово.
СПАСИБО!!!!!
По ходу ещё. А если в таблице group кроме поля group есть ещё текстовое поле, например zzz, как и его значение вывести в edZzz на форму?
Добавил в пример
Спасибо, Дмитрий! Такой мудрёный скрипт - ни за что сам не сделал бы...
Прошу помощи в написании запроса.
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, поэтому в результат запроса попасть она не должна.
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 запросе встречается точка с запятой, это означает конец запроса, и все что написано дальше, будет проигнорировано.
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, но результата никакого - отбирает все записи подряд, и выполненные и не выполненные.
По описанной выше проблеме сделал пример.
В грид формы frmAll должны отбираться только те записи, у которых в названии обозначено НА КОНТРОЛЕ.
Даже в EXCEL это решаемо. А тут сутки бьюсь, и всё никак. Неужели нет решения?
Как только появится время, я посмотрю.
Попробуйте пожалуйста данный 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)
Это оно! Спасибо огромное, Дмитрий!
Очень прошу посмотреть скрипт. Что в последней строке не так?
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.
Достаточно данного скрипта
procedure Form1_DateTimePicker1_OnChange (Sender: string);
begin
Form1.DateTimePicker2.DateTime := Form1.DateTimePicker1.DateTime + 28;
Form1.DateTimePicker2.Checked := Form1.DateTimePicker1.Checked;
end;
Дмитрий, это не то. Каждому значению, выбранному в комбобоксе, соответствует своё зачение, попадающее в Edit1. Для этой записи - это - 28 дней, для другой, например, + 7 дней, для третьей ещё какое-то...
Тогда так
procedure Form1_DateTimePicker1_OnChange (Sender: string);
begin
Form1.DateTimePicker2.DateTime := Form1.DateTimePicker1.DateTime + Form1.Edit1.Value;
Form1.DateTimePicker2.Checked := Form1.DateTimePicker1.Checked;
end;
Тогда так
Спасибо, Дмитрий! Наконец-то добрался до своего проекта. Благодаря Вам работает.
Подскажите пожалуйста, как правильно записать условие SQL отчёта, чтобы из разных таблиц отбирались записи только относящиеся к выбранному в гриде значению. Записал так, но даёт ошибку:
WHERE procedures.id=IntToStr(Form1.TableGrid1.dbItemID);
Без этого условия отчёт работает, но отбирает всё подряд.
не сосем вонял о каких разных таблицах идет речь, но попробуйте так
WHERE procedures.id={TableGrid1};
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};
Приложите пожалуйста данный проект с описанием, на какой форме данный отчет.
Попробуйте такой запрос
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)
Спасибо, Дмитрий. Этот запрос работает
My Visual Database → Russian → Прошу помощи знатоков SQL
Powered by PunBB, supported by Informer Technologies, Inc.
Theme Hydrogen by Kushi