Esta rotina que estou te passando faz isto via ClientDataset. Crio CDS´s
temporarios que pegam os itens de um plano de ação e depois grava tudo num
novo registor já com nova chave primária.


procedure TfvPlanosDeAcao.Panel11LinkDuplicate(DS: TDataSource);
var
  iFieldReg: integer;
  sOldIdPlan, sNewIdPlan : String;
  aFieldDefs : array of variant;
  cdsTmpItensPlano, cdsTmpAtividadesItens, cdsTmpComoFazerItensPlano:
TClientDataSet;
begin
  inherited;
  //
  // Tipos de TFieldTypes: ftUnknown, ftString, ftSmallint, ftInteger,
ftWord, ftBoolean,
  // ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, ftBytes,
ftVarBytes,
  // ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo, ftParadoxOle,
ftDBaseOle,
  // ftTypedBinary, ftCursor, ftFixedChar, ftWideString, ftLargeint, ftADT,
ftArray,
  // ftReference, ftDataSet, ftOraBlob, ftOraClob, ftVariant, ftInterface,
ftIDispatch,
  // ftGuid, ftTimeStamp, ftFMTBcd
  //
  sNewIdPlan := FormatDateTime('ddmmyyyyhhmmss',now);
  // Pega os campos do plano de acão
  SetLength(aFieldDefs,DMSGG.dsPlanoAcao.DataSet.FieldCount);
  aFieldDefs[0] := sNewIdPlan;
  sOldIdPlan := DMSGG.dsPlanoAcao.DataSet.Fields[0].Value;
  for iFieldReg := 1 to DMSGG.dsPlanoAcao.DataSet.FieldCount -2 do
    aFieldDefs[iFieldReg] :=
DMSGG.dsPlanoAcao.DataSet.Fields[iFieldReg].Value;
  DMSGG.dsPlanoAcao.DataSet.insert;
  for iFieldReg := 0 to DMSGG.dsPlanoAcao.DataSet.FieldCount -2 do
    DMSGG.dsPlanoAcao.DataSet.Fields[iFieldReg].Value :=
aFieldDefs[iFieldReg];
  DMSGG.dsPlanoAcao.DataSet.Post;
  //
  // Pega os campos dos itens do plano de acão
  if DMSGG.dsPlanoAcao.DataSet.locate('IDPLANO',sOldIdPlan,
[loCaseInsensitive, loPartialKey]) then
  begin
    // Duplica os ítens do plano de ação
    cdsTmpItensPlano := TClientDataset.Create(nil);
    cdsTmpItensPlano.FieldDefs.Add('IDPLANO',ftString,15,False);
    cdsTmpItensPlano.FieldDefs.Add('ITEM',ftInteger,0,False);
    cdsTmpItensPlano.FieldDefs.Add('TIPOITEM',ftInteger,0,False);
    cdsTmpItensPlano.FieldDefs.Add('MESCOMP',ftInteger,0,False);
    cdsTmpItensPlano.FieldDefs.Add('ANOCOMP',ftInteger,0,False);
    cdsTmpItensPlano.FieldDefs.Add('MACROAREA',ftString,16,False);
    cdsTmpItensPlano.FieldDefs.Add('MOTIVO',ftString,25,False);
    cdsTmpItensPlano.FieldDefs.Add('ATIVIDADE',ftMemo,0,False);
    cdsTmpItensPlano.FieldDefs.Add('JUSTIFICATIVA',ftMemo,0,False);
    cdsTmpItensPlano.FieldDefs.Add('SEGMENTO',ftString,10,False);
    cdsTmpItensPlano.PacketRecords := 1;
    cdsTmpItensPlano.CreateDataSet;
    cdsTmpComoFazerItensPlano := TClientDataset.Create(nil);
    cdsTmpComoFazerItensPlano.FieldDefs.Add('IDPLANO',ftString,15,False);
    cdsTmpComoFazerItensPlano.FieldDefs.Add('ITEM',ftInteger,0,False);
    cdsTmpComoFazerItensPlano.FieldDefs.Add('TIPOITEM',ftInteger,0,False);
 
cdsTmpComoFazerItensPlano.FieldDefs.Add('ITEMCOMOFAZER',ftInteger,0,False);
    cdsTmpComoFazerItensPlano.FieldDefs.Add('STATUS',ftString,2,False);
    cdsTmpComoFazerItensPlano.FieldDefs.Add('MACROAREA',ftString,25,False);
    cdsTmpComoFazerItensPlano.FieldDefs.Add('COMOFAZER',ftMemo,0,False);
 
cdsTmpComoFazerItensPlano.FieldDefs.Add('RESPONSAVEL',ftString,60,False);
    cdsTmpComoFazerItensPlano.FieldDefs.Add('PRAZO',ftDateTime,0,False);
    cdsTmpComoFazerItensPlano.FieldDefs.Add('PERIODO',ftString,12,False);
    cdsTmpComoFazerItensPlano.PacketRecords := 1;
    cdsTmpComoFazerItensPlano.CreateDataSet;
    cdsTmpAtividadesItens := TClientDataset.Create(nil);
    cdsTmpAtividadesItens.FieldDefs.Add('IDPLANO',ftString,15,False);
    cdsTmpAtividadesItens.FieldDefs.Add('ITEM',ftInteger,0,False);
    cdsTmpAtividadesItens.FieldDefs.Add('TIPOITEM',ftInteger,0,False);
    cdsTmpAtividadesItens.FieldDefs.Add('MESCOMP',ftInteger,0,False);
    cdsTmpAtividadesItens.FieldDefs.Add('ANOCOMP',ftInteger,0,False);
    cdsTmpAtividadesItens.FieldDefs.Add('MESEXERCICIO',ftString,3,False);
    cdsTmpAtividadesItens.FieldDefs.Add('ATIVIDADE',ftMemo,0,False);
    cdsTmpAtividadesItens.FieldDefs.Add('META',ftString,50,False);
    cdsTmpAtividadesItens.FieldDefs.Add('REALIZADO',ftString,50,False);
    cdsTmpAtividadesItens.FieldDefs.Add('VALORREALIZADO',ftFloat,0,False);
    cdsTmpAtividadesItens.FieldDefs.Add('VALORMETA',ftFloat,0,False);
    cdsTmpAtividadesItens.FieldDefs.Add('VALORSALDO',ftFloat,0,False);
    cdsTmpAtividadesItens.PacketRecords := 1;
    cdsTmpAtividadesItens.CreateDataSet;
    //
    while not DMSGG.dsItensPlano.DataSet.Eof do
    begin
      cdsTmpItensPlano.Insert;
      cdsTmpItensPlano.FieldByName('IDPLANO').AsString := sNewIdPlan;
      for iFieldReg := 1 to DMSGG.dsItensPlano.DataSet.FieldCount -3 do
        cdsTmpItensPlano.FieldList.Fields[iFieldReg].Value :=
DMSGG.dsItensPlano.DataSet.Fields[iFieldReg].Value;
      cdsTmpItensPlano.Post;
      //
      while not DMSGG.dsComoFazerItensPlano.DataSet.Eof do
      begin
        cdsTmpComoFazerItensPlano.Insert;
        cdsTmpComoFazerItensPlano.FieldByName('IDPLANO').AsString :=
sNewIdPlan;
        for iFieldReg := 1 to DMSGG.dsComoFazerItensPlano.DataSet.FieldCount
-1 do
          cdsTmpComoFazerItensPlano.FieldList.Fields[iFieldReg].Value :=
DMSGG.dsComoFazerItensPlano.DataSet.Fields[iFieldReg].Value;
        cdsTmpComoFazerItensPlano.Post;
        DMSGG.dsComoFazerItensPlano.DataSet.Next;
      end;
      while not DMSGG.dsAtividadesItem.DataSet.Eof do
      begin
        cdsTmpAtividadesItens.Insert;
        cdsTmpAtividadesItens.FieldByName('IDPLANO').AsString := sNewIdPlan;
        for iFieldReg := 1 to DMSGG.dsAtividadesItem.DataSet.FieldCount -1
do
          cdsTmpAtividadesItens.FieldList.Fields[iFieldReg].Value :=
DMSGG.dsAtividadesItem.DataSet.Fields[iFieldReg].Value;
        cdsTmpAtividadesItens.Post;
        DMSGG.dsAtividadesItem.DataSet.Next;
      end;
      //
      DMSGG.dsItensPlano.DataSet.Next;
    end;
    while not cdsTmpItensPlano.Eof do
    begin
      DMSGG.dsItensPlano.DataSet.Insert;
      for iFieldReg := 0 to cdsTmpItensPlano.FieldCount -1 do
        DMSGG.dsItensPlano.DataSet.Fields[iFieldReg].Value :=
cdsTmpItensPlano.FieldList.Fields[iFieldReg].Value;
      DMSGG.dsItensPlano.DataSet.Post;
      cdsTmpItensPlano.Next;
    end;
    cdsTmpItensPlano.Close;
    FreeAndNil(cdsTmpItensPlano);
    // Duplica os como fazer dos ítens do plano de ação
    while not cdsTmpComoFazerItensPlano.Eof do
    begin
      DMSGG.dsComoFazerItensPlano.DataSet.Insert;
      for iFieldReg := 0 to cdsTmpComoFazerItensPlano.FieldCount -1 do
        DMSGG.dsComoFazerItensPlano.DataSet.Fields[iFieldReg].Value :=
cdsTmpComoFazerItensPlano.FieldList.Fields[iFieldReg].Value;
      DMSGG.dsComoFazerItensPlano.DataSet.Post;
      cdsTmpComoFazerItensPlano.Next;
    end;
    cdsTmpComoFazerItensPlano.Close;
    FreeAndNil(cdsTmpComoFazerItensPlano);
    // Duplica os como fazer das Atividades do ítem do plano de ação
    while not cdsTmpAtividadesItens.Eof do
    begin
      DMSGG.dsAtividadesItem.DataSet.Insert;
      for iFieldReg := 0 to cdsTmpAtividadesItens.FieldCount -1 do
        DMSGG.dsAtividadesItem.DataSet.Fields[iFieldReg].Value :=
cdsTmpAtividadesItens.FieldList.Fields[iFieldReg].Value;
      DMSGG.dsAtividadesItem.DataSet.Post;
      cdsTmpAtividadesItens.Next;
    end;
    cdsTmpAtividadesItens.Close;
    FreeAndNil(cdsTmpAtividadesItens);
   //
  end;
  //
  if (DMSGG.dsPlanoAcao.DataSet as TClientDataset).ApplyUpdates(0) <> 0 then
    raise EDataBaseError.Create(Exception(exceptobject).Message);
  //
end;

[]s

Walter Alves Chagas Junior
Projeto e desenvolvimento de sistemas
Telemont Engenharia de telecomunicações
Belo Horizonte - MG - Brazil
[EMAIL PROTECTED]
Fone: (31) 3389-8215 Fax: (31) 3389-8200


-----Mensagem original-----
De: delphi-br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED]
nome de Eduardo Silva ®
Enviada em: terça-feira, 11 de abril de 2006 09:48
Para: Grupo Delphi-br
Assunto: [delphi-br] Copiar dados


Galera, preciso duplicar um (ou mais) registro da minha tabela da seguinte
forma:

quando eu estiver em cima do registro desejado, eu clico em um botão e ele
duplica esse registro dentro da mesma tabela.

Por exemplo, eu tenho uma certa quantidade de registros cadastradas, se, no
meio de um deles, eu precisar colocar um outro, não quero ter que copiar na
"unha" esse registro e alterar o que eu preciso.

Eu gostaria de ter um botão, jogar esse registro com se fosse um novo e dai
alterar o que ficou duplicado.

Me deu um branco total agora e eu não to conseguindo fazer.

Alguém pode me dar uma mão?

Uso delphi 5 e paradox.

      __    __
     /  \ /| |'-.
    .\__/ || |   |
_ /  `._ \|_|_.-'
| /  \__.`=._) (_
|/ ._/  |"""""""""|
|'.  `\ |         | Eduardo de Almeida Silva
;"""/ / |         | Kobra Sistemas
) /_/|  |.-------.| Desenvolvimento de Software
'  `-` ' "       "



-- 
<<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>


 
Links do Yahoo! Grupos




 




[As partes desta mensagem que não continham texto foram removidas]



-- 
<<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>

<*> Para ver as mensagens antigas, acesse:
    http://br.groups.yahoo.com/group/delphi-br/messages

<*> Para falar com o moderador, envie um e-mail para:
    [EMAIL PROTECTED]
 
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/delphi-br/

<*> Para sair deste grupo, envie um e-mail para:
    [EMAIL PROTECTED]

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html

 



Responder a