Mudar Select Dinamicamente - Consultas

Boa tarde.

Na minha consulta passo os seguintes parametros no select:

SELECT …ETC
FROM CONTRATO_PEDIDO P, CLI C
WHERE P.CLIEN = C.CLI_CODI
AND P.EMP_CODI = [glo_empresa]
AND P.FIL_CODI = [glo_filial]
AND P.CLIEN = [cod_cliente]

onde [glo_empresa], [glo_filial], [cod_cliente] são variaveis globais, porém se no filtro da consulta o campo GRUPO_NEGOCIOS = SIM… eu preciso passar somente os seguintes parametros:

WHERE P.CLIEN = C.CLI_CODI
AND P.GRUPO_NEGOCIOS = [glo_gnegocios]
AND P.CLIEN = [cod_cliente]

como posso fazer nesse caso?

Grato pela ajuda.

https://www.scriptcase.com.br/docs/pt_br/v9/manual/14-macros/01-visao-geral/#sc_select_where

Top… Obrigado Haroldo não estava localizando la nas macros.

Haroldo não estou conseguindo usar essa macro talvez por falta de conhecimento, poderia me ajudar?

Como deve ficar dentro do onScriptInit essa macro, só lembrando que no filtro da consulta tenho um campo (consultar por grupo de Negocios?) se ele for = Sim preciso adicionar ao where a condição (AND P.GRUPO_NEGOCIO = [cod_grupo])…mas se for = NAO preciso adicionar outra condição (AND P.CLIEN = [cod_cliente]).

Meu select no sql está assim:

SELECT P.NUMERO_CONTRATO, P.STATUS_CONTRATO, P.CLIEN, C.CLI_RAZA, C.CLI_NOME, P.DATA_DIGITACAO, P.DATA_VALIDADE, P.DATA_CONTRATO, P.ORDEM_COMPRA, P.GRUPO_NEGOCIO,
SITUACAO = case P.Status_Contrato
when 1 then ‘Aberto’
when 2 then ‘Em Andamento’
when 3 then ‘Fechado’
when 4 then ‘Cancelado’
when 5 then ‘Bloqueado’
else ‘E R R O’
end,
(SELECT IsNull(SUM(I.QUANTIDADE),0) FROM ITENS_CONTRATO_PEDIDO I
WHERE I.EMP_CODI = P.EMP_CODI
AND I.FIL_CODI = P.FIL_CODI
AND I.NUMERO_CONTRATO = P.NUMERO_CONTRATO) AS QUANTIDADE_PEDIDA,
(SELECT IsNull(SUM(IT.QUANTIDADE * IT.FATOR_CONVERSAO),0) FROM ITENS_NOTA_FISCAL_VENDA IT, NOTA_FISCAL_VENDA NF
WHERE IT.EMP_CODI = NF.EMP_CODI
AND IT.FIL_CODI = NF.FIL_CODI
AND IT.NUMERO_NFISCAL = NF.NUMERO_NFISCAL
AND IT.SERIE_NFISCAL = NF.SERIE_NFISCAL
AND NF.EMP_CODI = P.EMP_CODI
AND NF.FIL_CODI = P.FIL_CODI
AND NF.NUMERO_CONTRATO = P.NUMERO_CONTRATO
AND NF.DT_CANCELAMENTO is NULL
AND ((NF.NFREM_MER_CONTA_ORD_TER_C = ‘0’) or (NF.NFREM_MER_CONTA_ORD_TER_C is NULL))
AND (NF.nf_venda_entrega_futura <> ‘S’ or NF.nf_venda_entrega_futura is null) ) AS QUANTIDADE_CARREGADA,
((SELECT IsNull(SUM(I.QUANTIDADE),0) FROM ITENS_CONTRATO_PEDIDO I
WHERE I.EMP_CODI = P.EMP_CODI
AND I.FIL_CODI = P.FIL_CODI
AND I.NUMERO_CONTRATO = P.NUMERO_CONTRATO) -
(SELECT IsNull(SUM(IT.QUANTIDADE * IT.FATOR_CONVERSAO),0) FROM ITENS_NOTA_FISCAL_VENDA IT, NOTA_FISCAL_VENDA NF
WHERE IT.EMP_CODI = NF.EMP_CODI
AND IT.FIL_CODI = NF.FIL_CODI
AND IT.NUMERO_NFISCAL = NF.NUMERO_NFISCAL
AND IT.SERIE_NFISCAL = NF.SERIE_NFISCAL
AND NF.EMP_CODI = P.EMP_CODI
AND NF.FIL_CODI = P.FIL_CODI
AND NF.NUMERO_CONTRATO = P.NUMERO_CONTRATO
AND NF.DT_CANCELAMENTO is NULL
AND ((NF.NFREM_MER_CONTA_ORD_TER_C = ‘0’) or (NF.NFREM_MER_CONTA_ORD_TER_C is NULL))
AND (NF.nf_venda_entrega_futura <> ‘S’ or NF.nf_venda_entrega_futura is null) )) AS QUANTIDADE_SALDO
FROM CONTRATO_PEDIDO P, CLI C
WHERE P.CLIEN = C.CLI_CODI
AND P.EMP_CODI = [glo_empresa]
AND P.FIL_CODI = [glo_filial]

É uma query extensa. Consegue coloca la em uma view?

Opa acho que consigo sim.

Pronto coloquei esse select em uma view: contratos_clientes, e agora o que fazer Haroldo?

Boa tarde Rodolfo.

O que sugiro você fazer, é criar 1 variável na aplicação, ela será carregada após a seleção do seu filtro. Se for igual a ‘S’ a var1 = “WHERE P.CLIEN = C.CLI_CODI
AND P.EMP_CODI = [glo_empresa]
AND P.FIL_CODI = [glo_filial]
AND P.CLIEN = [cod_cliente]”

Se for igual a ‘N’ a var1 = “WHERE P.CLIEN = C.CLI_CODI
AND P.GRUPO_NEGOCIOS = [glo_gnegocios]
AND P.CLIEN = [cod_cliente]”

Lá no comando que fica na consulta, vc coloca todo o comando concatenando com a variável criada. Acredito que vai dar certo.

Desta forma, num evento você consegue utilizar outros campos da sua consulta e sua variável será uma super string que você poderá colocar o complemento de SQL que você quiser, de acordo com alguma condição.

André poderia exemplificar como fica minha consulta por favor, não está dando certo.

Alguma sugestão que poderia ajudar???

Bom dia Rodolfo.

Você tem o comando inteiro na opção de SQL dentro da sua consulta, certo?

no final do comando, onde você usa coloca as condições do filtro, você vai trocar os filtros por uma variável. Ficaria mais ou menos assim usa consulta SQL do scriptcase:

SELECT P.NUMERO_CONTRATO, P.STATUS_CONTRATO, P.CLIEN, C.CLI_RAZA, C.CLI_NOME, P.DATA_DIGITACAO, P.DATA_VALIDADE, P.DATA_CONTRATO, P.ORDEM_COMPRA, P.GRUPO_NEGOCIO,
SITUACAO = case P.Status_Contrato
when 1 then ‘Aberto’
when 2 then ‘Em Andamento’
when 3 then ‘Fechado’
when 4 then ‘Cancelado’
when 5 then ‘Bloqueado’
else ‘E R R O’
end,
(SELECT IsNull(SUM(I.QUANTIDADE),0) FROM ITENS_CONTRATO_PEDIDO I
WHERE I.EMP_CODI = P.EMP_CODI
AND I.FIL_CODI = P.FIL_CODI
AND I.NUMERO_CONTRATO = P.NUMERO_CONTRATO) AS QUANTIDADE_PEDIDA,
(SELECT IsNull(SUM(IT.QUANTIDADE * IT.FATOR_CONVERSAO),0) FROM ITENS_NOTA_FISCAL_VENDA IT, NOTA_FISCAL_VENDA NF
WHERE IT.EMP_CODI = NF.EMP_CODI
AND IT.FIL_CODI = NF.FIL_CODI
AND IT.NUMERO_NFISCAL = NF.NUMERO_NFISCAL
AND IT.SERIE_NFISCAL = NF.SERIE_NFISCAL
AND NF.EMP_CODI = P.EMP_CODI
AND NF.FIL_CODI = P.FIL_CODI
AND NF.NUMERO_CONTRATO = P.NUMERO_CONTRATO
AND NF.DT_CANCELAMENTO is NULL
AND ((NF.NFREM_MER_CONTA_ORD_TER_C = ‘0’) or (NF.NFREM_MER_CONTA_ORD_TER_C is NULL))
AND (NF.nf_venda_entrega_futura <> ‘S’ or NF.nf_venda_entrega_futura is null) ) AS QUANTIDADE_CARREGADA,
((SELECT IsNull(SUM(I.QUANTIDADE),0) FROM ITENS_CONTRATO_PEDIDO I
WHERE I.EMP_CODI = P.EMP_CODI
AND I.FIL_CODI = P.FIL_CODI
AND I.NUMERO_CONTRATO = P.NUMERO_CONTRATO) -
(SELECT IsNull(SUM(IT.QUANTIDADE * IT.FATOR_CONVERSAO),0) FROM ITENS_NOTA_FISCAL_VENDA IT, NOTA_FISCAL_VENDA NF
WHERE IT.EMP_CODI = NF.EMP_CODI
AND IT.FIL_CODI = NF.FIL_CODI
AND IT.NUMERO_NFISCAL = NF.NUMERO_NFISCAL
AND IT.SERIE_NFISCAL = NF.SERIE_NFISCAL
AND NF.EMP_CODI = P.EMP_CODI
AND NF.FIL_CODI = P.FIL_CODI
AND NF.NUMERO_CONTRATO = P.NUMERO_CONTRATO
AND NF.DT_CANCELAMENTO is NULL
AND ((NF.NFREM_MER_CONTA_ORD_TER_C = ‘0’) or (NF.NFREM_MER_CONTA_ORD_TER_C is NULL))
AND (NF.nf_venda_entrega_futura <> ‘S’ or NF.nf_venda_entrega_futura is null) )) AS QUANTIDADE_SALDO
FROM CONTRATO_PEDIDO P, CLI C
[variavel com o restante do SQL]

No evento onScriptInit, ou no AppInit, você vai verificar se o campo GRUPO_NEGOCIOS = ‘S’.

sua lógica será:

IF (GRUPO_NEGOCIOS == ‘S’){
[variavel com o restante do SQL] = “WHERE P.CLIEN = C.CLI_CODI
AND P.GRUPO_NEGOCIOS = [glo_gnegocios]
AND P.CLIEN = [cod_cliente]”
}else{
[variavel com o restante do SQL] = “WHERE P.CLIEN = C.CLI_CODI
AND P.EMP_CODI = [glo_empresa]
AND P.FIL_CODI = [glo_filial]
AND P.CLIEN = [cod_cliente]”
}

Desta forma, o seu comando SQL será complementado com toda essa string.

Não cheguei a testar, mas acredito que vai funcionar com as devidas concatenações das variáveis.

Att.

André.

a sugestão é usar a macro citada acima e transformar o sql em uma view.

1 Curtida

Haroldo deu certo tanto com a view como select direto na consulta, so tem um detalhe agora a demora na busca, fiz um teste tanto com a view como select direto demora a busca das informações, teria alguma sugestão?

Aí tem que investigar no banco de dados.