PrjMngFR. Поток данных для отчета по запланированным ресурсам |
Файл: Example\Src\VIP\PrjMng\PrjMngFR.vip
Издание 04.2007. Вызовы методов StartNewVisual и StopVisual перенесены из обработчика событий dataset в обработчик событий datastream.
Издание 01.2007. Добавлены директивы документирования.
Издание 01.2006. В интерфейсе формирования потока данных для отчета по запланированным ресурсам PrjMngFR убран экран с кнопкой "Показать отчет". Запуск отчета перенесен из обработчика события cmShowRep в cmInit
Включен в проект начиная с издания 03.2005.
//****************************************************************************** // (c) корпорация Галактика // Демопроект 1.0 - Управление проектами // Поток данных для отчета по запланированным ресурсам //****************************************************************************** #include IKatPersons.vih #include IKatMaterials.vih #include IPRJEXECUTORS.vih #include IPRJMATERIALS.vih #component "C_PRJMNG" //****************************************************************************** objInterface objPrjMngFR; end; vipInterface PrjMngFR implements objPrjMngFR licensed(free); //****************************************************************************** #doc Поток данных для отчета по запланированным ресурсам. #end interface PrjMngFR; create view var cSuperStack : longInt; cSuperStage : comp; // вышестоящий этап, 0 для проектов wMasterCode : word; // код текущего владельца ресурса sRep : string; sEnterprize : string; sDepChief : string; ProjectLevel : integer; ProjectCode : string; ProjectName : string; ProjectSummP : double; ProjectNRec : comp; i : longInt; as select if(Projects.Status = 'З','Завершенный', if(Projects.Status = 'Т','Текущий', if(Projects.Status = 'П','Планируемый', 'Неопределенное состояние'))) (FieldName = ProjectStatus), PrjExecutors.*, KatPersons.*, PrjMaterials.*, KatMaterials.*, Projects.* from objref PrjExecutors, objref KatPersons, objref PrjMaterials, objref KatMaterials, Projects where (( cSuperStage == Projects.cParent // Cвязь: Проекты -> Сотрудники and wMasterCode == PrjExecutors.MasterCode and ProjectNRec == PrjExecutors.cMaster and resResourceOriginal == PrjExecutors.Status and PrjExecutors.cEmployee == KatPersons.NREC // Связь: Проекты -> Материалы and wMasterCode == PrjMaterials.MasterCode and ProjectNRec == PrjMaterials.cMaster and resResourceOriginal == PrjMaterials.Status and PrjMaterials.cMaterial == KatMaterials.NREC )) ; //============================================================================== datastream PrjMngFR01Stream ( sRep; sEnterprize; sDepChief; dataset ProjectsDS ( [ PrjLevel ] ProjectLevel; [ PrjCode ] ProjectCode; [ PrjName ] ProjectName; [ PrjStatus ] ProjectStatus; [ PrjSummP ] ProjectSummP; table PrjMaterials ( [ MatName ] KatMaterials.Name; [ MatEI ] KatMaterials.EI; [ MatQuantP ] PrjMaterials.QuantP; [ MatSummP ] PrjMaterials.SummP; ); table PrjExecutors ( [ PsnFIO ] KatPersons.FIO; [ PsnDepartment ] KatPersons.Department; [ PsnPost ] KatPersons.Post; [ PsnSalary ] KatPersons.Salary; [ PsnQuantP ] PrjExecutors.QuantP; [ PsnSummP ] PrjExecutors.SummP; ); ); ) //------------------------------------------------------------------------------ handleEvent cmPreProcess: StartNewVisual(vtRotateVisual, vfTimer+vfBreak+vfConfirm, 'Формируется отчет', 0); cmPostProcess: StopVisual('', 0); end; //------------------------------------------------------------------------------ handleEvent table PrjExecutors cmOnProcess: if (not NextVisual) BreakProcess; end; //------------------------------------------------------------------------------ handleEvent table PrjMaterials cmOnProcess: if (not NextVisual) BreakProcess; cmOnClick: message('KatMaterials.Name cmOnClick :' + ExprFieldValue); end; //------------------------------------------------------------------------------ handleEvent dataset ProjectsDS cmOnClick: message('ProjectName cmOnClick :' + ExprFieldValue); cmPreProcess: { cSuperStage := 0; ProjectCode := ''; ProjectName := ''; ProjectSummP := 0; ProjectNRec := 0; if (getFirst Projects = tsOK) ContinueDataset; } cmOnProcess: { if( not NextVisual ) BreakProcess; // текущую запись Projects - в отчет ProjectLevel := Container_GetCount(cSuperStack); ProjectCode := Projects.Code; ProjectName := Projects.Name; ProjectSummP := Projects.SummP; ProjectNRec := Projects.NRec; // следующую готовим (если она есть) PushPos(tnProjects); // запомнить Container_Insert(cSuperStack, cSuperStage); // точку отката // идем вниз по дереву cSuperStage := Projects.Nrec; if (getFirst Projects = tsOK) // есть поддерево - обрабатываем его { ContinueDataset; exit; } else // нет поддерева - возвращаемся ... { i := Container_GetCount(cSuperStack) - 1; cSuperStage := Container_AtC(cSuperStack, i); Container_AtDelete(cSuperStack, i); PopPos(tnProjects); } // ... и продолжаем перебор уровня // если на текущем уровне листья закончились, то поднимаемся, пока не найдем данные while (getNext Projects <> tsOK) do { i := Container_GetCount(cSuperStack); if (i = 0) // обошли все дерево exit; i := i - 1; cSuperStage := Container_AtC(cSuperStack, i); Container_AtDelete(cSuperStack, i); PopPos(tnProjects); }; ContinueDataset; } end; // handleEvent dataset ProjectsDS end; // datastream PrjMngFR01Stream //============================================================================== handleEvent cmInit: { wMasterCode := resProject; cSuperStack := Container_Init('',8,100,10); sRep := '2005 г.'; sEnterprize := 'Концерн "Богатырь"'; sDepChief := 'Петраковский В.П.'; RunFReport(PrjMngFR01Stream, '', false); // только просмотр // RunFReport(PrjMngFR01Stream, '', true); // редактор abort; } end; // interface handleEvent end.