Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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.
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;
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, 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?
O ScriptError segue a tabela:
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?
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.
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.
Fabio,
Antes do If adicione:
Set ErrorMode=0;
ErrorMode =0 | O 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!!!
Excelente!!!!! Agora ficou top. Obrigado Thiago!!!
Sempre à disposição fabioval