4:02 03.03.2007Так , ладно , возьмемся за эту гадину серьезно... Закатали рукава...
Ой... Пирог приготовился , пойду выну... ещё не готов , ладно ...
Построение идет по IDDept , т.е. таблице Departments.
-> Departments содержит подразделения предприятия. IDDept - ключь
(P|A)Struc <- IDDept -> Departments
Суть ключа такова , ID_Struc - ключ должности , НО должность может быть в отделе
главной , т.е. ей подчинаются другие ID_Struc. При этом ведущая должность имеет
ID_Dept структуры которой она подчиняется , как и любая другая. Таким образом
имеем внутреннюю связь таблицы по ID_Struc и ID_Dept. Т.е. Нам надо выбрать
ID_Struc которое на входе И выбрать все ID_Struc которые имеют ID_Dept равный входному
ID_Struc. Причем рекурсивно , т.е. так же для ID_Struc которые мы выбрали
надо выбрать подчинных по ID_Dept , итд. Это очень важный момент.
4:44 03.03.2007Попытался сделать данную выборку путем объединения таблицы с собой , не вышло ,
можно выбрать полное древо подчинения , но отдельную ветвь не выходит (мозг кипит , значит вариант не катит)
Буду делать рекурсией.
Запрос для рекурсии :
code:
Select SSlave.id_struc IDStruc
from Struc SSlave
Where SSlave.id_dept = :IDDept
Собираем все ID_Struc , после чего смотрим для них все подчиненные структуры (если таковые имеются)
Важный момент , если у Query Dept = 1 , то это значит что данный элемент является главным
в новой структуре. Т.е. надо выбирать все подчиненные ему IDStruc
5:54 03.03.2007Напоролся на непонятную багу , беру перерыв.
15:10 03.03.2007Снова возвращаюсь к работе ... итак бага..
15:32 03.03.2007-> На заметку , FastReport - PascalScript некорректно работает с глобальными и локальными переменными.Итого рекурсивная функция:
code:
function GetSlaveStruc(IDDept: Integer;): string;
var
Query: TfrxADOQuery;
IDStruc: string;
begin
Query:= TfrxADOQuery.Create(Data);
Query.CommandTimeout:= _QueryTimeout;
Query.UserName:= 'Query';
Query.SQL.Text:= 'Select Struc.id_struc IDStruc , Struc.Dept as Dept '+#13+
'from Struc '+#13+
'Where Struc.id_dept = :IDDept;';
Query.Params.Items[Query.Params.IndexOf('IDDept')].DataType:= 3;
Query.Params.Items[Query.Params.IndexOf('IDDept')].Value:= IDDept;
Query.Open;
Query.First;
While not(Query.EOF) do
begin
if Query.FieldByName('Dept').AsInteger = 1
then
IDStruc:= Set_IDStruc+
' '+GetSlaveStruc(Query.FieldByName('IDStruc').AsInteger)
else
IDStruc:= IDStruc+' '+Query.FieldByName('IDStruc').AsString;
Query.Next;
end;
Query.Close;
Query.Free;
result:= IDStruc;
end;
---
16:03 03.03.2007Одену ка я линзы и пойду на прогулку... дальше начнется муть , ибо надо выбирать из
AStruc , PStruc , Struc , т.е. архивной структуры , плановой или текущей. И соответственно
брать из архива данные по должностям.
----
17:13 03.03.2007Продолжим ... Итак есть коды подразделений , надо выбрать по ним данные из таблицы Positions или по таблице Worker
Скомпоновал шапку. Сделал выборку IDFirm по входной IDStruc.
Написал выборку сотрудников. Надо будет переработать весь алгоритм построения документа,
учесть тип структуры (архив, план, текущий).
----
Ладно , жмем паузу , подводим итоги ... 3 часа 44 минуты , 165 строк кода , 283 рубля.
[полный листинг написанный на этом этапе не приводится]