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.