× Linguagem de Programação ADVPL

Perguntas Order by com problemas

Mais
7 anos 11 meses atrás #31594 por thiago_tas
Bom dia,

Não mexo muito com ADVPL, e gostaria de saber como posso ordenar uma consulta confome o parâmetro informado.

O que fiz até agora, gera o sql com aspas no parâmetro 11 (que é passado para a variável cOrder), causando erro de execução.

Segue meu código nesta questão:

if(!Empty(%Exp:MV_PAR04%))
cCodProdIni := %Exp:MV_PAR04%
Endif
if(!Empty(%Exp:MV_PAR05%))
cCodProdFim := %Exp:MV_PAR05%
Endif
if(!Empty(%Exp:MV_PAR06%))
cCodArmIni := %Exp:MV_PAR06%
Endif
if(!Empty(%Exp:MV_PAR07%))
cCodArmFim := %Exp:MV_PAR07%
Endif
if(!Empty(%Exp:MV_PAR08%))
cCodCCIni := %Exp:MV_PAR08%
Endif
if(!Empty(%Exp:MV_PAR09%))
cCodCCFim := %Exp:MV_PAR09%
Endif
if(%Exp:MV_PAR10% <> 1)
nQtdeAtual := 1
Endif
if(!Empty(%Exp:MV_PAR11%))
if(%Exp:MV_PAR11% = 1)
cOrder := "SD3.D3_COD"
Endif
if(%Exp:MV_PAR11% = 2)
cOrder := "SB1.B1_DESC"
Endif
if(%Exp:MV_PAR11% = 3)
cOrder := "SD3.D3_UM"
Endif
Endif



BeginSql Alias cAlias

SELECT SD3.D3_FILIAL, SD3.D3_COD, SB1.B1_DESC, SD3.D3_LOCAL, SD3.D3_UM FROM %Table:SD3% SD3
INNER JOIN %Table:SB1% SB1 ON SD3.D3_COD = SB1.B1_COD
INNER JOIN %Table:SB2% SB2 ON SD3.D3_COD = SB2.B2_COD
WHERE SD3.D3_EMISSAO BETWEEN %Exp:MV_PAR02% AND %Exp:MV_PAR03%
AND SD3.D3_COD BETWEEN %Exp:cCodProdIni% AND %Exp:cCodProdFIM%
AND SD3.D3_LOCAL BETWEEN %Exp:cCodArmIni% AND %Exp:cCodArmFim%
AND SD3.D3_CC BETWEEN %Exp:cCodCCIni% AND %Exp:cCodCCFim%
AND SB2.B2_QATU >= %Exp:nQtdeAtual%
AND SD3.D3_FILIAL = %xFilial:SD3%
AND Sd3.%notDel% AND SB1.%notDel% AND SB2.%notDel%
GROUP BY SD3.D3_FILIAL, SD3.D3_COD, SB1.B1_DESC, SD3.D3_LOCAL, SD3.D3_UM
ORDER BY %Exp:cOrder%
EndSql

Alguem pode dar uma luz?

Por favor Acessar ou Registrar para participar da conversa.

Mais
7 anos 11 meses atrás #31595 por lalberto
Respondido por lalberto no tópico Order by com problemas
Thiago bom dia, a instrução Embedded SQL na clausula order não vai aceitar este tipo de instrução, ele
trabalha apenas com os indices existentes na tabela e no sql.

o que você poderá fazer é substituir o Embedded SQL por uma montagem diferente da query, da forma abaixo:

Segue um exemplo com troca de Ordem
_cQuery += "SELECT SZP.*,B1_DESC FROM "+RetSqlName("SZP")+" SZP "
_cQuery += "LEFT JOIN "+RetSqlName("SB1")+" ON ZP_COD=B1_COD "
_cQuery += "LEFT JOIN "+RetSqlName("SBM")+" ON BM_GRUPO=B1_GRUPO "
_cQuery += "WHERE SZP.D_E_L_E_T_<>'*' AND ZP_FILIAL='"+xFilial("SZP")+"' "
_cQuery += "AND ZP_COD>='"+mv_par01+"' AND ZP_COD<='"+mv_par02+"' "
_cQuery += "AND ZP_DATANT>='"+DTOS(mv_par03)+"' AND ZP_DATANT<='"+DTOS(mv_par04)+"' "
_cQuery += Iif(!Empty(mv_par05),"AND ZP_FORNECE='"+mv_par05+"' ","")
[b]_cQuery += "ORDER BY "+Iif(mv_par06=1,"ZP_COD","B1_DESC")[/b]

TcQuery _cQuery New Alias "QZP"

dbSelectArea("QZP")

ProcRegua(QZP->(RecCount()))

While !QZP->(EOF())

	IncProc(QZP->ZP_COD+" - "+QZP->B1_DESC)

Luiz Alberto Vieira Alves
Proprietário
55 (12) 9 8256-5905 (Vivo)
www.3lsystems.com.br
www.masteradvpl.com.br

Por favor Acessar ou Registrar para participar da conversa.

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