Qlik Community

Qlik Brasil

Group community for Brazil users. discussion only in Portuguese.

Highlighted
fabioval
Contributor

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.

1 Solution

Accepted Solutions
thiago_justen
Valued Contributor III

Re: Recuperar sucesso em conexão ODBC

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
WhatsApp: 24 98152-1675
Skype: justen.thiago
8 Replies
thiago_justen
Valued Contributor III

Re: Recuperar sucesso em conexão ODBC

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
WhatsApp: 24 98152-1675
Skype: justen.thiago
fabioval
Contributor

Re: Recuperar sucesso em conexão ODBC

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
Valued Contributor III

Re: Recuperar sucesso em conexão ODBC

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
WhatsApp: 24 98152-1675
Skype: justen.thiago
fabioval
Contributor

Re: Recuperar sucesso em conexão ODBC

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.

fabioval
Contributor

Re: Recuperar sucesso em conexão ODBC

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
Valued Contributor III

Re: Recuperar sucesso em conexão ODBC

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
WhatsApp: 24 98152-1675
Skype: justen.thiago
fabioval
Contributor

Re: Recuperar sucesso em conexão ODBC

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

thiago_justen
Valued Contributor III

Re: Recuperar sucesso em conexão ODBC

Sempre à disposição fabioval

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