×
Linguagem de Programação ADVPL
Perguntas SQL
- fejuchem
- Autor do Tópico
- Desconectado
- Membro Iniciado
Menos
Mais
- Postagens: 14
- Obrigados Recebidos: 0
- kanaamlrr
- Desconectado
- Membro Platina
Menos
Mais
- Postagens: 1576
- Obrigados Recebidos: 4
10 anos 10 meses atrás #20379
por kanaamlrr
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:
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.
- fejuchem
- Autor do Tópico
- Desconectado
- Membro Iniciado
Menos
Mais
- Postagens: 14
- Obrigados Recebidos: 0
10 anos 10 meses atrás #20382
por fejuchem
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
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