× Linguagem de Programação ADVPL

Perguntas SQL

Mais
10 anos 10 meses atrás #20369 por fejuchem
SQL foi criado por fejuchem
Boa Tarde Caros!

Possuo esta query:

SELECT DISTINCT F1_FORNECE, F1_DNOME, SUM(F1_VALMERC)
FROM SF1010

Qual a maneira mais fácil para jogar este relatório num fonte (advpl) e colocá-la no menu do protheus?

Por favor Acessar ou Registrar para participar da conversa.

Mais
10 anos 10 meses atrás #20379 por kanaamlrr
Respondido por kanaamlrr no tópico SQL
Felipe, você não vai utilizar nenhum tipo de filtro nesse relatório?
Isso pode causar uma grande perda de desempenho.
Outro ponto importante é filtrar os registros deletados.

utilize a query assim:

SELECT DISTINCT F1_FORNECE, F1_DNOME, SUM(F1_VALMERC) FROM SF1010 WHERE D_E_L_E_T_ <> '*'
--AND COLOQUE AQUI OS FILTROS


Segue um exemplo de relatório para você utilizar como base:
#Include "Protheus.ch"
#include "TopConn.ch"

#Define ENTER chr(13)+chr(10)
/*
Funcao      : RelCCBalc
Objetivos   : Relatório de Movimentações de balconistas
Autor       : Kanaãm L. R. Rodrigues 
Data/Hora   : 01/06/2012
*/
*---------------------*
User Function RelCCBalc()
*---------------------*
Local oDlg
Local oCodIni
Local oCodFim
Local oDtIni
Local oDtFim
Local bOk        := {||lOk := .T., oDlg:End() }
Local bCancel    := {||lOk := .F., oDlg:End() } 
Local nLin       := 19
Local nCol1      := 5
Local nCol2      := 40
Local nPulaLinha := 15
Local lOk        := .F.
Local lDados     := .F.

Private oReport 
Private cCodIni    := Space(6)
Private cCodFim    := "ZZZZZZ"
Private dDtIni     := CTOD("")
Private dDtFim     := CTOD("")

Define MsDialog oDlg Title 'Filtro por Produto' From 7,10 To 18,60 Of oMainWnd
   *
   @ nLin,nCol1 Say  'Codigo Inicial: '                                                                       Of oDlg Pixel                                  
   @ nLin,nCol2 MsGet oCodIni VAR cCodIni F3 "SZ3" VALID (VAZIO() .OR. EXISTCPO('SZ3'))           Size 60,09  Of oDlg Pixel  
   *
   nLin += nPulaLinha
   *
   @ nLin,nCol1 Say  'Codigo Final: '                                                                         Of oDlg Pixel                                  
   @ nLin,nCol2 MsGet oCodFim VAR cCodFim F3 "SZ3" VALID (cCodFim=="ZZZZZZ" .OR. EXISTCPO('SZ3')) Size 60,09  Of oDlg Pixel  
   *
   nLin += nPulaLinha
   *
   @ nLin,nCol1 Say  'Data Inicial: '                                                                         Of oDlg Pixel                                  
   @ nLin,nCol2 MsGet oDtIni  VAR dDtIni           VALID (Vazio() .OR. dDtIni<=dDataBase)         Size 60,09  Of oDlg Pixel  
   *
   nLin += nPulaLinha
   *
   @ nLin,nCol1 Say  'Data Final: '                                                                           Of oDlg Pixel                                  
   @ nLin,nCol2 MsGet oDtFim  VAR dDtFim           VALID (Vazio() .OR. dDataBase<=dDtFim)         Size 60,09  Of oDlg Pixel  
   *
Activate MsDialog oDlg On Init Enchoicebar(oDlg,bOk,bCancel) Centered         

If lOk
   Processa({||lDados := ProcDados()},'Pesquisando Dados...') 
   If lDados
      Processa({|| oReport := ReportDef(),oReport:PrintDialog()},'Imprimindo Dados...')       
   EndIf
   Q_QRY->(dbCloseArea())
EndIf

Return


/*
Funcao      : ProcDados
Objetivos   : Processa dados de acordo com o filtro
Autor       : Kanaãm L. R. Rodrigues 
Data/Hora   : 31/05/2012
*/
*--------------------------*
Static Function ProcDados()
*--------------------------*
Local cQry := ""

cQry := "SELECT Z3_CODIGO, Z3_CPF, Z3_NOME, Z3_SALDO, "
cQry += "Z9_DTOPER, Z9_TIPOPER, "
cQry += "Z9_PONTOS, Z9_SALDO, Z9_OBS, Z9_USERLOG, Z9_QTDEPRE, "
//trazer a descrição do prêmio
cQry += "(SELECT ZD_DESCRI "
cQry += "FROM "+RetSqlName("SZD")+" SZD "
cQry += "WHERE "+RetSqlCond("SZD")+" "
cQry += "AND SZD.ZD_CODIGO=Z9_CODPREM) AS ZD_DESCRI, "
//trazer a descrição do cliente
cQry += "(SELECT A1_NOME "
cQry += "FROM "+RetSqlName("SA1")+" SA1 "
cQry += "WHERE "+RetSqlCond("SA1")+" "
cQry += "AND SA1.A1_COD=Z9_LOJA) AS A1_NOME, "
//Tratamento do tipo de operação
cQry += "(CASE Z9_TIPOPER "
cQry += "    WHEN 'I' THEN 'Inicial' "
cQry += "    WHEN 'S' THEN 'Saida' "
cQry += "    ELSE          'Entrada' "
cQry += " END) as Z9_TIPOPER "

cQry += "FROM "+RetSqlName("SZ3")+" SZ3, "
cQry += RetSqlName("SZ9")+" SZ9 "
cQry += "WHERE "+RetSqlCond("SZ3")+" "
cQry += "AND "+RetSqlCond("SZ9")+" "
cQry += "AND Z3_CODIGO = Z9_CODBALC "
cQry += "AND Z3_CODIGO >='"+cCodIni+"' "
cQry += "AND Z3_CODIGO <='"+cCodFim+"' "
If !Empty(dDtIni)
   cQry += "AND Z9_DTOPER >='"+DTOS(dDtIni)+"' "
EndIf
If !Empty(dDtFim)
   cQry += "AND Z9_DTOPER <='"+DTOS(dDtFim)+"' "
EndIf

//executa a query
If !GerTCQuery(cQry,"Q_QRY",.T.)
   MsgAlert("Ocorreu um erro na busca dos dados."+ENTER+;
           "Entre em contato com o setor de TI.")
   Return .F.
EndIf
If Q_QRY->(EOF()) .AND. Q_QRY->(BOF())
   MsgAlert("Não existem registros para o filtro selecionado.")
EndIf
//
Return .T.


/*
Funcao      : ReportDef
Objetivos   : Define estrutura de impressão
Autor       : Kanaãm L. R. Rodrigues 
Data/Hora   : 31/05/2012
*/
*--------------------------*
Static Function ReportDef()
*--------------------------*
//
oReport := TReport():New("RELCCBALC","Movimentação Balconistas",;
                         "",{|oReport| ReportPrint(oReport)},"Este relatorio irá Imprimir as movimentações das balconistas")

//Inicia o relatório como paisagem. 
oReport:oPage:lLandScape := .T. 
oReport:oPage:lPortRait := .F. 

//Define o objeto com a seção do relatório
oSecao  := TRSection():New(oReport,"BALCONISTAS"  ,"Q_QRY",{})
oSecao1 := TRSection():New(oReport,"MOVIMENTACOES","Q_QRY",{})

//Dados do balconista
TRCell():New(oSecao,"Z3_CODIGO","Q_QRY",AVSX3("Z3_CODIGO",5),AVSX3("Z3_CODIGO",6),AVSX3("Z3_CODIGO",3),,,"CENTER")
TRCell():New(oSecao,"Z3_CPF"   ,"Q_QRY",AVSX3("Z3_CPF"   ,5),AVSX3("Z3_CPF"   ,6),AVSX3("Z3_CPF"   ,3),,,"CENTER")
TRCell():New(oSecao,"Z3_NOME"  ,"Q_QRY",AVSX3("Z3_NOME"  ,5),AVSX3("Z3_NOME"  ,6),AVSX3("Z3_NOME"  ,3),,,"LEFT"  )
TRCell():New(oSecao,"Z3_SALDO" ,"Q_QRY",AVSX3("Z3_SALDO" ,5),AVSX3("Z3_SALDO" ,6),AVSX3("Z3_SALDO" ,3),,,"RIGHT" )

//Dados da movimentação
TRCell():New(oSecao1,"Z9_DTOPER" ,"Q_QRY",AVSX3("Z9_DTOPER" ,5),"@D"                 ,AVSX3("Z9_DTOPER" ,3),,,"CENTER")
TRCell():New(oSecao1,"Z9_TIPOPER","Q_QRY",AVSX3("Z9_TIPOPER",5),AVSX3("Z9_TIPOPER",6),                    7,,,"LEFT"  )
TRCell():New(oSecao1,"Z9_QTDEPRE","Q_QRY",AVSX3("Z9_QTDEPRE",5),AVSX3("Z9_QTDEPRE",6),AVSX3("Z9_QTDEPRE",3),,,"LEFT"  )
TRCell():New(oSecao1,"ZD_DESCRI" ,"Q_QRY","Prêmio"             ,AVSX3("ZD_DESCRI" ,6),                   40,,,"LEFT"  )
TRCell():New(oSecao1,"A1_NOME"   ,"Q_QRY","Cliente"            ,AVSX3("A1_NOME"   ,6),AVSX3("A1_NOME"   ,3),,,"LEFT"  )
TRCell():New(oSecao1,"Z9_PONTOS" ,"Q_QRY",AVSX3("Z9_PONTOS" ,5),AVSX3("Z9_PONTOS" ,6),AVSX3("Z9_PONTOS" ,3),,,"RIGHT" )
TRCell():New(oSecao1,"Z9_SALDO"  ,"Q_QRY",AVSX3("Z9_SALDO"  ,5),AVSX3("Z9_SALDO"  ,6),AVSX3("Z9_SALDO"  ,3),,,"RIGHT" )
TRCell():New(oSecao1,"Z9_OBS"    ,"Q_QRY",AVSX3("Z9_OBS"    ,5),AVSX3("Z9_OBS"    ,6),AVSX3("Z9_OBS"    ,3),,,"LEFT"  )
TRCell():New(oSecao1,"Z9_USERLOG","Q_QRY",AVSX3("Z9_USERLOG",5),AVSX3("Z9_USERLOG",6),AVSX3("Z9_USERLOG",3),,,"LEFT"  )


Return oReport


/*
Funcao      : ReportPrint
Objetivos   : Imprime os dados filtrados
Autor       : Kanaãm L. R. Rodrigues 
Data/Hora   : 31/05/2012
*/
*----------------------------------*
Static Function ReportPrint(oReport)
*----------------------------------*
Local cBalc := ""


oReport:SetMeter(Q_QRY->(RecCount()))

Do While Q_QRY->(!EoF()) .And. !oReport:Cancel()

   If cBalc != Q_QRY->Z3_CODIGO
      oReport:Section("BALCONISTAS"):Init()
      oReport:Section("BALCONISTAS"):PrintLine() //Impressão da linha
      oReport:SkipLine()
      cBalc := Q_QRY->Z3_CODIGO
      oReport:Section("MOVIMENTACOES"):Init()
   EndIf
   oReport:Section("MOVIMENTACOES"):PrintLine() //Impressão da linha
   oReport:IncMeter()                     //Incrementa a barra de progresso
   Q_QRY->( dbSkip() )
   If cBalc != Q_QRY->Z3_CODIGO
      oReport:Section("MOVIMENTACOES"):Finish()      
      oReport:Section("BALCONISTAS"):Finish()    
      oReport:SkipLine(3)
   EndIf   
EndDo

//Fim da impressão da seção 
  

Return .T.


/*
Funcao      : GerTCQuery
Objetivos   : Executa a query de busca
Autor       : Kanaãm L. R. Rodrigues 
Data/Hora   : 31/05/2012
*/
*-------------------------------------------------*
Static Function GerTCQuery(cQuery,cAlias,lEraseLog)
*-------------------------------------------------*
Local nCod

Default lEraseLog := .T.

If lEraseLog
   nCod := FCreate("cQuery.TXT")
Else
   nCod := FOpen("cQuery.TXT",2)
EndIf

If nCod # -1
   FWRITE(nCod,cQuery)
   Fclose(nCod)
EndIf

cQuery := ChangeQuery(cQuery)

If Select(cAlias) # 0
   (cAlias)->(dbCloseArea())
EndIf

TcQuery cQuery ALIAS (cAlias) NEW

If !USED()
   Return .F.
EndIf
//
Return .T.   

Por favor Acessar ou Registrar para participar da conversa.

Mais
10 anos 10 meses atrás #20382 por fejuchem
Respondido por fejuchem no tópico SQL
Boa Tarde Kanaãm

Primeiramente, obrigado pela resposta.

Fiz a query mais simples possível, somente para compreender o modo com que farei em advpl.

Após, irei aos poucos, melhorando a query a fim de desempenho e conteúdo.

Mas com seu modelo já é possível entender um pouco como proceder.

Grande abraço,
Felipe

Por favor Acessar ou Registrar para participar da conversa.

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