ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Duvida - Comparando valores em memoria com ClientDataSet

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
RFG
Novato
Novato


Registrado: Quarta-Feira, 18 de Mai de 2005
Mensagens: 85

MensagemEnviada: Qua Jul 11, 2018 3:29 pm    Assunto: Duvida - Comparando valores em memoria com ClientDataSet Responder com Citação

Boa tarde pessoal.

Estou com um pequeno projeto que nomeei de conferencia cega o "imex" me ajudou muito no topico: "Duvida - Usando ClientDataSet para trabalhar em memoria". No form tenho um pagecontrol com três tabsheets, no primeiro coloquei um dbgrid ligado a um ADOQuery, onde faço uma consulta no banco de dados e armazeno de forma virtual a um e um ClientDataSet. A consulta ao banco é atraves do número do pedido e exibo as colunas EAN, PRODUTO e a QTD comprada de cada item.

Ex.:

1234,Produto1, 144
1235,Produto2, 250

Até aqui, tudo redondinho...

No segundo tabsheet eu tenho um edit para digitação do EAN e um dbgrid ligado a um clientdataset que trabalha em memoria nele tenho as seguintes colunas: SEQ,EAN,QTD e CFC, sem vinculo com o banco de dados. No campo SEQ eu gostaria de inserir um contator para mostrar o número de cada linha, a coluna EAN guarda o código digitado ou escaneado através do edit, o campo QTD recebe sempre 1, para obrigar que cada item seja bipado ou digitado e o campo CFC recebe S ou N indicando se o produto está fora ou não do pedido, esta validação configurei no OnExit do edit, para sempre consultar o EAN no pedido e identificar se chegou algum item que teoricamente não foi comprado.

Dado sequencia ao exemplo acima:

Ex.:

1,1234,1,N
2,1234,1,N
3,9999,1,S
4,1235,1,N

Com exceção da primeira coluna deste exemplo, que seria o SEQ que eu gostaria de fazer mas não consegui, o resto está redondinho também.

Agora vem a outra parte que não estou conseguindo fazer, na verdade, nem sei como começar. Eu preciso que após a finalização da contagem do pedido (essa finalização pode ser indicada por um click em um button), exista um comparativo do que foi bipado ou digitado com o que está no pedido, assim poderemos identificar as diferenças de quantidade e dos itens que não estavam no pedido mas vieram de forma física.

Mais uma vez, obrigado pelo tempo.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 8748
Localização: Sinop-MT

MensagemEnviada: Qua Jul 11, 2018 6:15 pm    Assunto: Responder com Citação

1. sequencia:

Código:
campoSEQ.Value := ClientDataSet.RecNo;


assim ele vai colocar o numero do registro atual, vc so nao pode excluir registros senao fura a sequencia

2. depois q vc "bipar" todos itens, vc quer conferir as quantidade de cada um? sempre sera um, ou os itens poderam ter mais quantidade?
pra verificar os itens:
Código:
cds.first;
while not cds.eof do
begin
  if cdsItensPedido.Locate('ean', cdsEAND.AsStriing, []) then
  begin
     { faca a comparacao aqui }
  end;
  cds.next;
end;

_________________
<b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
RFG
Novato
Novato


Registrado: Quarta-Feira, 18 de Mai de 2005
Mensagens: 85

MensagemEnviada: Qua Jul 11, 2018 8:58 pm    Assunto: Responder com Citação

Boa noite Joemil, agradeço sua atenção.
Amigo, não sei se fiz algo errado, mas quando inseri o código para o campo sequencial o valor que aparece é o -1 e ele se repete para cada linha que eu incluo. Meu código ficou assim:

1. Tabsheet coletor

Código:

procedure TFrmConferenciaCega.Edit2Exit(Sender: TObject);
begin
  if Edit2.Text = '' then
  Button1.SetFocus
  else
  if not CDSPedido.Locate('EAN',Edit2.Text,[]) then
  begin
    ClientDataSetColetor.Append;
    ClientDataSetColetor.FieldByName('IDSEQ').Value := ClientDataSetColetor.RecNo;
    ClientDataSetColetor.FieldByName('EAN').AsString:= Edit2.Text;
    ClientDataSetColetor.FieldByName('QTDE').AsInteger:= 1;
    ClientDataSetColetor.FieldByName('CFC').AsString:= 'S';
    ClientDataSetColetor.Post;
    Edit2.Clear;
    Edit2.SetFocus;
  end
  else
  if CDSPedido.Locate('EAN',Edit2.Text,[]) then
  begin
    ClientDataSetColetor.Append;
    ClientDataSetColetor.FieldByName('IDSEQ').Value := ClientDataSetColetor.RecNo;
    ClientDataSetColetor.FieldByName('EAN').AsString:= Edit2.Text;
    ClientDataSetColetor.FieldByName('QTDE').AsInteger:= 1;
    ClientDataSetColetor.FieldByName('CFC').AsString:= 'N';
    ClientDataSetColetor.Post;
    Edit2.Clear;
    Edit2.SetFocus;
  end;
end;


Obs.: Lembrando que este ClientDataSetColetor é virtual, não tem vinculo com BD, se fechar o exe, o que foi bipado e armazenado nele será apagado.


2.Tabsheet resumo consulta
Código:

procedure TFrmConferenciaCega.Button2Click(Sender: TObject);
var
  strSqlLog: string;
  mensagem: string;
begin
  strSqlLog:= 'Select P.EMISSAO,P.PROGRAMACA,P.LOCESCRITU,O.CODIGO,P.LOCENTREGA,D.CODIGO,P.CHCRIACAO,P.PESSOA,F.NOME,P.TIPO,TP.CODIGO,P.NUMERO,P.CHAVE,P.RECURSO,EAN.CODIGO as EAN,R.NOME as NOME_RECURSO,P.QUANTIDADE,P.UNITARIO,P.TOTAL, 1 as CT from PEDIDO P ';
  strSqlLog:= strSqlLog + 'left join recurso R on (R.CHAVE = P.RECURSO) left join codigo EAN  on (EAN.CLASSE = -1897054264 and EAN.MAE = P.RECURSO) left join entidade F on (F.CHAVE = P.PESSOA) left join entidade O on (O.CHAVE = P.LOCESCRITU) ';
  strSqlLog:= strSqlLog + 'left join entidade D on (D.CHAVE = P.LOCENTREGA) left join tabela TP on (TP.CHAVE = P.TIPO) where P.TIPOOPERACAO Is Null and P.ECOTACAO is null and ((P.CHPEDBAIXA>0 and P.BAIXAAUTOM is null and P.MOVIMENTAC is null)) ';
  strSqlLog:= strSqlLog + 'and (P.CHCRIACAO = '+ #39 + (Edit1.Text) + #39' or P.CHAVE = '+ #39 + (Edit1.Text) + #39') Order By P.CHCRIACAO,P.CHAVE';

  FrmConferenciaCega.ADOQueryPEDIDO.Close;
//  FrmConferenciaCega.ADOQueryPEDIDO.Parameters.ParamByName('chcria').Value:= Edit1.Text;
  FrmConferenciaCega.CDSPedido.Close;
  FrmConferenciaCega.ADOQueryPEDIDO.SQL.Clear;
  FrmConferenciaCega.ADOQueryPEDIDO.SQL.Add(StrSqlLog);
  FrmConferenciaCega.ADOQueryPEDIDO.Open;
  FrmConferenciaCega.CDSPedido.Open;

end;



Neste segundo eu realmente não sei como fazer, eu não sei se seria possível, adicionar outro dbgrid apresentando os itens da consulta inicial e mais duas colunas, uma com o total de cada um dos itens contados para poder subtrair as quantidades e outra com o resultado.

Ex.: dbgrid

|EAN |PRODUTO |QTD PEDIDO |QTD BIPADA |DIVERG | CFC |
| 1234 | Produto1 | 144 | 143 | -1 | N |
| 1235 | Produto2 | 250 | 250 | 0 | N
| 9999 | | 0 | 1 | 1 | S |

Esta ultima linha apresenta um item que não estava cadastrado no pedido de compras, mas chegou fisicamente, então a divergencia que deu na primeira linha foi por conta dele.

Código:
cds.first;
while not cds.eof do
begin
  if cdsItensPedido.Locate('ean', cdsEAND.AsStriing, []) then
  begin
     { ??? - Como poderia ser? }
  end;
  cds.next;
end;
[/quote]
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 8748
Localização: Sinop-MT

MensagemEnviada: Qui Jul 12, 2018 9:00 am    Assunto: Responder com Citação

primeira parte: veja se isto funciona

Código:
procedure TFrmConferenciaCega.Edit2Exit(Sender: TObject);
begin
  if Edit2.Text = '' then
  begin 
    Button1.SetFocus
    Exit;   
  end;

  ClientDataSetColetor.Append;
  ClientDataSetColetor.FieldByName('EAN').AsString:= Edit2.Text;
  ClientDataSetColetor.FieldByName('QTDE').AsInteger:= 1;
 
  if not CDSPedido.Locate('EAN',Edit2.Text,[]) then
    ClientDataSetColetor.FieldByName('CFC').AsString:= 'S'
  else
    ClientDataSetColetor.FieldByName('CFC').AsString:= 'N';
  ClientDataSetColetor.Post;
 
  ClientDataSetColetor.Edit;
  ClientDataSetColetor.FieldByName('IDSEQ').Value := ClientDataSetColetor.RecNo;
  ClientDataSetColetor.Post;
  Edit2.Clear;
  Edit2.SetFocus;
 
end;

_________________
<b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
RFG
Novato
Novato


Registrado: Quarta-Feira, 18 de Mai de 2005
Mensagens: 85

MensagemEnviada: Qui Jul 12, 2018 9:20 am    Assunto: Responder com Citação

Bom dia Joemil...

Perfeito, essa primeira parte funcionou sim!

joemil escreveu:
primeira parte: veja se isto funciona

Código:
procedure TFrmConferenciaCega.Edit2Exit(Sender: TObject);
begin
  if Edit2.Text = '' then
  begin 
    Button1.SetFocus
    Exit;   
  end;

  ClientDataSetColetor.Append;
  ClientDataSetColetor.FieldByName('EAN').AsString:= Edit2.Text;
  ClientDataSetColetor.FieldByName('QTDE').AsInteger:= 1;
 
  if not CDSPedido.Locate('EAN',Edit2.Text,[]) then
    ClientDataSetColetor.FieldByName('CFC').AsString:= 'S'
  else
    ClientDataSetColetor.FieldByName('CFC').AsString:= 'N';
  ClientDataSetColetor.Post;
 
  ClientDataSetColetor.Edit;
  ClientDataSetColetor.FieldByName('IDSEQ').Value := ClientDataSetColetor.RecNo;
  ClientDataSetColetor.Post;
  Edit2.Clear;
  Edit2.SetFocus;
 
end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB