Fórum ajuda com o generator das tabelas no delphi #559851

03/08/2016

0

Boa tarde
Estou fazendo a importação de um banco antigo para um novo, a importação está ocorrendo sem problemas e as tabelas estão recebendo os registros normalmente, o detalhe ta no generator da cada tabela que mesmo após a importação o mesmo permanece no 0 mesma a tabela estrando com seus respectivos registros


segue o código de importação, a ideia é, após realizar a importação do ultimo registro atribuir o seu numero ao generator, se a tabela tiver 30 mil registros o generator receber o valor 30.000

//---------------- INÍCIO DO PROCESSO DE SINCRONIZAÇÃO DA TABELA GRUPOS--------------------------------------------------
    try
        Application.ProcessMessages;

        Sleep(0);
        lblStatus01.Caption := 'Sincronizando tabela Grupos...';
        Application.ProcessMessages;

        DtMdl.FDGruposVelho.Active := False;    //BD ANTIGO QUE ENVIARÁ OS DADOS PARA O NOVO
        DtMdl.FDGruposVelho.Active := True;
        DtMdl.FDGruposVelho.First;
        DtMdl.FDGruposNovo.Active := False;
        DtMdl.FDGruposNovo.Active := True;

        status := Ler_chave_reg('Tabelas','grupos', '', verifica_ini);
        if  status = 'OK' then
            next
        else
        begin
            parcial:= 0;
            WaitPanel.Visible := True;
            while not DtMdl.FDGruposVelho.Eof do
            begin
                inc(Parcial);
                DtMdl.FDGruposNovo.Insert;
                DtMdl.FDGruposNovoGR_NUMERO.Value := DtMdl.FDGruposVelhoCODIGO.Value;
                DtMdl.FDGruposNovoGR_GRUPO.Value := DtMdl.FDGruposVelhoNOME_GRUPO.Value;
                DtMdl.FDGruposNovo.Post;
                Grava_Chave_Reg('tabelas','grupos', 'OK', verifica_ini);
                DtMdl.FDGruposVelho.Next;
                Application.ProcessMessages;
                LbParcial.Caption:= IntToStr(Parcial);
            end;
        end;
        DtMdl.FB_DataBaseNew.CommitRetaining;
        Sleep(0);
        lblStatus01.Caption := 'Sincronização tabela Grupos concluída.';
        Inc(cont);

        StringGrid1.Cells[0,0]:= inttostr(cont)+'. Grupos Ok!';
        Application.ProcessMessages;
        pbStatus01.Position := pbStatus01.Position + 1;
        WaitPanel.Visible := False;
        TrimAppMemorySize;
    except
        on E : Exception do
        begin
            DtMdl.FB_DataBaseNew.RollbackRetaining;
            application.MessageBox(pchar('Problemas durante a migração dos dados' +#13+#13+ 'Descrição do erro: '+#13+#13+E.Message+#13+#13+'Tentativa de sincronização cancelada'), 'AVISO', mb_OK + MB_ICONERROR);
            if DtMdl.FDGruposNovo.State = dsInsert then
              DtMdl.FDGruposNovo.Cancel;
        end;
end;
Emanuel Gonçalves

Emanuel Gonçalves

Responder

Posts

03/08/2016

Raimundo Pereira

Crie um gatilho autoicrement
Responder

Gostei + 0

04/08/2016

Emanuel Gonçalves

Crie um gatilho autoicrement


P2 eu não consegui visualizar a ideia de como atribuir ao generator (GEN_NUM_GRUPO) um autoincrement nesse trecho de código.
Responder

Gostei + 0

04/08/2016

Raimundo Pereira

Bom dia,

Quais os campos da nova tabela?

Se for usar o auto increment, não precisará passar DtMdl.FDGruposNovoGR_NUMERO.Value := DtMdl.FDGruposVelhoCODIGO.Value;
Toda vez que for inserido um novo registro ele acrescerá mais um .

Estou usando o firibird, veja o exemplo.


/******************************************************************************/
/*** Following SET SQL DIALECT is just for the Database Comparer ***/
/******************************************************************************/
SET SQL DIALECT 3;



/******************************************************************************/
/*** Tables ***/
/******************************************************************************/


CREATE GENERATOR GEN_GRUPOS_NOVOS_ID;

CREATE TABLE GRUPOS_NOVOS (
GR_NUMERO INTEGER NOT NULL,
GR_GRUPO VARCHAR(20)
);




/******************************************************************************/
/*** Primary Keys ***/
/******************************************************************************/

ALTER TABLE GRUPOS_NOVOS ADD CONSTRAINT PK_GRUPOS_NOVOS PRIMARY KEY (GR_NUMERO);


/******************************************************************************/
/*** Triggers ***/
/******************************************************************************/


SET TERM ^ ;



/******************************************************************************/
/*** Triggers for tables ***/
/******************************************************************************/



/* Trigger: GRUPOS_NOVOS_BI */
CREATE OR ALTER TRIGGER GRUPOS_NOVOS_BI FOR GRUPOS_NOVOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.gr_numero is null) then
new.gr_numero = gen_id(gen_grupos_novos_id,1);
end
^


SET TERM ; ^



/******************************************************************************/
/*** Privileges ***/
/******************************************************************************/


Veja minha inserção :

INSERT INTO GRUPOS_NOVOS (GR_GRUPO) values ('TESTE P2')
INSERT INTO GRUPOS_NOVOS (GR_GRUPO) values ('TESTE P3')

Resultado:
https://uploaddeimagens.com.br/imagens/insertresult-jpg

Espero que ajude,
Responder

Gostei + 0

04/08/2016

Emanuel Gonçalves

Bom dia,

Quais os campos da nova tabela?


DtMdl.FDGruposNovoGR_NUMERO.Value
DtMdl.FDGruposNovoGR_GRUPO.Value

onde o campo GR_NUMERO tem um generator (GEN_NUM_GRUPOS)
Responder

Gostei + 0

04/08/2016

Raimundo Pereira

Sobe, resposta editada
Responder

Gostei + 0

04/08/2016

Emanuel Gonçalves

O detalhe que preciso importar todo o conteúdo do banco antigo, em tabelas como as de clientes com mais de 75 mil registros, eu preciso manter seus respectivos códigos, de modo que ao final de uma importação dessa eu preciso informar para o generator o número do ultimo registo de clientes por exemplo, para que assim ao cadastrar um novo cliente já na base de dados nova o generator se encarregue de incrementar 75001, 75002, 75003......
Responder

Gostei + 0

04/08/2016

Raimundo Pereira

Veja isso

Exemplo
Responder

Gostei + 0

04/08/2016

Emanuel Gonçalves

Veja isso

Exemplo



eu vinha fazendo isso, mudando manualmente.
Responder

Gostei + 0

04/08/2016

Raimundo Pereira

Uma alternativa funcional

var UltimoID_Importado:integer;
begin
UltimoID_Importado:=0;
dm.FDGruposNovo.Close;
dm.FDGruposNovo.sql.Clear;
dm.FDGruposNovo.sql.Text:='SELECT * FROM GRUPOS_NOVOS ORDER BY GR_NUMERO';
dm.FDGruposNovo.OPEN;
dm.FDGruposNovo.FetchAll;
dm.FDGruposNovo.LAST;

UltimoID_Importado:= dm.FDGruposNovo.FieldByName('GR_NUMERO').AsInteger;

dm.FDGruposNovo.Close;
dm.FDGruposNovo.sql.Clear;
dm.FDGruposNovo.sql.Text:='SET GENERATOR GEN_GRUPOS_NOVOS_ID TO '+IntToStr(UltimoID_Importado)+'';

try
dm.FDGruposNovo.ExecSQL;
ShowMessage('Generator Atualizado com sucesso');
except
ShowMessage('Falha ao realizar o restart no Generator [L233]');
FUNCOES.Copiar_Script(dm.FDGruposNovo.sql.Text);
end;


end;
Responder

Gostei + 0

04/08/2016

Emanuel Gonçalves

P2

ele ta reclamando aqui

dm.FDGruposNovo.sql.Text:='SET GENERATOR GEN_GRUPOS_NOVOS_ID TO '+IntToStr(UltimoID_Importado)+'';

ao entrar no ExecSql ele lança uma exceção dinamic sql error token unknown - line 1 columm 30 TO4

esse TO4 é o comando TO mais o número do ultimo registro importado 4
Responder

Gostei + 0

04/08/2016

Raimundo Pereira

Pq vc está usando o meu generator
Troque isso GEN_GRUPOS_NOVOS_ID pelo nome do seu generator
Responder

Gostei + 0

04/08/2016

Emanuel Gonçalves

opa desculpa, foi na hora, ja testei com o meu generator

DtMdl.FDGruposNovo.sql.Text:='SET GENERATOR GEN_NUM_GRUPOS TO'+inttostr(UltimoID_Importado)+'';

na hora de colar eu escolhi errado mas no inicio já tinha trocado
Responder

Gostei + 0

04/08/2016

Natanael Ferreira

Não se é isso, mas faltou um espaço depois do TO:

Teste assim:

DtMdl.FDGruposNovo.sql.Text:='SET GENERATOR GEN_NUM_GRUPOS TO '+inttostr(UltimoID_Importado)+'';
Responder

Gostei + 0

04/08/2016

Emanuel Gonçalves

brincadeira

obrigado
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar