1 (edited by kunar80 2015-07-05 06:59:47)

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

Нужен SQL  запрос для кнопки frmMain.ButtonSQL на поиск и отбор в frmMain.TableGrid1 только тех записей, которые удовлетворяют такому условию: к ним привязаны записи из подчинённой таблицы details, и хотя бы одна из них имеет дату dateCompletion равную искомой дате в frmMain.DateTimePicker3 при details.status=1. Таблицы и их поля смотрите на прилагаемом рисунке. И уже заранее всех благодарю.

Post's attachments

Attachment icon 2015-07-05_004601.jpg 66.62 kb, 301 downloads since 2015-07-05 

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

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

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

Dmitry.

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

DriveSoft wrote:

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

Проект прилагаю. Основных не решённых вопросов пока четыре:
1)    frmMain.TableGrid1
Enter и DoubleClik почему-то открывают форму редактирования, хотя прописан запрет и этого не должно быть. Т.е. должна открываться форма frmViewDetails, а редактирование только по кнопке редактирования.
2)    procedure frmMain_TableGrid1_OnChange
Здесь к раскраске ячеек со значением НА КОНТРОЛЕ хотелось бы добавить красный цвет этих ячеек при условии, что или сама задача должна быть выполнена сегодня, или в подчинённой таблице у этой задачи есть хотя бы одна подзадача, срок исполнения которой истекает именно сегодня. Т.е. сразу же после запуска проекта в таблице главной формы красным цветом выделены актуальные на сегодня задачи, розовым (как сейчас) – остальные со статусом НА КОНТРОЛЕ.
3)    frmMain .DateTimePicker3 и кнопка frmMain .ButtonSQL
Почти то же, что и пункт 2, т.е. показ в гриде  только тех задач, у которых хотя бы одна подзадача должна быть выполнена в установленный в DateTimePicker срок. Кнопку планирую спрятать,  а клик по ней навесить на кнопку поиска.
4)    frmAddTask.CheckBox1,  frmAddTask.CheckBox2 и frmAddDetail.CheckBox1 по ходу изменил на три состояния, следовательно возникла необходимость изменить вычисляемые поля statusControl2 (tasks), statusYes(tasks) и statusControl(details), т.к. скрипты  в них были написаны для чекбоксов на два состояния. Т.е. добавить в ячейку грида помимо НА КОНТРОЛЕ ещё и ВЫПОЛНЕНО.

Post's attachments

Attachment icon Test_Assistant.rar 429.91 kb, 653 downloads since 2015-07-06 

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

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

kunar80

исправил немного SQL запрос для кнопки frmMain.ButtonSQL

SELECT
tasks.dateRecording,
tasks.contentTask,
tasks.dateCompletion,
(CASE WHEN ((SELECT Count(*) FROM details WHERE details.id_tasks=tasks.id AND details.status=1) > 0 OR details.status=1) then 'НА КОНТРОЛЕ' else  '' end),
tasks.note,
details.dateCompletion,
details.status
FROM tasks

LEFT OUTER JOIN details ON details.id_tasks = tasks.id

WHERE details.dateCompletion = {DateTimePicker3} AND details.status = 1


1. У меня работает все так, как вы описали, открывается форма frmViewDetails


С остальными вопросами помочь не смогу, я могу помочь вам только с чем то конкретным.

Dmitry.

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

DriveSoft wrote:

1. У меня работает все так, как вы описали, открывается форма frmViewDetails

У меня тоже, ПОКА НЕ ЗАЛОГИНИШЬСЯ!

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

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

kunar80 wrote:
DriveSoft wrote:

1. У меня работает все так, как вы описали, открывается форма frmViewDetails

У меня тоже, ПОКА НЕ ЗАЛОГИНИШЬСЯ!

на 283 строке у вас данный запрет снимается

frmMain.TableGrid1.dbPopupMenu.Items[0].Enabled := True;
Dmitry.

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

СПАСИБО!!!!!!

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

8 (edited by kunar80 2015-07-08 08:32:52)

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

По пункту 2 сейчас скрипт выглядит так:

procedure frmMain_TableGrid1_OnChange (Sender: string);
/////// Цвет фона ячейки грида при условии /////////////
    var
       i,c: integer;
    begin
         c := frmMain.TableGrid1.RowCount - 1;
         for i := 0 to c do
         begin
         if frmMain.TableGrid1.Cells[3,i] = 'НА КОНТРОЛЕ' then frmMain.TableGrid1.Cell[3,i].Color := $00BBBBFF;
         end;
    end;

Самостоятельно никак не получается дописать скрипт так, чтобы получилось, как на прикрепленном рисунке. Прошу помощи.

Post's attachments

Attachment icon 2015-07-08_111748.jpg 140.78 kb, 292 downloads since 2015-07-08 

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

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

kunar80
Попробуйте так

procedure frmMain_TableGrid1_OnChange (Sender: string);
/////// Цвет фона ячейки грида при условии /////////////
 var
       id,i,c: integer;
       s,z: string;
begin


         c := frmMain.TableGrid1.RowCount - 1;
         for i := 0 to c do
         begin
             id := frmMain.TableGrid1.dbIndexToID(i);
             if frmMain.TableGrid1.Cells[3,i] = 'НА КОНТРОЛЕ' then
                 if (SQLExecute('SELECT COUNT(*) FROM details WHERE date(dateCompletion)=date(''now'') AND id_tasks='+IntToStr(id)) > 0) or (frmMain.TableGrid1.Cells[2,i]=DateToStr(now)) then
                     frmMain.TableGrid1.Cell[3,i].Color := clRed else
                         frmMain.TableGrid1.Cell[3,i].Color := $00BBBBFF;
         end;
 end;


если  будет много записей в гриде, возможно это будет  работать медленно, т.к. на каждую запись делаем SQL запрос, можно ограничить максимальное количество загружаемых записей в грид:

Form1.TableGrid1.dbLimit := 500;
Dmitry.

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

Спасибо. Это работает.

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

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

Подскажите пожалуйста, что неправильно в запросе

DELETE
abonents.id_organization,
abonentsid.id_department,
abonents.id_otdel,
abonents.id_room,
abonents.id_position,
abonents.person,
abonents.phoneWork,
abonents.phoneMobile,
abonents.phoneHome,
abonents.phoneOther,
abonents.FAX,
abonents.emailWork,
abonents.emailHome,
abonents.tags

FROM abonents



WHERE id_organization = {ComboBox1}

Смотрите рисунок, будет понятнее, о чём речь.

Post's attachments

Attachment icon SQL запрос.jpg 72.76 kb, 293 downloads since 2015-07-10 

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

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

kunar80
Для удаления записи нет необходимости перечислять поля:

DELETE FROM abonents WHERE id_organization = {ComboBox1}
Dmitry.

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

DriveSoft wrote:

kunar80
Для удаления записи нет необходимости перечислять поля

Спасибо, Дмитрий! Так работает.

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

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

И вновь прошу помощи. Такой скрипт

SELECT
tasks.contentTask,
tasks.dateCompletion,
details.contentDetails,
details.dateCompletion,
(CASE WHEN ((SELECT Count(*) FROM details WHERE details.id_tasks=tasks.id AND details.status=1) > 0 OR details.status=1) then 'НА КОНТРОЛЕ' else  '' end)

FROM tasks

LEFT OUTER JOIN details ON details.id_tasks = tasks.id

даёт даты в виде 2015-07-14 00:00:00.000 (Результат на рисунке). А как получить 14.07.2015?
Это первый вопрос. И второй. Как к этому добавитьещё поля department.department, otdel.otdel, pozition.pozition, abonents.person если в таблице details есть поля id_department, id_otdel, id_pozition, id_abonents?

Post's attachments

Attachment icon 2015-07-13_225240.jpg 58.23 kb, 304 downloads since 2015-07-13 

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

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

kunar80

SELECT
tasks.contentTask,
strftime('%d.%m.%Y',tasks.dateCompletion),
details.contentDetails,
strftime('%d.%m.%Y',details.dateCompletion),
(CASE WHEN ((SELECT Count(*) FROM details WHERE details.id_tasks=tasks.id AND details.status=1) > 0 OR details.status=1) then 'НА КОНТРОЛЕ' else  '' end),

department.department, 
otdel.otdel, 
pozition.pozition, 
abonents.person

FROM tasks

LEFT OUTER JOIN details ON details.id_tasks = tasks.id

LEFT OUTER JOIN department ON details.id_department = department.id
LEFT OUTER JOIN otdel ON details.id_otdel = otdel.id
LEFT OUTER JOIN pozition ON details.id_pozition = pozition.id
LEFT OUTER JOIN abonents ON details.id_abonents = abonents.id
Dmitry.

16 (edited by kunar80 2015-07-14 11:49:44)

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

СПАСИБО! И ещё вопрос: а как дописать, чтобы осуществлялась сортировка по датам? Сейчас записи выводятся в непонятном порядке (см. рисунок выше).

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

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

Вконце запроса добавить

ORDER BY tasks.dateCompletion
Dmitry.

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

DriveSoft wrote:

Вконце запроса добавить

ORDER BY tasks.dateCompletion

А внутри tasks по details.dateCompletion (см. рисунок)?

Post's attachments

Attachment icon 2015-07-14_155016.jpg 152.55 kb, 300 downloads since 2015-07-14 

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

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

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

ORDER BY tasks.dateCompletion, details.dateCompletion
Dmitry.

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

DriveSoft wrote:

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

ORDER BY tasks.dateCompletion, details.dateCompletion

Спасибо Дмитрий! Я до этого как-то не додумался. Почти также пробовал сделать, но вместо запятой писал AND. Увы, это ничего не дало, поэтому и обратился за помощью.

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

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

Пожалуйста подскажите, что не правильно в записи

Form1.dtpBirthday.DateTime := SQLExecute ('SELECT strftime('%d.%m.%Y',contact.birthday) WHERE id='+Form1.TableGrid2.sqlValue);

Ругается на скобку перед форматом даты.

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

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

Form1.dtpBirthday.DateTime := SQLExecute ('SELECT strftime(''%d.%m.%Y'',contact.birthday) WHERE id='+Form1.TableGrid2.sqlValue);
Dmitry.

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

теперь ругается на отсутствие колонки contact.birthday. В таблице и гриде она есть.

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

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

в sql запросе пропущено слово FROM

Form1.dtpBirthday.DateTime := SQLExecute ('SELECT strftime(''%d.%m.%Y'',contact.birthday) FROM contact WHERE id='+Form1.TableGrid2.sqlValue);
Dmitry.

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

DriveSoft wrote:

в sql запросе пропущено слово FROM

С  FROM contact даёт ошибку (на рисунке)

Post's attachments

Attachment icon 2015-07-31_121634.jpg 48.76 kb, 292 downloads since 2015-07-31 

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