Манипуляции с отчетами

Подготовка и запуск вложенного отчета:
в разделе SETUP отчета

dc=zzPrintDoc()
dc.addDataSource("zz")
mem.heap.detSql="""
	SELECT
		left(date,7) as gmon,
		sum(works) as works,
		sum(paya) as paya,
		sum(payb) as payb,
		sum(pays) as pays,
		sum(inds) as inds
	FROM
	(
	%s
	) zz
	where (works<>0 or paya<>0 or payb<>0 or pays<>0 or inds<>0) and kzak=:kzak and gp=:gp and k_obj=:k_obj
	group by kzak,gp,k_obj,gmon

	""" % replaceParamSql(mem.dataSource['jr'].partSelect.replace("group by kzak,gp,k_obj","group by kzak,gp,k_obj,date"),mem.param)

dc.dataSource['zz'].partSelect= mem.heap.detSql

dtl=mem.makeGridCopy(mem.getSections()[1])
dc.append(dtl,"DETAIL",dataSource='zz')

for x in [1,2,3,4,5,6,7,8,9,10]:
	dtl.setFormat(1,x,";%s;font-size:6pt" % dtl.dataFormat[(1,5)])
dtl.setData(1,1,u"[zzCMonth('%s-01' % gmon )] [zzYear('%s-01' % gmon )]","text-align:right;border-width:1 1 1 1;font-size:6pt")
dtl.setSpan(1,1,1,3)
dtl.calcAfter=""
mem.heap.detReport=dc

В скрипте

def doDetail():
	kzak=grid.t.r.kzak
	gp=grid.t.r.gp
	k_obj=grid.t.r.k_obj
	if mem.param['showDet']:
		mem.heap.detReport.dataSource['zz'].partSelect=replaceParamSql(mem.heap.detSql,locals())
		mem.runSubReport(mem.heap.detReport)
	return ""

Печать отчетов по выделенным строкам таблицы:

li=mem.zzGridWidget.grid.selectionModel().selectedRows(0)
lUid=[]
for x in li:
	lUid.append(mem.t.getRowAt(x.row())['UID'])
dc=zzPrintDoc(format="border-width:0 0 0 0;margin 0.0 0.0 0.0 0.0")
dc.dataSource['zz']=zzRepDbTable(MyApp.myDataBase, "select uid from cash_i where uid in (%s)" % ",".join(lUid))
dtl=zzBaseGrid(1, 1)
dtl.setData(1,1,u"[subReport(u'%s',{'uid':uid})]" % repName)
dc.append(dtl,"DETAIL",dataSource='zz')
dc.run()
модуль _e_runreport

-вызывается сразу после rep.run()

print mem.repname, mem.dataSource['zag'].partSelect
print mem.param
Добавление итоговых сумм в табличный отчет
if mem.getSections("") and  u'Материальный отчет' in mem.getSections("")[0].dataLabel[(1,1)]:
	mem.getSections()[0].totalGrid.insertRow(1)
	mem.getSections()[0].totalGrid.rowHeight[1]='0.00-0.00'
	def sumZtr(mem):
		def worker():
			price=num(mem.currentRecordDict['NAME'].split(u"Цена")[-1])
			for x in mem.currentRecordDict:
				xx=x.lower()
				if 'rasx_ztr' in xx:
					setattr(mem.heap,xx,getattr(mem.heap,xx)+round(num(mem.currentRecordDict[x])*price,2))
			return ""
		return worker
	mem.heap.sumZtr=sumZtr(mem)
	mem.getSections()[0].dataLabel[(1,1)]+="[mem.heap.sumZtr()]"
	
	for x in mem.getSections()[0].dataLabel:
		clv=mem.getSections()[0].dataLabel[x].replace("[","").replace("]","")
		if "rasx_ztr" in clv:
			setattr(mem.heap,clv ,0)
			mem.getSections()[0].totalGrid.dataLabel[(2,x[1])]="[mem.heap.%s]" % clv
			mem.getSections()[0].totalGrid.setFormat(2,x[1],"text-align:right;")
			mem.getSections()[0].totalGrid.setDataPicture(2,x[1],"@Z 999,999,999,999.99")

модуль _e_report

Подмена отчета

if repname==u"Сведения о технике":
    mem=getReportByName(u"_Сведения о технике 2")

Подмена текста источника данных в отчете:

rep=getReportByName(u"ТТН-1")
if rep:
	rep.dataSource['zag'].partSelect=""" SELECT *,num_doc as ndoc FROM kuos_docs where uid=:docsuid """
	rep.dataSource['inf'].partSelect=""" SELECT *,
															(select name from kuos k where k.os=kuos_infs.os) as name, prim as part
														FROM kuos_infs
														where parent_uid=:docsuid """
	rep.param['docsuid']=mem.t.r.uid
	rep.run()

Подмена текста источника данных в отчете по условию (через подмену текста модуля SETUP):

if "repname" in locals():
	if repname==u"ТТН-1(ТМЦ)":
		mem.psetup="""
if gi("docs","uid",mem.param['docsuid'],"doc")=='333':
	sql=[]
	for z in zzCursor("show columns from infs").zzRecords():
		if z['FIELD'] not in ["price","price2"]:
			sql.append(z['FIELD'])
		elif z['FIELD']=="price":
			sql.append("case when dbl_uid<>0 then (select price from infs i where i.uid=infs.dbl_uid) else price end as price")
		elif z['FIELD']=="price2":
			sql.append("case when dbl_uid<>0 then (select price from infs i where i.uid=infs.dbl_uid) else price end as price2")
	mem.dataSource['inf'].partSelect="select %s from infs where parent_uid=:docsuid and uid<>dbl_uid" % ",".join(sql)
"""

Добавление секции в отчет на этапе выполнения (через встроенную функцию mem.heap.e_report)

	if repname==u"Ведомость наличия ОС":
		def e_kuos_nal(mem):
			last_grid=mem.doc[-1]
			grd=zzBaseGrid(4,last_grid.numCols)
			grd.setSpan(2,2,1,2)
			grd.setSpan(2,5,1,3)
			grd.setFormat(2,4,"border-width:0 0 1 0")
			grd.setData(2,2,u"[const.buh_os_post]")
			grd.setData(2,5,u"[const.buh_os]")

			grd.setSpan(4,2,1,2)
			grd.setSpan(4,5,1,3)
			grd.setFormat(4,4,"border-width:0 0 1 0")
			grd.setData(4,2,u"Главный бухгалтер")
			grd.setData(4,5,u"[const.gb]")
			mem.append(grd)
		mem.heap.e_report=e_kuos_nal

Настройка итогов на лету

ao=sc()
ao.addClose()
ao.addForm(u"Итоги")
iDict={}
iList=[]
sDict={}
for x in [u"Вид техники:vt.vt:vt_name",
		u"Тип (модель) техники:mc.mch:mch_name",
		u"Техника:ts.tsp:tsp_gosn",
		u"Вид организации (дочерние/прочие):dopr:dopr",
		u"Организация:morg:morg_name",
		u"Затраты:mzat:mzat:name",
		u"Подразделения:mpod:mpod_name",
		]:
	iDict[x.split(":")[0]]=x.split(":")[1]
	sDict[x.split(":")[0]]=x.split(":")[2]
	iList.append(x.split(":")[0])

ao.addLine("lines1","Итог 1",len=25,pic=u"L "+";".join(iList),value=iList[0])
ao.addLine("lines2","Итог 1",len=25,pic=u"L Нет;"+";".join(iList),value=u"Техника")
ao.addLine("lines3","Итог 1",len=25,pic=u"L Нет;"+";".join(iList))
ao.addLine("lines4","Итог 1",len=25,pic=u"L Нет;"+";".join(iList))
ao.addLine("lines5","Итог 1",len=25,pic=u"L Нет;"+";".join(iList))
ao.addClose()
ao.addLine("showdet","",pic=u"C показать даты и номера путевых листов")

ao.runForm(u"Параметры отчета КИП 2")
ot=0
if ao.okPressed:
	rez=[]
	for x in range(1,6):
		cc=ao.s.__getattr__("lines%s" % x)
		if cc!=u"Нет" and cc not in rez:
			rez.append(iDict[cc])
			gheader=mem.makeGridCopy(mem.getSections()[0])
			gheader.setSpan(1,1,gheader.numRows,gheader.numCols)
			gheader.setData(1,1,"[' '*%s][%s]" % (ot,sDict[cc]))

			gfooter=mem.makeGridCopy(mem.getSections()[0].totalGrid)
			if ao.s.showdet=="*":
				gfooter.setFormat(1,1,"text-align:right;border-width:1 1 1 1;font-size:6pt;")
			else:
				gfooter.setFormat(1,1,"text-align:left;border-width:1 1 1 1;font-size:8pt;")
			gfooter.setData(1,1,u"[' '*%s]Итого по [%s]" % (ot,sDict[cc]))
			mem.getSections()[0].addGroup(sDict[cc],gheader,gfooter)
			ot+=2
	if ao.s.showdet=="*":
		mem.getSections()[0].printWhen="True"
	else:
		mem.getSections()[0].printWhen="False"
		mem.getSections()[0].groupGrids[-1]['GHEAD'].printWhen='0'
		mem.getSections()[0].groupGrids[-1]['GFOOT'].setData(1,1,"%s" % (mem.getSections()[0].groupGrids[-1]['GFOOT'].dataLabel[(1,1)].replace(u"Итого по ","")))

	mem.getSections()[0].setData(1,1,u"[' '*%s]%s" % (ot,mem.getSections()[0].dataLabel[(1,1,)]))
	mem.param['_order']=",".join(rez)
else:
	mem.RETURN=False