#-*- encoding: iso-8859-1 -*-
#-*- coding: iso-8859-1 -*-
import os
import PyQt4
from pyHed.common import *
from pyHed.components import *
import frameCustomRpt
import pyHedReportList
import pyHedReportMd
wherePrivateWord = '%WHERECLAUSE%'
class FrameCustomRptCondition(frameCustomRpt.FrameCustomRpt):
"""
Nesta classe, você encontra diversas facilidades para geração do seu relatório. Usando o componentes do condComponents, ele irá montar todo o SQL
do relatório e já irá chamar o classe do relatório e mostrará o mesmo na tela para o usuário
- reportPath = caminho para geração do arquivo .pdf
- masterFields = field's Master (usados na hora da criação do Master/Detail)
- detailFields = field's Details (usados na hora da criação do Master/Detail)
- masterKey = Coluna Usada para separar os Registros
- sql = sql do relatório já com o %WHERECLAUSE%
- exportCsvFields = fields dos masters do CSV
- params = parâmetros adicionais
Edgar, 25/set/2008
"""
def __init__(self, parent, reportFields, reportPath, exportCsvFields, sql=None, params=None):
super(FrameCustomRptCondition, self).__init__(parent, params)
# caminho para criação do pdf na máquina
self.__reportPath = reportPath
# Campos do Relatório
self.__reportFields = reportFields
# Fields Para Exportar para CSV
self.__exportCsvFields = exportCsvFields
# SQL do relatório
self.__sql = sql
def onPaint(self):
super(FrameCustomRptCondition, self).onPaint()
# botão de impressão
self.btnImprimir = components.Button(self.PnlButtons, text=u"&" + pyHedConsts.translation.getItem('framecustomrptcondition', 'print_button'), icon='%s/icon_impressora.gif' % pyHedConsts.pyHedImagePath, x=10, y=4, width=100, hint=pyHedConsts.translation.getItem('framecustomrptcondition', 'print_button_hint'))
self.connect(self.btnImprimir, PyQt4.QtCore.SIGNAL('clicked()'), self.evtImprimir)
# botão de exportar para planilha
self.btnExportar = components.Button(self.PnlButtons, text=u"&" + pyHedConsts.translation.getItem('framecustomrptcondition', 'export_button'), icon='%s/icon_exportar_csv.gif' % pyHedConsts.pyHedImagePath, x=self.btnImprimir.width()+20, y=4, width=100, hint=pyHedConsts.translation.getItem('framecustomrptcondition', 'export_button_hint'))
#self.btnExportar.setVisible(False)
self.connect(self.btnExportar, PyQt4.QtCore.SIGNAL('clicked()'), self.evtExportar)
def getWhereClause(self, container = None):
def getValues(container):
where = ''
for comp in container.children():
# if the comp is a container, then, re-calls the getWhereClause to search conditions inside it
if comp.children() != [] and not issubclass(comp.__class__, condComponents.CustomCondition):
where += getValues(comp)
elif issubclass(comp.__class__, condComponents.CustomCondition):
if comp.getSqlClause() is None and comp.getRequired():
raise pyHedExceptions.UserException('%s %s' % (pyHedConsts.translation.getItem('framecustombtndb', 'required_field'), comp.label.text().toLatin1()))
elif comp.getSqlClause() is not None:
where += comp.getSqlClause() + ' and '
return where[:len(where) - 5]
"""
Retorna o where montado para passagem para o sql. Percorre todos os componentes condition do PnlMain
Edgar, 25/set/2008
"""
# if container is None, getWhereClause must search throughout the PnlMain
if container is None:
return getValues(self.PnlMain)
else:
return getValues(container)
def evtImprimir(self):
"""
Função responsável por gerar o sql e criar/passar para o relatório definido. Percorre todos os componentes condition's que possuem como parent o
PnlMain e busca os valores do where.
Edgar, 25/set/2008
"""
self.setCursor(PyQt4.QtCore.Qt.WaitCursor)
try:
# busca a cláusula where e executa a sql
rs = pyHedConsts.dbInst.getConnection().execute(self.__sql.replace(wherePrivateWord, self.getWhereClause())).fetchall()
# Verifica os Master e Detail Fields e Chama o Relatório Específico.
if self.__reportFields.get("masterFields"):
report = pyHedReportMd.PyHedReportMd(reportFields=self.__reportFields, reportPath=self.__reportPath, dataSet=rs)
self.evtBeforeBuild(report)
report.build()
elif self.__reportFields.get("detailFields") and not self.__reportFields.get("masterFields"):
report = pyHedReportList.PyHedReportList(reportFields=self.__reportFields, reportPath=self.__reportPath, dataSet=rs)
self.evtBeforeBuild(report)
report.build()
else:
raise pyHedExceptions.UserException(pyHedConsts.translation.getItem('framecustomrptcondition', 'no_fields_defined'))
finally:
self.setCursor(PyQt4.QtCore.Qt.ArrowCursor)
def evtBeforeBuild(self, report):
"""
Atention: This method is called before mounting the report, if want to set its properties you must inherit it from.
John, 29/may/2009
"""
pass
def evtExportar(self):
"""
Função responsável por gerar a exportacao do csv de um relatório, salvando no local escolhido apartir da consulta selecionada
Uso MasterFields:
__masterFields, para o uso de Labels nas colunas do csv é necessário que se use a váriavel padrão __masterFields passando o valor dos labels,
fica compatível com a evtImprimir padrão, caso o método evtImprimir seja herdado e reescrito, é necessário que seja diferenciado o
__masterFields de cada um pois neste método ele necessita de todos os labels dos campos setados na sql.
John, 31/out/2008
"""
self.setCursor(PyQt4.QtCore.Qt.WaitCursor)
try:
recordSet = pyHedConsts.dbInst.getConnection().execute(self.__sql.replace(wherePrivateWord, self.getWhereClause())).fetchall()
if len(recordSet) > 0:
# Abre modal do PyQt4 para escolher o local onde salvar o arquivo
fileDialog = PyQt4.QtGui.QFileDialog(self, pyHedConsts.translation.getItem('framecustomrptcondition', 'save_file_dialog'))
fileDialog.setAcceptMode(PyQt4.QtGui.QFileDialog.AcceptSave)
if fileDialog.exec_():
# Chama função do dbMain.exportCsv padrão de csv e passa o recordSet, o path e os labels, com retorno True exibe a mensagem.
if pyHedConsts.dbInst.exportCsv(recordSet, fileDialog.selectedFiles()[0].toLatin1(), self.__exportCsvFields):
components.messageBox(pyHedConsts.translation.getItem('framecustomrptcondition', 'data_exported_success'))
else:
raise pyHedExceptions.UserException(pyHedConsts.translation.getItem('framecustomrptcondition', 'no_data_resulted'))
finally:
self.setCursor(PyQt4.QtCore.Qt.ArrowCursor)
def getSql(self):
return self.__sql
def setSql(self, value):
if str(value).find(wherePrivateWord) == -1:
raise Exception(u'The private word was not found on the whereClause. It should be informed on the sql to put the correct where clause no the SQL. Private word: %s' % wherePrivateWord)
self.__sql = value
def __getEvtAfterWhereClause(self):
return self.__evtAfterWhereClause
def __setEvtAfterWhereClause(self, value):
self.__evtAfterWhereClause = value
# retorna a sql do relatório
SQL = property(getSql, setSql)