
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
04.01.2006, 22:44
|
|||
|---|---|---|---|
|
|||
Report Header - Нашел вариант |
|||
|
#18+
Один из недостатков 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=15&mobile=1&tid=1337956]: |
0ms |
get settings: |
6ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
67ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
2ms |
| others: | 215ms |
| total: | 371ms |

| 0 / 0 |
