Fórum ajuda com o generator das tabelas no delphi #559851
03/08/2016
0
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
Curtir tópico
+ 0Posts
03/08/2016
Raimundo Pereira
Gostei + 0
04/08/2016
Emanuel Gonçalves
P2 eu não consegui visualizar a ideia de como atribuir ao generator (GEN_NUM_GRUPO) um autoincrement nesse trecho de código.
Gostei + 0
04/08/2016
Raimundo Pereira
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,
Gostei + 0
04/08/2016
Emanuel Gonçalves
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)
Gostei + 0
04/08/2016
Raimundo Pereira
Gostei + 0
04/08/2016
Emanuel Gonçalves
Gostei + 0
04/08/2016
Emanuel Gonçalves
Gostei + 0
04/08/2016
Raimundo Pereira
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;
Gostei + 0
04/08/2016
Emanuel Gonçalves
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
Gostei + 0
04/08/2016
Raimundo Pereira
Troque isso GEN_GRUPOS_NOVOS_ID pelo nome do seu generator
Gostei + 0
04/08/2016
Emanuel Gonçalves
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
Gostei + 0
04/08/2016
Natanael Ferreira
Teste assim:
DtMdl.FDGruposNovo.sql.Text:='SET GENERATOR GEN_NUM_GRUPOS TO '+inttostr(UltimoID_Importado)+'';
Gostei + 0
04/08/2016
Emanuel Gonçalves
obrigado
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)