Gravação de Itens
06/03/2006
0
Essa é a primeira vez que estou fazendo este processo. Tenho duas tabelas:
TABELA SOLICITACAO - COD_SOLIC, OPERADOR *, DATA, HORA, UNIDADE
TABELA ITENS - COD_ITEM, COD_SOLIC, CARTUCHO *, MARCA, QTDE
* Não usei código nestas duas situações, pois estou fazendo de uma maneira simples, pois o que me importa neste momento é como fazer o processo.
Este sistema trata-se de um controle de cartuchos, onde é feito um pedido de cartuchos para ser disponibilizado a uma determinada filial.
No botão gravar pedido, não é gerado erros, tanto que o registro é gravaado na tabela de SOLICITACAO, porém estou tendo dificuldades quando tento incluir um item na tabela ITENS.
O código que utilizei no botão GRAVAR SOLICITAÇÃO, que aparentemente está correto, é:
procedure TfrmSolicitacao.btnGravarSolicitacaoClick(Sender: TObject);
var
TDS : TTransactionDesc;
begin
try
TDS.TransactionID := 1;
TDS.IsolationLevel := xilREADCOMMITTED;
with dm.cdsInserirPedido do
begin
dm.sqlConexao.StartTransaction(TDS);
FieldByName(´OPERADOR´).AsString := edtOperador.Text;
FieldByName(´DATA´).AsDateTime := dtpData.Date;
FieldByName(´HORA´).AsDateTime := strtotime(mskedtHora.Text);
FieldByName(´UNIDADE´).AsString := edtUnidade.Text;
dm.sqlConexao.Commit(TDS);
ApplyUpdates(0);
Refresh;
Last;
edtSolicitacao.Text := inttostr(FieldByName(´COD_SOLIC´).AsInteger);
end;
except
on E : Exception do
begin
dm.sqlConexao.Rollback(TDS);
showmessage(E.Message);
end;
end;
// Atualizar o codigo da solicitação na tabela ITENS
with dm.cdsAtualizaCodSolic do
begin
close;
Params.ParamByName(´CODSOLIC´).AsInteger := strtoint(edtSolicitacao.Text);
execute;
end;
btnGravarSolicitacao.Enabled := false;
btnNovaSolicitacao.Enabled := true;
end;
Código do botão IncluirSolicitacao (aqui eu precisarei de uma ajuda) que escrevi é:
procedure TfrmSolicitacao.btnIncluirItemClick(Sender: TObject);
var
TDI : TTransactionDesc;
begin
try
TDI.TransactionID := 1;
TDI.IsolationLevel := xilREADCOMMITTED;
with dm.cdsIncluirItem do
begin
dm.sqlConexao.StartTransaction(TDI);
FieldByName(´COD_SOLIC´).AsInteger := 0;
FieldByName(´ITEM´).AsString := edtItem.Text;
FieldByName(´MARCA´).AsString := edtMarca.Text;
FieldByName(´QTDE´).AsInteger := strtoint(edtQtde.Text);
dm.sqlConexao.Commit(TDI);
ApplyUpdates(0);
Refresh;
Last;
end;
except
on E : Exception do
begin
dm.sqlConexao.Rollback(TDI);
showmessage(E.Message);
end;
end;
btnIncluirItem.Enabled := false;
btnNovoItem.Enabled := true;
end;
Quando clico no botão Incluir Item, aparece a mensagem - traduzida - ´não há nenhuma transação ativa´
Essa é uma típica situação que ocorre, por exemplo, numa venda de produtos, onde é feito um pedido de uma determinada quantidade de itens. Pesquisei, mas não encontrei a solução desejada. Gostaria que me apontassem o erro, e qual seria a melhor solução.
Estou utilizando INTERBASE + DBEXPRESS...
Fico no aguardo.
Um abraço a todos....
Rogério
Roger1976
Posts
07/03/2006
Paullsoftware
07/03/2006
Macario
reveja esta parte.
Pois voce está finalizando a transação antes do ApplyUpdates!
Outras Dicas:
[color=orange:4f778a4f73][url=http://forum.clubedelphi.net/viewtopic.php?t=58547&start=0&postdays=0&postorder=asc&highlight==url]Transações com DbExpress[/url][/color:4f778a4f73]
Espero que ajude. :arrow:
07/03/2006
Adriano Santos
Até eu, que já trampo com DBExpress, aprendi várias coisas...rsrs...até mais.
10/03/2006
Roger1976
procedure TfrmIncluirItem.btnIncluirItemClick(Sender: TObject);
var
TDI : TTransactionDesc;
begin
try
TDI.TransactionID := 1;
TDI.IsolationLevel := xilREADCOMMITTED;
//dm.sqlConexao.StartTransaction(TDI);
with dm.cdsIncluirItem do
begin
FetchParams;
dm.sqlConexao.StartTransaction(TDI);
Params.ParamByName(´COD_SOLIC´).AsInteger := strtoint(edtSolicitacao.Text);
Params.ParamByName(´ITEM´).AsString := edtItem.Text;
Params.ParamByName(´MARCA´).AsString := edtMarca.Text;
Params.ParamByName(´QTDE´).AsInteger := strtoint(edtQtde.Text);
execute;
dm.sqlConexao.Commit(TDI);
// mostrar o item gravado na dbgid toda vez que um novo for inserido
with dm.cdsCodSolic do
begin
close;
Params.ParamByName(´CODSOLICIT´).AsInteger := strtoint(edtSolicitacao.Text);
open;
if not isempty then
begin
dbgrid1.DataSource := dm.dsCodSolic;
last;
end;
end;
end;
except
on E : Exception do
begin
dm.sqlConexao.Rollback(TDI);
showmessage(E.Message);
end;
end;
end;
Agora está dentro daquilo que eu queria, caso tenha alguma sugestão, ficarei muito grato.
Macario, estou lendo a matéria referente ao link que me passou, está sendo muito útil, pois estou iniciando.
Obrigado!!!!
Clique aqui para fazer login e interagir na Comunidade :)