ajuda com o generator das tabelas no delphi
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
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
Curtidas 0
Respostas
Raimundo Pereira
03/08/2016
Crie um gatilho autoicrement
GOSTEI 0
Emanuel Gonçalves
03/08/2016
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.
GOSTEI 0
Raimundo Pereira
03/08/2016
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,
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
Emanuel Gonçalves
03/08/2016
Bom dia,
Quais os campos da nova tabela?
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
Raimundo Pereira
03/08/2016
Sobe, resposta editada
GOSTEI 0
Emanuel Gonçalves
03/08/2016
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......
GOSTEI 0
Raimundo Pereira
03/08/2016
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;
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
Emanuel Gonçalves
03/08/2016
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
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
Raimundo Pereira
03/08/2016
Pq vc está usando o meu generator
Troque isso GEN_GRUPOS_NOVOS_ID pelo nome do seu generator
Troque isso GEN_GRUPOS_NOVOS_ID pelo nome do seu generator
GOSTEI 0
Emanuel Gonçalves
03/08/2016
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
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
Natanael Ferreira
03/08/2016
Não se é isso, mas faltou um espaço depois do TO:
Teste assim:
Teste assim:
DtMdl.FDGruposNovo.sql.Text:='SET GENERATOR GEN_NUM_GRUPOS TO '+inttostr(UltimoID_Importado)+'';
GOSTEI 0
Emanuel Gonçalves
03/08/2016
brincadeira
obrigado
obrigado
GOSTEI 0