• 0
Sign in to follow this  
alemoraes

(Resolvido) Transferir dados de uma tabela para outra

Question

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.

Share this post


Link to post
Share on other sites

8 answers to this question

Recommended Posts

  • 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.

Share this post


Link to post
Share on other 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

 

 

 

 

Share this post


Link to post
Share on other 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;

 

Share this post


Link to post
Share on other 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 ?

Share this post


Link to post
Share on other 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.

 

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this