Copiar Somente Um Campo do ClientDataSet2 para o ClientDataSet1 com While

20/09/2018

0

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
Bruno Henrique

Bruno Henrique

Responder

Posts

20/09/2018

Emerson Nascimento

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

20/09/2018

Emerson Nascimento


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

20/09/2018

Emerson Nascimento

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

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar