• Авторизация


Один день из жизни программиста 03-03-2007 18:16 к комментариям - к полной версии - понравилось!


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 рубля. [полный листинг написанный на этом этапе не приводится]
вверх^ к полной версии понравилось! в evernote
Комментарии (5):
Гриня 03-03-2007-21:18 удалить
под кат ныкать надо, ленту рвешь :)))) ммда, не густо... но! совершенство достигается практикой - не будешь лениться, станешь великим гуру Дельфей ;)
ITDalee 03-03-2007-22:47 удалить
ну да...шесть утра...Не знаю как насчет совершенства, но ты станешь не просто великим гуру, а сразу каконированым в ранг святых великомучеников гуру !
Не дай бог делфей :) Большую часть машинальных вещей я упустил , тут только размышления о сути проекта :) Вообще если что это штатное расписание Т-3 , форма прилогается +)
Гриня 03-03-2007-22:57 удалить
ITDalee, я пару раз двое суток без сна провел над кодом :) И не столько потому, что "надо было срочно сдавать проект", а потому, что вошел в раж :))


Комментарии (5): вверх^

Вы сейчас не можете прокомментировать это сообщение.

Дневник Один день из жизни программиста | Апрельский_Ёжик - Норка | Лента друзей Апрельский_Ёжик / Полная версия Добавить в друзья Страницы: раньше»