Группировка

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
korvanakorvana
Местный житель
Сообщения: 429
Зарегистрирован: 24 сен 2008, 11:53

Группировка

Сообщение korvanakorvana »

Код: Выделить всё

const
  xlColorBlack     = 0;
end;

Interface _gt_dolgall 'Задолженность по всем менеджерам' escclose;
//show at(,,70,);
show at(,,33,4);

Table Struct UT
(
  cUser    : comp,
  DesGr    : string [5],
  Descr    : string [21],
  FIO      : string [80],
  OwnName  : string [40],
  Visible  : word
)
With index
(
  UT01 = Descr,
  UT02 = DesGr,
  UT03 = OwnName,
  UT04 = cUser
);

table struct tdolg
   (
   org:string,
   dat:date,
   ckatorg:comp,
   cbasedoc:comp,
   total:double, 
   plat:double, 
   rekl:double,
   prosroch:double,
   itog:double
 )
with index (idx1=cbasedoc, idx2=dat);

create view
var
sum:double;
i,days,delta:longint;
date2,dat2:date;
XlRes: Boolean;
aFileName: String;
as
Select *
From 
basedoc basedoc1, 
katorg katorg1,
katcity katcity1,
basefin, 
stepdoc, 
katsopr, 
tDolg, 
ut usertune,
x$users
, x$users x$users1
, ut
Where
((
word(201)==basedoc.viddoc
and dat2>>=basedoc.ddoc
and 2==basedoc.status
and basedoc.nrec == stepdoc.cbasedoc
and stepdoc.nrec /== katsopr.cstepdoc
and basedoc.nrec == basefin.cbasedoc
//and 106 == katsopr.vidsopr //?

and tdolg.cbasedoc==basedoc1.nrec
and basedoc1.corg==katorg1.nrec
and katorg1.ccity==katcity1.nrec
and basedoc1.descr==UserTune.Descr
));
//and isvalid(tnkatsopr);

//**********************************************************************


screen params 
show at(,,,3);
//show at(,,,20);
fields date2:,noprotect;
buttons 
cmOK, default;
cmCancel;
<<
  Расчет долгов по  .@@@@@@@@@@
 <.Формировать.>  <.  Закрыть  .>
>>
end;

//panel P1
//show at(1,5,32,10);
//show at(,4,,);
// browse Bro1
//  table UserTune;
//  fields
//  UserTune.Descr 'Дескриптор':[5],protect;
//  UserTune.FIO 'Фамилия Имя Отчество':[30],protect;
// end;
//end;

//panel p02
//show at(2,11,20,);
//browse Base;
//table basedoc;
//fields 
//basedoc.descr;
//basedoc.ddoc;
//basedoc.nodoc;
//end;
//end;
//
//panel p02
//show at(21,11,30,);
//browse step;
//table stepdoc;
//fields 
//stepdoc.nrec;
//end;
//end;
//
//panel p02
//show at(31,11,40,);
//browse Kats;
//table katsopr;
//fields
//katsopr.nrec; 
//end;
//end;
//
//panel p02
//show at(41,11,60,);
//browse tDolg;
//table tDolg;
//fields
//tDolg.total; 
//end;
//end;


handleevent

cmInit:
{
date2:=Cur_Date;

    delete all UT;
    
    _LOOP x$users1
      {
        if (GetFirst UT where ((x$users1.Atl_NRec == Ut.cUser)) = tsOk)
          continue;

        ClearBuffer(#UT);
        UT.OwnName := x$users1.XU$LoginName;
        UT.cUser   := x$users1.Atl_NRec;
        UT.Descr   := sGetTuneEx('USER.DESCR', UserOfficeFilial(x$users1.atl_nrec), x$users1.Atl_NRec);
        if (Length(ut.Descr) = 0)
          continue;

        UT.DesGr   := sGetTuneEx('USER.DESGR', UserOfficeFilial(x$users1.atl_nrec), x$users1.Atl_NRec);
        UT.Fio     := sGetTuneEx('USER.Fio', UserOfficeFilial(x$users1.atl_nrec), x$users1.Atl_NRec);
        UT.Visible := wGetTuneEx('Doc.Visible', UserOfficeFilial(x$users1.atl_nrec), x$users1.atl_NRec);
        insert current UT;
      }
}

cmOK:
{
	dat2:=date2;

	delete all tDolg;
	
	StartNewVisual(vtRotateVisual, vfTimer+vfBreak+vfConfirm,'Расчет долгов...', RecordsInTable(#basedoc));
	



_loop basedoc where (basedoc.descr<>'MER' and basedoc.descr<>'***')
	{
//	if isvalid(tnkatsopr) then 
//	if getfirst spsopr=tsOk then
	if getfirst katsopr=tsOk then
		{
        	if GetFirst tDolg where ((basedoc.nrec==tDolg.cbasedoc ))<>tsOk
                //if GetFirst tDolg where ((basedoc.corg==tDolg.ckatorg ))<>tsOk
		then 
		{
		insert in tDolg 	set tDolg.cbasedoc:=basedoc.nrec,
                                            tDolg.ckatorg:=katorg1.nrec,  
                                            tDolg.org:=katorg1.name, 
					    tDolg.total:=basedoc.total,
					    tDolg.dat:=basedoc.ddoc,
					    tDolg.plat:=0,
					    tDolg.rekl:=0,
                                            tDolg.prosroch:=0,
                                            tDolg.itog:=0;
                                            
		if basedoc.valcurse>0 then  tDolg.total:=tDolg.total*basedoc.valcurse;
                		}
		_loop basefin	update current tDolg set tDolg.plat:=tDolg.plat+basefin.summa;
		_loop katsopr if (katsopr.vidsopr=106) then update current tDolg set tDolg.rekl:=tDolg.rekl+katsopr.summa;
	        
        	days:=to_days(dat2)-to_days(basedoc.ddoc);
                if days-basedoc.koldn-delta>0 then  update current tDolg set tDolg.prosroch:=tDolg.prosroch+tdolg.total-tdolg.plat-tdolg.rekl;
                update current tDolg set tDolg.itog:=tDolg.itog+tdolg.total-tdolg.plat-tdolg.rekl;                                   

                }
	if (not nextvisual)  break;	
	}

 i:=4	;

 if getfirst tDolg(idx2)=tsOk then
 {
         XlRes := True;

	aFileName := GetStringParameter('Files','OutputFilesDirectory',0) +'dolg'+trim(UserTune.Descr)+DateToStr(dat2,'DD-MM-YY')+'.xls';
	DeleteFile(aFileName);
	XlRes := xlCreateExcel((aFileName), True);
	if (XlRes) XlRes := xlIsExcelValid;
	If (not XlRes)  
		{
		StopVisual('',0);
		message('Ошибка создания EXEL файла');
		Exit;
		}

	xlSetSheetName(1, 'Долги'); 


// xlCreateMatrix ( recordsintable(#tDolg)+10, 13 );

	xlSetcellFormula('Задолженность по оплате счетов на '+DateToStr(dat2,'DD.MM.YYг.'),1,1,1,1);

	xlSetcellFormula('Дата сч.',3,1,3,1);
	xlSetcellFormula('№ сч.',3,2,3,2);
	xlSetcellFormula('Организация',3,3,3,3);
	xlSetcellFormula('Город',3,4,3,4);
	xlSetcellFormula('Сумма',3,5,3,5);
	xlSetcellFormula('Оплачено',3,6,3,6);
	xlSetcellFormula('Возврат',3,7,3,7);
	xlSetcellFormula('Остаток',3,8,3,8);
	xlSetcellFormula('Дни',3,9,3,9);
	xlSetcellFormula('Усл.',3,10,3,10);
	xlSetcellFormula('Проср',3,11,3,11);
	xlSetcellFormula('Деск.',3,12,3,12);
	xlSetcellFormula('Менеджер',3,13,3,13);



  _loop tDolg
 {   if(  usertune.descr='GTB'or usertune.descr='CHA'  or usertune.descr='GUT01'  or usertune.descr='FRO' or usertune.descr='GUT' or usertune.descr='BAL' or usertune.descr='STA'  or usertune.descr='GOR' or usertune.descr='KOL' or usertune.descr='ALE' or usertune.descr='SPR' or usertune.descr='KLS'or usertune.descr='SHL'or usertune.descr='TRG'or usertune.descr='PIR' or usertune.descr='IVV' or usertune.descr='KOS' or usertune.descr='MAX')
      {
 	sum:=tdolg.total-tdolg.plat-tdolg.rekl;
 	if sum<0 then sum:=0;
 	if sum>1 then
 	{
 	delta:=0;
	case longint(substr(katcity1.tel,length(katcity1.tel),1)) of
		1:delta:=6;
		2:delta:=8;
		3:delta:=4;
		4:delta:=9;
		5:delta:=3;
		6:delta:=1;
	end;

 	days:=to_days(dat2)-to_days(basedoc1.ddoc);
        if days<0 then days:=0;
	xlSetcellFormula(tDolg.org,i,3,i,3);
	xlSetcellFormula(katcity1.name,i,4,i,4);
	//xlSetcellnumbervalue(tdolg.total,i,5,i,5);
	//xlSetcellnumbervalue(tdolg.plat,i,6,i,6);
	//xlSetcellnumbervalue(tdolg.rekl,i,7,i,7);
	//xlSetcellFormula('=RC[-3]-RC[-2]-RC[-1]',i,8,i,8);
	//xlSetcellnumbervalue(days,i,9,i,9);
	//xlSetcellFormula(basedoc1.koldn,i,10,i,10);
	//xlSetcellFormula('=ЕСЛИ(RC[-2]-RC[-1]-'+string(delta)+'>0;RC[-2]-RC[-1]-'+string(delta)+';0)',i,11,i,11);
	//xlSetcellFormula(usertune.descr,i,12,i,12);
	xlSetcellFormula(usertune.fio,i,13,i,13);
        xlSetcellFormula(tDolg.itog,i,5,i,5);
	xlSetcellFormula(tDolg.prosroch,i,6,i,6);
         i:=i+1;
	}  
   }
 }

 i:=i+1;
xlSetcellFormula('=СУММ(E4:E'+string(i-1)+')',i,5,i,5);
xlSetcellFormula('=СУММ(F4:F'+string(i-1)+')',i,6,i,6);
xlSetcellFormula('=СУММ(G4:G'+string(i-1)+')',i,7,i,7);
xlSetcellFormula('=СУММ(H4:H'+string(i-1)+')',i,8,i,8);

 xlSetActiveSheetByName('Долги');
// if not xlImportModule('c:\GAL582\Modules\page.bas') then message ('Ошибка импорта макроса');
// xlRunMacro('SetPage');
 //xlWriteMatrixToExcel ( 1, 1 );
 //xlFreeMatrix;

 xlSetNumberFormat	( '# ##0,00',		4,  5, i, 8 ); 

 xlFrameCells ( xlBorderL, xlThin, xlLineStyleNone, xlColorBlack, 3, 1, i, 13 );
 xlFrameCells ( xlBorderR, xlThin, xlLineStyleNone, xlColorBlack, 3, 1, i, 13 );
 xlFrameCells ( xlBorderT, xlThin, xlLineStyleNone, xlColorBlack, 3, 1, i, 13 );
 xlFrameCells ( xlBorderB, xlThin, xlLineStyleNone, xlColorBlack, 3, 1, i, 13 );
 xlFrameCells ( xlInsideV, xlThin, xlLineStyleNone, xlColorBlack, 3, 1, i, 13 );
 xlFrameCells ( xlInsideH, xlThin, xlLineStyleNone, xlColorBlack, 3, 1, i, 13 );

 XLSETBACKCOLOR (16370100, 3 , 1 , 3 , 13);

 xlSetFontSize  ( 8 , 1 , 1 , MaxExcelRow , MaxExcelCol ); // по всему файлу - шрифт "8"

// xlMergeCells(1,1,1,13);
 xlAlignCells(xlCenter,3,1,3,13);
 xlSetFontSize  ( 11 , 1 , 1 , 1 , 13);
 xlSetFontStyle ( xlBold, 1 , 1 , 3 , 13);
 xlSetFontStyle ( xlBold, i , 1 , i , 13);
 xlFreeze(4,1);

 xlAutoFit(4,1,MaxExcelRow , MaxExcelCol);

 xlSetColumnWidth(20,1,3,MaxExcelRow,3); // ширина колонки организация


 xlKillExcel;

// t2:=cur_time;
}
else message ('Долги отсутствуют');
 StopVisual('',0);
// message(timetostr(sub_time(t2,t1),'HH:MM:SS:SSSS'));

}
cmCancel:
{
closeinterface(cmDone);
mtChangeRefCount( #tDolg,  -1 );
}
end;

end.

РЕбята привет не получается отсортировать таблицу на выходе по организациям
Не получается вот в этой части кода((((

Код: Выделить всё

_loop basedoc where (basedoc.descr<>'MER' and basedoc.descr<>'***')
	{
//	if isvalid(tnkatsopr) then 
//	if getfirst spsopr=tsOk then
	if getfirst katsopr=tsOk then
		{
        	if GetFirst tDolg where ((basedoc.nrec==tDolg.cbasedoc ))<>tsOk
                //if GetFirst tDolg where ((basedoc.corg==tDolg.ckatorg ))<>tsOk
		then 
		{
		insert in tDolg 	set tDolg.cbasedoc:=basedoc.nrec,
                                            tDolg.ckatorg:=katorg1.nrec,  
                                            tDolg.org:=katorg1.name, 
					    tDolg.total:=basedoc.total,
					    tDolg.dat:=basedoc.ddoc,
					    tDolg.plat:=0,
					    tDolg.rekl:=0,
                                            tDolg.prosroch:=0,
                                            tDolg.itog:=0;

if GetFirst tDolg where ((basedoc.nrec==tDolg.cbasedoc ))<>tsOk

Вот здесь пытаюсь заменить на

if GetFirst tDolg where ((katorg1.name==tDolg.org))<>tsOk
для того чтобы при формировании документа Одинаковые фирмы группировались в одну, но при работе этого отчета
вылетает ошибка(((
Подскажите пожалуйста, как сгруппировать по фирмам(?
Ольга
Постоянный обитатель
Сообщения: 135
Зарегистрирован: 29 мар 2005, 17:49

Re: Группировка

Сообщение Ольга »

Если вам нужна сортировка по организациям, то нужен соответствующий индекс в tDolg, поскольку, как я поняла, вы делаете сортировку именно по временной таблице:

Код: Выделить всё

table struct tdolg
   (
   org:string,
   dat:date,
   ckatorg:comp,
   cbasedoc:comp,
   total:double, 
   plat:double, 
   rekl:double,
   prosroch:double,
   itog:double
)
with index (idx1=cbasedoc, idx2=dat, idx3=org);
И для Getfirst в приведенной варианте:
if GetFirst tDolg where ((katorg1.name==tDolg.org))<>tsOk
индекс нужен тоже.
korvanakorvana
Местный житель
Сообщения: 429
Зарегистрирован: 24 сен 2008, 11:53

Re: Группировка

Сообщение korvanakorvana »

Ольга писал(а):Если вам нужна сортировка по организациям, то нужен соответствующий индекс в tDolg, поскольку, как я поняла, вы делаете сортировку именно по временной таблице:

Код: Выделить всё

table struct tdolg
   (
   org:string,
   dat:date,
   ckatorg:comp,
   cbasedoc:comp,
   total:double, 
   plat:double, 
   rekl:double,
   prosroch:double,
   itog:double
)
with index (idx1=cbasedoc, idx2=dat, idx3=org);
И для Getfirst в приведенной варианте:
if GetFirst tDolg where ((katorg1.name==tDolg.org))<>tsOk
индекс нужен тоже.
В том то и дело . Но при запуске отчета вылетает ошибка
Изображение
ahv
Новичок
Сообщения: 21
Зарегистрирован: 15 дек 2009, 07:52

Re: Группировка

Сообщение ahv »

так вот же оно, рекурсивное отношение:
во вьюшке

Код: Выделить всё

and tdolg.cbasedoc==basedoc1.nrec
and basedoc1.corg==katorg1.nrec
и в гетферст

Код: Выделить всё

katorg1.name==tDolg.org
надо делать где-то ResetBounds/SetBounds или добавлять еще синоним.
korvanakorvana
Местный житель
Сообщения: 429
Зарегистрирован: 24 сен 2008, 11:53

Re: Группировка

Сообщение korvanakorvana »

ahv писал(а):так вот же оно, рекурсивное отношение:
во вьюшке

Код: Выделить всё

and tdolg.cbasedoc==basedoc1.nrec
and basedoc1.corg==katorg1.nrec
и в гетферст

Код: Выделить всё

katorg1.name==tDolg.org
надо делать где-то ResetBounds/SetBounds или добавлять еще синоним.
) т.е katorg2 делать? можно примерчик
Ответить