alemoraes Postado Novembro 9, 2017 Denunciar Share Postado Novembro 9, 2017 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Novembro 9, 2017 Denunciar Share Postado Novembro 9, 2017 como voce colocou esse comando no delphi 7 ? qual foi o erro ? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 alemoraes Postado Novembro 10, 2017 Autor Denunciar Share Postado Novembro 10, 2017 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Novembro 10, 2017 Denunciar Share Postado Novembro 10, 2017 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 alemoraes Postado Novembro 11, 2017 Autor Denunciar Share Postado Novembro 11, 2017 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; Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Novembro 11, 2017 Denunciar Share Postado Novembro 11, 2017 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 ? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 alemoraes Postado Novembro 12, 2017 Autor Denunciar Share Postado Novembro 12, 2017 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Novembro 12, 2017 Denunciar Share Postado Novembro 12, 2017 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 aditya12 Postado Maio 29, 2019 Denunciar Share Postado Maio 29, 2019 https://www.welookups.com/sql/sql_insert_into_select.html Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
alemoraes
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
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.