8 Replies Latest reply: Jul 18, 2018 4:04 PM by Thiago Justen Teixeira RSS

    Recuperar sucesso em conexão ODBC

    Fabio Vallone

      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.

        • Re: Recuperar sucesso em conexão ODBC
          Thiago Justen Teixeira

          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;

            • Re: Recuperar sucesso em conexão ODBC
              Fabio Vallone

              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?

                • Re: Recuperar sucesso em conexão ODBC
                  Thiago Justen Teixeira

                  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?

                    • Re: Recuperar sucesso em conexão ODBC
                      Fabio Vallone

                      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.

                      • Re: Recuperar sucesso em conexão ODBC
                        Fabio Vallone

                        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.