× Linguagem de Programação ADVPL

Perguntas LEFT JOIN

Mais
10 anos 3 meses atrás #24144 por manoelcarlosjunior
LEFT JOIN foi criado por manoelcarlosjunior
Bom dia Galera !!

Sou bem novato em ADVPL pra ser sincero devo muito a esse blog pelo conhecimento adquirido até hoje. Mais em fim, fiz um relatório treport só pra intenderem. Confecciono primeiro a query no SQL rodando e exibindo os dados que quero tenho um modelo que substituo no código advpl. A principio achei que o relatório estava funcionando até aparecer uma condição em que o nome do vendedor não precisa ser preenchido ai na sexta feira fui apresentado ao LEFT JOIN. Um amigo aqui do trabalho me ajudou a montar a query no SQL deu trabalho mais deu certo e no ADVPL esta dando erro. Alguém poderia me ajudar ? Segue abaixo o código, abraço.


SELECT DA0_CODTAB, DA0_DESCRI, DA0_DATDE, DA0_ATIVO, DA0_XCLI, DA0_XLOJA, A1_NREDUZ,
A1_XCODEX, A1_MUN, A1_EST, A1_VEND, A3_NREDUZ,
DA1_ITEM,DA1_CODPRO, B1_DESC, B1_XCODEX, DA1_PRCVEN
FROM %Table:DA0% DA0, %Table:DA1% DA1, %Table:SB1% SB1, %Table:SA1% SA1

LEFT JOIN %Table:SA3% SA3 ON SA3.A3_COD = SA1.A1_VEND AND
SA3.A3_FILIAL = SA1.A1_FILIAL AND
SA3.D_E_L_E_T_ <>'*'

%Table:SA3% SA3, %Table:DA1% DA1, %Table:SB1% SB1

WHERE DA0_FILIAL = %xFilial:DA0% AND DA0.%NotDel% AND
A1_FILIAL = %xFilial:SA1% AND SA1.%NotDel% AND
DA1_FILIAL = %xFilial:DA1% AND DA1.%NotDel% AND
B1_FILIAL = %xFilial:SB1% AND SB1.%NotDel% AND
DA0.DA0_FILIAL = DA1.DA1_FILIAL AND
DA0.DA0_CODTAB = DA1.DA1_CODTAB AND
DA0.DA0_FILIAL = SA1.A1_FILIAL AND
DA0.DA0_XCLI = SA1.A1_COD AND
DA0.DA0_XLOJA = SA1.A1_LOJA AND
DA1.DA1_FILIAL = SB1.B1_FILIAL AND
DA1.DA1_CODPRO = SB1.B1_COD AND
SA3.A3_FILIAL = SA1.A1_FILIAL AND
SA3.A3_COD = SA1.A1_VEND

%Exp:cSQL%

ORDER BY DA0_CODTAB, DA1_ITEM

Por favor Acessar ou Registrar para participar da conversa.

Mais
10 anos 3 meses atrás #24147 por AndersonBR
Respondido por AndersonBR no tópico LEFT JOIN
Bom Dia Manoel,

eu faria a select da forma como postei abaixo, no meu ponto de vista fica mais organizada e de mais fácil entendimento, com relação a não funcionar não sei o que pode ser até porque não foi postado o erro, mas teste dessa forma e se der erro poste o o log, aqui não tive como testar, pois não tenho os campos customizados que você tem.
Você usa o TDS?
Se sim? Já sabe que é possível fazer o teste das selects diretamente nele através da View TOTVS SQL COmmand?

Quer dúvida, posta aí, abraço
SELECT DA0_CODTAB, DA0_DESCRI, DA0_DATDE, DA0_ATIVO, DA0_XCLI, DA0_XLOJA, 
       A1_NREDUZ, A1_XCODEX, A1_MUN, A1_EST, A1_VEND, 
	   A3_NREDUZ,
       DA1_ITEM,DA1_CODPRO, B1_DESC, B1_XCODEX, DA1_PRCVEN

FROM %Table:DA0% DA0, %Table:SA1% SA1

INNER JOIN %Table:DA1% DA1 on DA0.DA0_FILIAL = DA1.DA1_FILIAL AND
                              DA0.DA0_CODTAB = DA1.DA1_CODTAB AND
							  DA1.%NotDel%
INNER JOIN %Table:SB1% SB1 on DA1.DA1_FILIAL = SB1.B1_FILIAL AND
                              DA1.DA1_CODPRO = SB1.B1_COD AND 
							  SB1.%NotDel%
INNER JOIN %Table:SA1% SA1 on DA0.DA0_FILIAL = SA1.A1_FILIAL AND
                              DA0.DA0_XCLI = SA1.A1_COD AND
                              DA0.DA0_XLOJA = SA1.A1_LOJA AND 
							  SA1.%NotDel%
LEFT JOIN %Table:SA3% SA3 ON SA3.A3_COD = SA1.A1_VEND AND
                             SA3.A3_FILIAL = SA1.A1_FILIAL AND
                             SA3.%NotDel%

WHERE DA0_FILIAL = %xFilial:DA0% AND DA0.%NotDel% AND
                   %Exp:cSQL%

ORDER BY DA0_CODTAB, DA1_ITEM

Por favor Acessar ou Registrar para participar da conversa.

Mais
10 anos 3 meses atrás #24169 por manoelcarlosjunior
Respondido por manoelcarlosjunior no tópico LEFT JOIN
Caro Anderson Barbosa, foi ótima a sua dica desculpe a identação desorganiza é que como disse estou aprendendo, brigado por esse toque tambem. Em fim o erro na minha query era a linha %Table:SA3% SA3, %Table:DA1% DA1, %Table:SB1% SB1 que era pra ficar só no from e a linha SA3.A3_FILIAL = SA1.A1_FILIAL AND
SA3.A3_COD = SA1.A1_VEND que ja estava declarada no left join .... coloquei o seu código e deu uns erros na condição END vou analisar depois o relatório ficou pronto muito obrigado só uma duvida. Eu coloquei esse relatório de impressão em um menu da tabela de preço pra fazer uma graça para o usuário ai então digamos que eu abra ele e não queria mais filtrar e clik em fechar ele da um erro na função oReport:PrintDialog()
Debuguei e dei um print na tela esta em anexo ele menciona alias da SX4 mais nem to usando essa tabela...
Erro em anexo

Grato
Anexos:

Por favor Acessar ou Registrar para participar da conversa.

Mais
10 anos 3 meses atrás #24172 por AndersonBR
Respondido por AndersonBR no tópico LEFT JOIN
Manoel, seguinte, com relação a select ainda não é nem a questão da identação, ela ajuda e muito, mas me referia a forma que você trabalhou os joins ele funciona perfeitamente da forma que você fez, mas eles não estão identificados e você deixa enorme a clausula where, mas fora isso não tem problema nenhum!

Com relação ao erro na X4, se você chamar direto pelo menu o relatório ele apresenta erro também?

Dei uma olhada na X4 e ela nem tem o campo que menciona no erro, vou dar uma procurada aqui se achar alguma coisa te aviso, mas sinceramente ainda não tinha pego esse erro.

Abraço e boa sorte aí na caminhada

Por favor Acessar ou Registrar para participar da conversa.

Mais
10 anos 3 meses atrás #24174 por manoelcarlosjunior
Respondido por manoelcarlosjunior no tópico LEFT JOIN
Cara é alguma coisa no parâmetro
oReport:PrintDialog()
O que vi no TDN é que ele é verdadeiro se confirmamos a impressão mais o erro da quando eu não confirmo se eu abrir o relatório e desistir e fechar por exemplo.
Já olhei 10 vezes o código e comparei com outro que tava funcionando e não vi nada em fim to procurando quando souber o erro posto aqui. Haaa abaixo o código completo.:

/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±º Programa º TABELAP º Autor ºManoel Carlos Juniorº Data ³31/07/2014 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDescricao ³ Imprime Tabela de preço. º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍËÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºModulo | SIGAFAT | USO | Especifico do SIGAFAT º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/


#Include "PROTHEUS.CH"
#Include "REPORT.CH"

User Function TABELAP()

Local oReport
Local oSection1
Local oSection2
Local oBreak
Local cPerg := "TABELAP"




CriaSX1(cPerg)
Pergunte(cPerg, .F.)




DEFINE REPORT oReport NAME "TABELAP" TITLE "Tabela de Preços" PARAMETER cPerg ACTION {|oReport| PrintReport(oReport, cPerg)}

DEFINE SECTION oSection1 OF oReport TITLE "Cabeçalho" TABLES "DA0"

TRCell():New(oSection1,"DA0_CODTAB","DA0","Código",,,,,,,,,,,,,,,.F.)
DEFINE CELL NAME "DA0_DESCRI" OF oSection1 ALIAS "DA0"
TRCell():New(oSection1,"DA0_DATDE","DA0","Data",,,,,,,,,,,,,,,.F.)
TRCell():New(oSection1,"DA0_ATIVO","DA0","Ativa",,,,,,,,,,,,,,,.F.)
DEFINE CELL NAME "DA0_XCLI" OF oSection1 ALIAS "DA0"
TRCell():New(oSection1,"DA0_XLOJA","DA0","Lj",,,,,,,,,,,,,,,.F.)
DEFINE CELL NAME "A1_NREDUZ" OF oSection1 ALIAS "SA1"
DEFINE CELL NAME "A1_XCODEX" OF oSection1 ALIAS "SA1"
DEFINE CELL NAME "A1_MUN" OF oSection1 ALIAS "SA1"
TRCell():New(oSection1,"A1_EST","SA1","Est",,,,,,,,,,,,,,,.F.)
TRCell():New(oSection1,"A1_VEND","SA1","Vend",,,,,,,,,,,,,,,.F.)
TRCell():New(oSection1,"A3_NREDUZ","SA3","Nome",,,,,,,,,,,,,,,.F.)


//DEFINE FUNCTION FROM oSection1:Cell("A1_NOME") OF oSection1 FUNCTION COUNT TITLE "Total de Clientes: " NO END SECTION

//DEFINE FUNCTION FROM oSection1:Cell("A1_NOME") OF oSection1 FUNCTION COUNT TITLE "Total de Clientes: " NO END SECTION

DEFINE SECTION oSection2 OF oSection1 TITLE "Ítens" TABLE "DA1"

DEFINE CELL NAME "DA1_ITEM" OF oSection2 ALIAS "DA1"
DEFINE CELL NAME "DA1_CODPRO" OF oSection2 ALIAS "DA1"
DEFINE CELL NAME "B1_DESC" OF oSection2 ALIAS "SB1"
DEFINE CELL NAME "B1_XCODEX" OF oSection2 ALIAS "SB1"
DEFINE CELL NAME "DA1_PRCVEN" OF oSection2 ALIAS "DA1"




//DEFINE BREAK oBreak OF oSection1 WHEN oSection1:Cell("C5_NUM")

//DEFINE FUNCTION FROM oSection2:Cell("C6_ITEM") OF oSection2 FUNCTION COUNT TITLE "Total de Ítens"
//DEFINE FUNCTION FROM oSection2:Cell("C6_VALOR")OF oSection2 FUNCTION SUM TITLE "Valor Total"

oReport:SetLandScape(.F.)

oReport:PrintDialog()

Return Nil

//
//


Static Function PrintReport(oReport, cPerg)

#IFDEF TOP

Local cAlias := GetNextAlias()
Local cSQL := ""

MakeSqlExp(cPerg)

If !Empty(mv_Par01)
cSQL += "AND DA0_CODTAB >= '" + mv_Par01 + "' "
EndIf
If !Empty(mv_Par02)
cSQL += "AND DA0_CODTAB <= '" + mv_Par02 + "' "
EndIf /*

If !Empty(mv_Par03)
cSQL += "AND C9_CLIENTE >= '" + mv_Par03 + "' "
EndIf
If !Empty(mv_Par04)
cSQL += "AND C9_CLIENTE <= '" + mv_Par04 + "' "
EndIf

If !Empty(mv_Par05)
cSQL += "AND DC_PRODUTO >= '" + mv_Par05 + "' "
EndIf
If !Empty(mv_Par06)
cSQL += "AND DC_PRODUTO <= '" + mv_Par06 + "' "
EndIf

If !Empty(mv_Par07)
cSQL += "AND DA0_DATDE = '" + DtoS(mv_Par07) + "' "
EndIf
/*If !Empty(mv_Par08)
cSQL += "AND C9_DATALIB <= '" + DtoS(mv_Par08) + "' "
EndIf */

cSQL := "%"+cSQL+"%"

BEGIN REPORT QUERY oReport:Section(1)

BeginSQL Alias cAlias


SELECT DA0_CODTAB, DA0_DESCRI, DA0_DATDE, DA0_ATIVO, DA0_XCLI, DA0_XLOJA, A1_NREDUZ,
A1_XCODEX, A1_MUN, A1_EST, A1_VEND, A3_NREDUZ,
DA1_ITEM,DA1_CODPRO, B1_DESC, B1_XCODEX, DA1_PRCVEN
FROM %Table:DA0% DA0, %Table:DA1% DA1, %Table:SB1% SB1, %Table:SA1% SA1

LEFT JOIN %Table:SA3% SA3 ON SA3.A3_COD = SA1.A1_VEND AND
SA3.A3_FILIAL = SA1.A1_FILIAL AND
SA3.%NotDel%


WHERE DA0_FILIAL = %xFilial:DA0% AND DA0.%NotDel% AND
A1_FILIAL = %xFilial:SA1% AND SA1.%NotDel% AND
DA1_FILIAL = %xFilial:DA1% AND DA1.%NotDel% AND
B1_FILIAL = %xFilial:SB1% AND SB1.%NotDel% AND
DA0.DA0_FILIAL = DA1.DA1_FILIAL AND
DA0.DA0_CODTAB = DA1.DA1_CODTAB AND
DA0.DA0_FILIAL = SA1.A1_FILIAL AND
DA0.DA0_XCLI = SA1.A1_COD AND
DA0.DA0_XLOJA = SA1.A1_LOJA AND
DA1.DA1_FILIAL = SB1.B1_FILIAL AND
DA1.DA1_CODPRO = SB1.B1_COD


%Exp:cSQL%

ORDER BY DA0_CODTAB, DA1_ITEM

EndSQL

END REPORT QUERY oReport:Section(1)



oReport:Section(1):Section(1):SetParentQuery()
oReport:Section(1):Section(1):SetParentFilter({|cNum| (cAlias)->DA0_CODTAB == cNum}, {|| (cAlias)->DA0_CODTAB})
//oReport:Section(1):Section(1):SetParentFilter({|cNome| (cAlias)->Z2_NOME == cNome}, {|| (cAlias)->Z1_NOME})


oReport:Section(1):Print()

#ELSE

MakeAdvplExpr(cPerg)

dbSelectAreaSZ1")
dbSetOrder(1)

If !Empty(mv_Par01)
oReport:Section(1):SetFilter(mv_Par01) // mv_Par01 contém a range de Contas.
EndIf

//oReport:Section(1):Section(1):SetRelation({|| xFilial("SZ2")+SZ1->Z1_NOME}, "SZ2", 2, .T.)
//oReport:Section(1):Section(1):SetRelation({|| xFilial("SZ2")+SZ1->Z1_CODIGO}, "SZ2", 2, .T.)
//oReport:Section(1):Section(1):SetParentFilter({|cNome| SZ2->Z2_NOME == cNome}, {|| SZ1->Z1_NOME})
oReport:Section(1):Section(1):SetParentFilter({|cCodigo| SZ2->Z2_CODCOR == cCodigo}, {|| SZ1->Z1_CODIGO})
oReport:Section(1):Section(1):SetLineCondition({|| SZ2->Z2_Data >= mv_Par02 .And. SZ2->Z2_Data <= mv_Par03 .And. Z2_Tipo $ IIf(mv_Par04==1,"12",If(mv_Par04==2,"1","2"))})

oReport:Section(1):Print()

#ENDIF

Return Nil

//
//
// Parametros que devem ser passados para a função de criação das perguntas no arquivo SX1.
//
//
// 1o. Parametro -> Nome do grupo
// 2o. Parametro -> Numero da ordem
// 3o. Parametro -> Texto da pergunta em portugues
// 4o. Parametro -> Texto da pergunta em espanhol
// 5o. Parametro -> Texto da pergunta em ingles
// 6o. Parametro -> Nome da variavel
// 7o. Parametro -> Tipo do dado C=caractere, D=Data, N=Numerico
// 8o. Parametro -> Tamanho do dado
// 9o. Parametro -> Quantidade de casas decimais para o dado
// 10o. Parametro -> Numero da pre-selecao
// 11o. Parametro -> O tipo do dado sera G=get, S=scroll, C=choice, R=Range
// 12o. Parametro -> Sintaxe em advpl, ou funcao para validacao
// 13o. Parametro -> Consistencia com alguma tabela do sistema via <F3>
// 14o. Parametro -> Nome do grupo para SXG
// 15o. Parametro -> Pyme
// 16o. Parametro -> Nome da variavel que será utilizada no programa
// 17o. Parametro -> Primeira definicao do texto em portugues se caso o tipo do dado for choice, exemplo: SIM ou Nao
// 18o. Parametro -> Primeira definicao do texto em espanhol se caso o tipo do dado for choice, exemplo: Si o No
// 19o. Parametro -> Primeira definicao do texto em ingles se caso o tipo do dado for choice, exemplo: Yes or No
// 20o. Parametro -> Conteudo da ultima resposta informada no parametro se caso o tipo do dados for get
// 21o. Parametro -> Segunda definicao do texto em portugues se caso o tipo do dado for choice, exemplo: SIM ou Nao
// 22o. Parametro -> Segunda definicao do texto em espanhol se caso o tipo do dado for choice, exemplo: Si o No
// 23o. Parametro -> Segunda definicao do texto em ingles se caso o tipo do dado for choice, exemplo: Yes or No
// 24o. Parametro -> Terceira definicao do texto em portugues se caso o tipo do dado for choice, exemplo: SIM ou Nao
// 25o. Parametro -> Terceira definicao do texto em espanhol se caso o tipo do dado for choice, exemplo: Si o No
// 26o. Parametro -> Terceira definicao do texto em ingles se caso o tipo do dado for choice, exemplo: Yes or No
// 27o. Parametro -> Quarta definicao do texto em portugues se caso o tipo do dado for choice, exemplo: SIM ou Nao
// 28o. Parametro -> Quarta definicao do texto em espanhol se caso o tipo do dado for choice, exemplo: Si o No
// 29o. Parametro -> Quarta definicao do texto em ingles se caso o tipo do dado for choice, exemplo: Yes or No
// 30o. Parametro -> Quinta definicao do texto em portugues se caso o tipo do dado for choice, exemplo: SIM ou Nao
// 31o. Parametro -> Quinta definicao do texto em espanhol se caso o tipo do dado for choice, exemplo: Si o No
// 32o. Parametro -> Quinta definicao do texto em ingles se caso o tipo do dado for choice, exemplo: Yes or No
// 33o. Parametro -> Vetor com o texto do help em portugues
// 34o. Parametro -> Vetor com o texto do help em espanhol
// 35o. Parametro -> Vetor com o texto do help em ingles
// 36o. Parametro -> Nome do grupo do help

Static Function CriaSX1(cPerg)

Local aHelp := {}

// Texto do help em português , inglês, espanhol
AAdd(aHelp, {{"Informe o Código da Tabela " }, {""}, {""}})
AAdd(aHelp, {{"Informe o Código da Tabela " }, {""}, {""}})
/*AAdd(aHelp, {{"Informe a data final" }, {""}, {""}})
AAdd(aHelp, {{"Informe o tipo de transação" }, {""}, {""}})*/

// 1o 2o 3o 4 5 6o 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
PutSX1(cPerg,"01","De Tabela" ,"","","mv_ch1","C",06,00,00,"G","","DA0","","","mv_Par01","","","","","","","","","","","","","","","","",aHelp[1,1],aHelp[1,2],aHelp[1,3],"")
PutSX1(cPerg,"02","Até Tabela" ,"","","mv_ch2","C",06,00,00,"G","","DA0","","","mv_Par02","","","","","","","","","","","","","","","","",aHelp[2,1],aHelp[2,2],aHelp[2,3],"")
/*PutSX1(cPerg,"03","Cliente de?" ,"","","mv_ch3","C",06,00,00,"G","","SA1","","","mv_Par03","","","","","","","","","","","","","","","","",aHelp[1,1],aHelp[1,2],aHelp[1,3],"")
PutSX1(cPerg,"04","Cliente até" ,"","","mv_ch4","C",06,00,00,"G","","SA1","","","mv_Par04","","","","","","","","","","","","","","","","",aHelp[3,1],aHelp[3,2],aHelp[3,3],"")
PutSX1(cPerg,"05","Produto de?" ,"","","mv_ch5","C",15,00,00,"G","","SB1ATF","","","mv_Par05","","","","","","","","","","","","","","","","",aHelp[1,1],aHelp[1,2],aHelp[1,3],"")
PutSX1(cPerg,"06","Produto até" ,"","","mv_ch6","C",15,00,00,"G","","SB1ATF","","","mv_Par06","","","","","","","","","","","","","","","","",aHelp[3,1],aHelp[3,2],aHelp[3,3],"")*/
//PutSX1(cPerg,"07","Data Inicial" ,"","","mv_ch7","D",08,00,00,"G",""," ","","","mv_Par07","","","","","","","","","","","","","","","","",aHelp[4,1],aHelp[4,2],aHelp[4,3],"")
/*PutSX1(cPerg,"08","Data ate?" ,"","","mv_ch8","D",08,00,00,"G",""," ","","","mv_Par08","","","","","","","","","","","","","","","","",aHelp[4,1],aHelp[4,2],aHelp[4,3],"")*/


Return

Por favor Acessar ou Registrar para participar da conversa.

Mais
10 anos 3 meses atrás #24178 por delsonfilho
Respondido por delsonfilho no tópico LEFT JOIN
Você já testou no SQL SERVER?

Por favor Acessar ou Registrar para participar da conversa.

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