Fórum Clonar registro de uma tabela #7891

23/07/2009

0

Colegas,     Boa noite!!!     Tenho um sistema de controle Patrimonial, surgiu a necessidade de implementar a rotina de inserção/cadastro de bens... O que aconteçe é o seguinte:     Na tabela de bens tenho o campo nº de tombamento, descrição do bem, tipo de aquisição, fornecedor, etc...   Preciso criar uma função que me dê a opção de criar diversos clones de um cadastro alterando somente o nº de tombamento para sempre + 1 a cada clone...     Por exemplo:   Cadeira X, nº de tombamento 100, vamos dizer que nesse caso seria a inclusão de 50 cadeiras... Quando a função fosse chamada, ela geraria mais 49 registro iguais modificando somente o nº de tombamento para 101, 102, 103...     aguardo retorno   um abraço     Irenildo Carvalho        
Irenildo Carvalho

Irenildo Carvalho

Responder

Posts

23/07/2009

Rodrigo Mourão

Olá Irenildo,

Bem existe mil maneira de preparar Neston, invent uma. Com Delphi é a mesma coisa. Eu vou lhe mostar aqui uma das muitas maneira que você pode fazer isso. Eu faria o seguinte criaria uma função no Delphi CloneBem assim:


function CloneBem(BemID, Quantidade: Integer): Boolean;


A ideia é você passar a chave do Bem, que é o identificador unico do bem e a quantidade de clones que você faz. A implementação ficaria assim:

function CloneBem(BemID, Quantidade: Integer): Boolean;
var
  Select, Insert: String;
  Qry: TSqlQuery;
begin
  Select := 'Select * from Bem where BemID = '+IntToStr(BemID);
  Qry := TSqlQuery.Create(Self);
  Qry.SqlConnection := SeuSqlConnectionAqui;
  Qry.Sql.Add(Select);
  Qry.Open;
   If not Qry.Eof then
   begin
       for I := 1 to Quantidade do
       begin
         Insert := 'Insert into Bem (Tombamento, CampoA, CampoB, CampoC) values ('+
         Insert := Insert +IntToStr(Qry.FieldByName('Tombamento').asInteger+I)+', '+
         Insert := Insert +Qry.FieldByName('CampoA').asString+', '+
         Insert := Insert +Qry.FieldByName('CampoB').asString+', '+
         Insert := Insert +Qry.FieldByName('CampoC').asString+')';
         SeuSqlConnectionAqui.ExecuteDirect(Insert);
       end;
   end;
end;


Bem como vc nao deu detalhes do banco e conexao entao pensei num rotina 100% Delphi. Aqui asumi que vc usa DBX caso não adapte para seu tipo de conexao. Bem o que fiz foi dar um select e trazer o registro que vc quer clonar. Feito isso criamos um loop de 1 até a quantidade que quer colocar e para cada loop dp for geramos um comando insert so alteramos o tombamento que vai ser o tombamento atual + I ou seja + 1, 2, 3, 4, etc.

Acho que isso ajuda e espero ter sido claro.

Abs!

Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi
Responder

Gostei + 0

26/07/2009

Irenildo Carvalho

Ei mano,     Fiz como vc me passou, mas deu erro, eu utilizo delphi 7, Sql Server 2005 +ado   Veja como fiz:   function TfrmCadPatrimonioDetalhe.ClonePat(pat_codigo,
  Quantidade: Integer): Boolean;
var
  Select, Insert: String;
  Qr: TAdoQuery;
begin   Select := 'Select * from tb_Patrimonio where pat_codigo = '+IntToStr(pat_codigo);
  Qr := TADOQuery.Create(Self);
  qr.Connection := dmAdo.ADOConnection;
  Qr.Sql.Add(Select);
  Qr.Open;
   If not Qr.Eof then
   begin
       for I := 1 to Quantidade do
       begin
         Insert := 'Insert into tb_patrimonio (pat_codigo, pat_descricao, pat_referencia, pat_valor) values ('+
         Insert := Insert +IntToStr(Qr.FieldByName('pat_codigo').asInteger+I)+', '+
         Insert := Insert +Qr.FieldByName('pat_descricao').asString+', '+
         Insert := Insert +Qr.FieldByName('pat_referencia').asString+', '+
         Insert := Insert +Qr.FieldByName('pat_valor').asString+')';
         dmAdo.ADOConnection.Execute(Insert);
       end;
   end;
end;         Segue a imagem do erro...  
Responder

Gostei + 0

28/07/2009

Rodrigo Mourão

E so declarar a variavel I como integer:


var
I: Integer;


Abs!
Responder

Gostei + 0

28/07/2009

Irenildo Carvalho

Ei mano,   Claro, eu fiz isso sim, mas o problema não é esse, me referia aos outros erros abaixo na imagem, eles permanecem, ok...     um abraço   aguardo retorno
Responder

Gostei + 0

28/07/2009

Rodrigo Mourão

Segue  correto.  Eu escrevi um codigo e postei outro;

function TfrmCadPatrimonioDetalhe.ClonePat(pat_codigo,
  Quantidade: Integer): Boolean;
var
  Select, Insert: String;
  Qr: TAdoQuery;
begin   Select := 'Select * from tb_Patrimonio where pat_codigo = '+IntToStr(pat_codigo);
  Qr := TADOQuery.Create(Self);
  qr.Connection := dmAdo.ADOConnection;
  Qr.Sql.Add(Select);
  Qr.Open;
   If not Qr.Eof then
   begin
       for I := 1 to Quantidade do
       begin
         Insert := 'Insert into tb_patrimonio (pat_codigo, pat_descricao, pat_referencia, pat_valor) values (';
         Insert := Insert +IntToStr(Qr.FieldByName('pat_codigo').asInteger+I)+', ';
         Insert := Insert +Qr.FieldByName('pat_descricao').asString+', ';
         Insert := Insert +Qr.FieldByName('pat_referencia').asString+', ';
         Insert := Insert +Qr.FieldByName('pat_valor').asString+')';
         dmAdo.ADOConnection.Execute(Insert);
       end;
   end;
end;

Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi
Responder

Gostei + 0

28/07/2009

Irenildo Carvalho

Colega,     Desculpa, mas o que foi que mudou nesse código mesmo? :)   Aguardo retorno      
Responder

Gostei + 0

28/07/2009

Rodrigo Mourão

Repare no final das linhas eu tinha terminadao com concatenação mas não é. Tem que ser terminada com ;

Correto:
         Insert := 'Insert into tb_patrimonio (pat_codigo, pat_descricao, pat_referencia, pat_valor) values (';
         Insert := Insert +IntToStr(Qr.FieldByName('pat_codigo').asInteger+I)+', ';
         Insert := Insert +Qr.FieldByName('pat_descricao').asString+', ';
         Insert := Insert +Qr.FieldByName('pat_referencia').asString+', ';
         Insert := Insert +Qr.FieldByName('pat_valor').asString+')';

Errado:

       Insert := 'Insert into tb_patrimonio (pat_codigo, pat_descricao, pat_referencia, pat_valor) values ('+
         Insert := Insert +IntToStr(Qr.FieldByName('pat_codigo').asInteger+I)+', '+
         Insert := Insert +Qr.FieldByName('pat_descricao').asString+', '+
         Insert := Insert +Qr.FieldByName('pat_referencia').asString+', '+
         Insert := Insert +Qr.FieldByName('pat_valor').asString+')'+
Responder

Gostei + 0

28/07/2009

Irenildo Carvalho

Quase cego, não... kkkkkkkk, desculpa, foi mal...   Mas não muda nada, acnoteçe a mesma coisa...     valeu...
Responder

Gostei + 0

28/07/2009

Irenildo Carvalho

Olha só,     Fiz de outra forma, bem semelhante: Compila, mas quando mando clonar gera um erro (imagem anexo), sabe me dizer por que?             procedure TfrmClone.acConsultaExecute(Sender: TObject);
var
  Select, Insert: String;
  Qr: TAdoQuery;
  i, quantidade : integer;
begin
   inherited;
  with DataSource.DataSet do
  begin
    if State = dsEdit then
    begin
      qr := TADOQuery.Create(Self);
      try
        qr.Connection := dmADO.ADOConnection;
        qr.SQL.Add('Select * from tb_Patrimonio where pat_codigo = '+FieldByName ('pat_codigo').AsString);
        Select := IntToStr(FieldByName ('pat_codigo').Value);         qr.Open;         Quantidade := strtoint(edTombamento.Text);          If not Qr.Eof then
     begin
       for i := 1 to Quantidade do
       begin
         dmAdo.ADOConnection.Execute ('Insert into tb_patrimonio (pat_tombamento, pat_descricao, pat_referencia, pat_valor) values ('+
         IntToStr(Qr.FieldByName('pat_tombamento').asInteger+I)+', '+
         Qr.FieldByName('pat_descricao').asString+', '+
         Qr.FieldByName('pat_referencia').asString+', '+
         Qr.FieldByName('pat_valor').asString+')');
    end;
  end;
 finally
        qr.Close;
        qr.Free;
      end;
    end;
  end;
end; end.
Responder

Gostei + 0

28/07/2009

Rodrigo Mourão

kkkkkkkkkkkkkkkkkkkkk

Não a virgula grande e para ficar em destraque mesmo. rsrsrs e que nem eu saiba qual era a diferença.

Bem, eu nunca vi este tipo de erro, qual é o banco ?

Pela mensagem está parecendo que ele não aceita a palavra armário. Parece que ele entende como nome de coluna.

Se quiser mandar a app que eu compilo e teste. Erros tem que ser depurados, debugados. Utilize o disco virtual para enviar o projeto para que eu possa compilar e testar .

Fico no aguardo abs !!
Responder

Gostei + 0

29/07/2009

Irenildo Carvalho

Na verdade falei me referindo ao fato de não ter percebido também a diferença... :)   Olha tô te enviando o projeto, delphi 7 e SqlServer2005+sp3 então verifica aí pra mim, certo?   -> http://video.devmedia.com.br/discovirtual/201854/Proj%20Patrimonio/proj%20patrimonio.rar
-> http://video.devmedia.com.br/discovirtual/201854/Proj%20Patrimonio/bd.rar   Na dúvida, segue os componentes utilizados também...   -> http://video.devmedia.com.br/discovirtual/201854/Proj%20Patrimonio/rxlib275.rar
-> http://video.devmedia.com.br/discovirtual/201854/Proj%20Patrimonio/xpmenu7.rar
-> http://video.devmedia.com.br/discovirtual/201854/Proj%20Patrimonio/rxlib275.rar
-> http://video.devmedia.com.br/discovirtual/201854/Proj%20Patrimonio/VCLSckin%204.8.rar
-> http://video.devmedia.com.br/discovirtual/201854/Proj%20Patrimonio/Componente.rar
-> http://video.devmedia.com.br/discovirtual/201854/Proj%20Patrimonio/Sistemas.rar
-> http://video.devmedia.com.br/discovirtual/201854/Proj%20Patrimonio/TMS_pack_1.part01.rar
-> http://video.devmedia.com.br/discovirtual/201854/Proj%20Patrimonio/TMS_pack_1.part02.rar
-> http://video.devmedia.com.br/discovirtual/201854/Proj%20Patrimonio/TMS_pack_1.part03.rar
-> http://video.devmedia.com.br/discovirtual/201854/Proj%20Patrimonio/TMS_pack_1.part04.rar
-> http://video.devmedia.com.br/discovirtual/201854/Proj%20Patrimonio/TMS_pack_1.part05.ra      tô no aguardo   um abraço
Responder

Gostei + 0

31/07/2009

Irenildo Carvalho

E aí, alguma novidade?     aguardo retorno Um abraço
Responder

Gostei + 0

31/07/2009

Rodrigo Mourão

Olá Amigo, ainda não !!!

O sistema tira-dúvidas se propoes a auxiliar os usuarios a resolver os seus problemas atraves dos post. Bem foi o que eu fiz, postei uma rotina para clonar o código.

A rotina funciona, o erro que ocorre é algum problema em sua aplicacao por isso eu pedi para vc postar seus fontes, mesmo a o suporte não abrangendo a analise do codigo.


Para eu analizar o código preciso montar seu ambiente, que inclui instalar seu banco e todos essas dezenas de componentes que vc usa. Ai aparecem os problema que é erro em componentes do D2009, etc.

Por este motivo vou criar um aplicacao com um tabela apenas, mostrando para vc a rotina funcionando e ai vc adapata ao seu sistema. Isso será mais rápido.

A aplicacao utiliza Access e ADO.

Em 1h eu ja espero ter algo pronto aqui e estarei postando aqui !!!

Abs!!
Responder

Gostei + 0

31/07/2009

Irenildo Carvalho

Ei,     Me desculpa se tô equivocado, mas falei com uma das atendentes antes de contratar o suporte e ela me passou que no suporte teria análise de código, bem como suporte ao banco de dados slq server... Na verdade contratei o suporte porque sou iniciante e tenho muitas dúvidas e dificuldades...     Mas não se preocupe, faça o que der pra fazer, certo?   um abraço   Aguardo retorno...    
Responder

Gostei + 0

02/08/2009

Rodrigo Mourão

Segue Codigo:


var
  i,J: Integer;
begin
  for I := 1 to StrToInt(LabeledEdit2.Text) do
  begin
    AdoInsert.Append;
    for J := 0 to ADODataSet1.FieldCount-1 do
    begin
      case J of
        0: continue;//pula o primeiro campo pois e auto incremento;
        1: begin
             AdoInsert.Fields[J].AsInteger := ADODataSet1.Fields[J].AsInteger+I;      //Incremento do Tombamento
           end
        else
         AdoInsert.Fields[J].Value := ADODataSet1.Fields[J].Value;  //Demais campos
      end;
    end;
    AdoInsert.Post;
  end;
end;


Eu tenho 2 AdoDataSet, um apra pegar o patrimonio e um para inserir as copias. Abaixo segue o link do exemplo feito em delphi e usando seu proprio banco de dados:

http://video.devmedia.com.br/RodrigoCarreiro/Consultoria/Patrimonio.rar


P.S.: Quando disse analise de codigo estava me referindo a analise dos fontes.

Abs!!


Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar