Array
(
)

Gravação de Itens

Roger1976
   - 06 mar 2006

Olá amigos!!!!

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


Paullsoftware
   - 07 mar 2006

basicamente vc não tem que dar um Post no Maste e depois começar a inserir os dados Detail?


Macario
   - 07 mar 2006


Citação:
Olá amigos!!!!
dm.sqlConexao.Commit(TDS);
ApplyUpdates(0);
Refresh;
Last;


reveja esta parte.

Pois voce está finalizando a transação antes do ApplyUpdates!

Outras Dicas:
[url=http://forum.clubedelphi.net/viewtopic.php?t=58547&start=0&postdays=0&postorder=asc&highlight==url]Transações com DbExpress[/url]

Espero que ajude. :arrow:


Adriano Santos
   - 07 mar 2006

Caramba, esse link para a explicação do Vinicius2K é muito loko.
Até eu, que já trampo com DBExpress, aprendi várias coisas...rsrs...até mais.


Roger1976
   - 10 mar 2006

Amigos, fiz mudanças no meu código, vejam abaixo como ficou:

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!!!!