Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Bom dia pessoal. Acho que esta dúvida vai ficar sem resposta mas gostaria de compartilhar só pra desabafar. hehe
Tenho um problema que está me tirando o sono. Desenvolvi uma aplicação QV a qual rodo em 3 empresas diferentes. Todas utilizam o mesmo ERP e o mesmo SGBD (SQL Server). Porém cada uma tem uma versão diferente de SQL.
SQL 2005 - QlikView 10 - Funciona OK (Tem o pior Hardware - 16 Gb de RAM num banco de quase 200 Gb)
SQL 2008 - QlikView 11 - Personal - Erro (Tem o melhor Hardware - 64 Gb de RAM num banco de menos de 100 Gb)
SQL 2012 - QlikView 11 - Funciona OK (Tem um Hardware mediano - 32 Gb de RAm num banco de quase 150 Gb)
Minha aplicação trabalha com Demonstração de Resultados da Contabilidade.
Dentro de uma tabela do Database estão gravadas as fórmulas que cada empresa criou na montagem da sua DRE. Existe também no Database uma função a qual eu passo parâmetros por meio de um For no QlikView. Os parâmetros são coisas como: Empresa, Data, Conta, etc. sendo que a função pega estes parâmetros, encontra a fórmula da conta, faz todos os cálculos previstos na fórmula e me devolve apenas um valor o qual atribuo a um campo dentro da minha tabela de retorno e funciona "de boa".
Porém na empresa do SQL 2008 durante o FOR "eventualmente" o SQL Server não retorna o Valor pois a função apresenta um erro o qual não consegui salvar agora, mas fala sobre "excesso de recursividade" (se não me engano) isso porque pelo visto esta função chama outra função, que chama outra função, que chama outra função... etc.
O mais estranho é que se eu rodar a mesma função que apresentou erro durante a recarga no QlikView diretamente no Enterprise Manager é retornado um valor sem nenhum problema. (E esta é minha dificuldade em capturar o erro do SQL pois no QlikView o erro simples não aparece já que é apenas o retorno da função);
A minha dúvida é: Porque raios nas demais empresas não dá?! E também porque isso é exporádico? (Se eu fizer outra recarga a conta que na primeira vez deu erro vai calcular e o erro vai acontecer em outra conta).
Me ocorreu enquanto escrevia se pode ter a ver com o conector 32 ou 64 bits. Sei lá.
Alguma ideia maluca pra eu testar? hehe
Abraços
Poderia postar seu script?
Bom dia.
O SQL 2008 tem o IR e os SP1 a SP4. Sera que não pode ser um 2008 sem os SPs?
10.0.1600.22 | 10.0.2531.0 or 10.1.2531.0 | 10.0.4000.0 or 10.2.4000.0 | 10.0.5500.0 or 10.3.5500.0 | 10.0.6000.29 |
Outra situação. Sei que no driver SQL tem uma opcao colocada nas ultimas versoes de somente leitura. Lembro desta opcao em algum modo avancado no driver client versao 10 ou similar. Tem isto na sua? Ou quem sabe atualizar o driver para testar (as vezes mais facil que atualizar o SP do banco....)
Att,
AMF
Clever, segue abaixo o pedaço de código que apresenta o erro. Fiz um comentário em cada linha para ajudar a entender o funcionamento.
//Inicia a contagem até ler todas as contas da DRE e a respectiva fórmula de cada conta
For vCount = 1 to NoOfRows('DRE') -1;
//Monta a instrução SQL que será passa para a Função com base nos parametro da empresa específica e da fórmula lida em cada registro da tabela DRE (a tabela DRE foi carregada antes desta instrução)
LET vComando = '$(SPDre)' & '(' & Peek('Procedure', $(vCount), 'DRE') & ')';
//Vai montando do Dataset da DRE Calculada a cada passagem do FOR
DRECalculada:
Load
Evaluate(Valor) as DRECalculadaValorFinal, //O SQL vai retornar uma fórmula matemática a qual será calculada pelo QlikView
Valor as DRECalculadaValorFormulado, //Grava a fórmula matemática retornada pelo SQL
Peek('Procedure', $(vCount), 'DRE') as DRECalculadaValorFormula, //Grava a função que foi passa para o SQL Cálcular
Peek('GeraPeriodoEstabelecimento', $(vCount), 'DRE') as DRECalculadaEstabelecimento, //Grava o estabelecimento
Date(MonthStart(Peek('GeraPeriodoDREFim', $(vCount), 'DRE')),'MMM/YYYY') as DRECalculadaData, //Grava a data que foi passada para a função
AutoNumberHash128( Peek('GeraPeriodoEstabelecimento', $(vCount), 'DRE'), Date(MonthStart(Peek('GeraPeriodoDREFim', $(vCount), 'DRE')),'MMM/YYYY'), Peek('PlanoContasEstruturaDREOID', $(vCount), 'DRE') ) as IDDRECalculada;
SQL
Select $(vComando) as Valor; //Passa a instrução para o SQL rodar a função que irá retornar o Valor com uma fórmula matemática
//O erro apresentado é "Campo Não Encontrado - <Valor>" ou seja, em alguma passagem do For o SQL não retorna nada
Next;
Então Alessandro, quem mantém o Banco não sou eu, a empresa tem um TI o qual vou passar o link do seu comentário. Achei muito bom pois tem todas atualizações de todas as versões de Database.
Valeu! Se der certo posto a resposta aqui.
Errata: A versão do SQL que está dando problema é 2005, sendo que o correto é:
SQL 2005 - QlikView 11 - Personal - Erro (Tem o melhor Hardware - 64 Gb de RAM num banco de menos de 100 Gb)
SQL 2008 - QlikView 10 - Funciona OK (Tem o pior Hardware - 16 Gb de RAM num banco de quase 200 Gb)
SQL 2012 - QlikView 11 - Funciona OK (Tem um Hardware mediano - 32 Gb de RAm num banco de quase 150 Gb)
Fiz a recarga a partir de outro computador e agora apresentou a mensagem de erro que havia dito:
Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32)
Alguém já viu?
Testei com os 2 drivers da imagem e os dois apresentaram erro.
Acho que só pode ser a versão do SQL 2005.
Já conseguiu a resposta? Se sim, escolha uma e marque como "Correta" para fechar o tópico e nos ajudar a manter a comunidade organizada
Have fun, be Qlik
Boa tarde. Conseguiu encontrar a solução? Estou tendo o mesmo problema. Obrigado.