Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» FastReport

Автор: Shadka
Дата сообщения: 11.01.2012 10:20
Помогите! В датасете 1000+ записей. При выводе на печать матричного отчета начинает с 1 до последней записи в датасете перепрыгивать, а уж потом выводит отчет. Как с эти бороться?

frxObor2.PrepareReport();
frxObor2.ShowReport;
Автор: YuriyRR
Дата сообщения: 11.01.2012 12:46
Shadka
Да никак. Не делать больших отчетов. Или сразу печатать, зачем показывать.
Автор: Shadka
Дата сообщения: 18.01.2012 16:49
Помогите!
Имеется отчет с группировкой и итогами. Вот пример итогов по группировке:
Приход | Расход | Сумма
------------------------------------------------------
Итог по подразделению 1: двигатель шайбы 150


Приход | Расход | Сумма
------------------------------------------------------
Итог по подразделению 2: кабина болты 420


Приход | Расход | Сумма
------------------------------------------------------
Итог по подразделению 3: двигатель шайбы 380


В конце этого добра необходимо вывести итог по складу вот такого вида:
Приход | Расход | Сумма
------------------------------------------------------
Итог по складу: двигатель шайбы 530
кабина болты 420
Как можно такое реализовать?
Автор: YuriyRR
Дата сообщения: 18.01.2012 21:31
Shadka

Цитата:
Как можно такое реализовать?

Если итоги с перечислением всех приходных позиций по подразделению
то делать их в виде отдельных запросов в связке мастер - несколько деталей
Автор: salexn1
Дата сообщения: 19.01.2012 09:43
YuriyRR
Shadka
Сделать группу. На групповой бэнд положить объект текст и выводить наименование подразделения. Далее идет detail band. Потом Group Footer.
В конце отчета положить Summary Group.
Все должно быть просто, в примерах такое есть
Единственно, обязательно отсортируйте данные по подразделениям
Автор: Shadka
Дата сообщения: 19.01.2012 09:57
YuriyRR мастер не использую потому что таких группировок должно быть 3 в отчете.
salexn1, если сделать так то в итоге выведется просто общая сумма 1 строчкой. Мне же фактически нужно просто в конце всего отчета вывести все групповые итоги которые раньше встречались. И при совпадении 2х переменных из группировки (приход и расход) вывести их сумму
Итог по подразделению 1: двигатель шайбы 150 +
Итог по подразделению 2: кабина болты 420+
Итог по подразделению 3: двигатель шайбы 380=
Итог по складу: двигатель шайбы 530
кабина болты 420
Автор: Czechoslovak
Дата сообщения: 19.01.2012 10:48
Shadka

Не совсем понятно, что вы хотите. Болты от шайб, как то же отличаете!? Ну в конце концов введите переменные и подсчитывайте свои болты и шайбы или сделайте итоговый запрос и просто выводите готовый результат
Автор: druff
Дата сообщения: 26.01.2012 13:26
Shadka

это можно сделать с помощью кросстаблицы
Автор: AndreyPA
Дата сообщения: 02.02.2012 09:46
Есть шаблон отчета для страницы А4.
Иногда этот отчет вместо печати экспортировали в Excel. Но т.к. при формировании отчета он разбивался на много страниц А4 то чтобы в при экспортировании в Excel получалась одна таблица делали так.
Свойства страницы
Ширина 21,00 заменяли на 2100
Высота 29,70 заменяли на 29,70
применить ко всем. И отчет перестраивался на одну боольшую виртуальную страницу и после этого вызывали экспорт.
Сейчас хотят чтобы сразу экспортровался отчет без показа.
Я разобрался что можно сделать frxReport.PrepareReport, а потом frxReport.Export(frxXMLExport1); в заданное имя файла.
Но как мне программно изменить Ширину и Высоту страницы (то что они делали вручную через диалог свойства страницы) и только после этого произвести экспорт. А то получается порезанная таблица в excel неудобно для манипуляций.
Шаблон при этом должен остаться не именным. Иногда они буду печатать как и раньше на А4.
Автор: salexn1
Дата сообщения: 02.02.2012 10:22
>AndreyPA
У репорта есть свойства и перед печатью вы можете ставить любой размер.
Как-то так
Report.Pages[1].Height := 2100;

именно Pages[1]!!!
Автор: AndreyPA
Дата сообщения: 03.02.2012 02:29
salexn1
Неа - что-то не так.
1. Я решил посмотреть какие значения там хранятся.

Код:
frxReport.LoadFromFile('Приложение1.fr3');
ShowMessage(FloatToStr(frxReport.Pages[1].Height)+','+FloatToStr(frxReport.Pages[1].Width));
Автор: salexn1
Дата сообщения: 03.02.2012 08:13
AndreyPA
Для перевода пикселов в сантиметры и дюймы
определены следующие константы:
fr01cm = 3.77953; // 96 / 25.4
fr1cm = 37.7953;
fr01in = 9.6;
fr1in = 96;
Например, задать высоту бэнда, равную 5мм, можно так:
Band.Height := fr01cm * 5;
Band.Height := fr1cm * 0.5;

Добавлено:
кстати, попробуйте еще вот это:
Свойство PaperSize задает формат бумаги. Это одно из стандартных
значений, определенных в Windows.pas, например, DMPAPER_A4. Если присвоит
значение этому свойству, FastReport сам заполнит свойства PaperWidth и
PaperHeight (размеры бумаги в миллиметрах). Если в качестве формата задать
значение DMPAPER_USER (или 256), это означает, что задан пользовательский
размер бумаги. В этом случае свойства PaperWidth и PaperHeight надо заполнить
самостоятельно.
Автор: Frodo_Torbins
Дата сообщения: 03.02.2012 10:51
salexn1
Значение DPI на разных компьютерах может быть разным, поэтому использовать 96 в виде константы нельзя. А уж на принтерах оно и подавно разное.
Автор: salexn1
Дата сообщения: 03.02.2012 11:21
Frodo_Torbins
Вообще-то это из мануала вырезка
Автор: dzh2000
Дата сообщения: 28.02.2012 10:41
skip
Автор: exteris
Дата сообщения: 07.03.2012 09:48
Кто нибудь знает, есть ли возможность развернуть страницу при печати на 180 градусов?
Нашел только PrintOptions.SwapPageSize. Но это или не оно или не работает.
Автор: wasilissk
Дата сообщения: 07.03.2012 09:51
exteris
Можно распечатанный лист перевернуть.
Автор: exteris
Дата сообщения: 07.03.2012 10:07
Классно, спасибо!

Добавлено:
А если серьезно.

Ситуация:
Диспетчер распечтал 500 пакетов документов на завтрашний развоз. Теперь ей надо на каждом поставить печать и роспись. Это около 2000 печатей и росписей. Все документы идут с альбомной ориентацией, а один с ландшафтной. В итоге место для печати (относительно других документов) у него оказывается не там, где надо. Вот и попросили перевернуть, для ускорения работы.
Автор: wasilissk
Дата сообщения: 07.03.2012 10:25
exteris

Цитата:
Все документы идут с альбомной ориентацией, а один с ландшафтной.

А это не одно и то же? Если имелось в виду книжная (Portrait (между ними разница 90 градусов, а не 180 если что)), то проще создать два отчета в соответствующей ориентации.
Вы собираетесь печатать на уже распечатанных листах, как я понял. Тут имхо вроде как проще вообще без фастрепорта обойтись.
Автор: exteris
Дата сообщения: 07.03.2012 10:33
Вы не поняли. Если я распечатаю пачку документов и начну пропечатывать, то будет следующее:
Счет-фактура - место для печати(подписи) - левый нижний угол
ТТН - место для печати(подписи) - верхний правый угол(потому шта ориентация другая)
Торг-12 - место для печати(подписи) - левый нижний угол
и т.д.

Вот если перевернуть ТТН при печати, то и место для печати окажется в нижнем левом углу. Вроде бы ерунда, но на большом количестве документов на скорости работы сказывается.
Автор: Corsairs
Дата сообщения: 07.03.2012 10:52
exteris
Так это надо при печати нового документа (т.е. чтобы печать и подпись была сразу), или поверх уже напечатанного?
Если второе - то поддерживаю wasilissk - фастрепорт тут совершенно не при чем... Разве что создать варианты листов с различным расположением и ориентацией изображения печати и подписи...
К тому же, если идет печать поверх уже напечатанного - то как будет определяться, что это за документ, и где надо напечатать картинку? (а еще стоит учесть тот факт, что принтер иногда может захватить два листа бумаги вместо одного...)

Так что варианты - или сразу при создании документа размещать нужные изображения в соответствующих местах, или вручную рассортировать напечатанное, и печатать поверх...
Автор: Frodo_Torbins
Дата сообщения: 07.03.2012 10:52
exteris
Можно экспортировать страницу отчета в битмап, а потом ручками нарисовать на канве принтера в том положении, которое требуется.
Автор: wasilissk
Дата сообщения: 07.03.2012 11:23
exteris

Цитата:
Вот если перевернуть ТТН при печати, то и место для печати окажется в нижнем левом углу

И факсимиле будет вверх ногами напечатан. Тогда уж лучше отсортировать печатные формы по ориентации, тогда и скорость появится.
Автор: exteris
Дата сообщения: 07.03.2012 12:43
Печатется новый документ. Никаких факсимиле. Оператор ручками шлепает на документ печать. Вот чтобы ей шлепать эту печать на автоматизме в одно и тоже место я и хочу перевернуть один документ с альбомной ориентацией. Сортировка по ориентации займет еще больше времени.
Ладно, попробую поработать с принтером.
Автор: Corsairs
Дата сообщения: 07.03.2012 12:51
exteris
Если в одном и том же документе ориентация и место для печати и подписи одинаково - то имеет смысл печатать документы группами (т.е. сначала документы, где подпись и печать внизу слева, потом - где внизу справа и т.д.), и такими группами отдавать оператору для дальнейшей работы... Раз в пределах одной группы ориентация и место для печати не меняется - то оператор и будет шлепать печать на автомате...
Автор: exteris
Дата сообщения: 07.03.2012 13:12
Тогда ему потом нужно будет для каждого клиента собрать набор документов. Это тоже не быстро. А так они уже комплектом идут.
В общем, спасибо всем! Буду думать, а то уже оффтоп начался.
Автор: neznayka3
Дата сообщения: 08.03.2012 19:23
почему получаю "invalid file format"?

Код:
procedure TfrReport.LoadReport(report_name: String);
var
ms: TMemoryStream;
begin
try
Screen.Cursor:=crHourGlass;
with ZQuery1 do
begin
Close;
SQL.Clear;
SQL.Add(Format('SELECT report_data FROM report WHERE report_name=''%s''',[report_name]));
Open;
if RecordCount=0 then
begin
MessageDlg('Îò÷åò íå íàéäåí.',mtInformation,[mbOK],0);
Exit;
end
else
begin
ms:=TMemoryStream.Create;
TBlobField(FieldByName('report_data')).SaveToStream(ms);
ms.Position:=0;
frxReport1.LoadFromStream(ms);
frxReport1.PrepareReport();
frxReport1.ShowPreparedReport;
end;
end;
finally
ZQuery1.Close;
Screen.Cursor:=crDefault;
ms.Free;
end;
end;
Автор: PowerChute
Дата сообщения: 09.03.2012 07:01
neznayka3
После восьмого марта разбираться в чужом коде....


Вот тебе работающий код:
[more=код]
procedure pr_LoadReport (_DocN : LongInt);
var
Stream: TMemoryStream;
begin
with DM_II do begin
fr_Report.Clear;
tbl_Report.First;
while not tbl_Report.Eof do begin
if tbl_Report.FieldbyName('rpt_ID').AsInteger = _DocN then begin
Stream := TMemoryStream.Create;
TBlobField(tbl_Report.FieldbyName('rpt_Blob')).SaveToStream(Stream);
Stream.Position := 0;
if Stream.Size > 0 then begin
fr_Report.LoadFromStream(Stream);
fr_Report.FileName := tbl_Report.FieldbyName('rpt_Remark').AsString;
end;
Stream.Free;
break;
end;
tbl_Report.Next;
end;
end;
end; // pr_LoadReport
[/more]
Шаблон читается из базы по ID

[more=Структура таблицы шаблонов]
procedure pr_CreateSystemTableReport;
begin
q_ := fn_QueryCreate;
try
with q_ do begin
Close;
SQL.Clear;
SQL.Add ('CREATE TABLE ' + rs_NameTableReport + '(');
SQL.Add ('rpt_ID int NOT NULL,');
// SQL.Add ('rpt_Prg int NULL,');
SQL.Add ('rpt_Remark varchar(100) NULL,');
SQL.Add ('rpt_Blob ntext NULL,');
SQL.Add ('PRIMARY KEY (rpt_ID))');
gv_SQLText := SQL.Text;
Execute;
Free;
end; { with q_ }
except
pr_ShowError (rs_StrErrorQuery, '',gv_SQLText);
end;
end;
[/more]
Автор: neznayka3
Дата сообщения: 09.03.2012 11:58
Ваш код отличается только способом загрузки и условием "if stream.Size>0 then". [more=Вот]
Код:
procedure TfrReport.acLoadREportExecute(Sender: TObject);
var
fs: TFileStream;
begin
CreateOrShowform(TfmDlgLoadReport, fmDlgLoadReport, False, false);
with fmDlgLoadReport do
begin
ShowModal;
if ModalResult=mrOK then
begin
fs:=TFileStream.Create(fmDlgLoadReport.edFile.Text,fmOpenRead);
with ZQuery1 do
begin
Close;
SQL.Clear;
Params.Clear;
SQL.Add('select fn_insert_report(:parent_id, :report_name, :report_data) as result;');

Params.ParamValues['report_name']:= Trim(fmDlgLoadReport.edReportName.Text);
Params.ParamValues['parent_id']:= (DBTreeView.Selected as TdxDBTreeNode).keyfieldvalue;
ZQuery1.ParamByName('report_data').DataType:=ftBlob;
ZQuery1.ParamByName('report_data').LoadFromStream(fs,ftBlob);
Open;
end;
fs.free;
end;
end;
end;


procedure TfrReport.LoadReport(report_name: String);
var
ms: TMemoryStream;
begin
try
Screen.Cursor:=crHourGlass;
with ZQuery1 do
begin
Close;
SQL.Clear;
SQL.Add(Format('SELECT report_data FROM report WHERE report_name=''%s''',[report_name]));
Open;
if RecordCount=0 then
begin
MessageDlg('Îò÷åò íå íàéäåí.',mtInformation,[mbOK],0);
Exit;
end
else
begin
ms:=TMemoryStream.Create;
TBlobField(FieldByName('report_data')).SaveToStream(ms);
ms.Position:=0;
if ms.Size>0 then
begin
frxReport1.Clear;
frxReport1.LoadFromStream(ms);
//frxReport1.FileName:=FieldByName('report_name').AsString;
frxReport1.PrepareReport();
frxReport1.ShowPreparedReport;
end;

end;
end;
finally
ZQuery1.Close;
Screen.Cursor:=crDefault;
ms.Free;
end;
end;

Автор: MagistrAnatol
Дата сообщения: 15.03.2012 15:41
Господа подсобите с проблемой - вопрос 100% подымался, но лопатить все страницы нет времени -
в Коде отчета надо задать фильтр для FIBQuery
пишу

Код: [no]
if (RadioButton1.Checked==true)tVidklVkl.Filter="OPER_TYPE=0";
....
tVidklVkl.Filtered=true;
[/no]

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859

Предыдущая тема: CBuilder и копирование файла


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.