Fórum Baixa de Itens #321108
11/05/2006
0
Tenho uma dúvida sobre processo de baixa de itens. Eu criei duas telas, uma que faz a solicitação e a outra que faz a saída. Na tela da entrada da solicitação, não há problemas. Na saída, tenho um dbgrid que mostra todas as solicitações pendentes (tabela SOLICITACAO), e um abaixo constando os itens de cada solicitação (num esquema mestre - detalhe - tabela ITENS). Os campos que fazem parte da tabela de itens são COD_ITEM, COD_CART (cartucho), MODELO, MARCA, QTDE e STATUS.
Gostaria de saber se é possível, com uma solicitação selecionada, baixar todos os itens de uma só vez, ou seja, analisar a disponibilidade em estoque de cada item da solicitação e fazer a baixa, se o estoque for suficiente, status fica como ENVIADO, caso contrário, PENDENTE (numa outra situação, poderia até colocar um status PARCIAL, se eu solicitei 2 itens e tem apenas um no estoque, poderia enviar 1 e ficar o outro pendente, por exemplo). A única forma que encontrei foi fazer manual um a um, ou seja, eu clico no item do dbgrid e faço a baixa, mas e se tiver vários itens, fica um pouco produtivo.
Fico no aguardo e se tiverem uma sugestão melhor, será muito bem-vinda.
Estou utilizando FIREBIRD + DELPHI 2005 + CLIENTDATASET
Um abraço,
Roger1976
Curtir tópico
+ 0Posts
11/05/2006
Jonas_giron
While not QrItens.Eof do begin
//...seu texto pra dar a baixa do item
QrEquipamento.Next;
end;
cada next que o sistema da ele vai executar a baixa do item que estiver setado.
Gostei + 0
11/05/2006
Roger1976
Para testar, criei um botão chamado teste e implementei o seguinte código:
procedure TfrmAtenderSolic.Button1Click(Sender: TObject);
var
QtdeSolic, QtdeEstoque, CodigoCartucho : integer;
Mensagem : string;
begin
btnBaixarItem.Enabled := false;
CodigoCartucho := strtoint(copy(edtModelo.Text, 1, 3));
QtdeSolic := strtoint(edtQtde.Text);
QtdeEstoque := strtoint(edtQtdeEst.Text);
while not dmSolicitacao.cdsItensPend.Eof do
begin
if QtdeEstoque >= QtdeSolic then
begin
// Baixa o estoque
with dmEstoque.cdsBaixaEstoque do
begin
FetchParams;
close;
Params.ParamByName(´COD_CART´).AsSmallInt := CodigoCartucho;
Params.ParamByName(´RESULTADO´).AsSmallInt := QtdeSolic;
execute;
end;
// Atualiza o status do item para ´ENVIADO´
with dmItens.cdsStatusEnviado do
begin
FetchParams;
close;
Params.ParamByName(´COD_ITEM´).AsInteger := strtoint(lblCodItem.Caption);
execute;
dmSolicitacao.cdsSolicPend.Refresh;
end;
// Mostra a qtde. em estoque atualizada
with dmEstoque.cdsPesqQtdeCodCart do
begin
FetchParams;
close;
Params.ParamByName(´COD_CART´).AsSmallInt := CodigoCartucho;
open;
edtQtdeEst.Text := inttostr(FieldByName(´QTDE´).AsInteger);
end;
end;
dmSolicitacao.cdsItensPend.Next;
end;
end;
O que há de errado no código?
De qualquer forma, achei uma boa dica, caso tenha outra sugestão para o código acima ou queira mostrar os erros, será bem-vinda.
Obrigado amigo...
Gostei + 0
11/05/2006
Roger1976
Para testar, criei um botão chamado teste e implementei o seguinte código:
procedure TfrmAtenderSolic.Button1Click(Sender: TObject);
var
QtdeSolic, QtdeEstoque, CodigoCartucho : integer;
Mensagem : string;
begin
btnBaixarItem.Enabled := false;
CodigoCartucho := strtoint(copy(edtModelo.Text, 1, 3));
QtdeSolic := strtoint(edtQtde.Text);
QtdeEstoque := strtoint(edtQtdeEst.Text);
while not dmSolicitacao.cdsItensPend.Eof do
begin
if QtdeEstoque >= QtdeSolic then
begin
// Baixa o estoque
with dmEstoque.cdsBaixaEstoque do
begin
FetchParams;
close;
Params.ParamByName(´COD_CART´).AsSmallInt := CodigoCartucho;
Params.ParamByName(´RESULTADO´).AsSmallInt := QtdeSolic;
execute;
end;
// Atualiza o status do item para ´ENVIADO´
with dmItens.cdsStatusEnviado do
begin
FetchParams;
close;
Params.ParamByName(´COD_ITEM´).AsInteger := strtoint(lblCodItem.Caption);
execute;
dmSolicitacao.cdsSolicPend.Refresh;
end;
// Mostra a qtde. em estoque atualizada
with dmEstoque.cdsPesqQtdeCodCart do
begin
FetchParams;
close;
Params.ParamByName(´COD_CART´).AsSmallInt := CodigoCartucho;
open;
edtQtdeEst.Text := inttostr(FieldByName(´QTDE´).AsInteger);
end;
end;
dmSolicitacao.cdsItensPend.Next;
end;
end;
O que há de errado no código?
De qualquer forma, achei uma boa dica, caso tenha outra sugestão para o código acima ou queira mostrar os erros, será bem-vinda.
Obrigado amigo...
Gostei + 0
12/05/2006
Jonas_giron
Gostei + 0
12/05/2006
Emerson Nascimento
procedure TfrmAtenderSolic.Button1Click(Sender: TObject);
var
QtdeSolic, QtdeEstoque, CodigoCartucho : integer;
Mensagem : string;
begin
btnBaixarItem.Enabled := false;
{
// creio que essas variáveis sejam desnecessárias aqui
// ----------------------------------------------
CodigoCartucho := strtoint(copy(edtModelo.Text, 1, 3));
QtdeSolic := strtoint(edtQtde.Text);
QtdeEstoque := strtoint(edtQtdeEst.Text);
}
// se as tabelas são ligadas no esquema mestre/detalhe não
// haverá problema em executar o First
dmSolicitacao.cdsItensPend.First;
with dmSolicitacao do
while not cdsItensPend.Eof do
begin
QtdeEstoque := strtointdef(edtQtdeEst.Text,0);
// pegue a quantidade do item posicionado
QtdeSolic := cdsItensPendQUANTIDADE.AsInteger;
// pegue o código do item posicionado
CodigoCartucho := strtoint(copy(cdsItensPendMODELO.AsString, 1, 3));
// aqui, ao invés de QtdeSolic, poderia ser
// um campo saldo, para que você não perca o
// valor original
if QtdeEstoque >= QtdeSolic then
begin
// Baixa o estoque
with dmEstoque.cdsBaixaEstoque do
begin
FetchParams;
close;
Params.ParamByName(´COD_CART´).AsSmallInt := CodigoCartucho;
Params.ParamByName(´RESULTADO´).AsSmallInt := QtdeSolic;
execute;
end;
// Atualiza o status do item para "ENVIADO"
with dmItens.cdsStatusEnviado do
begin
FetchParams;
close;
Params.ParamByName(´COD_ITEM´).AsInteger := strtoint(lblCodItem.Caption);
execute;
//não execute o refresh. isso reposiciona o
//ponteiro de registros
//cdsSolicPend.Refresh;
end;
// Mostra a qtde. em estoque atualizada
with dmEstoque.cdsPesqQtdeCodCart do
begin
FetchParams;
close;
Params.ParamByName(´COD_CART´).AsSmallInt := CodigoCartucho;
open;
edtQtdeEst.Text := inttostr(FieldByName(´QTDE´).AsInteger);
end;
end;
cdsItensPend.Next;
end;
dmSolicitacao.cdsSolicPend.Refresh;
end;acho que assim pode funcionar...
Gostei + 0
13/05/2006
Roger1976
Emerson, fiz o teste de acordo com o código que vc sugeriu, mas a baixa está sendo feita somente qdo clico no item que está no dbgritens, neste caso, teria que fazer isso um a um.
Jonas, Emerson, obrigado mais uma vez pela ajuda.
Gostei + 0
15/05/2006
Jonas_giron
Gostei + 0
15/05/2006
Jonas_giron
Gostei + 0
17/05/2006
Roger1976
procedure TfrmAtenderSolic.btnBaixarItensClick(Sender: TObject);
var
QtdeSolic, QtdeEstoque, CodigoCartucho : integer;
StatusItem : string;
begin
btnBaixarItens.Enabled := false;
btnFinalizarSolic.Enabled := true;
with dmSolicitacao do
begin
cdsItensPend.First;
while not cdsItensPend.Eof do
begin
QtdeEstoque := strtoint(edtQtdeEst.Text);
QtdeSolic := strtoint(edtQtde.Text);
CodigoCartucho := strtoint(copy(edtModelo.Text, 1, 3));
StatusItem := cdsItensPend.FieldByName(´STATUS´).AsString;
if QtdeEstoque >= QtdeSolic then
begin
// Faz a verificação do STATUS do item
// se estiver como PENDENTE, realiza a baixa no estoque
// e muda o status para ENVIADO
if StatusItem = ´PENDENTE´ then // essa foi uma mudança que eu fiz, onde verificasse os itens que estão com o status pendente e faz a baixa
begin
// Baixa o estoque
with dmEstoque.cdsBaixaEstoque do
begin
FetchParams;
close;
Params.ParamByName(´COD_CART´).AsSmallInt := CodigoCartucho;
Params.ParamByName(´RESULTADO´).AsSmallInt := QtdeSolic;
execute;
end;
// Atualiza o status do item para ´ENVIADO´
with dmItens.cdsStatusEnviado do
begin
FetchParams;
close;
Params.ParamByName(´COD_ITEM´).AsInteger := strtoint(lblCodItem.Caption);
execute;
end;
// Mostra a qtde. em estoque atualizada
with dmEstoque.cdsPesqQtdeCodCart do
begin
FetchParams;
close;
Params.ParamByName(´COD_CART´).AsSmallInt := CodigoCartucho;
open;
edtQtdeEst.Text := inttostr(FieldByName(´QTDE´).AsInteger);
end;
end;
end;
cdsItensPend.Next;
// Mostra os dados nos edits/combo
dbgrdItensCellClick(dbgrdItens.Columns.Items[1]); // outra mudança, onde garante a seleção do próximo item
end;
dmSolicitacao.cdsSolicPend.Refresh;
end;
end;
Em relação a sua pergunta, eu tenho um datamodule onde há um esquema master-detail, da tabela de SOLICITACOES com a de ITENS, e os dois dbgrids estão relacionados a este DM.
De qualquer forma, agora está funcionando da maneira que eu quero.
Agradeço muito a vc e ao Emerson pelas dicas, que foram muito importantes para a minha solução.
Abraço,
Rogério
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)