Qlik Community

Brasil

Announcements
June 28, 10AM ET: Qlik Nation and Qlik Community present: CyberSleuth REGISTER TODAY
cancel
Showing results for 
Search instead for 
Did you mean: 
fabio_vallone
Creator
Creator

Recuperar sucesso em conexão ODBC

Bom dia, pessoal!

Na empresa onde trabalho, nós temos um servidor dedicado para o BI, onde nele é feito um espelhamento de todas as informações da base oficial (base "quente"), para trabalharmos sem concorrência com os sistemas de gestão. O espelhamento é feito sempre em D-1 (ou seja, tenho as informações até o dia anterior). Ocorre que, esporadicamente, o espelhamento falha, e o banco fica indisponível para conexão. Como minhas cargas rodam de madrugada, eu não tenho como prever o erro, e no início do dia, tenho alguns painéis desatualizados. Pensei numa solução, mas queria saber com vocês se é viável, e como fazer:

Existe a possibilidade de recuperar o "sucesso" ou "falha" de uma conexão ODBC e passar isso por parâmetro no script do Qlik?

Em outras palavras, eu poderia criar duas strings de conexão ODBC: a primeira, apontando para o banco espelhado (se houver sucesso, é esta que deve ser usada), e a segunda string com a conexão direto na base quente (só seria utilizada no caso de falha da primeira conexão); porém eu não sei como (e nem se é possível) "capturar" este sucesso ou falha da conexão para saber quando usar uma ou outra string... alguém pra me auxiliar?

Desde já agradeço!!!

Fabio.

Labels (2)
1 Solution

Accepted Solutions
Thiago_Justen_

Fabio,

Eis um exemplo:

LET vErrorDetail = ScriptErrorDetails; 

LET vScriptErrorCount = ScriptErrorCount; 

LET vErrorList = ScriptErrorList; 

LET vErrorDate = Date(Now(),'YYYY-MM-DD hh:mm:ss'); 

LET vQVWName = DocumentName(); 

Set vConexaoA = LIB CONNECT TO 'Ultra'; //Minha primeira conexão

Set vConexaoB = LIB CONNECT TO 'Base Ultra'; //Conexão auxiliar em caso da primeira falhar

//Aqui, caso não haja erro, a conexão B será aberta.

If ScriptError = 0 then

$(vConexaoB);

Else

$(vConexaoA);

End If

//Gravo o log de erros num qvd (este script foi retirado daqui: Problem in storing ScriptErrorList to QVD)

ErrorLogs: 

LOAD '$(vQVWName)' AS [QVWName], 

  '$(vScriptErrorCount)' AS [ErrorCount], 

  Replace('$(vErrorList)',chr(13)& chr(10),chr(44)) AS [ErrorList], 

  '$(vErrorDetail)' AS [ErrorDetail], 

  '$(vErrorDate)' AS ErrorDate 

AutoGenerate (1);

 

STORE ErrorLogs INTO [LIB://SUA_PASTA/ErrorLogs.qvd](QVD);

DROP TABLE ErrorLogs;

Thiago Justen Teixeira Gonçalves
Farol BI
WhatsApp: 24 98152-1675
Skype: justen.thiago

View solution in original post

8 Replies
Thiago_Justen_

Fabio,

Eis um exemplo:

LET vErrorDetail = ScriptErrorDetails; 

LET vScriptErrorCount = ScriptErrorCount; 

LET vErrorList = ScriptErrorList; 

LET vErrorDate = Date(Now(),'YYYY-MM-DD hh:mm:ss'); 

LET vQVWName = DocumentName(); 

Set vConexaoA = LIB CONNECT TO 'Ultra'; //Minha primeira conexão

Set vConexaoB = LIB CONNECT TO 'Base Ultra'; //Conexão auxiliar em caso da primeira falhar

//Aqui, caso não haja erro, a conexão B será aberta.

If ScriptError = 0 then

$(vConexaoB);

Else

$(vConexaoA);

End If

//Gravo o log de erros num qvd (este script foi retirado daqui: Problem in storing ScriptErrorList to QVD)

ErrorLogs: 

LOAD '$(vQVWName)' AS [QVWName], 

  '$(vScriptErrorCount)' AS [ErrorCount], 

  Replace('$(vErrorList)',chr(13)& chr(10),chr(44)) AS [ErrorList], 

  '$(vErrorDetail)' AS [ErrorDetail], 

  '$(vErrorDate)' AS ErrorDate 

AutoGenerate (1);

 

STORE ErrorLogs INTO [LIB://SUA_PASTA/ErrorLogs.qvd](QVD);

DROP TABLE ErrorLogs;

Thiago Justen Teixeira Gonçalves
Farol BI
WhatsApp: 24 98152-1675
Skype: justen.thiago
fabio_vallone
Creator
Creator
Author

Thiago, quase funcionou... só não entendi em que momento o ScriptError vai ser diferente de zero... no meu script a carga sempre está entrando no THEN do IF, nunca no ELSE... eu tenho que fazer alguma etapa de conexão antes deste script?

Thiago_Justen_

O ScriptError segue a tabela:

Capturar.PNG

Talvez eu não esteja compreendendo a dimensão do seu requerimento. Mas veja, você diz que quando o espelhamento falha a conexão fica indisponível...nesse caso o scripterror apontará um valor diferente de 0. Talvez, possamos verificar a seguinte lógica:

A maior data da base espelhada é igual a today() - 1? Se sim, faz a conexão nela, se não faz a conexão a outra base (a de produção).

O que você acha?

Thiago Justen Teixeira Gonçalves
Farol BI
WhatsApp: 24 98152-1675
Skype: justen.thiago
fabio_vallone
Creator
Creator
Author

Hum, para retornar o ScriptError eu já tenho que ter chamado a string de conexão então, certo? A minha dúvida é que, por estarem ambas as conexões setadas nas variáveis, ele não efetuava nenhuma tentativa de conexão para retornar o ScriptError, por isso que o IF entrava sempre em zero (falha minha). Agora deu certo! Muito obrigado, Thiago!!! Perfeita explicação e exemplo! Abraço.

fabio_vallone
Creator
Creator
Author

Thiago, muito obrigado pela ajuda; só fiquei com uma última dúvida: quando rodo o script pelo QV desktop, a tentativa de conexão com o banco espelhado dá erro, eu clico em "OK" e continuo, e então a variável ScriptError traz o resultado desejado (1) e entra no ELSE do IF; perfeito! Mas quando tentei rodar pelo QMC, ele tenta abrir a conexão, dá o erro e ele já aborta a carga, não dá "tempo" de chegar no IF para fazer a conexão B... o que estou fazendo errado?

Minha sequência:

1- Tentei copiar exatamente seu script no início do arquivo, mas aí como não trouxe nenhum retorno de ScriptError (porque não tentou nenhuma conexão), ele sempre traz 0, então não funcionou;

2- Minha segunda tentativa foi: começar pela string de conexão no banco principal (no meu caso, o espelhado), pra "dar o erro" e setar a variável ScriptError; quando rodo pelo Desktop, eu consigo continuar o script após a falha da conexão, mas pelo QMC o Qlik aborta o processo.

Tem alguma ideia pra eu conseguir capturar o retorno da variável ScriptError sem que o Qlik aborte a carga no QMC?

Grato.

Fabio.

Thiago_Justen_

Fabio,

Antes do If adicione:

Set ErrorMode=0;

ErrorMode =0O QlikView simplesmente ignora a falha e continua a execução do script no próximo comando de script.

Não coloquei na instrução acima e dessa: my bad! hehe

Abraços e Sucesso!!!

Thiago Justen Teixeira Gonçalves
Farol BI
WhatsApp: 24 98152-1675
Skype: justen.thiago
fabio_vallone
Creator
Creator
Author

Excelente!!!!! Agora ficou top. Obrigado Thiago!!!

Thiago_Justen_

Sempre à disposição fabioval

Thiago Justen Teixeira Gonçalves
Farol BI
WhatsApp: 24 98152-1675
Skype: justen.thiago