Chave Primária auto incrementada com chave estrangeira dentro de uma transação
Estou com seguinte problema: Preciso gravar a chave primária da tabela pedido como chave estrangeira na tabela itens dentro de uma transação, o problema é que a chave primária é autoincrement e por isso só é gerada no momento da gravação, impedindo assim que eu posso inserir os itens já que não tenho a chave estrangeira. então como gravar a chave estrangeira se ela a chave primária só é gerada no momento da gravação? se eu fizer fora de uma transação da certo, mas isso precisa de fato ser realizado dentro de uma transação para que os itens só sejam realmente gravados se o pedido também for gravado.
O Código abaixo exemplifica melhor o que eu estou tentando dizer. Desde já agradeço.
try
Transaction := DataModule.SQLConnection.BeginTransaction(TDBXIsolations.ReadCommitted);
// ID - PK e é auto incrementado pelo banco MySQL
DataModule.cdsPedido.Close;
DataModule.cdsPedido.Open;
DataModule.cdsPedido.Insert;
DataModule.cdsDataPedido.AsDateTime := Date;
DataModule.ValorPedido.AsCurrency := Tot;
DataModule.cdsPedido.Post;
DataModule.cdsPedido.ApplyUpDates(0);
// ID - PK e é auto incrementado pelo banco MySQL
DataModule.cdsItens.Close;
DataModule.cdsItens.Open;
DataModule.cdsItens.Insert;
DataModule.cdsItensIDPedido.AsInteger := DataModule.cdsPedidoID.AsInteger; // IDPedido é a chave estrangeira na tabela de Intens
DataModule.cdsItens.AsString := Itens;
DataModule.cdsItens.Post;
DataModule.cdsItens..ApplyUpDates(0);
DataModule.SQLConnection.CommitFreeAndNil(Transaction);
Application.MessageBox('Regisgtro Salvo com Sucesso!','Informação', MB_OK+MB_ICONINFORMATION);
except
On E : Exception do
begin
dm.SQLConn.RollbackFreeAndNil(Transaction);
showmessage(E.Message);
end;
O Código abaixo exemplifica melhor o que eu estou tentando dizer. Desde já agradeço.
try
Transaction := DataModule.SQLConnection.BeginTransaction(TDBXIsolations.ReadCommitted);
// ID - PK e é auto incrementado pelo banco MySQL
DataModule.cdsPedido.Close;
DataModule.cdsPedido.Open;
DataModule.cdsPedido.Insert;
DataModule.cdsDataPedido.AsDateTime := Date;
DataModule.ValorPedido.AsCurrency := Tot;
DataModule.cdsPedido.Post;
DataModule.cdsPedido.ApplyUpDates(0);
// ID - PK e é auto incrementado pelo banco MySQL
DataModule.cdsItens.Close;
DataModule.cdsItens.Open;
DataModule.cdsItens.Insert;
DataModule.cdsItensIDPedido.AsInteger := DataModule.cdsPedidoID.AsInteger; // IDPedido é a chave estrangeira na tabela de Intens
DataModule.cdsItens.AsString := Itens;
DataModule.cdsItens.Post;
DataModule.cdsItens..ApplyUpDates(0);
DataModule.SQLConnection.CommitFreeAndNil(Transaction);
Application.MessageBox('Regisgtro Salvo com Sucesso!','Informação', MB_OK+MB_ICONINFORMATION);
except
On E : Exception do
begin
dm.SQLConn.RollbackFreeAndNil(Transaction);
showmessage(E.Message);
end;
Edivania
Curtidas 0
Respostas
Edivania
17/03/2017
pessoal, desculpem por não identar o código, na realidade estava identado mas acabei apagando a Tag Código que fica responsável por manter a Identação
GOSTEI 0