Страница 1 из 1

EXCEL снова он

Добавлено: 21 янв 2014, 14:56
korvanakorvana

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

Const
  xlColorBlack     = 0;
end;


Interface _gt_kkontragent 'Справка по сертификатам' (,,sci178InsPM) escclose;
show at(,,70,);


create view
var
date1,dat1,date2,dat2:date;
XlRes: Boolean;
aFileName: String;
as
Select *
From 
  basedoc
, katorg
, katcity
, katstate
, katbank
Where
((
word(201)==basedoc.viddoc

and dat1<<=basedoc.ddoc
and dat2>>=basedoc.ddoc

and katorg.nrec == basedoc.corg

and basedoc.nrec==stepdoc.cbasedoc
and stepdoc.nrec==katsopr.cstepdoc

and basedoc.nrec==basefin.cbasedoc

and katorg.ccity==katcity.nrec
and katorg.cstate==katstate.nrec

and katorg.nrec==katbank.corg
));

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

panel P1
//show at(1,5,32,10);
show at(,4,,);
 browse Bro1
  table katorg;
  fields
  katorg.name 'Организация':[50],protect;
  katcity.name 'Город':[30],protect;
 end;
end;

handleevent

cmInit:
{
	date1:=sub_months(cur_date,1);
	date2:=cur_Date;
	getfirst katorg(KATORG02);
}

cmOK:
{
	var i,j,k,c,d:integer;
	var myorg, boss, buh: string;

	myorg := sGetTune('MYORG');
	boss  := sGetTune('BOSS');
	buh   := sGetTune('MAINBUH');

	dat1:=date1;
	dat2:=date2;

	if getfirst basedoc!=tsOk {
		message('Данные отсутствуют!');
		exit;
	}

//	getfirst katbank where ((1==katbank.aktiv(noindex)));
//	message(RecordsInTable(#katbank));

	StartNewVisual(vtRotateVisual, vfTimer+vfBreak+vfConfirm,'Расчет ...', RecordsInTable(#basedoc));

        XlRes := True;

	aFileName := GetStringParameter('Files','OutputFilesDirectory',0) +'kntagnt-'+DateToStr(date1,'DDMMYY')+DateToStr(date2,'DDMMYY')+'.xls';
	DeleteFile(aFileName);
	XlRes := xlCreateExcel((aFileName), True);
	if (XlRes) XlRes := xlIsExcelValid;
	If (not XlRes) {
		message('Ошибка создания EXEL файла');
		Exit;
	}

	xlCreateMatrix ( 1000, 10 );

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

	xlSTWriteToMatrix(1, 1, myorg);
	xlSetFontSize  ( 14, 1 , 1 , 1 , 8);
	xlAlignCells(xlCenter,1,1,1,8);
	xlMergeCells(1,1,1,8);
	xlSTWriteToMatrix(2, 1, 'Акт сверки с контрагентом');
	xlSetFontSize  ( 12, 2 , 1 , 2 , 8);
	xlAlignCells(xlCenter,2,1,2,8);
	xlMergeCells(2,1,2,8);
	xlSTWriteToMatrix(3, 1, 'сформирован за период '+ DateToStr(date1,'DD.MM.YYYY')+' по '+DateToStr(date2,'DD.MM.YYYY'));
	xlSetFontSize  ( 10, 2 , 1 , 2 , 8);
	xlAlignCells(xlCenter,3,1,3,8);
	xlMergeCells(3,1,3,8);

	xlSTWriteToMatrix(5, 1, 'Контрагент: ' + katorg.name);
	xlMergeCells(5,1,5,8);
	xlSTWriteToMatrix(6, 1, 'Адрес: ' + katstate.name + ', ' + katcity.name + ', ' + katorg.addr  + ', тел: ' + katorg.tel);
	xlMergeCells(6,1,6,8);
	xlSTWriteToMatrix(7, 1, 'Банковские реквизиты: ' + katbank.name );
	xlMergeCells(7,1,7,8);
	
	xlSTWriteToMatrix(8, 1, 'P/c: ' + katbank.SCHET1 + ' МФО ' + katbank.MFO1);
	xlMergeCells(8,1,8,8);

	i:=10;

	xlSTWriteToMatrix(i, 1, 'Счёт фактура');
	xlSTWriteToMatrix(i, 3, 'Отгружено');
	xlSTWriteToMatrix(i, 4, 'Оплачено');
	xlMergeCells(i,1,i,2);
//	xlMergeCells(i,3,i,4);
	xlMergeCells(i,4,i,6);
	xlAlignCells(xlCenter,i,1,i,6);
	i:=i+1;
	xlSTWriteToMatrix(i, 1, 'Накладные');
	xlSTWriteToMatrix(i, 4, 'Оплата');
	xlMergeCells(i,1,i,3);
	xlMergeCells(i,4,i,6);
	xlAlignCells(xlCenter,i,1,i,8);
	i:=i+1;
	xlSTWriteToMatrix(i, 1, 'Номер');
	xlSTWriteToMatrix(i, 2, 'Дата');
	xlSTWriteToMatrix(i, 3, 'Сумма');
	xlSTWriteToMatrix(i, 4, 'Номер');
	xlSTWriteToMatrix(i, 5, 'Дата');
	xlSTWriteToMatrix(i, 6, 'Сумма');
	xlAlignCells(xlCenter,i,1,i,8);

	xlSetFontStyle ( xlBold, 1 , 1 , i , 8);

	i:=i+1;

	d:=i;

//	getfirst basedoc(BASEDOC05);

	_loop basedoc {
//		message(basedoc.ddoc + ' ' + basedoc.nodoc);

		if getfirst katsopr!=tsOk and getfirst basefin!=tsOk then continue;

		c:=i;
		xlSTWriteToMatrix(i, 1, basedoc.nodoc +' от '+ DateToStr(basedoc.ddoc,'DD.MM.YY')+'г.');
		xlMergeCells(i,1,i,2);
//		xlMergeCells(i,3,i,4);
//		xlMergeCells(i,5,i,6);
		i:=i+1;

		j:=i;
		_loop katsopr {
			xlSTWriteToMatrix(j, 2, DateToStr(katsopr.dsopr,'DD.MM.YYYY'));
			xlSTWriteToMatrix(j, 1, katsopr.nsopr);
			xlAlignCells(xlCenter,j,1,j,2);
			xlDOWriteToMatrix(j, 3, katsopr.summa);
			j:=j+1;
		}

		k:=i;
		_loop basefin {
			xlSTWriteToMatrix(k, 5, DateToStr(basefin.ddoc,'DD.MM.YYYY'));
			xlSTWriteToMatrix(k, 4, basefin.nodoc);
			xlAlignCells(xlCenter,k,4,k,5);
			xlDOWriteToMatrix(k, 6, basefin.summa);
			k:=k+1;
		}

		if (j>k) then {i:=j;} else {i:=k;}

		xlSTWriteToMatrix(c, 3, '=sum(C'+string(c+1)+':C'+string(i-1)+')');
		xlSTWriteToMatrix(c, 6, '=sum(F'+string(c+1)+':F'+string(i-1)+')');

		xlSetFontStyle( xlBold, c , 1 , c , 8 );
		xlAlignCells( xlCenter, c , 1 , c , 8 );
		xlAlignCells( xlCenter, c , 3 , c , 3 );
		xlAlignCells( xlCenter, c , 6 , c , 6 );

//		xlMergeCells(c,3,c,4);
//		xlMergeCells(c,5,c,6);


		if (not nextvisual)  break;
	}
	xlSTWriteToMatrix(i, 1, 'Всего по контрагенту');
	xlSTWriteToMatrix(i, 3, '=sum(C'+string(d)+':C'+string(i-1)+')/2');
	xlSTWriteToMatrix(i, 6, '=sum(F'+string(d)+':f'+string(i-1)+')/2');

	xlSetNumberFormat	( '# ##0,00',		d,  3, i, 3 ); 
	xlSetNumberFormat	( '# ##0,00',		d,  6, i, 6 ); 


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


	d:=i;

	xlMergeCells(i,1,i,2);

	i:=i+2;
	xlSTWriteToMatrix(i, 1, 'Задолженность контрагента на '+DateToStr(date2,'DD.MM.YYYY')+ 'г. перед '+myorg+' составляет: ');
	xlMergeCells(i,1,i,6);
	xlSTWriteToMatrix(i, 7, '=C'+string(d)+'-F'+string(d));

	xlSetFontStyle ( xlBold, d , 1 , d , 8);

	i:=i+2;
	xlSTWriteToMatrix(i, 1, 'Задолженность подтверждаем:');
	xlMergeCells(i,1,i,8);
	i:=i+2;
	xlSTWriteToMatrix(i, 1, 'От '+myorg);
	xlMergeCells(i,1,i,8);
	i:=i+2;
	xlSTWriteToMatrix(i, 1, 'Директор');
	xlSTWriteToMatrix(i, 3, boss);
	xlSTWriteToMatrix(i, 6, '___________');
	xlMergeCells(i,1,i,2);
	xlMergeCells(i,3,i,5);
	i:=i+2;
	xlSTWriteToMatrix(i, 1, 'Главный бухгалтер');
	xlSTWriteToMatrix(i, 3, buh);
	xlSTWriteToMatrix(i, 6, '___________');
	xlMergeCells(i,1,i,2);
	xlMergeCells(i,3,i,5);
	i:=i+2;
	xlSTWriteToMatrix(i, 1, 'От '+katorg.name);
	xlMergeCells(i,1,i,8);
	i:=i+2;
	xlSTWriteToMatrix(i, 1, 'Директор');
	xlSTWriteToMatrix(i, 3, '_____________________________');
	xlSTWriteToMatrix(i, 6, '___________');
	xlMergeCells(i,1,i,2);
	xlMergeCells(i,3,i,5);
	i:=i+2;
	xlSTWriteToMatrix(i, 1, 'Главный бухгалтер');
	xlSTWriteToMatrix(i, 3, '_____________________________');
	xlSTWriteToMatrix(i, 6, '___________');
	xlMergeCells(i,1,i,2);
	xlMergeCells(i,3,i,5);

//	xlSetFontStyle ( xlBold, d , 1 , i , 8);

	xlWriteMatrixToExcel ( 1, 1 );
	xlFreeMatrix;

	xlAutoFit(1,1,MaxExcelRow , MaxExcelCol);

	xlSetColumnWidth(10,1,1,MaxExcelRow,6); // ширина колонки

	StopVisual('',0);
	xlKillExcel;
}

cmCancel:
{
	closeinterface(cmDone);
}
end;

end.

Ребят Привет. скажите почему у меня строки тут циклятся до 65501 строки. и документ получается 41 МБ . Где ошибка? Я понимаю что есть другой способ вывести в ячейки, но может есть более простой способ?

Re: EXCEL снова он

Добавлено: 21 янв 2014, 15:27
Den
внутри цикла basedoc выведи в лог отладочную информацию во nrec-ам таблиц, участвующих в связях и увидите быстрее всего что не так....

Re: EXCEL снова он

Добавлено: 21 янв 2014, 20:51
Zver
Ребят Привет. скажите почему у меня строки тут циклятся до 65501 строки. и документ получается 41 МБ . Где ошибка? Я понимаю что есть другой способ вывести в ячейки, но может есть более простой способ?
Не очень понял, что значит "циклится", но скорее всего это связано с тем, что в 2003 офисе ( а создаётся именно такой, судя по расширению файла .xls)
максимальное количество строк - около 65 000.

Начиная с 2007 офиса количество строк чуть больше 1 000 000 (расширение .xlsx)

Так что нужно любыми средствами добиться, чтобы отчет выводился в формате 2007.

Самое простое, для начала, что можно попробовать - указать расширение создаваемого файла .xlsx.

Помогает 50/50.

Re: EXCEL снова он

Добавлено: 21 янв 2014, 20:58
Zver
Кроме того, настоятельно рекомендую избегать явного указания номера строк и столбцов.
Любое изменение количества и/или порядка следования столбцов приведёт к большому количество ручного труда
по перестановки их в коде. Особенно сложно будет сопоставить заголовок и данные.

Могу порекомендовать для номера колонки столбца объявить константу (См. корпоративный стандарт "Система "Галактика". Правила кодирования". пункт 5.1.3 ).
Когда придёт изменить порядок следования столбцов - один раз меняем константу и переделываем весь отчет.

Re: EXCEL снова он

Добавлено: 22 янв 2014, 16:36
korvanakorvana
Zver писал(а):
Ребят Привет. скажите почему у меня строки тут циклятся до 65501 строки. и документ получается 41 МБ . Где ошибка? Я понимаю что есть другой способ вывести в ячейки, но может есть более простой способ?
Не очень понял, что значит "циклится", но скорее всего это связано с тем, что в 2003 офисе ( а создаётся именно такой, судя по расширению файла .xls)
максимальное количество строк - около 65 000.

Начиная с 2007 офиса количество строк чуть больше 1 000 000 (расширение .xlsx)

Так что нужно любыми средствами добиться, чтобы отчет выводился в формате 2007.

Самое простое, для начала, что можно попробовать - указать расширение создаваемого файла .xlsx.

Помогает 50/50.
Пробовали сменить Расиширение на xlsx не помогло. Все равно после выдачи нужных строк ниже идут строки до 65000

Re: EXCEL снова он

Добавлено: 22 янв 2014, 17:50
KATZ
Zver
Так что нужно любыми средствами добиться, чтобы отчет выводился в формате 2007.

Самое простое, для начала, что можно попробовать - указать расширение создаваемого файла .xlsx.
В галактических инклудах описаны константы

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

MaxExcelRow = 65536;
MaxExcelCol = 256;
Сомневаюсь, что смена расширения файла сработает.


korvanakorvana
На первый взгляд, код кажется рабочим. Что печатается в лишних строках? Сделайте, как Den советует, сразу ясности добавится.

Re: EXCEL снова он

Добавлено: 22 янв 2014, 23:27
edward_K
1. Галактический вывод могет выводить много строк в шаблон 2007 и выше
чтобы быть уверенным, что шаблон того формата надо excel открывать через xlcreatefromtemplate
В идеале нужно проверить версию - на это тоже есть функции.
2. чтобы быть уверенным ограничьте вывод в отчет 32000 строк - обычно это помогает
3. писать в матрицу больше строк точно нельзя - обычно пишут блоками по 100/1000 строк
4. в функциях обрамление допускается писать через or - не надо для каждой границы писать.
5. добавьте logstrtofile и посмотрите где чего выводится - заодно узнаете сколько же строк у вас гонится в отчет.
6. у меня для вывода написан свой набор функций, поэтому мне одно переменной
легко отключить матричный вывод - иногда ломается именно из за него, особенно если есть объединение ячеек.

Re: EXCEL снова он

Добавлено: 24 янв 2014, 11:09
Zver
Правильно ли я понимаю, что максимальный размер матрицы, создаваемый функцией xlCreateMatrix, составляет MaxExcelCol * MaxExcelRow ( 256 * 65536 )?

Re: EXCEL снова он

Добавлено: 24 янв 2014, 12:54
Den
Zver писал(а):Правильно ли я понимаю, что максимальный размер матрицы, создаваемый функцией xlCreateMatrix, составляет MaxExcelCol * MaxExcelRow ( 256 * 65536 )?
http://tyumbit.ru/gal_forum/viewtopic.p ... rix#p55144

Re: EXCEL снова он

Добавлено: 24 янв 2014, 13:01
Алексей
нет. неправильно.
я пытался писать матрицей 60000 х 50 полей и получил фигню.... стал выводить матрицей 10000 х 45 - вывелось нормально.
эмпирическим размер вычислить не пытался...

а... уже вон ссылку дали вперёд меня :)

Re: EXCEL снова он

Добавлено: 28 янв 2014, 11:41
korvanakorvana
Алексей писал(а):нет. неправильно.
я пытался писать матрицей 60000 х 50 полей и получил фигню.... стал выводить матрицей 10000 х 45 - вывелось нормально.
эмпирическим размер вычислить не пытался...

а... уже вон ссылку дали вперёд меня :)


ОШИБКА БЫЛА ВОТ В ЧЕМ

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

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

MaxExcelRow а по умолчанию имеет большую цифру, поэтому и прогонялось до последней строчки .


Вы оказались как всегда правы ! Всем спасибо большой. :cool: