Russian Qt Forum

Qt => Печать => Тема начата: PavelVX от Октябрь 31, 2011, 08:27



Название: Торг 12, кто делал под Qt и каким способом
Отправлено: PavelVX от Октябрь 31, 2011, 08:27
Добрый день!
Платформа win/linux. PostgreSQL сервер.
Пытаюсь сделать отчет Торг12. Было три варианта:
1. Попытался приделать eXaro, но он только для SQLite.
2. NCReport бесплатный пока не хочет собираться.
3. (Предпочтителен) Пишем нормальный html. Учитываем заголовок, колонтитулы и все такое в самом html. Вроде бы самый простой вариант, но тут есть две засады:
3.1 Нужно знать номер текущй страницы. Для этого нужно знать, сколько информации входит на одну страницу. И что я достиг конца страницы.
3.2 Нужно знать общее количество страниц. Что бы можно было правильно верстать нижние колонтитулы: страницы 1 из 10.
Если знать количество строк на страницу, можно было бы приблизительно сверстывать страницу, но если название позиции не входит в одну стандартную строку, то что тогда делать? :(

Помогите советами, кто подобное реализовывал.


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: panAlexey от Октябрь 31, 2011, 09:55
Если знать количество строк на страницу, можно было бы приблизительно сверстывать страницу, но если название позиции не входит в одну стандартную строку, то что тогда делать? :(
просто исходи из того, что каждая строка наименования товара/услуги занимает 2 строки. Даже если помещается.

Вот алгоритм печати с моей 1С-ки. Он подскажет:
Код:
//*****************************************************************************
// Если БыстраяПечать=1, то печать производится в режиме быстрой продажи.
Процедура ПечатьТОРГ_12(БыстраяПечать=0, псСДовер = 0)
Если глРазрешитьНапечатать(Контекст, КонтекстФормыДокумента) = 0 Тогда
Возврат;
КонецЕсли;

СтрСортировки = "";
Если (Модифицированность() = 1) И (глДокументСортируется(Контекст, СтрСортировки) = 1) Тогда
Если глПользователь.ОтменитьВопросОСортировке = 1 Тогда
    глСортироватьНакладную(Контекст);
Иначе
Если Вопрос("Сортировать документ? "+СтрСортировки,"Да+Нет") = "Да" Тогда
глСортироватьНакладную(Контекст);
КонецЕсли;
КонецЕсли;
КонецЕсли;

//Для простоты настройки печатной формы примем следующие соглашения:
// - высота строк в таблице печатной формы задана жестко,
// тогда известно, сколько строк помещается на странице;
СтрокНаСтранице = 22;
// - высота шапки и подвала задана жестко и кратна высоте строк таблицы,
// тогда можно указать, сколько строк занимают шапка и подвал
// в пересчете на строки таблицы;
СтрокШапки = 14;
СтрокПодвала = 8;
// - для нормальной работы алгоритма необходимо, чтобы шапка и подвал
// могли поместиться на одной странице + хотя бы одна строка таблицы:
// СтрокНаСтранице >= СтрокШапки + СтрокПодвала + 1
// - если подвал не помещается на странице, он переносится на другую
// страницу с последней строкой; исключение составляет случай,
// когда в таблице всего одна строка.
Если КоличествоСтрок() = 1 Тогда
ПереноситьПоследнююСтроку = 0;
Иначе
ЦелыхСтраницСПодвалом = Цел((СтрокШапки+КоличествоСтрок()+СтрокПодвала)/СтрокНаСтранице);
ЦелыхСтраницБезПодвала = Цел((СтрокШапки+КоличествоСтрок()-1)/СтрокНаСтранице);
ПереноситьПоследнююСтроку = ЦелыхСтраницСПодвалом - ЦелыхСтраницБезПодвала;
КонецЕсли;
//Если ПереноситьПоследнююСтроку = 1 - переносить,
//если ПереноситьПоследнююСтроку = 0 - не надо переносить.
гВалютаПечати=Рубли;
Фирма.ИспользоватьДату(ДатаДок);

ПечПоставщик = "";
ПечПоставщикПа = "";

Таб=СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("ТОРГ-12");
Если УчитыватьНП=1 Тогда
Секц="|НП";
Иначе
Секц="|БезНП";
КонецЕсли;             
вДата = ДатаДок;
печДатаДокДень = глДатаФормат(вДата,"ДД");
печДатаДокМесяц = глДатаФормат(вДата,"ММММ");
печДатаДокГод = глДатаФормат(вДата,"ГГ");


ОрганизацияАдрес = СокрЛП(Фирма.ПолнНаименование)+", ИНН "+СокрЛП(Фирма.ИНН)+", "+
                   глАдресСтрокой(Фирма.ЮридическийАдрес);
Если (ПустоеЗначение(Фирма) = 0) И (ПустоеЗначение(Клиент) = 0) Тогда
ПечПоставщик = СокрЛП(Фирма.ПолнНаименование)+", ИНН "+СокрЛП(Фирма.ИНН)+", "+глАдресСтрокой(Фирма.ЮридическийАдрес);
ПечПоставщикПА = СокрЛП(Фирма.ПолнНаименование)+", ИНН "+СокрЛП(Фирма.ИНН)+", "+глАдресСтрокой(Фирма.ПочтовыйАдрес);
Иначе
Предупреждение("Не выбран клиент или фирма!"); Возврат;
КонецЕсли;         
СчетФирмы = РасчетныйСчет;
Если ПустоеЗначение(СчетФирмы) = 1 Тогда
СчетФирмы = Фирма.СчетПоУмолчанию;
КонецЕсли;
Если ПустоеЗначение(СчетФирмы) = 0 Тогда
Если ПустоеЗначение(СчетФирмы.БанкОрганизации) = 0 Тогда
ОрганизацияАдрес = ОрганизацияАдрес + ", БИК " + СчетФирмы.БанкОрганизации.Код;
ОрганизацияАдрес = ОрганизацияАдрес + ", счет № " + СокрП(СчетФирмы.Номер);
ОрганизацияАдрес = ОрганизацияАдрес + ", в " + СокрП(СчетФирмы.БанкОрганизации.Наименование);
КонецЕсли;
КонецЕсли;
ДопСтрокаОснование = "";
ДопСтрокаОснование = ДопСтрокаОснование + ?(ПустоеЗначение(ЧерезКого) = 1, "", " через: " + СокрЛП(ЧерезКого));
ДопСтрокаОснование = ДопСтрокаОснование + ?(ПустоеЗначение(НомерДоверенности) = 1, "", " доверенность №" + СокрЛП(НомерДоверенности) + " от " + ДатаДоверенности);

ПечГрузополучатель = глГрузополучательПеч(Контекст,1);


СекцияШапки = Таб.ПолучитьСекцию("Шапка"+Секц);

СекцияШапки.Область("Грузополучатель").Текст = ПечГрузополучатель;
Если ПустоеЗначение(ПлательщикСтрокой) = 0 Тогда
СекцияШапки.Область("ПлательщикСтрокой").Текст = СокрЛП(ПлательщикСтрокой);
КонецЕсли;
Таб.ВывестиСекцию(СекцияШапки);

//Таб.ВывестиСекцию("Шапка"+Секц);
НомерСтраницы = 1;

ИтогоКоличествоНаСтранице = 0;
ИтогоСуммаНаСтранице = 0;
ИтогоНДСНаСтранице = 0;
ИтогоСуммаСНДСНаСтранице = 0;
ИтогоНГСМНаСтранице = 0;
ИтогоНПНаСтранице = 0;

ИтогоКоличество = 0;
ИтогоСумма = 0;
ИтогоНДС = 0;
ИтогоСуммаСНДС = 0;
ИтогоНГСМ = 0;
ИтогоНП = 0;

ЭтоНоваяВерсияДокументаНДС = глЭтоНоваяВерсияДокументаСоСтавкойНДС(Контекст);

ТаблЧ =  СоздатьОбъект("ТаблицаЗначений");;
Сворачивать = 0;

Сворачивать = 1;
ТаблЧ =  глПодготовитьТаблицуДокументаТОРГ12(Контекст);

Таб.ВывестиСекцию("ЗаголовокТаблицы"+Секц);

Ном=0;
Если Сворачивать = 1 Тогда
ТаблЧ.ВыбратьСтроки();
Пока ТаблЧ.ПолучитьСтроку() = 1 Цикл
Ном=Ном+1;
//Начинаем новую страницу, если предыдущая строка была последней на странице
//или пора переносить последнюю строку на последнюю страницу с подвалом.
ЦелаяСтраница = (СтрокШапки+Ном-1)/СтрокНаСтранице;
Если (ЦелаяСтраница = Цел(ЦелаяСтраница))
или ((ПереноситьПоследнююСтроку = 1) и (Ном = ТаблЧ.КоличествоСтрок())) Тогда
Таб.ВывестиСекцию("ИтогоПоСтранице"+Секц);
ИтогоКоличествоНаСтранице = 0;
ИтогоСуммаНаСтранице = 0;
ИтогоНДСНаСтранице = 0;
ИтогоСуммаСНДСНаСтранице = 0;
ИтогоНГСМНаСтранице = 0;
ИтогоНПНаСтранице = 0;
Таб.НоваяСтраница();
НомерСтраницы = НомерСтраницы + 1;
Таб.ВывестиСекцию("ЗаголовокТаблицы"+Секц);
КонецЕсли;

прмТовар = ТаблЧ.Товар;
прмЕдиница = ТаблЧ.Единица;
прмКоличество = ТаблЧ.Количество;

ПромНДС = ТаблЧ.ПромНДС;   
ПечЦена = глПересчет(ТаблЧ.Цена ,Валюта,Курс,гВалютаПечати,Дата_Курса);
ПечСумма = глПересчет(ТаблЧ.Сумма ,Валюта,Курс,гВалютаПечати,Дата_Курса);
ПечСуммаБезНДС = глПересчет(ТаблЧ.Сумма-ТаблЧ.ПромНДС ,Валюта,Курс,гВалютаПечати,Дата_Курса);
ПечНДС = глПересчет(ТаблЧ.ПромНДС ,Валюта,Курс,гВалютаПечати,Дата_Курса);
ПечНП = глПересчет(ТаблЧ.СуммаНП ,Валюта,Курс,гВалютаПечати,Дата_Курса);
ПечСтавкаНДС = "Х";
Если ПромНДС <> 0 Тогда
Если ПустоеЗначение(ТаблЧ.СтавкаНДС) = 1 Тогда
ПечСтавкаНДС=?(Розница=1,"Х",?(ВсегдаПечататьНДС = 0,ТаблЧ.Товар.СтавкаНДС.Получить(ДатаДок),Перечисление.ЗначенияНДС.НоваяСтавкаНДС));
Иначе
ПечСтавкаНДС=?(Розница=1,"Х",ТаблЧ.СтавкаНДС);
КонецЕсли;
КонецЕсли;

Таб.ВывестиСекцию("СтрокаТЗ"+Секц);

ИтогоКоличествоНаСтранице = ИтогоКоличествоНаСтранице + прмКоличество;
ИтогоСуммаНаСтранице = ИтогоСуммаНаСтранице + ПечСумма - ПечНДС;
ИтогоНДСНаСтранице = ИтогоНДСНаСтранице + ПечНДС;
ИтогоСуммаСНДСНаСтранице = ИтогоСуммаСНДСНаСтранице + ПечСумма;
ИтогоНПНаСтранице = ИтогоНПНаСтранице + ПечНП;

ИтогоКоличество = ИтогоКоличество + прмКоличество;
ИтогоСумма = ИтогоСумма + ПечСумма - ПечНДС;
ИтогоНДС = ИтогоНДС + ПечНДС;
ИтогоСуммаСНДС = ИтогоСуммаСНДС + ПечСумма;
ИтогоНП = ИтогоНП + ПечНП;
КонецЦикла;
Иначе
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
Ном=Ном+1;
//Начинаем новую страницу, если предыдущая строка была последней на странице
//или пора переносить последнюю строку на последнюю страницу с подвалом.
ЦелаяСтраница = (СтрокШапки+Ном-1)/СтрокНаСтранице;
Если (ЦелаяСтраница = Цел(ЦелаяСтраница))
или ((ПереноситьПоследнююСтроку = 1) и (Ном = КоличествоСтрок())) Тогда
Таб.ВывестиСекцию("ИтогоПоСтранице"+Секц);
ИтогоКоличествоНаСтранице = 0;
ИтогоСуммаНаСтранице = 0;
ИтогоНДСНаСтранице = 0;
ИтогоСуммаСНДСНаСтранице = 0;
ИтогоНГСМНаСтранице = 0;
ИтогоНПНаСтранице = 0;
Таб.НоваяСтраница();
НомерСтраницы = НомерСтраницы + 1;
Таб.ВывестиСекцию("ЗаголовокТаблицы"+Секц);
КонецЕсли;

//ПромНДС = ?(ВсегдаПечататьНДС = 0, НДС, ?(ДатаДок<Дата("01.01.04"),Сумма * 20 / 120,Сумма * 18 / 118));
Если ЭтоНоваяВерсияДокументаНДС <> 1 Тогда
ПромНДС = ?(ВсегдаПечататьНДС = 0, НДС, ?(ДатаДок<Дата("01.01.04"),Сумма * 20 / 120,Сумма * 18 / 118));
Иначе
ПромНДС = НДС;
КонецЕсли;

ПечЦена = глПересчет(Цена - Окр(Цена*ПроцентСкидки/100,2) -ПромНДС/ ?(Количество=0,1,Количество) ,Валюта,Курс,гВалютаПечати,Дата_Курса);
//ПечЦена = глПересчет(Цена-ПромНДС/Количество,Валюта,Курс,гВалютаПечати,Дата_Курса);
ПечСумма = глПересчет(Сумма,Валюта,Курс,гВалютаПечати,Дата_Курса);
ПечСуммаБезНДС = глПересчет(Сумма-ПромНДС,Валюта,Курс,гВалютаПечати,Дата_Курса);
ПечНДС = глПересчет(ПромНДС,Валюта,Курс,гВалютаПечати,Дата_Курса);
ПечНП = глПересчет(СуммаНП,Валюта,Курс,гВалютаПечати,Дата_Курса);
ПечСтавкаНДС = "Х";
Если ПромНДС <> 0 Тогда
Если ПустоеЗначение(СтавкаНДС) = 1 Тогда
ПечСтавкаНДС=?(Розница=1,"Х",?(ВсегдаПечататьНДС = 0,Товар.СтавкаНДС.Получить(ДатаДок),Перечисление.ЗначенияНДС.НоваяСтавкаНДС));
Иначе
ПечСтавкаНДС=?(Розница=1,"Х",СтавкаНДС);
КонецЕсли;
КонецЕсли;
//ПечСтавкаНДС=?(Розница=1,"Х",?(ВсегдаПечататьНДС = 0,Товар.СтавкаНДС.Получить(ДатаДок),Перечисление.ЗначенияНДС.НоваяСтавкаНДС));

Таб.ВывестиСекцию("Строка"+Секц);

ИтогоКоличествоНаСтранице = ИтогоКоличествоНаСтранице + ?(Количество=0,1,Количество);
ИтогоСуммаНаСтранице = ИтогоСуммаНаСтранице + ПечСумма - ПечНДС;
ИтогоНДСНаСтранице = ИтогоНДСНаСтранице + ПечНДС;
ИтогоСуммаСНДСНаСтранице = ИтогоСуммаСНДСНаСтранице + ПечСумма;
ИтогоНПНаСтранице = ИтогоНПНаСтранице + ПечНП;

ИтогоКоличество = ИтогоКоличество + Количество;
ИтогоСумма = ИтогоСумма + ПечСумма - ПечНДС;
ИтогоНДС = ИтогоНДС + ПечНДС;
ИтогоСуммаСНДС = ИтогоСуммаСНДС + ПечСумма;
ИтогоНП = ИтогоНП + ПечНП;
КонецЦикла;
КонецЕсли;

//Если ЭтоНоваяВерсияДокументаНДС = 0 Тогда
// ПромИтогоНДС = ?(ВсегдаПечататьНДС = 0, Итог("НДС"), ПромИтогоНДС);
//Иначе
// ПромИтогоНДС = Итог("НДС");
//КонецЕсли;

Таб.ВывестиСекцию("ИтогоПоСтранице"+Секц);
Таб.ВывестиСекцию("Всего"+Секц);

НаСумму="на сумму "+Формат(ИтогоСуммаСНДС+ИтогоНП,"ЧПДС");
ПодвальнаяСекция = Таб.ПолучитьСекцию("Подвал"+Секц);
ПечЧерезКого = СокрЛП(""+Клиент.ПолнНаименование);
ПечЧерезКого = ПечЧерезКого + ", " + СокрЛП(ДолжностьДоверенности) + " " + СокрЛП(ЧерезКого);
ПодвальнаяСекция.Область("ЧерезКого").Текст = ПечЧерезКого;
ПодвальнаяСекция.Область("ДатаДоверенности").Текст = ДатаДоверенности;
ПодвальнаяСекция.Область("НомерДоверенности").Текст = НомерДоверенности;

Если (ПустоеЗначение(ДоверенностьСотрудника) = 0) И (псСДовер = 1) Тогда
вСотр = ДоверенностьСотрудника.владелец;
Попытка
вСотр = глФИО(вСотр);
Исключение
вСотр = "";
КонецПопытки;
ПодвальнаяСекция.Область("ОтпускРазрешилФИО").Текст = ""+вСотр;
ПодвальнаяСекция.Область("ДоверенностьСотрудника").Текст = ""+ДоверенностьСотрудника;
Попытка
ПодвальнаяСекция.Область("ОтпускРазрешилДолжность").Текст = ДоверенностьСотрудника.Владелец.Должность;
Исключение
КонецПопытки;

КонецЕсли;
Таб.ВывестиСекцию(ПодвальнаяСекция);
Если БыстраяПечать=1 Тогда     
Таб.ПараметрыСтраницы(2,,,,,,,,,1,,);
Таб.КоличествоЭкземпляров(Константа.ПечКолЭкзТорг12ПриБыстройПродаже);
Таб.Напечатать(0);
ИначеЕсли БыстраяПечать="Почта" Тогда
глОтправитьПочтой(Таб,"ТОРГ_12"+НомерДок+"от"+Формат(ДатаДок,"ДГГГГММДД"),Клиент.ЭлПочта,,Контекст);
Иначе
Таб.Опции(0,0,0,0,"ОпцииПечатиНакладной","ОкноНакладной");
Таб.Защита(Константа.ФлагЗащитыТаблиц);
Таб.ТолькоПросмотр(1);
Таб.ПараметрыСтраницы(2,,,0,0,0,0,,,1);
Таб.Показать("Печать накладной","");
КонецЕсли;
КонецПроцедуры //Печать Торг12


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: villager от Ноябрь 03, 2011, 01:10
вряд ли html поможет
просчитать его нереально, и колонтитулы не получится отрисовать
правда я год назад смотрел, может что изменилось

а руками - сначала просчитать (виртуально отрисовать) все страницы, затем расставить общее количество страниц, и тогда уже отрисовать в PDF, или на принтер


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: Termit от Ноябрь 03, 2011, 01:45
Посмотри на
http://qt-apps.org/content/show.php/TextPrinter?content=62383

сможет все рассчитать когда будешь рисовать в html


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: PavelVX от Ноябрь 08, 2011, 09:02
Забавная вещица, просто и со вкусом, но она не показывает общее количество страниц :(
"Страница 1 из 10" не получается загнать.
В полный рост встала другая проблема: а как на хтмл порезать текст на страницы и вставить разделители????
То-есть хочу сделать промежуточные итоги на каждой странице: отрисовываю нужное количество строк, отрисую итоги, но как мне явно указать. что это конец страницы????
Дальше печатать со следующей!


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: Termit от Ноябрь 08, 2011, 11:36
"Страница 1 из 10" не получается загнать.
Показывает. 100%.

В полный рост встала другая проблема: а как на хтмл порезать текст на страницы и вставить разделители????
То-есть хочу сделать промежуточные итоги на каждой странице: отрисовываю нужное количество строк, отрисую итоги, но как мне явно указать. что это конец страницы????
Дальше печатать со следующей!
Боюсь, что на середине страницы вставить перенос не получится.
Можно поиграться с колонтитулами и итоги рисовать в них.


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: PavelVX от Ноябрь 08, 2011, 12:35
а можно пример с номерами страниц?
Код:
///////////////////////////////////////////////////////////////////////////////
// setHeaderText()
///////////////////////////////////////////////////////////////////////////////
/// Set the text for the header. Rich text is supported. HTML tags may be used
/// to format the text and align elements. The following page variables may be
/// included in the text:
/// - \&page; - Insert current page number
/// - \&date; - Insert current date, using the format set with setPageFormat()
///////////////////////////////////////////////////////////////////////////////
и вдогонку вопрос: а как в данном случае на HTML можно реализовать текст в 2 колонки?


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: Termit от Ноябрь 08, 2011, 12:55
а можно пример с номерами страниц?

Код
C++ (Qt)
QString headertext =
   "<table width=\"100%\">"
   "  <tr>"
   "    <td align=\"left\"><strong>%1</strong></td>"
   "    <td align=\"right\"><strong>&date;</strong></td>"
   "  </tr>"
   "</table>";
 
QString footertext =
"<table width=\"100%\">"
"  <tr>"
"    <td align=\"left\"><strong>%1</strong></td>"
"    <td align=\"right\"><strong>&page; / &pages;</strong></td>"
"  </tr>"
"</table>";
 
 
QString titleDoc = tr("Inventory doc #: %1").arg(m_numberDoc);
 
m_textPrinter->setHeaderText(headertext.arg(titleDoc));
m_textPrinter->setFooterText(footertext.arg(titleDoc));
 

&pages - хранит в себе сколько всего страниц

и вдогонку вопрос: а как в данном случае на HTML можно реализовать текст в 2 колонки?
Через html таблицу. Например footertext в коде. Соответственно количество строк будет больше чем 1 :-)


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: PavelVX от Ноябрь 09, 2011, 08:27
ууу, все гениальное просто! :)
если все нормально, завтра попробую ваше предложение с таблицей в футере! :)

PS кстати, а наверное через футер не прокатит, он же одинаковый для всех страниц должен быть!
PPS вещица оказалась удобной, но допиливать надо. После отчетов МС Аксеса кажется сырой :), но на безрыбе ... :) То что они называют заголовком, на самом деле верхний колонтитул. Как такового заголовка отчета нет.


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: PavelVX от Ноябрь 14, 2011, 09:35
Или вы все таки допиливали сами или выложен не самый последний вариант, но
QString footertext =
      "<table width=\"100%\">"
      "  <tr>"
      "    <td align=\"left\"><strong>%1</strong></td>"
      "    <td align=\"right\"><strong>&page; / &pages;</strong></td>"
      "  </tr>"
      "</table>";
что-то не так, у меня выдает 1 / &pages;
Можете выложить куда-нить свой исходник? Или выслать?


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: Termit от Ноябрь 14, 2011, 12:05
Или вы все таки допиливали сами или выложен не самый последний вариант

Да действительно немного допиливал... Давненько было, запамятовал уже :)

Выкладываю


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: PavelVX от Ноябрь 14, 2011, 12:27
Хмм, посмотрел вашу реализацию. Я сделал немного по другому, брал последнюю страницу, но сейчас понимаю, что не я совсем прав.
Спасибо.
А не подскажете, как можно отформатировать текст контента?
То-есть мне надо сделать двухколоночный отчет. Уже и хтмл повертел. Верстактся на две колонки замечательно, но там не получается в нужном месте вставить разрыв страницы.


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: Termit от Ноябрь 14, 2011, 12:45
А не подскажете, как можно отформатировать текст контента?
То-есть мне надо сделать двухколоночный отчет. Уже и хтмл повертел. Верстактся на две колонки замечательно, но там не получается в нужном месте вставить разрыв страницы.
Не совсем понял, что именно нужно сделать... Можете как-нить на яблоках рассказать/показать?


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: PavelVX от Ноябрь 14, 2011, 13:17
page 1
1. пункт 5. пункт
2. пункт 6. пункт
3. пункт 7. пункт
4. пункт 8. пункт
page 2
9.   пункт 13. пункт
10. пункт 14. пункт
11. пункт 15. пункт
12. пункт 16. пункт


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: Termit от Ноябрь 14, 2011, 13:29
Ну так, боюсь, html не позволит сделать красиво

Разве, что как-то насильно указывать сколько строк должно быть в таблице. Но решение будет не гибким...


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: PavelVX от Ноябрь 15, 2011, 05:07
Да и ладно, что решение будет не гибким. В данном случае, у меня вообще нет идей, как сделать гибкое решение :(. ХТМЛ еще и страницу резать не умеет :(.
По идее можно через QTextDocument тоже сделать 2 колонки, а в нужном месте ставить конец страницы. Но не получатся :(


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: panAlexey от Ноябрь 15, 2011, 22:54
Да и ладно, что решение будет не гибким. В данном случае, у меня вообще нет идей, как сделать гибкое решение :(. ХТМЛ еще и страницу резать не умеет :(.
эх, помогли бы довести до ума вот эту штучку (http://code.google.com/p/unnstudioreport/), у тебя бы все было.
Да и у меня )))
да и тот алгоритм мой подошел бы. как раз для фишек такого типа...


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: PavelVX от Ноябрь 16, 2011, 06:05
сейчас посмотрю ваше творение :)
А в чем его надо доводить до ума?
хмм, я демо уже до ошибки довел :(, упала и умерла
Покрутил, повертел и появилось несколько вопросов (в порядке важности):
1. Нумерация страниц, если есть. то как добавить?
2. Можно ли сделать неразрывные группы?
3. Данные для этих отчетов надо самому сформировать в виде xml определенного формата?
4. Границы колонок как-то странно выделяются, нельзя ли выделить 2 колонки одной общей границей?


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: PavelVX от Ноябрь 16, 2011, 07:48
Termit, а вы не пробовали допиливать данный отчет в направлении нормального заголовка отчет и подвала отчете? То, что там сейчас есть называется колонтитулами. А нужен нормальный заголовок. Я покрутил устройство данного отчета, похоже что там, все размеры под колонтитулы/контент вычисляются заранее один раз. Иначе может сбиться нумерация страниц. Поэтому изменить размер заголовка первой страницы проблематично :(. Можете что-нибудь посоветовать? Еще одной проблемой данного отчета является перенос. То-есть, если у вас в конце страницы будет текст размером в две строки, то он может часть текста оставить на одной странице, а вторую часть текста перенести на другую страницу :(. А это очень плохо.


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: panAlexey от Ноябрь 16, 2011, 09:54
сейчас посмотрю ваше творение :)
А в чем его надо доводить до ума?
хмм, я демо уже до ошибки довел :(, упала и умерла
баги, падения, скорость, фьючи.

Покрутил, повертел и появилось несколько вопросов (в порядке важности):
1. Нумерация страниц, если есть. то как добавить?
пака не заморачивался, но разумеется можно будет.

2. Можно ли сделать неразрывные группы?
а что это?

3. Данные для этих отчетов надо самому сформировать в виде xml определенного формата?
не. можно работать с uoReport::uoReportDoc* апи
http://code.google.com/p/unnstudioreport/source/browse/trunk/Report/uoReportDoc.h
в
http://code.google.com/p/unnstudioreport/source/browse/trunk/main.cpp
есть образцы кода. Просто обращаешся к ячейке и все.

4. Границы колонок как-то странно выделяются, нельзя ли выделить 2 колонки одной общей границей?
а скрин можно?


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: PavelVX от Ноябрь 16, 2011, 13:01
Я новичек, но сейчас вникая в дебри печати понимаю, что заголовок, колонтитулы, подвал и есть самые проблематичные места в формировании отчетов.
1. С нумерацией страниц будет тоже куча граблей. Надо учесть что на первой странице может быть/не быть заголовок + колонтитул.
2. Неразрывные группы. Есть товарный документ: накладная, у нее есть(сверху вниз): реквизиты, список товаров/услуг, итоговые данные. Дак вот, группа "итоговые данные" должна быть всегда на одной странице! Не может быть начало на одной, конец на другой. Если не влазит на конец страницы за товаром, нужно начать новую страницу.
4. см приложенный скрин сделанный на коленке в экселе. Это мелочь. но приятно :).


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: Termit от Ноябрь 16, 2011, 13:15
Termit, а вы не пробовали допиливать данный отчет в направлении нормального заголовка отчет и подвала отчете? То, что там сейчас есть называется колонтитулами. А нужен нормальный заголовок.
Заголовок отчёта пишите в тегах <h1>,<h2> и т.д. но не в колонтитуле, а в теле документа. Замечательно переносит со страницы на страницу... Допиливать вроде бы и нечего. Если я правильно понял вопрос ;)

Что касается разбить на 2 колонки. Где можно посмотреть как выглядит этот отчёт "Торг 12"?


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: panAlexey от Ноябрь 16, 2011, 14:03
Я новичек, но сейчас вникая в дебри печати понимаю, что заголовок, колонтитулы, подвал и есть самые проблематичные места в формировании отчетов.
1. С нумерацией страниц будет тоже куча граблей. Надо учесть что на первой странице может быть/не быть заголовок + колонтитул.
это решабельно. тем более когда напрямую управляешь процессом печати вплоть до комманд принтеру.

2. Неразрывные группы. Есть товарный документ: накладная, у нее есть(сверху вниз): реквизиты, список товаров/услуг, итоговые данные. Дак вот, группа "итоговые данные" должна быть всегда на одной странице! Не может быть начало на одной, конец на другой. Если не влазит на конец страницы за товаром, нужно начать новую страницу.
я тебе уже говорил, что ТОРГ-12 особый случай и там просто посчитать надо при выводе.
строки константной высоты и вперед.


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: PavelVX от Ноябрь 17, 2011, 04:58
Termit:
Про две колонки - это я прайс для начала решил сделать :). Просто товар идет в первой колонке, продолжает во второй, потом следующая страница.
Про заголовок: идея понятна, только тогда нужно ввести флаг: не печатать колонтитул на первой странице :) Иначе как-то странно это выглядит:
-начало страницы 1
-(верхний колонтитул) наименование колонок
-заголовок документа
-содержимое документа
-(нижний колонтитул) дата + номер страницы из страниц
-конец страницы 1
panAlexey: а про строку большой константной высоты я не подумал, наверное это и будет выглядеть как надо! :)


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: Termit от Ноябрь 17, 2011, 12:41
Termit:
Про две колонки - это я прайс для начала решил сделать :). Просто товар идет в первой колонке, продолжает во второй, потом следующая страница.
Про заголовок: идея понятна, только тогда нужно ввести флаг: не печатать колонтитул на первой странице :) Иначе как-то странно это выглядит:
-начало страницы 1
-(верхний колонтитул) наименование колонок
-заголовок документа
-содержимое документа
-(нижний колонтитул) дата + номер страницы из страниц
-конец страницы 1
panAlexey: а про строку большой константной высоты я не подумал, наверное это и будет выглядеть как надо! :)


Не нужно в колонтитул тулить наименования колонок!
Правильно делать так:
Нужно сформировать html следующим образом


Код
HTML
<table width=100% cellspacing=0 cellpadding=0>
<thead>
 <tr>
  <th>Col 1</th>
  <th>Col 2</th>
 </tr>
</thead>
<tbody>
 <tr>
  <td>Row 1-1</td>
  <td>Row 1-2</td>
 </tr>
 <tr>
  <td>Row 2-1</td>
  <td>Row 2-2</td>
 </tr>
</tbody>
</table>
 
Все что находится в тегах th будет автоматом повторятся на всех страницах где будет эта таблица.




Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: panAlexey от Ноябрь 17, 2011, 12:53
panAlexey: а про строку большой константной высоты я не подумал, наверное это и будет выглядеть как надо! :)
У меня такое есть: строке устанавливается атрибут фиксированного размера когда пользователь меняет её высоту руками.
"Стряхнуть" этот атрибут можно установив из контекстного меню "Автоширину".


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: PavelVX от Ноябрь 17, 2011, 13:11
Чих-пых! Век живи, век учись, все равно дураком помрешь :(.
За <thead>, <tbody> и как сделать без верхнего колонтитула огромное спасибо!!!
С колонками не совсем так: представьте открытую книгу. Вы в начале читаете левую страницу, потом правую. То же самое и с прайсом, в начале читаем левую колонку полностью на странице, потом правую.


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: Termit от Ноябрь 17, 2011, 13:46
С колонками не совсем так: представьте открытую книгу. Вы в начале читаете левую страницу, потом правую. То же самое и с прайсом, в начале читаем левую колонку полностью на странице, потом правую.
Представляю :-)

Вариант как я говорил выше - не гибкий.

Считаем кол-во строк которое помещается на страницу. И ручками разбираем все строки которые нужно вывести.

Для примера скажем так:
На страницу влазит 10 строк. У нас есть массив строк для вывода из 51 элемента. Выводить будем так

Из примера html выше
Row 1-1 => Элемент массива строк 1
Row 1-2 => Элемент массива строк 10+1
Row 2-1 => Элемент массива строк 2
Row 2-2 => Элемент массива строк 10+2
и т.д. до конца страницы

Дальше добавляем разделитель страниц.
И вставляем новую таблицу

Row 1-1 => Элемент массива строк 21
Row 1-2 => Элемент массива строк 31+1
Row 2-1 => Элемент массива строк 22
Row 2-2 => Элемент массива строк 31+2
и т.д. до конца страницы

Дальше добавляем разделитель страниц.
И вставляем новую таблицу
А вот тут нужно будет посчитать как правильно разместить строки
Row 1-1 => Элемент массива строк 41
Row 1-2 => Элемент массива строк 46
Row 2-1 => Элемент массива строк 42
Row 2-2 => Элемент массива строк 47
Row 3-1 => Элемент массива строк 43
Row 3-2 => Элемент массива строк 48
Row 4-1 => Элемент массива строк 44
Row 4-2 => Элемент массива строк 49
Row 5-1 => Элемент массива строк 45
Row 5-2 => Элемент массива строк 50
Row 6-1 => Элемент массива строк 51
Row 6-2 => &nbsp;

Про <thead> и <tbody> - в этом случае не пригодятся т.к. на каждой странице будет своя таблица.


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: PavelVX от Ноябрь 18, 2011, 04:51
Что-то подобное я и пытался сделать, посчитал количество строк, которое влазит на страницу, если текст переносится, то считаем строку за две.
Только сегодня нашел,  что можно средствами html создать разрыв страницы.
За идею "новая страница - новая таблица" - спасибо! Сам бы наверное не скоро до этого дошел. Кстати, проще и правильнее считать количество элементов в высоту, а в верстке делать таблицу в таблице: table(page) tr td table2(content) /td  td table2(content) /td /tr /table(page) разделитель_страницы.
PS А никто не подскажет, как посчитать высоту полученной ячейки? Сейчас реализовал дубово: высота = длина_строки_в_символах/константа(количество символов без переноса), но это дает погрешность.


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: Termit от Ноябрь 18, 2011, 12:07
Только сегодня нашел,  что можно средствами html создать разрыв страницы.
Каким образом?


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: o_m от Ноябрь 18, 2011, 20:07
не пробовал но вроде так:
...The following table lists the CSS properties supported by Qt's rich text engine: ...
page-break-before [ auto | always ] Make it possible to enforce a page break before the paragraph/table
page-break-after [ auto | always ]Make it possible to enforce a page break after the paragraph/table...
(из справки по скриптрепорту...)


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: Termit от Ноябрь 18, 2011, 20:14
...The following table lists the CSS properties supported by Qt's rich text engine: ...
Ну да, видел, но это CSS не HTML.


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: PavelVX от Ноябрь 21, 2011, 04:55
Да, неправильно написал, средствами CSS, а не HTML!
Код:
<table style=\"width: 100%; padding: 0; border: none; border-collapse: collapse;\">\n 
<tr><td style=\"background-color: #B0B0B0; height: 1; padding: 0;\" nowrap></td></tr>\n
</table>\n
<br style=\"page-break-after: always\">\n
Кстати, не знаю баг это или фича, но если просто разрывать таблицу постранично, то хватает только последней строчки. Если разрывать страницы потаблично сделанные, то нужно использовать всю конструкцию. Посколько с HTML&CSS малознаком, то может это особенность связки.


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: PavelVX от Ноябрь 22, 2011, 11:49
Какой-то бред получается :(
Дописал функцию вычисления высоты:
Код:
int dialogCreatePrices::numRowInPrintText(int iWidth, QString iText)
{
    QTextDocument doc;
    doc.setPlainText(iText);
    doc.setPageSize(QSizeF(iWidth,-1));
    int res = ((int)((doc.size().height()-21)/13)) + 1;
    return res;
}
Подобрал на тестах с данными(типа "10 11 12 13") ширину. На тестах получатся все замечательно. Но стоит подсунуть реальные данные, все съезжает из-за переносов!
Что-то я уже себе весь мозг вынес, но так и не придумал, как это побороть.
Подскажите такую вещь: как мне в QTextDocument дописывать данные в html виде?
Уже подумываю о том, что бы самому создавать и отформатировать страницы и добавлять их в готовый документ.


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: panAlexey от Ноябрь 22, 2011, 12:20
Какой-то бред получается :(
Дописал функцию вычисления высоты:
Код:
int dialogCreatePrices::numRowInPrintText(int iWidth, QString iText)
{
    QTextDocument doc;
    doc.setPlainText(iText);
    doc.setPageSize(QSizeF(iWidth,-1));
    int res = ((int)((doc.size().height()-21)/13)) + 1;
    return res;
}
Подобрал на тестах с данными(типа "10 11 12 13") ширину. На тестах получатся все замечательно. Но стоит подсунуть реальные данные, все съезжает из-за переносов!
Что-то я уже себе весь мозг вынес, но так и не придумал, как это побороть.
Подскажите такую вещь: как мне в QTextDocument дописывать данные в html виде?
Уже подумываю о том, что бы самому создавать и отформатировать страницы и добавлять их в готовый документ.
все-таки надо дописывать и стабилизировать uoReport.
ПС. Остальные сишники с подобными задачками видно редко сталкиваются.
ПС2. PavelVX, может попробуешь его сам прикрутить?


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: PavelVX от Ноябрь 22, 2011, 13:00
Все заработало! Если долго сидеть над одной задачей, то глаз замыливается и перестаешь видеть очевидное. Все функции правильно работали, опечатка в одном месте :).
panAlexey, не поверишь, я новичек в С++! Qt выбрал только из-за бесплатности.
Чуть позже могу попробовать твою форму, мне она больше нравится, чем полностью ручное создание отчетов. Просто сейчас надо допилить прайс и отчитаться о проделанном.
Но впереди еще отчетные документы, так что не горюй, опробуем твой репорт :)
PS Кстати, ты бы к нему пока что счетчики страниц бы прикрутил.
PPS Походу отчетность и прочие печатные формы никто не делает или делают что-нить типа экселя.


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: panAlexey от Ноябрь 22, 2011, 13:21
Все заработало! Если долго сидеть над одной задачей, то глаз замыливается и перестаешь видеть очевидное. Все функции правильно работали, опечатка в одном месте :).
panAlexey, не поверишь, я новичек в С++! Qt выбрал только из-за бесплатности.
Чуть позже могу попробовать твою форму, мне она больше нравится, чем полностью ручное создание отчетов. Просто сейчас надо допилить прайс и отчитаться о проделанном.
Но впереди еще отчетные документы, так что не горюй, опробуем твой репорт :)
PS Кстати, ты бы к нему пока что счетчики страниц бы прикрутил.
PPS Походу отчетность и прочие печатные формы никто не делает или делают что-нить типа экселя.
У меня там основные глюки начинаются когда начинаю работать с масштабом при выводе на печать и разбиении на страницы с использованием масштаба.
ну т.е. говоришь: поместить по ширине в лист, заходишь в просмотр и "бум".
А счетчик страниц, там по сути есть: я же перед отсылкой на печать фактически калькулирую количество страниц и создаю массив неких структур индекс которых + 1 и является по сути номером страницы.
т.е. для решения задачи надо просто сделать только вот что:
в методе прорисовки текста ячейки поискать нечто вроде "@pagenom" и заменить на индекс страницы + 1.
так что это дело плевое. Основной гемор в стабилизации.


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: panAlexey от Ноябрь 30, 2011, 14:29
http://code.google.com/p/unnstudioreport/
30.11.2011
Реализован механизм использования шаблонов и вывода секций шаблона в целевой документ.
(http://unnstudioreport.googlecode.com/files/20111130_OutputSect.PNG)


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: sergun1604 от Май 24, 2012, 13:35
не могу понять каким образом отчет уходит на печать uoreport и где формируется xml?


Название: Re: Торг 12, кто делал под Qt и каким способом
Отправлено: panAlexey от Май 24, 2012, 17:37
не могу понять каким образом отчет уходит на печать uoreport и где формируется xml?
Для отправки на печать его надо отправить на печать.
bool uoReportDoc::printDoc(const bool updPrintSourse, QWidget* qwidg)

Использую xml в 2-х эпостясях как шаблон для вывода отчета и как файл для хранения самого отчета.
xml-шаблон формируется пользователем в дизайнере в самом репорте мышкой. Собственно для этого и создавался такой софт - быстро набросать шаблон и вывести его.
Собственно это и есть основное назначение софтины: дизайнить, редактировать, печатать.
А если нужен уже сам отчет, то надо через АПИ поработать с обектом uoReport::uoReportDoc;