Copiar Somente Um Campo do ClientDataSet2 para o ClientDataSet1 com While

20/09/2018

2

Bom dia!!! Preciso copiar os dados do ClientDataSet2 para um outro que é o ClientDataSet1, com a seguinte condição, se o código de barras do ClientDataSet2(''P_BARRAS1'') for igual ao Código de Barras do ClientDataSet1(''cEAN''), copia o Código do Produto(P_ID) que está no ClientDataSet2 e joga os valores no campo (''CodigoProduto'') que está no ClientDataSet1.

Só que o meu código está fazendo só primeiro item da lista, ele não dá continuidade para o restante da lista, faz somente o primeiro.

Obs1.: o ClientDataSet1 é uma tabela temporaria que eu criei com os campos Descrição / Código de Barras aonde eu clico no botão(button1) e exibo os itens e descrição no dbgrid1, após isso eu clico no botão2 (button2) aonde ele deveria fazer a rotina acima descrita e não faz

Obs2.: o ClientDataSet2 está conectado diretamente ao banco de dados, aonde eu pego pego as informações diretamente do banco de dados

Este é o meu código do botão2

procedure TForm2.Button2Click(Sender: TObject);
begin
   ClientDataSet2.First;
      while not ClientDataSet2.Eof do
         begin
            ClientDataSet1.Edit;
               if (ClientDataSet2.FieldByName(''P_BARRAS1'').AsString) = ClientDataSet1.FieldByName(''cEAN'').AsString then
                    ClientDataSet1.FieldByName(''CodigoProduto'').AsString := ClientDataSet2.FieldByName(''P_ID'').AsString;
                    ClientDataSet1.Post;
                    ClientDataSet2.Next;
         end;
end;


Conto com a ajuda de vocês.

Grato
Responder

Posts

Não sei se entendi o que você pretende, mas vamos lá....
Acredito que não baste comparar com o conteúdo do ClientDataset1, você deve procurar o conteúdo.

Algo assim:
procedure TForm2.Button2Click(Sender: TObject);
begin
   ClientDataSet2.First;

   while not ClientDataSet2.Eof do
   begin

      // se NÃO encontrar o código de barras na tabela destino, insere um registro
      if not ClientDataSet1.Locate('cEAN', ClientDataSet2.FieldByName(''P_BARRAS1'').AsString, []) then
      begin
         ClientDataSet1.Insert;
         ClientDataSet1.FieldByName(''cEAN'').AsString := ClientDataSet2.FieldByName(''P_BARRAS1'').AsString;
      end
      else // se encontrou um código de barras igual, edita o registro
         ClientDataSet1.Edit;

      // atribui ao campo CodigoProduto do ClientDataset1 o conteúdo do campo P_ID do ClientDataset2
      ClientDataSet1.FieldByName(''CodigoProduto'').AsString := ClientDataSet2.FieldByName(''P_ID'').AsString;
      ClientDataSet1.Post;

      // segue para o próximo registro do ClientDataset2
      ClientDataSet2.Next;
   end;
end;
Responder

20/09/2018

Bruno Henrique

Emerson, bom dia!!! Obrigado Pela atenção!!!

Deu certo em partes o código que você me passou!!!

Veja na imagem : https://uploaddeimagens.com.br/imagens/grid-jpg-5c7c37b3-13b5-4309-b86c-5ca99a957755

Ele faz, só que ele insere todos os registro do banco no caso eu tenho mais de 9000 itens, ele insere todos no dbrig, precisaria que inserisse o código somente no que está no grid


E como eu poderia fazer quando o código de barras é igual mas o produto é diferente(no caso é separado por masculino e feminino) no ClientDataSet2, mas o fabricante coloca o mesmo código para os 2 ClientDataSet1, como se fosse um só produto, para não trazer em branco igual na imagem

Veja na imagem: https://uploaddeimagens.com.br/imagens/grid2-jpg
Responder

Ele faz, só que ele insere todos os registro do banco no caso eu tenho mais de 9000 itens, ele insere todos no dbrig, precisaria que inserisse o código somente no que está no grid

Não entendi.

A tua necessidade é deixar o mesmo P_ID pra todos os registros que tenham o mesmo código de barras?
Qual o banco de dados utilizado?
Responder

20/09/2018

Bruno Henrique

Emerson, boa tarde!!!
Não entendi.

A tua necessidade é deixar o mesmo P_ID pra todos os registros que tenham o mesmo código de barras?


É por que, quando chega o xml das notas, nele vem o código de barras dos produtos, o que eu faço, eu importo para o ClientDataSet1, então, o que eu quero fazer, quero verificar, se tem o mesmo produto no meu sistema (ClientDataSet2), para não cadastrar de novo, se tiver eu pego o P_ID, que é o código do meu sistema, no qual uso para dar entrada!

Uso Firebird

Conexões
Sqlconection
DataSetProvider
ClientDataSet
DataSource
Dbgrid
Responder
Ah, entendi.

Então talvez seja melhor você partir do ClientDataset1.

procedure TForm2.Button2Click(Sender: TObject);
begin
   ClientDataSet1.First;
 
   while not ClientDataSet1.Eof do
   begin
      // procura pelo código de barras no cadastro
      if ClientDataSet2.Locate('P_BARRAS1', ClientDataSet1.FieldByName(''cEAN'').AsString, []) then
      begin
         // atribui ao campo CodigoProduto do ClientDataset1 o conteúdo do campo P_ID do ClientDataset2
         ClientDataSet1.Edit;
         ClientDataSet1.FieldByName(''CodigoProduto'').AsString := ClientDataSet2.FieldByName(''P_ID'').AsString;
         ClientDataSet1.Post;
      end;

      // segue para o próximo registro do ClientDataset1
      ClientDataSet1.Next;
   end;
end;
Responder

21/09/2018

Bruno Henrique

Emerson, boa tarde!!!

Deu certo o código!!! Funcionou como eu precisava!!! Obrigado!!!

Você sabe se teria alguma forma para pegar o P_ID, quando os produtos for diferente com código de barras iguais?

Abraços

Grato

Responder