Perguntas Desenvolvimento TReport

Mais
7 anos 9 meses atrás #31798 por simoes
Boa tarde,

Galera, estou com duas dificuldades no relatório a seguir segue fonte.
/*
  Autor   : Súlivan Simões Silva
  Registro: / /
  Funcao  : Produzid
  Funcionalidade: Relatório traz tudo que foi produzido dentro de um determinado periodo.  
*/

//Bibliotecas
#Include "Protheus.ch"
#Include "TopConn.ch"
	
//Constantes
#Define STR_PULA		Chr(13)+Chr(10)
	
User Function Produzid()
	Local aArea   := GetArea()
	Local oReport
	Local lEmail  := .F.
	Local cPara   := ""
	Private cPerg := ""
	
	//Definições da pergunta
	cPerg := "@PRODUCED "   
	/*--------------------------*
	 | Da data?     = MV_PAR01  |
	 | Ate data?    = MV_PAR02  |
	 | Do produto?  = MV_PAR03  |
	 | Ate produto? = MV_PAR04  |                    
	 *--------------------------*/
	
	//Se a pergunta não existir, zera a variável
	DbSelectArea("SX1")
	SX1->(DbSetOrder(1)) //X1_GRUPO + X1_ORDEM
	If ! SX1->(DbSeek(cPerg))
		cPerg := Nil
	EndIf
	
	//Cria as definições do relatório
	oReport := fReportDef()
	
	//Será enviado por e-Mail?
	If lEmail
		oReport:nRemoteType := NO_REMOTE
		oReport:cEmail := cPara
		oReport:nDevice := 3 //1-Arquivo,2-Impressora,3-email,4-Planilha e 5-Html
		oReport:SetPreview(.F.)
		oReport:Print(.F., "", .T.)
	//Senão, mostra a tela
	Else
		oReport:PrintDialog()
	EndIf
	
	RestArea(aArea)
Return
	
/*-------------------------------------------------------------------------------*
 | Func:  fReportDef                                                             |
 | Desc:  Função que monta a definição do relatório                              |
 *-------------------------------------------------------------------------------*/
	
Static Function fReportDef()
	Local oReport
	Local oSectDad := Nil
	Local oBreak   := Nil
	Local oFunTot1 := Nil
	Local oFunTot2 := Nil
	Local cDescri  := POSICIONE("SB1",1,XFILIAL("SB1")+D3_COD,"B1_DESC")
	
	//Criação do componente de impressão
	oReport := TReport():New(	"Produzid",;	   				//Nome do Relatório
								"Produzido Por Periodo",;		//Título
								cPerg,;							//Pergunte ... Se eu defino a pergunta aqui, será impresso uma página com os parâmetros, conforme privilégio 101
								{|oReport| fRepPrint(oReport)},;//Bloco de código que será executado na confirmação da impressão
								)	  							//Descrição
	oReport:SetTotalInLine(.F.)
	oReport:lParamPage := .F.
	oReport:oPage:SetPaperSize(9) //Folha A4
	oReport:SetPortrait()
	
	//Criando a seção de dados
	oSectDad := TRSection():New(	oReport,;			//Objeto TReport que a seção pertence
									"Totais",;	   		//Descrição da seção
									{"QRY_AUX"})		//Tabelas utilizadas, a primeira será considerada como principal da seção
	oSectDad:SetTotalInLine(.F.)  //Define se os totalizadores serão impressos em linha ou coluna. .F.=Coluna; .T.=Linha
	
	//Colunas do relatório
	TRCell():New(oSectDad, "D3_COD", "QRY_AUX", "Produto", /*cPicture*/, 6, /*lPixel*/,/*{|| code-block de impressao }*/,/*cAlign*/,/*lLineBreak*/,/*cHeaderAlign */,/*lCellBreak*/,/*nColSpace*/,/*lAutoSize*/,/*nClrBack*/,/*nClrFore*/,/*lBold*/)
	TRCell():New(oSectDad, "D3_UM", "QRY_AUX", "1 Unidade", /*cPicture*/, 2, /*lPixel*/,/*{|| code-block de impressao }*/,/*cAlign*/,/*lLineBreak*/,/*cHeaderAlign */,/*lCellBreak*/,/*nColSpace*/,/*lAutoSize*/,/*nClrBack*/,/*nClrFore*/,/*lBold*/)
	TRCell():New(oSectDad, "D3_QUANT", "QRY_AUX", "Quantdiade", /*cPicture*/, 6, /*lPixel*/,/*{|| code-block de impressao }*/,/*cAlign*/,/*lLineBreak*/,/*cHeaderAlign */,/*lCellBreak*/,/*nColSpace*/,/*lAutoSize*/,/*nClrBack*/,/*nClrFore*/,/*lBold*/)
	TRCell():New(oSectDad, "D3_SEGUM", "QRY_AUX", "2 Unidade", /*cPicture*/, 2, /*lPixel*/,/*{|| code-block de impressao }*/,/*cAlign*/,/*lLineBreak*/,/*cHeaderAlign */,/*lCellBreak*/,/*nColSpace*/,/*lAutoSize*/,/*nClrBack*/,/*nClrFore*/,/*lBold*/)
	TRCell():New(oSectDad, "D3_QTSEGUM", "QRY_AUX", "Quantidade", /*cPicture*/, 6, /*lPixel*/,/*{|| code-block de impressao }*/,/*cAlign*/,/*lLineBreak*/,/*cHeaderAlign */,/*lCellBreak*/,/*nColSpace*/,/*lAutoSize*/,/*nClrBack*/,/*nClrFore*/,/*lBold*/)
	
	//Definindo a quebra
	oBreak := TRBreak():New(oSectDad,{|| QRY_AUX->(D3_COD) },{|| "Total Por Produto" })
	oSectDad:SetHeaderBreak(.T.)
	
	//Totalizadores
	oFunTot1 := TRFunction():New(oSectDad:Cell("D3_QUANT"),,"SUM",oBreak,,/*cPicture*/)
	oFunTot1:SetEndReport(.F.)
	oFunTot2 := TRFunction():New(oSectDad:Cell("D3_QTSEGUM"),,"SUM",oBreak,,/*cPicture*/)
	oFunTot2:SetEndReport(.F.)
Return oReport
	
/*-------------------------------------------------------------------------------*
 | Func:  fRepPrint                                                              |
 | Desc:  Função que imprime o relatório                                         |
 *-------------------------------------------------------------------------------*/
	
Static Function fRepPrint(oReport)
	Local aArea    := GetArea()
	Local cQryAux  := ""
	Local oSectDad := Nil
	Local nAtual   := 0
	Local nTotal   := 0
		
	//Pegando as seções do relatório
	oSectDad := oReport:Section(1)
	
	//Montando consulta de dados
	cQryAux := ""
	cQryAux += "SELECT "		+ STR_PULA
	cQryAux += "        * "		+ STR_PULA
	cQryAux += "FROM"			+ STR_PULA
	cQryAux += "           SD3010 SD3 "								+ STR_PULA
	cQryAux += "WHERE"												+ STR_PULA
	cQryAux += "            SD3.D_E_L_E_T_ = '' "					+ STR_PULA
	cQryAux += "            AND SD3.D3_FILIAL = '0101'"				+ STR_PULA
	cQryAux += "            AND SD3.D3_TM = '001' AND SD3.D3_OP != '' AND SD3.D3_CF = 'PR0'"								  + STR_PULA  
  	cQryAux += "            AND SD3.D3_EMISSAO >= '"+ DTOS(MV_PAR01) + "' " + "AND SD3.D3_EMISSAO <= '"+ DTOS(MV_PAR02) +"' " + STR_PULA
  	cQryAux += "            AND SD3.D3_COD >= '" +MV_PAR03+ "' AND SD3.D3_COD <= '"+MV_PAR04+ "'"   		  	  			  + STR_PULA              	
	cQryAux += "ORDER BY"				+ STR_PULA
	cQryAux += "  	        SD3.D3_COD"	+ STR_PULA
	cQryAux := ChangeQuery(cQryAux)
	
	//Executando consulta e setando o total da régua
	TCQuery cQryAux New Alias "QRY_AUX"
	Count to nTotal
	oReport:SetMeter(nTotal)
	TCSetField("QRY_AUX", "D3_EMISSAO", "D")
	TCSetField("QRY_AUX", "D3_DTLANC",  "D")
	TCSetField("QRY_AUX", "D3_DTVALID", "D")
	
	//Enquanto houver dados
	oSectDad:Init()
	QRY_AUX->(DbGoTop())
	While ! QRY_AUX->(Eof())
		//Incrementando a régua
		nAtual++
		oReport:SetMsgPrint("Imprimindo registro "+cValToChar(nAtual)+" de "+cValToChar(nTotal)+"...")
		oReport:IncMeter()
		
		//Imprimindo a linha atual
		oSectDad:PrintLine()
		
		QRY_AUX->(DbSkip())
	EndDo
	oSectDad:Finish()
	QRY_AUX->(DbCloseArea())
	
	RestArea(aArea)
Return

Primeira dificuldade é que quando eu tento acrescentar uma coluna nova no relatório da a seguinte mensagem na execução: Variavel D3_COD não existe

estou fazendo o seguinte na ultima linha do TRCELL eu coloco outra coluna exemplo
TRCell():New(oSectDad, "D3_OP", "QRY_AUX", "OP", /*cPicture*/, 6, /*lPixel*/,/*{|| code-block de impressao }*/,/*cAlign*/,/*lLineBreak*/,/*cHeaderAlign */,/*lCellBreak*/,/*nColSpace*/,/*lAutoSize*/,/*nClrBack*/,/*nClrFore*/,/*lBold*/)

Meu outro problema é que queria colocar uma coluna trazendo o peso total produzido pegando o valor do campo B3_PESO * D3_QUANT até ai blz mas não estou sabendo colocar isso na função TRCell estou meio perdido nessa parte..

Alguém pode me ajudar?
Grato desde já.

Por favor Acessar ou Registrar para participar da conversa.

Mais
7 anos 9 meses atrás #31802 por admin
Respondido por admin no tópico Desenvolvimento TReport
Vê se funfa ai.
/*
  Autor   : Súlivan Simões Silva
  Registro: / /
  Funcao  : Produzid
  Funcionalidade: Relatório traz tudo que foi produzido dentro de um determinado periodo.  
*/

//Bibliotecas
#Include "Protheus.ch"
#Include "TopConn.ch"
	
//Constantes
#Define STR_PULA		Chr(13)+Chr(10)
	
User Function Produzid()
	Local aArea   := GetArea()
	Local oReport
	Local lEmail  := .F.
	Local cPara   := ""
	Private cPerg := ""
	
	//Definições da pergunta
	cPerg := "@PRODUCED "   
	/*--------------------------*
	 | Da data?     = MV_PAR01  |
	 | Ate data?    = MV_PAR02  |
	 | Do produto?  = MV_PAR03  |
	 | Ate produto? = MV_PAR04  |                    
	 *--------------------------*/
	
	//Se a pergunta não existir, zera a variável
	DbSelectArea("SX1")
	SX1->(DbSetOrder(1)) //X1_GRUPO + X1_ORDEM
	If ! SX1->(DbSeek(cPerg))
		cPerg := Nil
	EndIf
	
	//Cria as definições do relatório
	oReport := fReportDef()
	
	//Será enviado por e-Mail?
	If lEmail
		oReport:nRemoteType := NO_REMOTE
		oReport:cEmail := cPara
		oReport:nDevice := 3 //1-Arquivo,2-Impressora,3-email,4-Planilha e 5-Html
		oReport:SetPreview(.F.)
		oReport:Print(.F., "", .T.)
	//Senão, mostra a tela
	Else
		oReport:PrintDialog()
	EndIf
	
	RestArea(aArea)
Return
	
/*-------------------------------------------------------------------------------*
 | Func:  fReportDef                                                             |
 | Desc:  Função que monta a definição do relatório                              |
 *-------------------------------------------------------------------------------*/
	
Static Function fReportDef()
	Local oReport
	Local oSectDad := Nil
	Local oBreak   := Nil
	Local oFunTot1 := Nil
	Local oFunTot2 := Nil
	Local cDescri  := POSICIONE("SB1",1,XFILIAL("SB1")+D3_COD,"B1_DESC")
	
	//Criação do componente de impressão
	oReport := TReport():New(	"Produzid",;	   				//Nome do Relatório
								"Produzido Por Periodo",;		//Título
								cPerg,;							//Pergunte ... Se eu defino a pergunta aqui, será impresso uma página com os parâmetros, conforme privilégio 101
								{|oReport| fRepPrint(oReport)},;//Bloco de código que será executado na confirmação da impressão
								)	  							//Descrição
	oReport:SetTotalInLine(.F.)
	oReport:lParamPage := .F.
	oReport:oPage:SetPaperSize(9) //Folha A4
	oReport:SetPortrait()
	
	//Criando a seção de dados
	oSectDad := TRSection():New(	oReport,;			//Objeto TReport que a seção pertence
									"Totais",;	   		//Descrição da seção
									{"QRY_AUX"})		//Tabelas utilizadas, a primeira será considerada como principal da seção
	oSectDad:SetTotalInLine(.F.)  //Define se os totalizadores serão impressos em linha ou coluna. .F.=Coluna; .T.=Linha
	
	//Colunas do relatório
	TRCell():New(oSectDad, "D3_COD", "QRY_AUX", "Produto", /*cPicture*/, 6, /*lPixel*/,/*{|| code-block de impressao }*/,/*cAlign*/,/*lLineBreak*/,/*cHeaderAlign */,/*lCellBreak*/,/*nColSpace*/,/*lAutoSize*/,/*nClrBack*/,/*nClrFore*/,/*lBold*/)
	TRCell():New(oSectDad, "D3_UM", "QRY_AUX", "1 Unidade", /*cPicture*/, 2, /*lPixel*/,/*{|| code-block de impressao }*/,/*cAlign*/,/*lLineBreak*/,/*cHeaderAlign */,/*lCellBreak*/,/*nColSpace*/,/*lAutoSize*/,/*nClrBack*/,/*nClrFore*/,/*lBold*/)
	TRCell():New(oSectDad, "D3_QUANT", "QRY_AUX", "Quantdiade", /*cPicture*/, 6, /*lPixel*/,/*{|| code-block de impressao }*/,/*cAlign*/,/*lLineBreak*/,/*cHeaderAlign */,/*lCellBreak*/,/*nColSpace*/,/*lAutoSize*/,/*nClrBack*/,/*nClrFore*/,/*lBold*/)
	TRCell():New(oSectDad, "D3_SEGUM", "QRY_AUX", "2 Unidade", /*cPicture*/, 2, /*lPixel*/,/*{|| code-block de impressao }*/,/*cAlign*/,/*lLineBreak*/,/*cHeaderAlign */,/*lCellBreak*/,/*nColSpace*/,/*lAutoSize*/,/*nClrBack*/,/*nClrFore*/,/*lBold*/)
	TRCell():New(oSectDad, "D3_QTSEGUM", "QRY_AUX", "Quantidade", /*cPicture*/, 6, /*lPixel*/,/*{|| code-block de impressao }*/,/*cAlign*/,/*lLineBreak*/,/*cHeaderAlign */,/*lCellBreak*/,/*nColSpace*/,/*lAutoSize*/,/*nClrBack*/,/*nClrFore*/,/*lBold*/)
	TRCell():New(oSectDad, "PESO", "QRY_AUX", "Peso Total", /*cPicture*/, 6, /*lPixel*/,/*{|| code-block de impressao }*/,/*cAlign*/,/*lLineBreak*/,/*cHeaderAlign */,/*lCellBreak*/,/*nColSpace*/,/*lAutoSize*/,/*nClrBack*/,/*nClrFore*/,/*lBold*/)
	
	//Definindo a quebra
	oBreak := TRBreak():New(oSectDad,{|| QRY_AUX->D3_COD },{|| "Total Por Produto" })
	oSectDad:SetHeaderBreak(.T.)
	
	//Totalizadores
	oFunTot1 := TRFunction():New(oSectDad:Cell("D3_QUANT"),,"SUM",oBreak,,/*cPicture*/)
	oFunTot1:SetEndReport(.F.)
	oFunTot2 := TRFunction():New(oSectDad:Cell("D3_QTSEGUM"),,"SUM",oBreak,,/*cPicture*/)
	oFunTot2:SetEndReport(.F.)
	oFunTot3 := TRFunction():New(oSectDad:Cell("PESO"),,"SUM",oBreak,,/*cPicture*/)
	oFunTot3:SetEndReport(.F.)
Return oReport
	
/*-------------------------------------------------------------------------------*
 | Func:  fRepPrint                                                              |
 | Desc:  Função que imprime o relatório                                         |
 *-------------------------------------------------------------------------------*/
	
Static Function fRepPrint(oReport)
	Local aArea    := GetArea()
	Local cQryAux  := ""
	Local oSectDad := Nil
	Local nAtual   := 0
	Local nTotal   := 0
		
	//Pegando as seções do relatório
	oSectDad := oReport:Section(1)
	
	
	//Montando consulta de dados
	cQryAux := ""
	cQryAux += "SELECT D3_COD, D3_UM, D3_QUANT, D3_SEGUM, D3_QTSEGUM, D3_EMISSAO, D3_DTLANC, D3_DTVALID, (D3_QUANT * B1_PESO) PESO "		+ STR_PULA
	cQryAux += "FROM"			+ STR_PULA
	cQryAux += "           SD3010 SD3, SB1010 SB1 "								+ STR_PULA
	cQryAux += "WHERE"												+ STR_PULA
	cQryAux += "            SD3.D_E_L_E_T_ = '' "					+ STR_PULA
	cQryAux += "            AND SB1.D_E_L_E_T_ = '' "				+ STR_PULA
	cQryAux += "            AND SB1.B1_COD = SD3.D3_COD "			+ STR_PULA
	cQryAux += "            AND SB1.B1_FILIAL = '0101'"				+ STR_PULA
	cQryAux += "            AND SD3.D3_FILIAL = '0101'"				+ STR_PULA
	cQryAux += "            AND SD3.D3_TM = '001' AND SD3.D3_OP != '' AND SD3.D3_CF = 'PR0'"								  + STR_PULA  
  	cQryAux += "            AND SD3.D3_EMISSAO >= '"+ DTOS(MV_PAR01) + "' " + "AND SD3.D3_EMISSAO <= '"+ DTOS(MV_PAR02) +"' " + STR_PULA
  	cQryAux += "            AND SD3.D3_COD >= '" +MV_PAR03+ "' AND SD3.D3_COD <= '"+MV_PAR04+ "'"   		  	  			  + STR_PULA              	
	cQryAux += "ORDER BY"				+ STR_PULA
	cQryAux += "  	        SD3.D3_COD"	+ STR_PULA
	cQryAux := ChangeQuery(cQryAux)
	
	//Executando consulta e setando o total da régua
	TCQuery cQryAux New Alias "QRY_AUX"
	Count to nTotal
	oReport:SetMeter(nTotal)
	TCSetField("QRY_AUX", "D3_EMISSAO", "D")
	TCSetField("QRY_AUX", "D3_DTLANC",  "D")
	TCSetField("QRY_AUX", "D3_DTVALID", "D")
	
	//Enquanto houver dados
	oSectDad:Init()
	QRY_AUX->(DbGoTop())
	While ! QRY_AUX->(Eof())
		//Incrementando a régua
		nAtual++
		oReport:SetMsgPrint("Imprimindo registro "+cValToChar(nAtual)+" de "+cValToChar(nTotal)+"...")
		oReport:IncMeter()
		
		//Imprimindo a linha atual
		oSectDad:PrintLine()
		
		QRY_AUX->(DbSkip())
	EndDo
	oSectDad:Finish()
	QRY_AUX->(DbCloseArea())
	
	RestArea(aArea)
Return

Por favor Acessar ou Registrar para participar da conversa.

Mais
7 anos 9 meses atrás #31803 por simoes
Respondido por simoes no tópico Desenvolvimento TReport
Deu certo Obrigado :)

Por favor Acessar ou Registrar para participar da conversa.

Tempo para a criação da página:0.103 segundos
Joomla templates by a4joomla