Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Olá,
Aqui na empresa temos uma função no Oracle que se passamos o ESTOQUE, PRODUTO, DIA e EMPRESA ela retorna o saldo do produto e como eu preciso criar um histórico mensal de saldos no QlikView pensei em utilizar essa função com um FOR passando todos os estoques, produtos, empresas e o último dia de cada mês.
Para testar, utilizei um estoque, um produto e uma empresa, criando registros em 2017. O código foi esse:
//42736 = 01/01/2017
Set dataIni = '42736';
let dif = ceil((monthstart(today())-Date(dataIni))/30);
for i = 0 to $(dif)
LET dt = AddMonths(MonthEnd($(dataIni)),i);
LOAD
*,
AddMonths(MonthEnd($(dataIni)),$(i)) as Periodo;
SQL SELECT es.cd_estoque,
es.cd_produto,
e.cd_multi_empresa,
e.ds_estoque,
p.ds_produto,
dbamv.fnc_uvs_saldo_anterior(e.cd_estoque, p.cd_produto, '$(dt)',e.cd_multi_empresa) TOTAL
FROM estoque e, produto p, est_pro es
Where e.cd_estoque = es.cd_estoque
and es.cd_produto = p.Cd_Produto
and es.cd_estoque = 5
and es.Cd_Produto = 825
and e.cd_multi_empresa = 1;
NEXT;
E funcionou, dando este resultado:
Sendo assim, apenas removi a parte do select abaixo:
and es.cd_estoque = 5
and es.Cd_Produto = 825
and e.cd_multi_empresa = 1;
Removendo esta parte, a ideia era pegar os saldos de todos os produtos, estoques, empresas do último dia de cada mês de 2017, porém apareceu o erro abaixo:
QVX_UNEXPECTED_END_OF_DATA: SQL##f - SqlState: S1000, ErrorCode: 1000, ErrorMsg: [Oracle][ODBC][Ora]ORA-01000: máximo de cursores abertos excedido
ORA-06512: em "DBAMV.VERIF_VL_FATOR_PROD", line 12
ORA-06512: em "DBAMV.VERIF_VL_FATOR_PROD", line 83
ORA-06512: em "DBAMV.FNC_UVS_SALDO_ANTERIOR", line 123
LOAD
*,
AddMonths(MonthEnd(42736),0) as Periodo
Então, alguém tem alguma ideia de como resolver este problema ?
Obrigado.
Essa função "dbamv.fnc_uvs_saldo_anterior" deve estar abrindo um cursor que como são muitos dados deve estar estourando o limite de cursores abertos.
Uma dúvida: Você não passa um parâmetro de data para a query? Não deveria estar passando?
Possíveis saídas:
Essa função "dbamv.fnc_uvs_saldo_anterior" deve estar abrindo um cursor que como são muitos dados deve estar estourando o limite de cursores abertos.
Uma dúvida: Você não passa um parâmetro de data para a query? Não deveria estar passando?
Possíveis saídas:
Sobre a data, a ideia é passar o último dia de cada mês com o for.
dbamv.fnc_uvs_saldo_anterior(e.cd_estoque, p.cd_produto, '$(dt)',e.cd_multi_empresa)
Por isso criei a variável 'dt'.
Amigo;
Se o seu usuário tiver permissões elevadas no BD, poderá abrir a função para saber o que faz;
Ou poderá rodar a query abaixo para pegar a consulta que sua query realiza no banco (usuário tem que ter permissões nas tabelas citadas).
Select S.USERNAME, s.sid, s.osuser, t.sql_id, sql_text
From v$sqltext_with_newlines t,V$SESSION s
Where t.address =s.sql_address
And t.hash_value = s.sql_hash_value
And s.status = 'ACTIVE'
And s.username <> 'SYSTEM'
Order By s.sid,t.piece
É, pelo visto vou ter que tentar pegar o código da função e reescrever.