Подготовка и запуск вложенного отчета:
в разделе 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