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

(Resolvido) Transferir dados de uma tabela para outra


alemoraes

Pergunta

boa noite

Preciso criar um botão de comando para transferir um registro selecionado de uma tabela para uma outra tabela idêntica.

Tenho duas tabelas: PATRIMONIO e BAIXA  (As duas tabelas tem Chave primária e auto incremento)

No IBExpert fiz o comando com SQL no Firebird 2.5 e funcionou mas no delphi 7 não consigo fazer.

insert into BAIXA (BAI_DATACADASTRO, BAI_DESCRICAO, BAI_MARCA, BAI_FORNECEDOR, BAI_DATACOMPRA, BAI_QUANT, BAI_VALORUNITARIO,

BAI_VALORTOTAL, BAI_OBS, BAI_DATASAIDA, BAI_DATADEVOLUCAO, BAI_DATAVENDA, BAI_SITCODIGO, BAI_USUCODIGO, BAI_FOTO)

select PAT_DATACADASTRO, PAT_DESCRICAO, PAT_MARCA, PAT_FORNECEDOR, PAT_DATACOMPRA, PAT_QUANT, PAT_VALORUNITARIO,

PAT_VALORTOTAL, PAT_OBS, PAT_DATASAIDA, PAT_DATADEVOLUCAO, PAT_DATAVENDA, PAT_SITCODIGO, PAT_USUCODIGO, PAT_FOTO

from PATRIMONIO WHERE PAT_CODIGO = 16;   //Exemplo

 

Agradeço antecipadamente.

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

Bom dia

Estou utilizando para esta rotina

01 IBQuery (ibqBaixa) ligado a 01 DataSetProvider (dspProvider) ligado a 01 ClientDataSet (cdsBaixa) ligado a 01 Datasource (dsBaixa)

01 DBGrid2 ligado ao datasource dsBaixa para mostrar os registros transferidos

No IBquery coloquei este comando SQL : select A.*, B.* from BAIXA A, PATRIMONIO B

No Botão de comando fiz esta rotina, mas ao clicar não acontece nada:

 

procedure TfrmPatrimonio.BitBtnBaixaClick(Sender: TObject);

begin

if dmDados.tblPatrimonio.IsEmpty then

   begin

     Application.MessageBox('Tabela vazia, não há dados para transferir!', 'Aviso', mb_Ok + MB_ICONQUESTION);

     Abort;

   end

   else

       if dmDados.dsBaixa.State in [dsInsert, dsEdit] then

       begin

      cdsBaixa.Close;

      cdsBaixa.ClearFields;

      cdsBaixa.CommandText:= 'INSERT INTO BAIXA (BAI_DATACADASTRO, BAI_DESCRICAO, BAI_MARCA, BAI_FORNECEDOR, BAI_DATACOMPRA, BAI_QUANT, BAI_VALORUNITARIO,'+

                             'BAI_VALORTOTAL, BAI_OBS, BAI_DATASAIDA, BAI_DATADEVOLUCAO, BAI_DATAVENDA, BAI_SITCODIGO, BAI_USUCODIGO, BAI_FOTO)'+

                             'SELECT PAT_DATACADASTRO, PAT_DESCRICAO, PAT_MARCA, PAT_FORNECEDOR, PAT_DATACOMPRA, PAT_QUANT, PAT_VALORUNITARIO, PAT_VALORTOTAL,'+

                             'PAT_OBS, PAT_DATASAIDA, PAT_DATADEVOLUCAO, PAT_DATAVENDA, PAT_SITCODIGO, PAT_USUCODIGO, PAT_FOTO'+

                             'FROM PATRIMONIO WHERE PAT_CODIGO = :cod';

      cdsBaixa.Params.ParamByName('cod').AsInteger:= DBGrid1.DataSource.DataSet.FieldByName('PAT_CODIGO').value;

  // O DBGrid1 mostra os Patrimônios cadastrados. A intenção é selecionar o registro no DBGrid1 para fazer a transferência entre

as tabelas PATRIMONIO e BAIXA.

      cdsBaixa.ApplyUpdates(-1);

      dmDados.transacao.CommitRetaining;  // componente TIBTransaction

  end;

end;

Obrigado.

Link para o comentário
Compartilhar em outros sites

  • 0

Pelo que eu entendi da sua explicação, voce tem um DBGrid1 que mostra os dados da tabela (  PATRIMONIO ) , que voce vai selecionar um registro e transferir para outra tabela ( BAIXA ) através de um Botão, onde esse registro será mostrado no DBGrid2 ... seria isso ?

sugestão: para que trabalhar com 2 tabelas iguais se voce pode usar apenas a tabela  ( PATRIMONIO ) e acrescentar nela o campo ( Baixa ) e colocar ( 0 ou 1 ...Sim ou Não ) para indicar que o registro sofreu alteração ?  ficaria muito mais facil.

com relação ao seu código:

quando se usa o comando insert into o código deve ser assim....( veja esse exemplo )

procedure TFMenu.Button1Click(Sender: TObject);
begin
  IBQuery1.SQL.Clear;
  IBQuery1.SQL.Text:='insert into arquivo2 (Nome, valor) '+
                    'select Nome, valor '+
                    'from arquivo1 WHERE id = 3';
  IBQuery1.ExecSql;
end;

OBS: voce deve usar o break point do delphi , para acompanhar a execução do programa

verifique tambem se existe algum valor no parametro COD, caso contrário não vai fazer nada

abraço

 

 

 

 

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas boa tarde

Fiz os testes aqui com estes procedimentos. Não dá erro mas também não acontece nada quando clico no botão

não grava no banco Firebird nem aparece no DBGrid2.

No IBquery1 no SQL digitei:

select A.*, B.* from BAIXA A, PATRIMONIO B WHERE B.PAT_CODIGO =:cod

 

No IBQuey1 Propriedade Params: DataType: ftInteger

                            ParamType: ptInput

procedure TfrmPatrimonio.BitBtnBaixaClick(Sender: TObject);

begin

if dmDados.tblPatrimonio.IsEmpty then

   begin

     Application.MessageBox('Tabela vazia, não há dados para transferir!', 'Aviso', mb_Ok + MB_ICONQUESTION);

     Abort;

   end

   else

       if dsBaixa.State in [dsInsert, dsEdit] then

       begin

       IBQuery1.SQL.Clear;

       IBQuery1.SQL.Text:= 'INSERT INTO BAIXA (BAI_DATACADASTRO, BAI_DESCRICAO, BAI_MARCA, BAI_FORNECEDOR, BAI_DATACOMPRA, BAI_QUANT, BAI_VALORUNITARIO,'+

                           'BAI_VALORTOTAL, BAI_OBS, BAI_DATASAIDA, BAI_DATADEVOLUCAO, BAI_DATAVENDA, BAI_SITCODIGO, BAI_USUCODIGO, BAI_FOTO)'+

                           'SELECT PAT_DATACADASTRO, PAT_DESCRICAO, PAT_MARCA, PAT_FORNECEDOR, PAT_DATACOMPRA, PAT_QUANT, PAT_VALORUNITARIO, PAT_VALORTOTAL,'+

                           'PAT_OBS, PAT_DATASAIDA, PAT_DATADEVOLUCAO, PAT_DATAVENDA, PAT_SITCODIGO, PAT_USUCODIGO, PAT_FOTO'+

                           'FROM PATRIMONIO WHERE PAT_CODIGO = :cod';

       IBQuery1.ParamByName('cod').AsInteger:= dmDados.tblPatrimonioPAT_CODIGO.AsInteger;

       IBQuery1.ExecSQL;

 

Link para o comentário
Compartilhar em outros sites

  • 0

amigo, o comando está correto ....  deveria funcionar

https://www.w3schools.com/sql/sql_insert_into_select.asp

pode ser problema de componente .... voce pode tentar troca-lo

caso não funcione, voce pode tentar copiar o registro inteiro para a outra tabela, criando uma rotina de copia.

OBS: Porque voce não quer usar a mesma tabela e acrescentar o campo  Baixa ?

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas bom dia

Obrigado pela ajuda, quanto a sua dica para usar a mesma tabela PATRIMONIO para dar baixa é interessante,

preciso expor o seguinte: o campo  PAT_SITCODIGO  da tabela PATRIMONIO é uma chave estrangeira que contém

vários Status pré cadastrados como: ESTOQUE, ALUGADO, DEVOLVIDO, VENDIDO, ETC. Quando for colocado o Status

VENDIDO neste Patrimonio e clicar no botão de comando ele sai da Listagem do DBGRid1 e passa para o DBGrid2

que vão conter a listagem dos Patrimonios vendidos. Peço a sua ajuda para me dar uma idéia de como poderia fazer

estas rotinas usando apenas a tabela PATRIMONIO.

Obrigado.

 

Link para o comentário
Compartilhar em outros sites

  • 0

ok... usando as 2 tabelas ( PATRIMONIO E BAIXA )  ambas devem ter a mesma estrutura ( iguais )

nesse exemplo, voce vai marcar os registros que voce quer copiar ( tabela PATRIMONIO ) para a tabela ( BAIXA )

unit UCopiaReg1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, DB, IBCustomDataSet, IBTable, DBClient,
  Provider, IBDatabase, Grids, DBGrids;

type
  TForm1 = class(TForm)
    IBTable1: TIBTable;
    BitBtn1: TBitBtn;
    IBTable2: TIBTable;
    DataSource1: TDataSource;
    DataSource2: TDataSource;
    DBGrid1: TDBGrid;
    IBDatabase1: TIBDatabase;
    IBTransaction1: TIBTransaction;
    DBGrid2: TDBGrid;
    Button1: TButton;
    procedure BitBtn1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// IBTable1 = Tabela PATRINOMIO  ( DBGrid1 )
// IBTable2 = Tabela BAIXA       ( DBGrid2 )

// PARA MARCAR MAIS DE UM REGISTRO, SEGURAR A TECLA COONTROL E
// CLICAR NO REGISTRO DA TABELA PATRIMONIO

procedure TForm1.BitBtn1Click(Sender: TObject);
var
   i, cont : integer;
   NomeCampo: String;
begin

   With Dbgrid1 do
   Begin
     DBGrid1.Options := [dgTitles,dgIndicator,dgColumnResize,dgColLines,
     dgRowLines,dgTabs,dgRowSelect,dgConfirmDelete,dgCancelOnExit,dgMultiSelect];

     if SelectedRows.Count = 0 then
        begin
           MessageDlg('OPERAÇÃO ANULADA! '+ #13 + #13 +
                      'SELECIONE OS REGISTROS PARA CÓPIAR PARA A '+
                      'TABELA BAIXA.', mtInformation, [mbOK], 0);

           DBGrid1.SetFocus;
           Exit;
        end;

     for cont:= 0 to Pred(SelectedRows.Count) do
        Begin

           DataSource1.Dataset.Bookmark:= SelectedRows[cont];

           IBTable2.Last;
           IBTable2.Append;
           IBTable2.Edit;

           For i := 0 To IBTable1.FieldCount - 1 Do
           Begin
              NomeCampo := IBTable1.Fields[i].FieldName;
              IBTable2.FieldbyName(NomeCampo).Value :=
              IBTable1.FieldbyName(NomeCampo).Value;
           End;

           IBTable2.Post;

           Application.ProcessMessages;
     End;
   end;
   IBTable2.Refresh;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   IBTable2.EmptyTable;
   IBTable2.Refresh;

end;

procedure TForm1.FormActivate(Sender: TObject);
begin
   IBTable1.Open;
   IBTable2.Open;
end;

end.

Poderia ser mais simples usando o Insert Into na select, mas já que não está funcionando ...  tem essa outra maneira

OBS: Os IBTables devem ser ligados a um Datasource ( Não use o DataSetProvider e nem o ClientDataSet )

Faça as modificações para o seu uso.

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
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...