|
Вместо кросстаб (и лучше) - Вариант решения
|
|||
---|---|---|---|
#18+
Datawindow PowerBuilder предоставляет возможность создания Crosstab отчетов с переменным кол-вом колонок. Однако, структура таких отчетов предопределена , а качество экспорта в другие форматы оставляет желать лучшего. Альтернативой м.б. использование Crystal Reports, но и в нем существуют свои ограничения по структуре создаваемых отчетов и функциональным возможностям окна просмотра отчетов. Как вариант предоставлена возможность создание отчетов в формате Grid Datawindow c переменным кол-вом колонок. Источником данных должна быть процедура, возвращающая динамический набор данных. Datawindow создается по определенным правилам, предполагается что некоторые колонки могут быть динамически размножены на основе результатов запроса. В момент выполнения запроса Datawindow автоматически модифицируется. Преимущества: Простая структура grid допускает простую выгрузку отчета в различные форматы. Процедура может выполнять сколь угодно сложные расчеты, колонки могут содержать разнородные данные и размножаться в разной степени, итоги и подитоги могут формироваться как в процедуре, так и в Datawindow. Возможна прямая генерация таких отчетов в формате Excel, в этом случае буферное Datawindow выгружается в промежуточный xls файл вместе с заголовками и переносится через clipboard в итоговый документ средствами VB см.Печатные формы и отчеты в специальных форматах, и пример 'rpt_cross1.xls', 'dw_rpt_cross1_xls'. Требования к процедуре см. пример 'rpt_cross3', 'rpt_cross4' 1) Должна возвращать описание размножаемых dw колонок при значении первого параметра @mod =0 select @col_list,@com_list from dummy; Где: @col_list - колонки (имена column в detail dw) подлежащие размножению напр 'sum_r_db1,sum_d_db1' Здесь запятая разделяет имена размножаемых колонок. Если в @col_list присутствует ';' то после нее должен идти список всех колонок через ',' (именно всех а не только размножаемых) в порядке соответствующем порядку колонок динамичекого sql запроса. Эта опция позволяет расположить колонки окна в любом порядке. Например 'sum_db,sum_db_r,sum_db_d;date,sum_db,sum_db_r,sum_db_d,sum_db2,sum_db_r2,sum_db_d2' @com_list - комментарий (заголовки размножаемых колонок ) в формате 'cr1,cr2,cr3;cr1,cr2' Здесь точка с запятой разделяет списки для разных размножаемых колонок Список заголовков может быть пустым, тогда колонка удаляется. Переменные заполняются процедурой на основе анализа результирующего набора данных 2) Должна возвращать динамический набор данных при значении первого параметра =1 execute immediate WITH RESULT SET ON @syntax Где: @syntax - произвольный sql - запрос сформированный по усмотрению разработчика Требования к DataWindow см. пример 'dw_rpt_cross3' 1)Порядок колонок в Preview (по координате x) должен соответствовать динамическому набору данных генерируемому процедурой, c учетом того что размножаемые колонки будут вставлены на месте колонки подлежащей размножению. Порядок колонок в column spec не играет роли. Если в @col_list присутствует ';' и далее список колонок то в порядке этого списка. 2) Порядок и кол-во аргументов окна должен соответсвовать оному в процедуре, первый аргумент процедуры в окне не нужен 3)Соглашения по именам размножаемых(удаляемых) колонок: Процедура возвращает список объектов - колонок подлежащих размножению [имя колонки] - column в detail 4) Имена прочих размножаемых объектов формируются на основе [имя колонки] [имя колонки]+'_t' - Размножаемые заголовки с измененным текстом 'text' [имя колонки]+'_t1' (t2,t3-t10) - Размножаемые итоги и тексты 'text','Compute' [имя колонки]+'_d' (d1,d2-d10) - Не размножаются но удаляются если список имен колонки пустой Объекты одной колонки должны нумероваться последовательно, при пропуске номера следующие не размножаются (для скорости). 5) При размножении 'Compute' в expression [имя колонки] заменяется на [имя колонки]+N, соответственно expression должен позволять такую замену. 6) Column не включенные в Control list (те не помещенные на лист отчета) аннулируются //----------- Примерно такой код для модификации окон перед запросом if dynsql then // динамическая модификация окон // предполагается что есть процедура возвращающая описание размножаемых колонок // при первом параметре 0 и набор данных при первом параметре 1 // требования к DataWindow // Порядок колонок в Preview (по x) должен соответствовать процедуре // ! или явно задан в процедуре через ';' после списка размножаемых колонок // в виде списка всех колонок через ',' // Порядок колонок в column spec - изменяется и несуществен // Соглашения по именам размножаемых колонок // Процедура возвращает список объектов - колонок подлежащих размножению // [имя колонки] - column в detail // [имя колонки]+'_t' - Размножаемые и удал заголовки с измененным текстом 'text' // [имя колонки]+'_t1' (t2,t3-t10) - Размножаемые и удал итоги и тексты 'text','Compute' // [имя колонки]+'_d1' (d2,d3-d10) - Не Размножаемые но удал итоги и тексты 'text','Compute' // Объекты одной колонки должны нумероваться последовательно, при пропуске номера // следующие не размножаются (для скорости) // При размножении 'Compute' в expression [имя колонки] заменяется на [имя колонки]+N, // соответственно expression должен позволять такую замену long pos,col_col,col_com // окно к исходному состоянию dataobject=dataobject dw_from_db() // Процедура - вынимаем из dw // Предполагаем что первый аргумент - мода= 0 // и следующие аргументы окна по порядку соответствуют аргументам проц //string command; command=describe ('datawindow.table.procedure') command=mid(left(command,pos(command,';') - 1 ),pos(command,'execute')+8) +'(0,' for i =1 to upperbound(arrarg) - 1 if isnull(arrarg ) then command=command+"null," elseif classname(arrarg)='string' then command=command+"'"+arrarg+"'," elseif classname(arrarg)='date' then command=command+"'"+string(arrarg,'YYYY.MM.DD')+"'," else command=command+string(arrarg)+"," end if next command='call '+left(command,len(command)-1)+")" //command="call rpt_cross2(1,'"+arrarg[1]+"')" // это вынуть из datawindow //------------------ //messagebox('',command) DECLARE pp DYNAMIC Procedure FOR sqlsa; PREPARE sqlsa FROM :command; EXECUTE DYNAMIC pp; checkerror() string col_list,com_list; FETCH pp into :col_list,:com_list ; checkerror() CLOSE pp; COMMIT; // Получили спецификацию колонок для размножения //messagebox(col_list,com_list) //messagebox('','1') string newsyntax,newsyntax1 //messagebox('',newsyntax) string com_arr1[],com_arr[],col_arr[] // порядок колонок из процедуры long pos11,col_ord string arr_ord[] pos11=pos(col_list,';') col_ord=0 if pos11>0 then col_ord=listtoarray(mid(col_list,pos11+1),arr_ord,',') col_list=left(col_list,pos11 - 1) end if // long col_com1 col_com1=listtoarray(com_list,com_arr1,';') col_col =listtoarray(col_list,col_arr,',') long j,m,k long ord,columncount string band,сtype,сdbname,cb_color,s_y,alignment,border,color,height,format,font_face,font_height,font_weight,font_family,font_pitch,font_charset,font_italic,background_mode,visible // Определение максимальной координаты "x" объектов detail сортировка по x datastore ds_colx ds_colx=create datastore ds_colx.dataobject='ds_x' string ls_report,ObjName,s_band,s_x,s_width long max_x max_x=0 i=0 pos=1 ls_report =trim(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 =Describe(Objname+'.band') if s_band='detail' then s_x =Describe(Objname+'.x') s_width=Describe(Objname+'.width') if s_x<>'!' and s_x<>'?' and s_width<>'!' and s_width<>'?' then max_x=max(max_x,long(s_x)+long(s_width)) i=i+1 ds_colx.object.name=Objname ds_colx.object.x =long(s_x) ds_colx.object.type=Describe(Objname+'.type') ds_colx.object.id=Describe(Objname+'.id') // Невидимые сделаем видимыми и запомним (иначе глюки) visible=dwcomp(Describe(Objname+'.visible')) if left(visible,1)='0' then string arr_nvis[],name_nvis[] arr_nvis[upperbound(arr_nvis)+1]=Objname+'.visible='+'"'+visible+'"' end if end if end if LOOP // это надо для сохранеия порядка по х вкл видимость for k=1 to upperbound(name_nvis) modify(name_nvis[k]+'.visible=1') next newsyntax=object.datawindow.syntax ds_colx.setsort('x A') ds_colx.sort() long rowcount,row rowcount=ds_colx.rowcount() for i=1 to rowcount ds_colx.object.ord=(i - 1)*1000 next max_x=ds_colx.object.x[rowcount]+10000 //messagebox('','2') // Вставка column в table, вставляем для начала справа (потом переместим, это проще) columncount=long( describe('datawindow.column.count')) m=1 for j=1 to col_col // ЦИКЛ ПО КОЛОНКАМ ДЛЯ РАЗМНОЖЕНИЯ pos=pos(newsyntax,'procedure') newsyntax1=left(newsyntax,pos - 1) if upperbound(com_arr1)>=j then col_com =listtoarray(com_arr1[j],com_arr,',') // список коммен к размнож колонкам else col_com=0 end if сtype =describe(col_arr[j]+'.coltype') сdbname =describe(col_arr[j]+'.dbname') cb_color=dwcomp(describe(col_arr[j]+'.background.color')) s_y =dwcomp(describe(col_arr[j]+'.y')) s_width =dwcomp(Describe(col_arr[j]+'.width')) alignment=dwcomp(Describe(col_arr[j]+'.alignment')) border=dwcomp(Describe(col_arr[j]+'.border')) color=dwcomp(Describe(col_arr[j]+'.color')) height=dwcomp(Describe(col_arr[j]+'.height')) format=dwcomp(Describe(col_arr[j]+'.format')) font_face=dwcomp(Describe(col_arr[j]+'.font.face')) font_height=dwcomp(Describe(col_arr[j]+'.font.height')) font_weight=dwcomp(Describe(col_arr[j]+'.font.weight')) font_family=dwcomp(Describe(col_arr[j]+'.font.family')) font_pitch=dwcomp(Describe(col_arr[j]+'.font.pitch')) font_charset=dwcomp(Describe(col_arr[j]+'.font.charset')) font_italic=dwcomp(Describe(col_arr[j]+'.font.italic')) background_mode=dwcomp(Describe(col_arr[j]+'.background.mode')) visible=dwcomp(Describe(col_arr[j]+'.visible')) // порядок row = ds_colx.Find("name='"+col_arr[j]+"'",1,ds_colx.rowcount()) if row >0 then ord=ds_colx.object.ord[row] else ord=0 end if // Вставка column в table string newsyntaxc newsyntaxc='' for i =2 to col_com newsyntaxc=newsyntaxc+'column=(type='+сtype+' name='+col_arr[j]+string(i)+' dbname="'+сdbname+string(i)+'" )'+char(13)+char(10)+char(32) //updatewhereclause=no next newsyntax=newsyntax1+newsyntaxc+mid(newsyntax,pos) // Вставка column pos=pos(newsyntax,'htmltable(') newsyntax1=left(newsyntax,pos - 1) string newsyntaxcc newsyntaxcc='' for i =2 to col_com m=m+1 columncount=columncount+1 newsyntaxcc=newsyntaxcc+'column(band=detail id='+string(columncount)+' alignment="'+alignment+'" tabsequence=32766 border="'+border+'" color="'+color+'" x="'+string(max_x+1+long(s_width)*(i - 2))+'" y="'+s_y+'" height="'+height+'" width="'+s_width+'" format="'+format+'" html.valueishtml="0" name='+сdbname+string(i)+' visible="'+visible+'" font.face="'+font_face+'" font.height="'+font_height+'" font.weight="'+font_weight+'" font.family="'+font_family+'" font.pitch="'+font_pitch+'" font.charset="'+font_charset+'" font.italic="'+font_italic+'" background.mode="'+background_mode+'" background.color="'+cb_color+'" )'+char(13)+char(10)+char(32) // порядок + inf по колонкам ds_colx.object.name[ds_colx.rowcount()+1]=col_arr[j]+string(i) ds_colx.object.ord [ds_colx.rowcount()] =ord+i ds_colx.object.type[ds_colx.rowcount()] ='column' ds_colx.object.id [ds_colx.rowcount()] =string(columncount) next //newsyntax=newsyntax1+ mid(newsyntax,pos) // Вставка заголовка c заменой текста по суффиксу '_t' string newsyntaxtt newsyntaxtt='' s_y =describe(col_arr[j]+'_t.y') if s_y<>'?' and s_y<>'!' then // образцовый объект существует cb_color=dwcomp(describe(col_arr[j]+'_t.background.color')) s_width =dwcomp(Describe(col_arr[j]+'_t.width')) alignment=dwcomp(Describe(col_arr[j]+'_t.alignment')) border=dwcomp(Describe(col_arr[j]+'_t.border')) color=dwcomp(Describe(col_arr[j]+'_t.color')) height=dwcomp(Describe(col_arr[j]+'_t.height')) format=dwcomp(Describe(col_arr[j]+'_t.format')) font_face=dwcomp(Describe(col_arr[j]+'_t.font.face')) font_height=dwcomp(Describe(col_arr[j]+'_t.font.height')) font_weight=dwcomp(Describe(col_arr[j]+'_t.font.weight')) font_family=dwcomp(Describe(col_arr[j]+'_t.font.family')) font_pitch=dwcomp(Describe(col_arr[j]+'_t.font.pitch')) font_charset=dwcomp(Describe(col_arr[j]+'_t.font.charset')) font_italic=dwcomp(Describe(col_arr[j]+'_t.font.italic')) background_mode=dwcomp(Describe(col_arr[j]+'_t.background.mode')) //pos=pos(newsyntax,'column(') //newsyntax1=left(newsyntax,pos - 1) for i =2 to col_com newsyntaxtt=newsyntaxtt+'text(name='+col_arr[j]+string(i)+'_t band=header alignment="'+alignment+'" text="'+com_arr+'" border="'+border+'" color="'+color+'" x="'+string(max_x+1+long(s_width)*(i - 2))+'" y="'+s_y+'" height="'+height+'" width="'+s_width+'" html.valueishtml="0" visible="'+visible+'" font.face="'+font_face+'" font.height="'+font_height+'" font.weight="'+font_weight+'" font.family="'+font_family+'" font.pitch="'+font_pitch+'" font.charset="'+font_charset+'" font.italic="'+font_italic+'" background.mode="'+background_mode+'" background.color="'+cb_color+'" )'+char(13)+char(10)+char(32) next end if // Вставка прочих объектов (текст и сомpute... )по суффиксу '_t1','_t2'... string newsyntaxttt newsyntaxttt='' for k=1 to 10 s_y =describe(col_arr[j]+'_t'+string(k)+'.y') if s_y<>'?' and s_y<>'!' then // образцовый объект существует cb_color=dwcomp(describe(col_arr[j]+'_t'+string(k)+'.background.color')) s_width =dwcomp(Describe(col_arr[j]+'_t'+string(k)+'.width')) alignment=dwcomp(Describe(col_arr[j]+'_t'+string(k)+'.alignment')) border=dwcomp(Describe(col_arr[j]+'_t'+string(k)+'.border')) color=dwcomp(Describe(col_arr[j]+'_t'+string(k)+'.color')) height=dwcomp(Describe(col_arr[j]+'_t'+string(k)+'.height')) format=dwcomp(Describe(col_arr[j]+'_t'+string(k)+'.format')) font_face=dwcomp(Describe(col_arr[j]+'_t'+string(k)+'.font.face')) font_height=dwcomp(Describe(col_arr[j]+'_t'+string(k)+'.font.height')) font_weight=dwcomp(Describe(col_arr[j]+'_t'+string(k)+'.font.weight')) font_family=dwcomp(Describe(col_arr[j]+'_t'+string(k)+'.font.family')) font_pitch=dwcomp(Describe(col_arr[j]+'_t'+string(k)+'.font.pitch')) font_charset=dwcomp(Describe(col_arr[j]+'_t'+string(k)+'.font.charset')) font_italic=dwcomp(Describe(col_arr[j]+'_t'+string(k)+'.font.italic')) background_mode=dwcomp(Describe(col_arr[j]+'_t'+string(k)+'.background.mode')) band=dwcomp(Describe(col_arr[j]+'_t'+string(k)+'.band')) string otype,text otype=describe(col_arr[j]+'_t'+string(k)+'.type') text=describe(col_arr[j]+'_t'+string(k)+'.text') //pos=pos(newsyntax,'column(') //newsyntax1=left(newsyntax,pos - 1) if otype='compute' then string expression expression=describe(col_arr[j]+'_t'+string(k)+'.expression') for i =2 to col_com // подмена имени колонки для суммирования string expression1 expression1=strtran (expression,col_arr[j],col_arr[j]+string(i)) //messagebox('','compute(name='+col_arr[j]+string(i)+'_t'+string(k)+' expression="'+expression+'" band='+band+' alignment="'+alignment+'" border="'+border+'" color="'+color+'" x="'+string(max_x+1+long(s_width)*(i - 2))+'" y="'+s_y+'" height="'+height+'" width="'+s_width+'" html.valueishtml="0" visible="1" font.face="'+font_face+'" font.height="'+font_height+'" font.weight="'+font_weight+'" font.family="'+font_family+'" font.pitch="'+font_pitch+'" font.charset="'+font_charset+'" font.italic="'+font_italic+'" background.mode="'+background_mode+'" background.color="'+cb_color+'" )'+char(13)+char(10)+char(32)) newsyntaxttt=newsyntaxttt+'compute(name='+col_arr[j]+string(i)+'_t'+string(k)+' expression="'+expression1+'" band='+band+' alignment="'+alignment+'" border="'+border+'" format="'+format+'" color="'+color+'" x="'+string(max_x+1+long(s_width)*(i - 2))+'" y="'+s_y+'" height="'+height+'" width="'+s_width+'" format="'+format+'" html.valueishtml="0" visible="'+visible+'" font.face="'+font_face+'" font.height="'+font_height+'" font.weight="'+font_weight+'" font.family="'+font_family+'" font.pitch="'+font_pitch+'" font.charset="'+font_charset+'" font.italic="'+font_italic+'" background.mode="'+background_mode+'" background.color="'+cb_color+'" )'+char(13)+char(10)+char(32) next elseif otype='text' then for i =2 to col_com newsyntaxttt=newsyntaxttt+'text(name='+col_arr[j]+string(i)+'_t'+string(k)+' band='+band+' alignment="'+alignment+'" text="'+text+'" border="'+border+'" color="'+color+'" x="'+string(max_x+1+long(s_width)*(i - 2))+'" y="'+s_y+'" height="'+height+'" width="'+s_width+'" html.valueishtml="0" visible="'+visible+'" font.face="'+font_face+'" font.height="'+font_height+'" font.weight="'+font_weight+'" font.family="'+font_family+'" font.pitch="'+font_pitch+'" font.charset="'+font_charset+'" font.italic="'+font_italic+'" background.mode="'+background_mode+'" background.color="'+cb_color+'" )'+char(13)+char(10)+char(32) next end if else exit end if next max_x=max_x+long(s_width)*(col_com - 1) // c учетом вставленных колонок newsyntax=newsyntax1 + newsyntaxcc + newsyntaxtt +newsyntaxttt + mid(newsyntax,pos) next //messagebox('',newsyntax) //messagebox('',MID(newsyntax,10000)) // порядок column надо сделать по списку X коор чтобы rowcount=ds_colx.rowcount() // перетасовать колонки согласно порядку переданному из процедуры if col_ord>0 then for i=1 to rowcount ds_colx.object.ord=alscan(arr_ord,ds_colx.object.name) next end if // ds_colx.setsort('ord A') ds_colx.sort() //rowcount=ds_colx.rowcount() // сортируем column в table 123 // вырежем table(... proc newsyntax1=mid(newsyntax, pos(newsyntax,'table(')+5,pos(newsyntax,'procedure=') - (pos(newsyntax,'table(') + 6)) long col_tcol string arr_tcol[] col_tcol =listtoarray(newsyntax1,arr_tcol[],'column=') // список определений колонок newsyntax1='' // сделаем table( отсортированный по x кординате используя старый id для поиска // в старом массиве колонок for i=1 to rowcount if ds_colx.object.type='column' then long l //objname=ds_colx.object.name l=alscan(col_arr,ds_colx.object.name) // колонка if l>0 then if listtoarray(com_arr1[l],com_arr,',')>0 then newsyntax1=newsyntax1+'column='+arr_tcol[ long(ds_colx.object.id) + 1 ] else // надо удалить описание колонки и изменить id ds_colx.object.id='0' end if else newsyntax1=newsyntax1+'column='+arr_tcol[ long(ds_colx.object.id) + 1 ] end if end if next newsyntax=mid(newsyntax,1, pos(newsyntax,'table(')+5)+ newsyntax1 + mid(newsyntax,pos(newsyntax,'procedure=')) // поменяем id j=0 pos=0 //newsyntax=strtran(newsyntax,'id','ID') for i=1 to rowcount if ds_colx.object.type='column' then if ds_colx.object.id<>'0' then j=j+1 newsyntax=strtran(newsyntax,' id='+ds_colx.object.id+' ',' ID='+string(j)+' ') else // удаляем описание удаленной колонки pos=pos(newsyntax,'column(name='+ds_colx.object.name) newsyntax1=left(newsyntax,pos - 1) newsyntax=newsyntax1+mid(newsyntax,pos(newsyntax,char(13)+char(10),pos + 1)) // Заголовки, итоги, compute for k=0 to 10 pos=pos(newsyntax,'text(name='+ds_colx.object.name+'_t'+iif(k=0,'',string(k)) ) if pos>0 then newsyntax1=left(newsyntax,pos - 1) newsyntax=newsyntax1+mid(newsyntax,pos(newsyntax,char(13)+char(10),pos + 1)) end if pos=pos(newsyntax,'text(name='+ds_colx.object.name+'_d'+iif(k=0,'',string(k))) if pos>0 then newsyntax1=left(newsyntax,pos - 1) newsyntax=newsyntax1+mid(newsyntax,pos(newsyntax,char(13)+char(10),pos + 1)) end if pos=pos(newsyntax,'compute(name='+ds_colx.object.name+'_t'+iif(k=0,'',string(k)) ) if pos>0 then newsyntax1=left(newsyntax,pos - 1) newsyntax=newsyntax1+mid(newsyntax,pos(newsyntax,char(13)+char(10),pos + 1)) end if pos=pos(newsyntax,'compute(name='+ds_colx.object.name+'_d'+iif(k=0,'',string(k))) if pos>0 then newsyntax1=left(newsyntax,pos - 1) newsyntax=newsyntax1+mid(newsyntax,pos(newsyntax,char(13)+char(10),pos + 1)) end if next end if //messagebox('id='+ds_colx.object.id +' '+'ID='+string(j),MID(newsyntax,3000)) end if next // //messagebox('',MID(newsyntax,3000)) //messagebox('',newsyntax) //messagebox('','4') create(newsyntax, ERRORS) //messagebox('','5') if errors<>'' then messagebox('Ошибка модификации окна',ERRORS) end if setredraw(false) Settransobject(sqlca) // меняем заголовок базовой колонки и пр for j=1 to col_col // ЦИКЛ ПО КОЛОНКАМ РАЗМНОЖЕНИЯ if upperbound(com_arr1)>=j then col_com =listtoarray(com_arr1[j],com_arr,',') // список коммен к размнож колонкам else col_com=0 end if if col_com>0 then modify(col_arr[j]+'_t.text="'+com_arr[1]+'"') //else // удаление колонок заголовков, итогов - это уже сделано? // messagebox('Destroy',col_arr[j]) // modify('DESTROY COLUMN '+col_arr[j]) // modify('DESTROY ' +col_arr[j]+'_t') // modify('DESTROY ' +col_arr[j]+'_d') // for k=1 to 10 // modify('DESTROY ' +col_arr[j]+'_d'+string(k)) // next end if next string arr_vis[]//,nnn // порядок колонок надо по списку через visible - убрать видимость всего // и назначить в новом порядке согласно координате x for i=1 to rowcount arr_vis=describe(ds_colx.object.name+'.visible') modify(ds_colx.object.name+'.visible=0') //nnn=ds_colx.object.name //messagebox('vis-',string(nnn)) next for i=1 to rowcount if arr_vis<>'?' and arr_vis<>'!' then modify(ds_colx.object.name+'.visible='+arr_vis) //nnn=ds_colx.object.name //messagebox('vis+',string(nnn)) end if next // для невидимых преобразованных в видимые for i=1 to upperbound(arr_nvis) modify(arr_nvis) next // подправить координаты прочих объектов for i=1 to rowcount s_x=describe(ds_colx.object.name+'.x') s_width=describe(ds_colx.object.name+'.width') if s_x<>'?' and s_x<>'!' then // текстовые объекты заголовка modify(ds_colx.object.name+'_t.x="'+s_x+'"') modify(ds_colx.object.name+'_t.width="'+s_width+'"') end if for k=1 to 10 // прочие объекты s_x=describe(ds_colx.object.name+'_t'+string(k)+'.x') s_width=describe(ds_colx.object.name+'_t'+string(k)+'.width') if s_x<>'?' and s_x<>'!' then modify(ds_colx.object.name+'_t'+string(k)+'.x="'+s_x+'"') modify(ds_colx.object.name+'_t'+string(k)+'.width="'+s_width+'"') else exit // для скорости считаем что объекты нумерованы последовательно end if next next //messagebox('','6') setredraw(true) // //messagebox('',modify(desribe'create column(band=detail id=3 alignment="1" tabsequence=32766 border="0" color="0" x="348" y="12" height="76" width="503" format="#,##0.00" html.valueishtml="0" name=sum_db2 visible="1" edit.limit=0 edit.case=any edit.focusrectangle=no edit.autoselect=no edit.imemode=0 font.face="Arial CYR" font.height="-10" font.weight="400" font.family="2" font.pitch="2" font.charset="204" background.mode="2" background.color="16777215" )')) //messagebox('',describe('datawindow.table.column')) // теперь надо размножить колонки //messagebox('',modify('create column(band=detail id=2 alignment="1" tabsequence=32766 border="0" color="0" x="648" y="12" height="76" width="503" format="#,##0.00" html.valueishtml="0" name=sum_db2 visible="1" edit.limit=0 edit.case=any edit.focusrectangle=no edit.autoselect=no edit.imemode=0 font.face="Arial CYR" font.height="-10" font.weight="400" font.family="2" font.pitch="2" font.charset="204" background.mode="2" background.color="16777215" )')) end if ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2006, 22:51 |
|
|
start [/forum/topic.php?fid=15&gotonew=1&tid=1337954]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
12ms |
get first new msg: |
99ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
others: | 260ms |
total: | 487ms |
0 / 0 |