powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Report Header - Нашел вариант
1 сообщений из 1, страница 1 из 1
Report Header - Нашел вариант
    #33468517
AVGritsenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Один из недостатков Datawindow PowerBuilder - невозможность простого создания титульного листа отчета без повтора на последующих страницах.
Обычно это требует использования вложенного отчета, что по многим причинам нежелательно, например:
- экспорт отчета в другие форматы невозможен (данные вложенного отчета не экспортируются)
- невозможно распечатать выбранный лист отчета
- невозможна динамическая загрузка вложенного отчета и любое изменение требует перекомпиляции
- отчет становиться многокомпонентным

Как вариант предлагается следующее решение:

В заголовок отчета вставляется элемент с ключевым именем "report_header".
При наличии оного dw автоматически разбивается на два (первая страница и последующие)
и печатаются последовательно.
Все элементы выше "report_header" считаются заголовком отчета и печатаются только на первой странице. Для второй и далее удаляются
Все элементы ниже "report_header" считаются заголовком страницы отчета и печатаются на каждой странице отчета. Для второй страницы и далее эти элементы смещаются вверх на величину равную "report_header.у" . Высота заголовка 2-й страницы и далее корректируется по максимальной координате "у" этих элементов.
В исходном окне элементы ниже "report_header" могут быть выведены за нижнюю
границу графы "header" .

Для корректной нумерации строк и страниц вводятся ключевые элементы окна типа compute, в исходном dw их значения =0

page_count - [число страниц второго окна] для первой страницы ( для второй и далее =0 )
second_page - флаг 2-й страницы (0 для первой 1 для второй и далее)
rows_on_first_page - число строк на первой странице (0 для первой)

Использовать следует так:
'Стр. ' + (page())+ ' из ' + (pageCount()+page_count) Номер страницы для 1-го листа
'Стр. ' + (page()+second_page) + ' из ' + (pageCount()+second_page) Номер страницы 2-го листа и далее
getrow() +rows_on_first_page Номер строки


В интерфейсе предпросмотра такого отчета появляются кнопки
Вид: Экр. Стр.1 Стр.2 ...

Экр. - показывает стандартный экранный вид окна без модификаций
Стр.1 - показывает первый лист (printpreview)
Стр.2... - показывает остальные (printpreview)


// --- Примерно так ---------------------------------
// Преобразование отчета в два для
// первой страницы и последующих
string pw

noedit()
pw=dw.object.datawindow.print.preview
//dw.setredraw(false)
dw.object.datawindow.print.preview="yes"
string hy
hy=dw.Describe("report_header.y")
dw1.dataobject='dw_blank'
dw2.dataobject='dw_blank'
if hy <>'?' and hy <>'!' and long(dw.Object.DataWindow.LastRowOnPage)<dw.rowcount() then

setpointer(HourGlass!)
string ls_report,command,objname,s_band,s_y,s_y1,s_y2,serror,command1
Long pos, mheight , maxy
maxy=0
mheight= long(hy)
// сдвинем заголовок по высоте и сместим все элементы вверх
// затем вставим сверху строку с наименованием БД
command =''
command1=''
pos=1
ls_report =trim( dw.Describe("DataWindow.Objects") )
DO WHILE len(ls_report)>0 and pos>0
pos=pos(ls_report,char(9))
if pos=0 then
ObjName=trim(ls_report)
Else
ObjName=left(ls_report,pos - 1)
End IF
ls_report =trim(mid(ls_report,pos + 1))
s_band=dw.Describe(Objname+'.band')
s_y=dw.Describe(Objname+'.y')
s_y1=dw.Describe(Objname+'.y1')
s_y2=dw.Describe(Objname+'.y2')
// список объектов заголовка с координатами
if s_band='header' or s_band='foreground' then
if s_y<>'?' and s_y<>'!' then

maxy=max(maxy,long(s_y))
if long(s_y)<= mheight then
command=command+char(9)+'destroy '+Objname
else
command=command+char(9)+Objname+'.y='+string (long(s_y) - mheight)
end if
end if
if s_y1<>'?' and s_y1<>'!' and s_y2<>'?' and s_y2<>'!' then // это линии
maxy=max(maxy,long(s_y1))
maxy=max(maxy,long(s_y2))
if long(s_y1)<= mheight or long(s_y2) <= mheight then
command=command+char(9)+'destroy '+Objname
else
command=command+char(9)+Objname+'.y1='+string(long(s_y1) - mheight)
command=command+char(9)+Objname+'.y2='+string(long(s_y2) - mheight)
End If
End If
End If
LOOP
command="DataWindow.Header.Height="+ string( maxy - mheight) + command

string dwSyntax,errmess
dwSyntax = dw.Describe("datawindow.syntax")
dw2.Create (string(dwSyntax) , errmess )
if errmess<>'' then
messagebox('Ошибка1 при формировании report_header!',serror)
end if
serror=dw2.modify(command)
if serror<>'' then
messagebox('Ошибка2 при формировании report_header!',serror)
end if

serror=dw2.modify('rows_on_first_page.expression="'+dw.Object.DataWindow.LastRowOnPage+'"')
serror=dw2.modify('second_page.expression="1"')

dw1.Create (string(dwSyntax) , errmess )
if errmess<>'' then
messagebox('Ошибка3 при формировании report_header!',serror)
end if

serror=dw1.modify("DataWindow.Summary.Height=0")
if serror<>'' then
messagebox('Ошибка4 при формировании report_header!',serror)
end if
if dw.RowsCopy(1,long(dw.Object.DataWindow.LastRowOnPage),Primary!,dw1,999999999,Primary!)=-1 then
messagebox('Внимание','Ошибка5 при формировании report_header!')
end if
if dw.RowsCopy(long(dw.Object.DataWindow.LastRowOnPage)+1,dw.rowcount(),Primary!,dw2,999999999,Primary!)=-1 then
messagebox('Внимание','Ошибка6 при формировании report_header!')
end if

dw2.object.datawindow.print.preview="yes"
dw1.object.datawindow.print.preview="yes"

serror=dw1.modify('page_count.expression="'+dw2.Describe("evaluate('pagecount()',1)")+'"')
setpointer(Arrow!)

return true
else
return false
end if
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Report Header - Нашел вариант
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]