[RESOLVIDO] Stored Procedure na Consulta.

Olá, bom dia!

Estou precisando criar uma aplicação de consulta que me mostre um comparativo entre contabilidade e financeiro.
Tudo estaria resolvido se eu conseguisse criar uma view e puxar para a aplicação do ScriptCase, porém eu consigo obter a informação através da seguinte estrutura:

SELECT ‘01’ AS EMPRESA, D.E2_FILIAL, D.E2_NUM, D.E2_TIPO, D.E2_VALOR, S.A2_CONTA,
(CASE WHEN D.E2_TIPO = ‘PA’ AND D.E2_BAIXA = ‘’ THEN (D.E2_VALOR * (-1))
WHEN D.E2_TIPO = ‘PA’ AND D.E2_BAIXA > ‘20170228’ THEN (D.E2_VALOR * (-1))
WHEN D.E2_TIPO = ‘PA’ AND D.E2_BAIXA <> ‘’ THEN (D.E2_SALDO * (-1))
WHEN D.E2_TIPO <> ‘PA’ AND D.E2_BAIXA = ‘’ THEN (D.E2_VALOR)
WHEN D.E2_TIPO <> ‘PA’ AND D.E2_BAIXA > '20170228’ THEN(D.E2_VALOR)
WHEN D.E2_TIPO <> ‘PA’ AND D.E2_BAIXA <> ‘’ THEN (D.E2_SALDO)
END ) AS SALDO_MES, D.E2_SALDO,
(CASE WHEN D.E2_BAIXA > ‘20170228’ THEN ‘’
ELSE D.E2_BAIXA END) AS E2_BAIXA_T, D.R_E_C_N_O_, D.E2_EMIS1, D.E2_VENCREA
FROM SE2010 D
LEFT JOIN .SA2010 S ON S.A2_COD = D.E2_FORNECE AND D.E2_LOJA = S.A2_LOJA
WHERE (D.D_E_L_E_T_ <> ‘’ OR D.D_E_L_E_T_ IS NULL)
AND (S.D_E_L_E_T_ <> '
’ OR S.D_E_L_E_T_ IS NULL)
AND D.E2_EMIS1 BETWEEN ‘20140401’ AND ‘20170228’
AND D.E2_VENCREA BETWEEN ‘20110101’ AND ‘20411231’

Ocorre que esse campos negritos tenho que deixar dinamico para ficar a critério do usuário.
Pensei em criar uma procedure onde iria me gerar as informações…
porém meu questionamento é teria como eu fazer essa consulta sem que fosse necessario eu gravar o resultado dessa estrutura em outra tabela e só ai criar uma view e puxar para o scriptcase?

Alguém poderia me ajudar com essa aplicação?

Obs.: eu havia pensando em colocar dentro do sql do scriptcase e substiuir por campos ficando assim:

SELECT ‘01’ AS EMPRESA, D.E2_FILIAL, D.E2_NUM, D.E2_TIPO, D.E2_VALOR, S.A2_CONTA,
(CASE WHEN D.E2_TIPO = ‘PA’ AND D.E2_BAIXA = ‘’ THEN (D.E2_VALOR * (-1))
WHEN D.E2_TIPO = ‘PA’ AND D.E2_BAIXA > ‘{campo_criado_no_sc}’ THEN (D.E2_VALOR * (-1))
WHEN D.E2_TIPO = ‘PA’ AND D.E2_BAIXA <> ‘’ THEN (D.E2_SALDO * (-1))
WHEN D.E2_TIPO <> ‘PA’ AND D.E2_BAIXA = ‘’ THEN (D.E2_VALOR)
WHEN D.E2_TIPO <> ‘PA’ AND D.E2_BAIXA >’{campo_criado_no_sc}’ THEN(D.E2_VALOR)
WHEN D.E2_TIPO <> ‘PA’ AND D.E2_BAIXA <> ‘’ THEN (D.E2_SALDO)
END ) AS SALDO_MES, D.E2_SALDO,
(CASE WHEN D.E2_BAIXA > '{campo_criado_no_sc}’ THEN ‘’
ELSE D.E2_BAIXA END) AS E2_BAIXA_T, D.R_E_C_N_O_, D.E2_EMIS1, D.E2_VENCREA
FROM SE2010 D
LEFT JOIN SA2010 S ON S.A2_COD = D.E2_FORNECE AND D.E2_LOJA = S.A2_LOJA
WHERE (D.D_E_L_E_T_ <> ‘’ OR D.D_E_L_E_T_ IS NULL)
AND (S.D_E_L_E_T_ <> '
’ OR S.D_E_L_E_T_ IS NULL)
AND D.E2_EMIS1 BETWEEN ‘{campo_criado_no_sc}’ AND’{campo_criado_no_sc}’
AND D.E2_VENCREA BETWEEN ‘’{campo_criado_no_sc}’ AND’{campo_criado_no_sc}

porém acaba dando BUG na aplicação pois o banco do TOTVS para cada empresa ele trabalha com uma estrutura de tabela diferente e no nosso caso temos "6 "

e ficaria essa consulta ligada a outras 5 através do union e o scriptcase acaba ‘bugando’

Mille minha sugestão é

1- Criar uma Tabela com esas colunas que vai precisar no relatório (cada uma delas), e coloque uma coluna chamada data_relatorio e php_session_id. Onde em data_relatorio vai ser a data da execução da procedure (explicado mais abaixo), para não acumular dados velhos, então ao executar a PR (pr a partir desde ponto chama-se StoredProcedure) faz um delete de dados menores ao dia de hoje, php_session_id vai ser a sessão do usuario que solicitou o relatório, que a cada execução também e deletado os dados dessa session
2- Criar um StoredProcedure que recebe os parámetros para gerar os dados (data, periodo, php_session_id, etc), e popular esa tabela que foi criada (chamamos a tabela deste ponto em diante de tmp_relatorio_x)
3- Crie um Filtro seja o filtro mesmo da GRID ou um controle (fazendo um REDIR)

  • si usar o filtro no evento onValidate chame a procedure via sc_exec_sql passando os parámetros necessarios
  • si usar um controle mesma coisa no onValidate chame a procedure via sc_exec_sql passando os parámetros necessarios e faça um REDIR para a GRID (eu prefiro usar o filtro mesmo da grid)

4- o SQL da GRID vai ser sobre a tabela tmp_relatorio_x “basicão” mesmo SELECT colunas FROM tmp_relatorio_x

Pronto sua GRID vai estar espetacular.

Eu uso isso para alguns relatórios que tem uma Puta logica por tras dele é super rápido e sem estress.

Espero que tenha entendido. Com isto não tem consulta que não consiga fazer.

Outra dica seguindo as explicações do Willian caso for criar tabelas temporárias tmp_ opte também pela engine MyISAM/ARIA, vai ajudar sua consultar ficar mais rápida.

Opa … Obrigada pelo Bizu ! rsss

Vou testar aqui, montando a estrutura e volto pra da o OK.

Novamente muito muito obrigada!

Tabela do Protheus Contas a Pagar né kkkkk

Select que você precisa e o restante ajusta no onRecord conforme algumas dicas abaixo

SELECT
‘01’ AS EMPRESA,
D.E2_FILIAL,
D.E2_NUM,
D.E2_TIPO,
D.E2_VALOR,
S.A2_CONTA,
D.R_E_C_N_O_,
D.E2_EMIS1,
D.E2_VENCREA
FROM
SE2010 D LEFT JOIN .SA2010 S ON S.A2_COD = D.E2_FORNECE AND D.E2_LOJA = S.A2_LOJA
WHERE
D.D_E_L_E_T_ = ‘’
AND S.D_E_L_E_T_ = ‘’

Crie um campo Saldo e no onRecord faça um o mesmo que o código porém com os campos, pelo que vi apenas por if resolve, exemplo:

if({D.E2_TIPO} == ‘PA’ && trim({D.E2_BAIXA}) == ‘’ )
{
{Saldo} = {D.E2_VALOR} * (-1);
}
else if( … e assim por diante

Para o campo Baixa faça a mesma coisa no onRecord, no caso pode fazer um IF ternário mesmo, no caso esse campo criado pode ser criado no filtro
{Baixa} = (D.E2_BAIXA > ‘{campo_criado_no_sc}’) ? “” : {D.E2_BAIXA};

Dicas:

  • troque o (D.D_E_L_E_T_ <> ‘*’ OR D.D_E_L_E_T_ IS NULL) por D.D_E_L_E_T_ = ‘’
  • tire os campos D.E2_EMIS1 e D.E2_VENCREA do select e coloque os no filtro do Scriptcase e inicie a grid pelo filtro

Rodrigo, obrigada pela diga.

Willian seguir suas dicas e funcionou!

Obrigada!!!

Como capturo o conteúdo php_session_id?
Alguém pode ajudar?

Julio,

O tópico é ‘Stored Procedure na Consulta’, sugiro que você abra outros post.

usando a função do PHP

$sessao = session_id();

Obrigado!
Achei que era alguma macro do SC.
Mas resolvi com o [usr_login] mesmo, obrigado.
E esta solução de executar a SP no controle e depois dar um REDIR para a consulta funcionou perfeito pra mim!

que bom