Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
jmcandido
Contributor III
Contributor III

Variável em where

Boa Tarde pessoal, estou com uma dúvida, acredito que seja coisa simples.

Estou carregando dados do Banco de Dados

LOAD

EMPRESA&ANOMES AS ChavePrimariaGeral,

ANOMES AS fl.AnoMes,

DTAEMISSAO AS fl.DtaEmissao,

SEQPRODUTO AS fl.SeqProduto,

PRODUTO AS fl.Produto,

VLRVENDA AS fl.VlrVenda

[Faturamento_Liquido]:

SELECT

"ANOMES",

"DTAEMISSAO",

"NROEMPRESA",

"SEQPRODUTO",

"PRODUTO",

"VLRVENDA"

FROM FATURAMENTOLIQUIDO";

Depois eu estou criando uma variável para carregar o maior valor

LET vUltMes = '=MAX(ALL[fl.AnoMes])';


E preciso fazer uma seleção de dados através de RESIDENT apenas dos dados que correspondem ao valor da variável,  na clásula WHERE se eu coloco um valor fixo o comando executa certinho, mas se eu coloco a variável me retorna erro


[Faturamento_Mes]:

LOAD

ChavePrimariaGeral,

fl.AnoMes AS fm.AnoMes,

fl.DtaEmissao AS fm.DtaEmissao,

fl.SeqProduto AS fm.SeqProduto,

fl.Produto AS fm.Produto,

fl.VlrVenda AS fm.VlrVenda

RESIDENT [Faturamento_Liquido]

WHERE [fl.AnoMes] = ($(vUltMes));

//

Dessa forma retorna o seguinte erro

RESIDENT [Faturamento_Liquido]

WHERE [fl.AnoMes] = (=MAX(ALL

--

Ocorreram os seguintes erros:

Error in expression:

')' expected

Como eu posso resolver essa questão?
Como deve ser escrito essa instrução.

Obrigado.

Labels (3)
1 Solution

Accepted Solutions
mario_sergio_ti
Partner - Specialist
Partner - Specialist

Bom dia João;

Você incluíu aspas simples na expressão para a variavel vUltMes, então o retorno é o próprio texto da expressão na variável, você deve retira-lo e ajustar a expressão, exemplo:

Faturamento_Liquido:

LOAD

   EMPRESA&ANOMES  AS ChavePrimariaGeral,

   ANOMES          AS fl.AnoMes,

   DTAEMISSAO      AS fl.DtaEmissao,

   SEQPRODUTO      AS fl.SeqProduto,

   PRODUTO         AS fl.Produto,

   VLRVENDA        AS fl.VlrVenda

;

SELECT

   "ANOMES",

   "DTAEMISSAO",

   "NROEMPRESA",

   "SEQPRODUTO",

   "PRODUTO",

   "VLRVENDA"

FROM FATURAMENTOLIQUIDO

;

TMP_MaxMinAnoMes:

LOAD

   Max([fl.AnoMes]) AS MaxAnoMes

Resident Faturamento_Liquido;

LET vMaxAnoMes = Peek('MaxAnoMes');

Drop Table TMP_MaxMinAnoMes;

Faturamento_Mes:

LOAD

   ChavePrimariaGeral,

   fl.AnoMes AS fm.AnoMes,

   fl.DtaEmissao AS fm.DtaEmissao,

   fl.SeqProduto AS fm.SeqProduto,

   fl.Produto AS fm.Produto,

   fl.VlrVenda AS fm.VlrVenda

RESIDENT Faturamento_Liquido

WHERE [fl.AnoMes] = $(vMaxAnoMes)

;

Estou considerando que o retorno do campo seja do tipo YYYYMM (Ex.: 201803), sendo assim, a função Max retornará o resultado adequado.

Consultor certificado | Quem compartilha, aprende!
https://www.linkedin.com/in/mariosergioti

View solution in original post

5 Replies
eduardo_dimperio
Specialist II
Specialist II

Tenta assim:

WHERE [fl.AnoMes] = '$(vUltMes)'; // colocando entre aspas simples 

ou

WHERE [fl.AnoMes] = $('vUltMes');

jmcandido
Contributor III
Contributor III
Author

Bom Dia Eduardo

Testando com a primeira opção não retorna erro, mas não filtra os dados, o maior mês que tem informação na tabela é 04/2018, se eu colocar WHERE [fl.AnoMes] = 2018; da certo, seleciona os dados certinho, mas eu não posso deixar fixo dessa forma, executando com a primeira opção o resultado é

Primeira Opção.PNG

Executando conforme sugestão da segunda opção retorna erro

Segunda Opção.PNG

mario_sergio_ti
Partner - Specialist
Partner - Specialist

Bom dia João;

Você incluíu aspas simples na expressão para a variavel vUltMes, então o retorno é o próprio texto da expressão na variável, você deve retira-lo e ajustar a expressão, exemplo:

Faturamento_Liquido:

LOAD

   EMPRESA&ANOMES  AS ChavePrimariaGeral,

   ANOMES          AS fl.AnoMes,

   DTAEMISSAO      AS fl.DtaEmissao,

   SEQPRODUTO      AS fl.SeqProduto,

   PRODUTO         AS fl.Produto,

   VLRVENDA        AS fl.VlrVenda

;

SELECT

   "ANOMES",

   "DTAEMISSAO",

   "NROEMPRESA",

   "SEQPRODUTO",

   "PRODUTO",

   "VLRVENDA"

FROM FATURAMENTOLIQUIDO

;

TMP_MaxMinAnoMes:

LOAD

   Max([fl.AnoMes]) AS MaxAnoMes

Resident Faturamento_Liquido;

LET vMaxAnoMes = Peek('MaxAnoMes');

Drop Table TMP_MaxMinAnoMes;

Faturamento_Mes:

LOAD

   ChavePrimariaGeral,

   fl.AnoMes AS fm.AnoMes,

   fl.DtaEmissao AS fm.DtaEmissao,

   fl.SeqProduto AS fm.SeqProduto,

   fl.Produto AS fm.Produto,

   fl.VlrVenda AS fm.VlrVenda

RESIDENT Faturamento_Liquido

WHERE [fl.AnoMes] = $(vMaxAnoMes)

;

Estou considerando que o retorno do campo seja do tipo YYYYMM (Ex.: 201803), sendo assim, a função Max retornará o resultado adequado.

Consultor certificado | Quem compartilha, aprende!
https://www.linkedin.com/in/mariosergioti
mario_sergio_ti
Partner - Specialist
Partner - Specialist

Para a tabela TMP_MaxMinAnoMes acima, era possível otimizar o resultado com as funções FieldValue, FieldValueCount e AUTOGENERATE, mas poderia atrapalhar a sua resolução.

Consultor certificado | Quem compartilha, aprende!
https://www.linkedin.com/in/mariosergioti
eduardo_dimperio
Specialist II
Specialist II

Oi Joao,

Uma pergunta, voce usou o debug para ver o que esta vindo nessa sua variavel? Porque as vezes esta vindo um valor que nao é o esperado e quando colocamos no where acaba por nao trazer nada. Poe um check nela e ve se esta tudo ok antes.

Outra coisa, concordo com o Mario se voce coloca aspas simples na atribuição de uma variavel acaba tendo o mesmo efeito do Set, ou seja, transforma em string. Por isso sempre faz um teste de retorno na variavel antes de mais nada.