6 Replies Latest reply: Jun 25, 2014 8:30 AM by Hamilton Junior RSS

    Atualização QVD Incremental

    Hamilton Junior

      Boa tarde, hoje eu não tenho em meu banco de dados uma estrutura para a carga incremental do QVD com uma data e hora de alteração confiável, tenho nas tabelas o campo chamado "Operação" que teoricamente é um valor por registro inserido. Criei uma tabela com uma data da qual eu vou usar para fechar o período do sistema, exemplo, se tiver a data 31/05/2014 o QVD vai ser atualizado apenas do dia 01/06/2014 para frente, não alterando os dados para traz, porém o arquivo do mes de Janeiro por exemplo tem quase 20 megas de registros, quando eu modifico a data do fechamento ele deleta todos os dados do QVD e deixa apenas alguns, não consegui achar a lógica. Com o período fechado ele retorna zero na consulta e não deveria alterar o QVD, porém ele esta alterando e deixando apenas alguns arquivos. Meu código é o seguinte:

       

      FatoVendaDetalhe:

      SQL

      select

        ano_mes_numero as id_tempo,

        mprd_operacao,

        mprd_unid_codigo as id_unidade,

        mprd_valor + mprd_nextra1 as mprd_valor,

        mprd_ctmedio,

        mprd_prod_codigo,

        (select prun_difvenda from produn where prun_prod_codigo=mprd_prod_codigo and prun_unid_codigo=mprd_unid_codigo) as difvenda,

        mprd_ctvenda

        from movprodd0114, dw.dim001_tempo where mprd_status='N' and

        ano_mes_numero='2014-01' and mprd_datamvto=data_media_formatodata and mprd_datamvto > (select blo_dtfim from wblgestor) //esse é o campo criado para fechar o periodo;

      and

        mprd_dcto_codigo in (select dcto_codigo from dw.tipo_movimento where mvto_descricao='Venda');

      Concatenate LOAD

        id_tempo,

        mprd_operacao,

        id_unidade,

        mprd_valor,

        mprd_ctmedio,

        mprd_prod_codigo,

        difvenda,

        mprd_ctvenda

        from [D:\1-QLIKVIEW_DESENVOLVIMENTO\Dados_Armazenados\Dados\2014\Junior\Vendadetalhe_01.qvd](qvd)

        where not Exists (mprd_operacao);

      STORE FatoVendaDetalhe into D:\1-QLIKVIEW_DESENVOLVIMENTO\Dados_Armazenados\Dados\2014\Junior\Vendadetalhe_01.qvd(qvd);

      DROP Table FatoVendaDetalhe;

        • Re: Atualização QVD Incremental
          Bruno Souza

          Oi, Hamilton.

           

          O que eu posso imaginar é que o campo mprd_operacao não é único. Varios valores dele devem aparecer repetidos entre a nova fatia de dados que está sendo extraída do banco e os dados que estão no qvd. Assim, você lê apenas algunas dados do qvd (os registros cujo mprd_operacao não aparecem nos novos dados).

           

          Como você não tem uma data de alteração dos registros, você não tem como identificar o que foi alterado ou não. Sendo assim, você só pega os registros mais novos, supondo que mprd_datamvto é preenchido no momento da criação do registro com a data atual. Então, como você só faz append nos dados, você pode dispensar o where not Exists (mprd_operacao) do Load.


          Se você quiser continuar usando o Exsists(), não tem outro campo que você possa usar? Algo como id_mvto?

           

          Espero ter ajudado.

            • Re: Atualização QVD Incremental
              Hamilton Junior

              Boa tarde Bruno, é isto mesmo, fiz um load com o ID e ficou tudo certinho, não alterou nenhum dado, o problema é que esta sendo feito um estudo para retirar esse ID do banco pois esta dando conflito em outros sistemas, não queria ficar dependendo dele. Mas realmente é isto, vou ter que tentar outra solução. Para carregar o SQL tem a opção parecida com o autonumberhash128? talvez assim eu conseguisse criar um ID automático. E se eu não usar o Exists quando a consulta retornar zero ele vai apagar os dados existentes, estou errado? Pois se eu fizer o append corro o risco de algum dado ser alterado, como um cancelamento de NF ou algo assim, por isso a data do fechamento do período.

                • Re: Atualização QVD Incremental
                  Bruno Souza

                  Você pode tentar criar uma chave concatenada, algo como Cliente_NumeroNF_SerieNF_Ano_Etc. Você conhece o seu banco e sabe que combinação de campos podem identificar unicamente um registro. Então você usa essa chave no lugar do ID.

                   

                  Mas eu não conheço nenhuma função tipo AutoNumberHash128 no SQL. Mas, mesmo que tivesse, você não iria poder usá-la, pois as funções AutoNumber... têm seus contadores zerados a cada execução do script, não sendo adequadas para carga incremental. No SQL, seria pior: o contador seria zerado a cada select.

                   

                  Se você achar que vale a pena, pode usar a função Hash128() (ou Hash256()), mas elas retornam uma string. Se a string for maior que a sua chave concatenada, nem adianta usar. De qualquer forma, para usá-la "no SQL", é só fazer um Load sobre Select:

                   

                  FatoVendaDetalhe:

                  Load

                       Hash128(campo_para_chave_1, campo_para_chave_2, ...) as ChaveVendaDetalhe,

                       *;

                  SQL Select

                       campo_para_chave_1,

                       campo_para_chave_2,

                       ...

                       outro_campo,

                       ...

                  From ... ;

              • Re: Atualização QVD Incremental
                Hamilton Junior

                Ótimo bruno, isso mesmo, eu tinha tentado usar esta logica mas estava fazendo da maneira errada.. Resolveu o problema e ficou melhor do que a ideia inicial. Abraço