Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Boa tarde a todos.
Estou fazendo um desenvolvimento que envolve a área de controladoria da empresa e preciso trabalhar com os balancetes das empresas do grupo.
São 6 empresas e preciso fazer a primeira massa de dados com o periodo Janeiro de 2009 até Abril de 2011 de todas as empresas. E depois disso vou automatizar a carga para Mes Corrente -1 como base. mas isso é algo que ainda vai ser desenvolvido.
Uma das minhas duvidas é se existe a possibilidade de fazer isso com um loop.
A segunda é a parte incremental. Eu nunca fiz algo desse tipo. E pelo que consegui ver nas pesquisas o ideal é que se tenha uma chave primaria na tabela e uma coluna com a data de inserção. Porém a tabela que eu vou trabalhar nasce a partir da execução de uma procedure. E a cada execução dessa procedure a tabela é renovada.
Se eu conseguir montar a parte incremental acho que ja consegui solucionar o meu problema.
Muito obrigado desde já.
Para realizar este loop ficaria algo mais ou menos assim:
// Data inicial
LET vDtIni = DATE('01/08/2009', 'DD/MM/YYYY');
// Data final
LET vDtFim = DATE('01/02/2011', 'DD/MM/YYYY');
// Diferença de meses entre as datas
LET numMeses = (MONTH(vDtFim) - MONTH(vDtIni)) + ((YEAR(vDtFim) - YEAR(vDtIni)) * 12);
LET pAnoMes = vDtIni;
// Variavel utilizada apenas para teste
LET j = 0;
// Inicio do LOOP Executará a de acordo com o valor gravado na variavel que verificou a diferença de meses
FOR i=1 TO $(numMeses)
pAnoMes = YEAR(vDtIni) & NUM(MONTH(vDtIni), '00');
// Chamada da sua procedure
//SQL CALL SP_BALAN ('AGRUPAMENTO', 2, 1,'1', NULL, $(pAnoMes),' ', 'CONTA', 0, 5, 'N', 'N');
...
...
// Incrementa o mês da sua variável
pAnoMes = YEAR(ADDMONTHS(vDtIni, i)) & NUM(MONTH(ADDMONTHS(vDtIni, i)), '00');
// Final do LOOP
NEXT
Boa Tarde Mauricio,
Seguem suas duvidas:
1ª) Referente a primeira,não entendi o que você deseja rodar em loop;
2ª) Existem diversos conceitos para aplicar a carga incremental, o ideal é que sempre tenha uma data como referência para saber quais são os novos registros.
A idéia é quando for executar a primeira carga, estas informações sejam gravados em um arquivo QVD.
Quando rodar as próximas recargas, você deve utilizar dois LOADS onde o primeiro é feita a leitura dos dados antigos (*.qvd), é utilizado o comando "ADD" e em seguida o segundo LOAD com as novas informações.
Segue um exemplo de uma carga incremental.
Abraços
Olá Eduardo
Muito obrigado pela ajuda. Já vou tentar implementar algo desse tipo e testar.
Quanto a primeira questão é o seguinte.
As informações que vou extrair partem da execução de uma procedure. Essa procedure exige um parametro de "Ano e Mes" (ex: 201104, 200901) e vou precisar fazer a carga desde 2009. E pra cada mes demanda uma execução da procedure.
O que eu tinha em mente era fazer um controle de fluxo para executar a procedure, fazer a select e incrementar no QVD.
Caso não seja dessa forma acredito que será preciso fazer uma execução do script para cada mes.
Para realizar este loop ficaria algo mais ou menos assim:
// Data inicial
LET vDtIni = DATE('01/08/2009', 'DD/MM/YYYY');
// Data final
LET vDtFim = DATE('01/02/2011', 'DD/MM/YYYY');
// Diferença de meses entre as datas
LET numMeses = (MONTH(vDtFim) - MONTH(vDtIni)) + ((YEAR(vDtFim) - YEAR(vDtIni)) * 12);
LET pAnoMes = vDtIni;
// Variavel utilizada apenas para teste
LET j = 0;
// Inicio do LOOP Executará a de acordo com o valor gravado na variavel que verificou a diferença de meses
FOR i=1 TO $(numMeses)
pAnoMes = YEAR(vDtIni) & NUM(MONTH(vDtIni), '00');
// Chamada da sua procedure
//SQL CALL SP_BALAN ('AGRUPAMENTO', 2, 1,'1', NULL, $(pAnoMes),' ', 'CONTA', 0, 5, 'N', 'N');
...
...
// Incrementa o mês da sua variável
pAnoMes = YEAR(ADDMONTHS(vDtIni, i)) & NUM(MONTH(ADDMONTHS(vDtIni, i)), '00');
// Final do LOOP
NEXT
Era basicamente isso que eu estava desenvolvendo.
O que eu tava quebrando a cabeça era essa parte da diferença dos meses porque como voce deve ter imaginado esse parametro de ano mes é uma string e se eu fizesse com o incremento de 1 ele faria algo do tipo "200913". Mas voce me ajudou a solucionar isso.
Mais uma vez obrigado Eduardo.
Vou fazer a implementação e já volto para dizer como ficou.
olá Eduardo
Muito obrigado pela ajuda.
Fiz o que indicou com algumas pequenas adequações e funcionou perfeitamente.
Mais uma vez obrigado