Skip to main content
Announcements
Have questions about Qlik Connect? Join us live on April 10th, at 11 AM ET: SIGN UP NOW
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Falha ao carregar dados a partir de função SQL

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

9 Replies
Clever_Anjos
Employee
Employee

Poderia postar seu script?

afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

Bom dia.

O SQL 2008 tem o IR e os SP1 a SP4.  Sera que não pode ser um 2008 sem os SPs?

↓ SQL Server 2008
     i

10.0.1600.2210.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

furtado@farolbi.com.br
Not applicable
Author

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;

Not applicable
Author

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.

Not applicable
Author

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)

Not applicable
Author

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?

Not applicable
Author

Testei com os 2 drivers da imagem e os dois apresentaram erro.

Acho que só pode ser a versão do SQL 2005.

Clever_Anjos
Employee
Employee

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

henryxn13
Contributor
Contributor

Boa tarde. Conseguiu encontrar a solução? Estou tendo o mesmo problema. Obrigado.