powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Вместо кросстаб (и лучше) - Вариант решения
1 сообщений из 1, страница 1 из 1
Вместо кросстаб (и лучше) - Вариант решения
    #33468520
AVGritsenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Вместо кросстаб (и лучше) - Вариант решения
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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