Ir para conteúdo
Fórum Script Brasil
  • 0

Copiar informações da mesma tabela no Firebird


danielrgoes

Pergunta

1 resposta a esta questão

Posts Recomendados

  • 0

Dica de Aldus ( Mario )

Trata-se de uma função que estou usando e tem se mostrado eficiente para o meu propósito, portanto, podem adequar as suas necessidades.

Utilizo em Fire 1.5

Chamada da Função:

Código: 
ComparaEstruturas('TABELAORIGEM','TABELADESTINO' ); 


Código: 
procedure TfDadosGuarda.ComparaEstruturas(vOrigem, vDestino: string); 
var 
   TrsAB: Ttransactiondesc; 
   vCampoTipo,vCampoTipoD,vOrigemCampo: string; 
   vCampoDec,vCampoTam: integer; 
   vCampoExiste,vTabelaExiste,vPrimeiraExecucao: boolean; 
begin 
   lblAndamento.caption := 'Comparando estrutura do arquivo: '+LowerCase(vOrigem); 
   Application.ProcessMessages; 

   // Select Campos de Origem 
   dm.cds_aux1.close; 
   dm.sql_aux1.commandText := 'SELECT A.RDB$FIELD_NAME CAMPO,'+ 
                              '       C.RDB$TYPE_NAME TIPO,'+ 
                              '       B.RDB$FIELD_LENGTH TAMANHO,'+ 
                              '       B.RDB$FIELD_SCALE DECIMAIS,'+ 
                              '       B.RDB$FIELD_PRECISION AS TAMDEC '+ 
                              'FROM   RDB$RELATION_FIELDS A,'+ 
                              '       RDB$FIELDS B,'+ 
                              '       RDB$TYPES C '+ 
                              'WHERE  (A.RDB$RELATION_NAME = '''+vOrigem+''') AND '+ 
                              '       (B.RDB$FIELD_NAME = A.RDB$FIELD_SOURCE) AND '+ 
                              '       (C.RDB$TYPE = B.RDB$FIELD_TYPE) AND '+ 
                              '       (C.RDB$FIELD_NAME = ''RDB$FIELD_TYPE'') '+ 
                              'ORDER BY RDB$FIELD_POSITION'; 
   dm.cds_aux1.open; 

   // Select Campos de Destino 
   dm.cds_aux2.close; 
   dm.sql_aux2.commandText := 'SELECT A.RDB$FIELD_NAME CAMPO,'+ 
                              '       C.RDB$TYPE_NAME TIPO,'+ 
                              '       B.RDB$FIELD_LENGTH TAMANHO,'+ 
                              '       B.RDB$FIELD_SUB_TYPE DECIMAIS '+ 
                              'FROM   RDB$RELATION_FIELDS A,'+ 
                              '       RDB$FIELDS B,'+ 
                              '       RDB$TYPES C '+ 
                              'WHERE  (A.RDB$RELATION_NAME = '''+vDestino+''') AND '+ 
                              '       (B.RDB$FIELD_NAME = A.RDB$FIELD_SOURCE) AND '+ 
                              '       (C.RDB$TYPE = B.RDB$FIELD_TYPE) AND '+ 
                              '       (C.RDB$FIELD_NAME = ''RDB$FIELD_TYPE'') '+ 
                              'ORDER BY RDB$FIELD_POSITION'; 
   dm.cds_aux2.open; 
   vTabelaExiste     := (not dm.cds_aux2.Eof); 
   vPrimeiraExecucao := True; 

   with dm.cds_aux1 do begin 
      prog.Max      := RecordCount; 
      while not eof do begin 
         prog.Position := RecNo; 
         Application.ProcessMessages; 
         vOrigemCampo := Trim(fieldbyname('campo').asstring); 
         vCampoExiste := False; 
         dm.cds_aux2.first; 
         while not dm.cds_aux2.eof do begin 
            if Trim(dm.cds_aux2.fieldbyname('CAMPO').asstring) = vOrigemCampo then begin 
               vCampoExiste := True; 
               Break; 
            end; 
            dm.cds_aux2.next; 
         end; 
         if not vCampoExiste then begin 
            vCampoTipo    := Trim(fieldbyname('TIPO').asstring); 
            if fieldbyname('DECIMAIS').asinteger = 0 then 
               vCampoDec  := 0 
            else 
               vCampoDec  := (fieldbyname('DECIMAIS').asinteger*-1); 
            vCampoTam     := fieldbyname('TAMANHO').asinteger; 
            if (vCampoTipo = 'LONG') AND (vCampoDec = 0) then 
               vCampoTipoD := 'INTEGER' 
            else if vCampoTipo = 'BLOB' then 
               vCampoTipoD := 'BLOB SUB_TYPE 1' 
            else if vCampoTipo = 'VARYING' then 
               vCampoTipoD := 'VARCHAR('+IntToStr(vCampoTam)+')  character set WIN1252 collate WIN_PTBR' 
            else if vCampoTipo = 'DATE' then 
               vCampoTipoD := 'DDATA' 
            else if ((vCampoTipo = 'LONG') OR (vCampoTipo = 'INT64')) AND (vCampoDec > 0) then 
               vCampoTipoD := 'DECIMAL('+IntToStr(fieldbyname('TAMDEC').asinteger)+','+IntToStr(vCampoDec)+')'; 
            try 
               TrsAB.TransactionID  := 21; 
               TrsAB.IsolationLevel := xilReadCommitted; 
               dm.Conexao.StartTransaction(TrsAB); 
               if not vTabelaExiste and vPrimeiraExecucao then 
                  dm.conexao.ExecuteDirect('CREATE TABLE '+vDestino+' ('+vOrigemCampo+' '+vCampoTipoD+')') 
               else 
                  dm.conexao.ExecuteDirect('ALTER TABLE '+vDestino+' ADD '+vOrigemCampo+' '+vCampoTipoD); 
               dm.Conexao.Commit(TrsAB); 
            except 
               dm.Conexao.RollBack(TrsAB); 
            end; 
            vPrimeiraExecucao := False; 
         end; 
         next; 
      end; 
   end; 

end;

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...