1 (edited by Evgeniy D 2017-05-30 06:35:52)

Topic: Помогите с SQL запросом (перенос задач)

Коллеги помогите реализовать следующее с помощью запроса:
Имеется таблица с поручениями (все функции сейчас работают, единственное что таблица не нормализованна  - ну так надо)
требуется реализовать перенос выбранного поручения на место другого. Словами сложно все описать. во вложении файл пример исходной таблицы и результат перемещения.
Помогите ))

Re: Помогите с SQL запросом (перенос задач)

Приложите пожалуйста проект, т.к. не ясно как именно у вас реализована иерархия

Dmitry.

Re: Помогите с SQL запросом (перенос задач)

К сожалению проект довольно большой и использует MySQL СУБД, к которой у меня нет доступа, поэтому не смогу быстро разобраться, что к чему.


Лучше если вы сделаете отдельный проект, с использованием СУБД SQLite с тестовыми данными.

Dmitry.

4 (edited by Evgeniy D 2017-05-30 06:34:43)

Re: Помогите с SQL запросом (перенос задач)

Создавать отдельный проект тоже громоздко, попробую тогда по функционально уточнить.

имеется таблица - porych_GD, в ней текстовое поле - nom_porGD.
nom_porGD допустим содержит следующие строки (номера поручений):
6
6.1
6.1.1
6.1.1.1
6.1.2
6.1.2.1
Нужно при добавлении (нового) поручения присвоить новый номер. Например выбираем в таблице 6.1 то новой записи должен присвоиться (которая на уровень находится ниже 6.1. т.е. будет являться подчиненной к 6.1.) номер 6.1.3, т.е. нужно проверить сколько у 6.1. есть подчиненных на уровень ниже и собственно сгенерировать следующий номер.
пока накидал такой запрос. но не совсем корректно работает ))

sss := poruch_gd.Edit1.Text +'.'; // копируем в переменную № выбранного поручения и добавляем точку (если выбрали №6 то в переменной будет 6.)
         

          new_poruch_GD.Label20.Caption := IntToStr (SQLexecute('SELECT count(*) FROM porych_GD WHERE  LOCATE (".",nom_porGD,"'+sss+'")=0 AND nom_porGD LIKE ("'+sss+'%")')) ;
          new_poruch_GD.Edit13.Text :=  (poruch_gd.Edit1.Text + '.' + new_poruch_GD.Label20.Caption);      // записываем в поле № задачи как - 1.1, 1.2.1, и т.п.

5 (edited by Evgeniy D 2017-05-31 04:20:41)

Re: Помогите с SQL запросом (перенос задач)

По вышеуказанному вопросу в общем получилось. Выглядит код так

sss := poruch_gd.Edit1.Text; // копируем в переменную № выбранного поручения
           x:=SQLexecute('SELECT MAX(nom_porGD) FROM porych_GD WHERE (LEFT(nom_porGD, LENGTH("'+sss+'"))="'+sss+'" AND LOCATE(".",RIGHT(nom_porGD,LENGTH(nom_porGD)-LENGTH("'+sss+'")-1))=0)');
           x:=SQLExecute('SELECT RIGHT("'+x+'",LENGTH("'+x+'")-LENGTH("'+sss+'")-1)')+1;
           x:=sss + '.' + x;
           new_poruch_GD.Edit13.Text :=  x;      // записываем в поле № задачи как - 1.1, 1.2.1, и т.п.

Но в некоторых случаях выражение:

x:=SQLExecute('SELECT RIGHT("'+x+'",LENGTH("'+x+'")-LENGTH("'+sss+'")-1)')+1;

может быть равно NULL.
Надо сделать проверку. код по идее должен выглядеть так:

x:=SQLExecute('SELECT IFNULL (RIGHT("'+x+'",LENGTH("'+x+'")-LENGTH("'+sss+'")-1),0)')+1;

Но 0 не присваивает если NULL
Подскажите что не так? в последнем выражении.
выдает ошибку - could not convert variant of type (UnicodeString) into type (Double)

Re: Помогите с SQL запросом (перенос задач)

Evgeniy D
К сожалению ваш способ организовать иерархию нельзя назвать правильным. В тоже время в программе пока нет компонента TreeView чтоб организовать иерархию правильным способом.


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



Проект с примером:

Post's attachments

Attachment icon TreeView.zip 8.65 kb, 383 downloads since 2017-05-31 

Dmitry.

Re: Помогите с SQL запросом (перенос задач)

Добрый день. Согласен структура не правильная, но задачу пришлось не тривиальными способами решать. Дерево по будущим планам понадобится точно. С этим собственно вопрос - планируете ли этот компонент реализовать? Остальные вопросы снимаются т.к. все получилось.

Re: Помогите с SQL запросом (перенос задач)

Evgeniy D
Планируется, но пока не могу подсказать по срокам.

Dmitry.

Re: Помогите с SQL запросом (перенос задач)

В примере с деревом используется SQLQuery - поясните чем от SQLExecute отличается?

Re: Помогите с SQL запросом (перенос задач)

И еще вопрос.
for i:=1 to 5 do
begin
EndS:= SQLExecute ('SELECT SUBSTRING_INDEX ("'+nn+'",".",i)');                 
end;

Не пойму как в SUBSTRING_INDEX использовать с I - счетчик. т.е. заместо i если написать цифры то работает, а нужно зациклить.

Re: Помогите с SQL запросом (перенос задач)

Здравствуйте.


Прощу прощения за задержку с ответом, был в отпуске. Вопрос все еще актуален для Вас?

Dmitry.

Re: Помогите с SQL запросом (перенос задач)

Вопрос решен. Дело было в типах данных

EndS:= SQLExecute ('SELECT SUBSTRING_INDEX ("'+nn+'",".","'+inttostr(iip)+'")');