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

Duplicar registros do Dbgrid


rebotea

Pergunta

Boas

Amigos como poderei copiar e colar outra vez em um dbgrid os valores no mesmo Dbgrig depois de enviar os dados para o Clipbrd, já tentei varias formas não esta dando certo. (Adiciono na tabela mestre um registo novo e quero adicionar os campos do dbgrid enviados para Clipbrd) . Obrigado

var

Linhas: TStringList;

i, posicao: integer;

s: string;

aField : Variant;

j : Integer;

H : Integer;

begin

Linhas := TStringList.Create;

Clipboard.Open;

try

with copiar1 do

begin

DSub_TRelFinal.AutoEdit:= true;

DataSource.DataSet.DisableControls;

Posicao := DataSource.DataSet.RecNo;

DataSource.DataSet.First;

while not DataSource.DataSet.Eof do

begin

s := '';

for i := 0 to Columns.Count - 1 do

begin

if i > 0 then s := s + #9; // Tabulação

s := s + Columns.Items.Field.Text;

end;

Linhas.Add(s);

DataSource.DataSet.Next;

end;

DataSource.DataSet.RecNo := Posicao;

DataSource.DataSet.EnableControls;

end;

Clipboard.SetTextBuf(Pointer(Linhas.Text));

finally

Linhas.Free;

Clipboard.Close;

try

// Create a variant Array

aField := VarArrayCreate(

[0,Sub_TRelFinal.Fieldcount-1],

VarVariant);

// read values into the array

for j := 0 to (Sub_TRelFinal.Fieldcount-1) do

begin

aField[j] := Sub_TRelFinal.fields[j].Value ;

end;

Sub_TRelFinal.Append ;

// Put array values into new the record

for j := 0 to (Sub_TRelFinal.Fieldcount-1) do

begin

//readOnly := SubTRelFinal.Fields.ReadOnly;

// SubTRelFinal.Fields.ReadOnly := false;

Sub_TRelFinal.fields[j].Value := aField[j] ;

// SubTRelFinal.Fields.ReadOnly := readOnly;

end;

except

DSub_TRelFinal.AutoEdit:= true ;

Sub_TRelFinal.FieldByName('localizacao').AsString := copiarlocal.text;

Sub_TRelFinal.FieldByName('Obra').AsString := copiarobra.text;

Sub_TRelFinal.FieldByName('Data_VisitaLocal').AsString := defnidata.Text;

Sub_TRelFinal.FieldByName('Data_Proxima_visita').AsString := '' ;

Sub_TRelFinal.FieldByName('data_relatorio').AsString := '';

Sub_TRelFinal.post;

Sub_TRelFinal.edit;

end;

end;

Link para o comentário
Compartilhar em outros sites

12 respostass a esta questão

Posts Recomendados

  • 0
Amigos como poderei copiar e colar outra vez em um dbgrid os valores no mesmo Dbgrig depois de enviar os dados para o Clipbrd, já tentei varias formas não esta dando certo. (Adiciono na tabela mestre um registo novo e quero adicionar os campos do dbgrid enviados para Clipbrd) . Obrigado

Copiando os registros selecionados num dbgrid para o clipboard

Procedure CopyDBGridToClipboard(DBGrid: TDBGrid; WithHeader: Boolean;
 SelectedOnly: Boolean);
var
  Linhas: TStringList;
  i, posicao, iSelec: integer;
  s: string;
begin
  Linhas := TStringList.Create;
  Clipboard.Open;
  Screen.Cursor := crHourGlass;
  try
    // Copia o Cabeçalho do DBGrid
    if WithHeader then
    begin
      s := '';
      for i := 0 to DBGrid.Columns.Count - 1 do
      begin
        if i > 0 then
          s := s + #9; // Tabulação
        s := s + DBGrid.Columns.Items[i].Field.DisplayLabel;
      end;
      Linhas.Add(s);
    end;

    DBGrid.DataSource.DataSet.DisableControls;
    // Copia os dados dos REGISTROS SELECIONADOS no DBGrid
    if (SelectedOnly) and (DBGrid.SelectedRows.Count > 0) then
    begin
      for iSelec := 0 to DBGrid.SelectedRows.Count-1 do
      begin
        DBGrid.DataSource.DataSet.GotoBookmark(pointer(
         DBGrid.SelectedRows.Items[iSelec]));
        s := '';
        for i := 0 to DBGrid.Columns.Count - 1 do
        begin
          if i > 0 then
            s := s + #9; // Tabulação
          s := s + DBGrid.Columns.Items[i].Field.Text;
        end;
        Linhas.Add(s);
      end;
      DBGrid.DataSource.DataSet.GotoBookmark(pointer(
       DBGrid.SelectedRows.Items[0]));
    end
    // Copia os dados de TODOS OS REGISTROS do DBGrid
    else
    begin
      Posicao := DBGrid.DataSource.DataSet.RecNo;
      DBGrid.DataSource.DataSet.First;
      while not DBGrid.DataSource.DataSet.Eof do
      begin
        s := '';
        for i := 0 to DBGrid.Columns.Count - 1 do
        begin
          if i > 0 then
            s := s + #9; // Tabulação
          s := s + DBGrid.Columns.Items[i].Field.Text;
        end;
        Linhas.Add(s);
        DBGrid.DataSource.DataSet.Next;
      end;
      DBGrid.DataSource.DataSet.RecNo := Posicao;
    end;
    DBGrid.DataSource.DataSet.EnableControls;

    Clipboard.SetTextBuf(Pointer(Linhas.Text));
  finally
    Linhas.Free;
    Clipboard.Close;
    Screen.Cursor := crDefault;
  end;
end;

Veja tambem

http://scriptbrasil.com.br/forum/index.php...st&p=433423

ou este

http://stackoverflow.com/questions/397413/...id-to-clipboard

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Brigado mas a minha dificuldade e quando tenho os dados no Clipbrd como posso montar eles novamente no novo registro (Dgrid1)

Basta fazer o processo inverso ... mas porque há a necessidade de fazer isso ?

abraço

Para replicar os valores após inserir mais um registro Mestre! ou existe alguma forma mais simples?

Obrigadro

Editado por rebotea
Link para o comentário
Compartilhar em outros sites

  • 0
Para replicar os valores após inserir mais um registro Mestre! ou existe alguma forma mais simples?
claro que existe uma forma mais simples, voce é que esta querendo fazer do jeito mais dificil ..rs

atribua os valores dos campos a variaveis depois voce joga de volta os valores das variaveis aos campos novamente

exemplo

nome := TabelaNome.Value;

endereco := TabelaEndereco.value;

telefone := TabelaTelefone.value;

depois voce faz o inverso

TabelaNome.Value := nome;

TabelaEndereco.value := endereço;

TabelaTelefone.value := telefone;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Para replicar os valores após inserir mais um registro Mestre! ou existe alguma forma mais simples?
claro que existe uma forma mais simples, voce é que esta querendo fazer do jeito mais dificil ..rs

atribua os valores dos campos a variaveis depois voce joga de volta os valores das variaveis aos campos novamente

exemplo

nome := TabelaNome.Value;

endereco := TabelaEndereco.value;

telefone := TabelaTelefone.value;

depois voce faz o inverso

TabelaNome.Value := nome;

TabelaEndereco.value := endereço;

TabelaTelefone.value := telefone;

abraço

o que achei mais facil de fazer foi :

Pego os dados da tabela Mastre e duplico os mesmos, ao mesmo tempo faço uma consulta do registro filho que tem N registros do mestre e passao eles da de um dbgrid de tabela consulta para o destino depois de inserir o mestre. Axa que fica bem assim!!!!!!!!!!!!!!!

var

i: Integer;

j: Integer;

begin

ShowMessage('Vai Adicionar nova visita a "'+cxDBTextEdit5.Text+'..........' +obra.Text);

Edit_consultaCop.Text:=NInterv.Text;

// Duplica as informações do registro atual

DSub_TRelFinal.AutoEdit:= true;

DuplicaRegistroDataSet(Sub_TRelFinal,

Sub_TRelFinal.RecNo,

['numeracao','Conclusoes','data_relatorio','Observações','Data_Proxima_visita']);

Sub_TRelFinal.FieldByName('Data_VisitaLocal').AsString := defnidata.Text;

Sub_TRelFinal.Post ;

// Duplicar registo Sub

DBcopiar.SelectedRows.SelectAll;

if DBcopiar.SelectedRows.Count in [0..1] then

begin

DBdestino.DataSource.DataSet.Append;

for j := 0 to DBcopiar.FieldCount - 1 do

begin

DBdestino.DataSource.DataSet.Edit;

DBdestino.Fields[j].Value := DBcopiar.Fields[j].Value;

end;

DBdestino.DataSource.DataSet.Post;

begin

//elimina na tabela origem ao copiar

//DBcopiar.DataSource.DataSet.Delete;

end;

end

else if DBcopiar.SelectedRows.Count>1 then

begin

for i := 0 to DBcopiar.SelectedRows.Count - 1 do

begin

DBcopiar.DataSource.DataSet.GotoBookmark(Pointer(DBcopiar.SelectedRows));

DBdestino.DataSource.DataSet.Append;

for j := 0 to DBcopiar.FieldCount - 1 do

begin

DBdestino.DataSource.DataSet.Edit;

DBdestino.Fields[j].Value := DBcopiar.Fields[j].Value;

end;

DBdestino.DataSource.DataSet.Post;

begin

//elimina na tabela origem ao Copiar

//DBcopiar.DataSource.DataSet.Delete;

end;

end;

end;

Q_SubTRelFinal_sub.Close;

ShowMessage('A nova Visita fica para "'+Obra.Text+'.........' +DBDateTimeEditEh3.Text);

end;

//para duplicar o registro Mestre

procedure DuplicaRegistroDataSet(

dataSet: TDataSet;

recNo: integer;

camposIgnorar: array of string);

function IgnorarCampo(campo: string): boolean;

var

i: integer;

begin

Result := false;

for i := 0 to Length(camposIgnorar) - 1 do

begin

if (camposIgnorar = campo) then

begin

Result := true;

Break;

end;

end;

end;

var

valores: Variant;

i: integer;

readOnly: boolean;

begin

// Duplica o registro "recNo" de um dataset

dataSet.RecNo := recNo;

valores := VarArrayCreate([0, dataSet.FieldCount - 1],

VarVariant);

for i := 0 to (dataSet.FieldCount - 1) do

valores := dataSet.Fields.Value;

dataSet.Append;

for i := 0 to (dataSet.FieldCount - 1) do

begin

if (not(IgnorarCampo(dataSet.Fields.FieldName)))

then

begin

readOnly := dataSet.Fields.ReadOnly;

dataSet.Fields.ReadOnly := false;

dataSet.Fields.Value := valores;

dataSet.Fields.ReadOnly := readOnly;

end;

end;

end;

Link para o comentário
Compartilhar em outros sites

  • 0
o que achei mais facil de fazer foi :

Pego os dados da tabela Mastre e duplico os mesmos, ao mesmo tempo faço uma consulta do registro filho que tem N registros do mestre e passao eles da de um dbgrid de tabela consulta para o destino depois de inserir o mestre. Axa que fica bem assim!!!!!!!!!!!!!!!

o seu código está bom ....mas existem maneiras melhores ( menos código ) , mas com a experiência voce vai aprender

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
o que achei mais facil de fazer foi :

Pego os dados da tabela Mastre e duplico os mesmos, ao mesmo tempo faço uma consulta do registro filho que tem N registros do mestre e passao eles da de um dbgrid de tabela consulta para o destino depois de inserir o mestre. Axa que fica bem assim!!!!!!!!!!!!!!!

o seu código está bom ....mas existem maneiras melhores ( menos código ) , mas com a experiência voce vai aprender

abraço

Acredito que sim.. Obrigado

Mas uma coisa e certa fica dificil duplicar registos em escada 1 para muitos

1| Tabela mestre

|| Filho

||| Sub

|||||||||||||||||||||||||||||| SUBB

a que ate agora so consegui duplicar ate a tabela filho .. Sera que existe algum segrede para duplicar os dados automaticamente apartir da Tabela Meste até a SUBB ???? ou sou novo demais para perceber como poderei fazer isso!!!! se alguém tiver uma dica\codigo Agradeçido.

Rebotea@gmail.com

Link para o comentário
Compartilhar em outros sites

  • 0
a que ate agora so consegui duplicar ate a tabela filho .. Sera que existe algum segredo para duplicar os dados automaticamente apartir da Tabela Meste até a SUBB ????

existir um modo existe, entretanto dependendo do que voce pretende fazer no programa não é aconselhável, voce vai povoar a tabela com informações desnecessárias e peder performance no uso em rede

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

mas a minha necessidade prende-se com:

Imaginando seu quadro carro que tem N equipamentos quendo vai a revisão faz um cheklist esse cheklist fica guardado para ano , no ano seguinte pega o chekliste retira as variaveis e data ele e já esta pronto a utilizar..

obrigado

Link para o comentário
Compartilhar em outros sites

  • 0
Imaginando seu quadro carro que tem N equipamentos quendo vai a revisão faz um cheklist esse cheklist fica guardado para ano , no ano seguinte pega o chekliste retira as variaveis e data ele e já esta pronto a utilizar..

Veja como funciona o relacionamento de 1 para N em tabelas

http://3.bp.blogspot.com/_buFzmAtZPuc/SUby...tegoriasDER.gif

O relacionamento demonstrado acima indica que uma “Categoria” pode classificar muitos produtos. Sendo que o “Produto” somente pode ser classificado por uma “Categoria”. Este tipo de relacionamento chama-se “Um para N” (1-N). No relacionamento “Um para N” a chave (campo de relacionamento) aponta para a tabela “N”, no caso “Produtos”.

Isso quer dizer que na tabela Producs, existe uma coluna que referencia a tabela “Categories”. Em outras palavras: A coluna “CategoryID”, de “Producs” aponta para a “CategoryID” de “Categories”.

Veja a partir da pagina 7 dessa apostila

http://www.fema.com.br/~schiavo/files/Apos...D5_Modulo03.pdf

Outros

http://www.ramosdainformatica.com.br/art_r...s01.php?CDA=853

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Imaginando seu quadro carro que tem N equipamentos quendo vai a revisão faz um cheklist esse cheklist fica guardado para ano , no ano seguinte pega o chekliste retira as variaveis e data ele e já esta pronto a utilizar..

Veja como funciona o relacionamento de 1 para N em tabelas

http://3.bp.blogspot.com/_buFzmAtZPuc/SUby...tegoriasDER.gif

O relacionamento demonstrado acima indica que uma “Categoria” pode classificar muitos produtos. Sendo que o “Produto” somente pode ser classificado por uma “Categoria”. Este tipo de relacionamento chama-se “Um para N” (1-N). No relacionamento “Um para N” a chave (campo de relacionamento) aponta para a tabela “N”, no caso “Produtos”.

Isso quer dizer que na tabela Producs, existe uma coluna que referencia a tabela “Categories”. Em outras palavras: A coluna “CategoryID”, de “Producs” aponta para a “CategoryID” de “Categories”.

Veja a partir da pagina 7 dessa apostila

http://www.fema.com.br/~schiavo/files/Apos...D5_Modulo03.pdf

Outros

http://www.ramosdainformatica.com.br/art_r...s01.php?CDA=853

abraço

Obrigado

mas meu problema e sempre ao duplicar os muitos de uma tebela indexada1 para muitos .

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