PDA

Ver la Versión Completa : Transacion


Paulao
20-05-2008, 13:36:11
Tengo un problema con una transacion. Yo tengo una funcion que abre mi transacion, otra comita y otra dar un Rollback. En todos los forma esta funcionando, pero yo tengo un otro forma que cerra mi caja. En este form yo hizo, asi:
if IniciaTransacao then
try
.. Pongo todos mis codigos aca.
Solo que hay una cosa. Dentro del Try, yo tengo procedures llamadas para hacer 2 INSERTS y abajo, despues destas procedures, yo tengo un UPDATE. Mira, mi UPDATE esta despues destas procedures, no se me lo entiende. Que hizo yo, puzo un error en neste UPDATE para hacer un teste para ver se ha grabado o no. Como estas en una transacion, no deberia grabar las mis procedures, pero estas grabando si. Yo saquei todos los ApplyUpdates en el AfterPost de mis CDS, pero aun estas grabando. Que puede ser esto? Abajo está mi Unit, se sirve para usteds hacer una verificacio mejor. En rojo estan las lineas donde queda el error con sua comentarios.

procedure TFrmEncerramento.Encerrar;
var
F: TextFile;
FrmRatVda: TFrmRatVda;
sMensagem: String;

nDia_Abertura: Integer;
sDT_Abertura: String;
begin
Btn_Encerrar.Enabled := False;
pbFechAll.Visible := True;

sNumLoj := FmtCamReg(FloatToStr(gLoja), 4, TIPO_NUM);

if not MapaCaxConsulta('', true) then
Exit;

if IniciaTransacao(DM_Principal.SoConn_GER) then
Try
//..>=======================================================================
Mapa_Caixa_Rel('');
Mapa_Caixa_Rel('');
//..>=======================================================================
RelDesp(DateToStr(gdat));
//..>=======================================================================
//..> Efetuando o Rateio das Vendas.
if ExisteFunRateio then begin
mbRateou := False;
Try
FrmRatVda := TFrmRatVda.Create(Self);
FrmRatVda.ShowModal;
Finally
FreeAndNil(FrmRatVda);
End;

if not mbRateou then begin
Warning('Sr. Operador. Rateio obrigatório.' + #13 + #13 +
'Favor selecionar funcionários da lista.');
BTN_Fechar.Enabled := True;
Btn_Encerrar.Enabled := True;
exit;
end
else
MM_Fechamento.Lines.add('Rateio Atualizado.');
end
else begin
MM_Fechamento.Lines.add('Não existem vendas a serem rateadas.');
{ $I- }
AssignFile(F, gPATH_ENV +
FormatDateTime('YYYYMMDD', mDt_Abertura) +
FormatFloat('000', gLoja) +
FormatFloat('00', gcd_caixa) +
FILE_RAT +
'.SEQ');
if IOResult <> 0 then
begin
sMensagem := gPATH_ENV +
FormatDateTime('YYYYMMDD', mDt_Abertura) +
FormatFloat('000', gLoja) +
FormatFloat('00', gcd_caixa) +
FILE_RAT + '.SEQ';
raise Exception.Create(sMensagem);
end;
{ $I+ }
Rewrite(F);
CloseFile(F);
end;//Fim do mbrateou
CB_Rateio.Checked := True;
//..>=======================================================================


//..>=======================================================================
//..> Atualiza Resumo das Vendas.
AtualizaFunv;//Procedure que inert algo
MM_Fechamento.Lines.add('Resumo das vendas realizado.');
CB_ResumoVendas.Checked := True;
//..>=======================================================================

//..>=======================================================================
//..> Atualiza Resumo das Peças.
AtualizaSecv;//Lo mismo arriba MM_Fechamento.Lines.add('Resumo das peças realizado.');
CB_ResumoPecas.Checked := True;
//..>=======================================================================

msMensDif := '';

//..> Zerando variaveis de registros Lidos.
mnRegLidRes := 0;
mnRegLidChq := 0;
mnRegLidTro := 0;
mnRegLidCli := 0;
mnRegLidDsp := 0;
mnRegLidVen := 0;
mnRegLidFis := 0;
mnRegLidLiv := 0;
mnRegLidLog := 0;

//..> Obtendo contadores dos registros.
mnRegCntRes := ObtemRegArqRes;
mnRegCntChq := ObtemRegArqChq;
mnRegCntTro := ObtemRegArqTro;
mnRegCntCli := ObtemRegArqCli;
mnRegCntDsp := ObtemRegArqDsp;
mnRegCntVen := ObtemRegArqVen;
mnRegCntFis := ObtemRegArqFis;
mnRegCntLiv := ObtemRegArqLiv;
mnRegCntLog := ObtemRegArqLog;

//..>=======================================================================
//..> Gerando arquivo de Flash.
{ $I- }
AssignFile(F, gPATH_ENV +
'FLASH' +
FormatFloat('0000', gLoja) +
'.NET');
if IOResult <> 0 then begin
sMensagem := gPATH_ENV +
'FLASH' +
FormatFloat('0000', gLoja) +
'.NET';
raise Exception.Create(sMensagem);
end;
{ $I+ }
Rewrite(F);
GeraArqFla(F);
CloseFile(F);
//..>=======================================================================


//..>=======================================================================
//..> Gerando arquivo de Resumo de Cartões.
{ $I- }
AssignFile(F, gPATH_ENV +
FormatDateTime('YYYYMMDD', mDt_Abertura) +
FormatFloat('000', gLoja) +
FormatFloat('00', gcd_caixa) +
FILE_RES +
'.SEQ');
if IOResult <> 0 then
begin
sMensagem := gPATH_ENV +
FormatDateTime('YYYYMMDD', mDt_Abertura) +
FormatFloat('000', gLoja) +
FormatFloat('00', gcd_caixa) +
FILE_RES + '.SEQ';
raise Exception.Create(sMensagem);
end;
{ $I+ }
Rewrite(F);
GeraArqRes(F);
CloseFile(F);
if CompVal(mnRegCntRes, mnRegLidRes, cmpDiferente) then
msMensDif := msMensDif + #13 + 'RES - CNT: ' + FormatFloat('000000', mnRegCntRes) + ' LID: ' + FormatFloat('000000', mnRegLidRes);
//..>=======================================================================


//..>=======================================================================
//..> Gerando arquivo de Cheques-Pre.
{ $I- }
AssignFile(F, gPATH_ENV +
FormatDateTime('YYYYMMDD', mDt_Abertura) +
FormatFloat('000', gLoja) +
FormatFloat('00', gcd_caixa) +
FILE_CHQ +
'.SEQ');
if IOResult <> 0 then
begin
sMensagem := gPATH_ENV +
FormatDateTime('YYYYMMDD', mDt_Abertura) +
FormatFloat('000', gLoja) +
FormatFloat('00', gcd_caixa) +
FILE_CHQ + '.SEQ';
raise Exception.Create(sMensagem);
end;
{ $I+ }
Rewrite(F);
GeraArqChq(F);
CloseFile(F);
if CompVal(mnRegCntChq, mnRegLidChq, cmpDiferente) then
msMensDif := msMensDif + #13 + 'CHQ - CNT: ' + FormatFloat('000000', mnRegCntChq) + ' LID: ' + FormatFloat('000000', mnRegLidChq);
//..>=======================================================================


//..>=======================================================================
//..> Gerando arquivo de Trocas.
{ $I- }
AssignFile(F, gPATH_ENV +
FormatDateTime('YYYYMMDD', mDt_Abertura) +
FormatFloat('000', gLoja) +
FormatFloat('00', gcd_caixa) +
FILE_TRO +
'.SEQ');
if IOResult <> 0 then
begin
sMensagem := gPATH_ENV +
FormatDateTime('YYYYMMDD', mDt_Abertura) +
FormatFloat('000', gLoja) +
FormatFloat('00', gcd_caixa) +
FILE_TRO + '.SEQ';
raise Exception.Create(sMensagem);
end;
{ $I+ }
Rewrite(F);
GeraArqTro(F);
CloseFile(F);
if CompVal(mnRegCntTro, mnRegLidTro, cmpDiferente) then
msMensDif := msMensDif + #13 + 'TRO - CNT: ' + FormatFloat('000000', mnRegCntTro) + ' LID: ' + FormatFloat('000000', mnRegLidTro);
//..>=======================================================================


//..>=======================================================================
//..> Gerando arquivo de Clientes.
{ $I- }
AssignFile(F, gPATH_ENV +
FormatDateTime('YYYYMMDD', mDt_Abertura) +
FormatFloat('000', gLoja) +
FormatFloat('00', gcd_caixa) +
FILE_CLI +
'.SEQ');
if IOResult <> 0 then
begin
sMensagem := gPATH_ENV +
FormatDateTime('YYYYMMDD', mDt_Abertura) +
FormatFloat('000', gLoja) +
FormatFloat('00', gcd_caixa) +
FILE_CLI + '.SEQ';
raise Exception.Create(sMensagem);
end;
{ $I+ }
Rewrite(F);
GeraArqCli(F);
CloseFile(F);
if CompVal(mnRegCntCli, mnRegLidCli, cmpDiferente) then
msMensDif := msMensDif + #13 + 'CLI - CNT: ' + FormatFloat('000000', mnRegCntCli) + ' LID: ' + FormatFloat('000000', mnRegLidCli);
//..>=======================================================================


//..>=======================================================================
//..> Gerando arquivo de Despesas.
{ $I- }
AssignFile(F, gPATH_ENV +
FormatDateTime('YYYYMMDD', mDt_Abertura) +
FormatFloat('000', gLoja) +
FormatFloat('00', gcd_caixa) +
FILE_DSP +
'.SEQ');
if IOResult <> 0 then
begin
sMensagem := gPATH_ENV +
FormatDateTime('YYYYMMDD', mDt_Abertura) +
FormatFloat('000', gLoja) +
FormatFloat('00', gcd_caixa) +
FILE_DSP + '.SEQ';
raise Exception.Create(sMensagem);
end;
{ $I+ }
Rewrite(F);
GeraArqDsp(F);
CloseFile(F);
if CompVal(mnRegCntDsp, mnRegLidDsp, cmpDiferente) then
msMensDif := msMensDif + #13 + 'DSP - CNT: ' + FormatFloat('000000', mnRegCntDsp) + ' LID: ' + FormatFloat('000000', mnRegLidDsp);
//..>=======================================================================


//..>=======================================================================
//..> Gerando arquivo de Vendas.
{ $I- }
AssignFile(F, gPATH_ENV +
FormatDateTime('YYYYMMDD', mDt_Abertura) +
FormatFloat('000', gLoja) +
FormatFloat('00', gcd_caixa) +
FILE_VEN +
'.SEQ');
if IOResult <> 0 then
begin
sMensagem := gPATH_ENV +
FormatDateTime('YYYYMMDD', mDt_Abertura) +
FormatFloat('000', gLoja) +
FormatFloat('00', gcd_caixa) +
FILE_VEN + '.SEQ';
raise Exception.Create(sMensagem);
end;
{ $I+ }
Rewrite(F);
GeraArqVenCapea(F);
CloseFile(F);
if CompVal(mnRegCntVen, mnRegLidVen, cmpDiferente) then
msMensDif := msMensDif + #13 + 'VEN - CNT: ' + FormatFloat('000000', mnRegCntVen) + ' LID: ' + FormatFloat('000000', mnRegLidVen);
//..>=======================================================================


//..>=======================================================================
//..> Gerando arquivo Fiscal.
{ $I- }
AssignFile(F, gPATH_ENV +
FormatDateTime('YYYYMMDD', mDt_Abertura) +
FormatFloat('000', gLoja) +
FormatFloat('00', gcd_caixa) +
FILE_FIS +
'.SEQ');
if IOResult <> 0 then
begin
sMensagem := gPATH_ENV +
FormatDateTime('YYYYMMDD', mDt_Abertura) +
FormatFloat('000', gLoja) +
FormatFloat('00', gcd_caixa) +
FILE_FIS + '.SEQ';
raise Exception.Create(sMensagem);
end;
{ $I+ }
Rewrite(F);
GeraArqFisCapea(F);
CloseFile(F);
if CompVal(mnRegCntFis, mnRegLidFis, cmpDiferente) then
msMensDif := msMensDif + #13 + 'FIS - CNT: ' + FormatFloat('000000', mnRegCntFis) + ' LID: ' + FormatFloat('000000', mnRegLidFis);
//..>=======================================================================


//..>=======================================================================
//..> Gerando arquivo Livros Fiscais.
{ $I- }
AssignFile(F, gPATH_ENV +
FormatDateTime('YYYYMMDD', mDt_Abertura) +
FormatFloat('000', gLoja) +
FormatFloat('00', gcd_caixa) +
FILE_LIV +
'.SEQ');
if IOResult <> 0 then
begin
sMensagem := gPATH_ENV +
FormatDateTime('YYYYMMDD', mDt_Abertura) +
FormatFloat('000', gLoja) +
FormatFloat('00', gcd_caixa) +
FILE_LIV + '.SEQ';
raise Exception.Create(sMensagem);
end;
{ $I+ }
Rewrite(F);
GeraArqLivCapea(F);
CloseFile(F);
if CompVal(mnRegCntLiv, mnRegLidLiv, cmpDiferente) then
msMensDif := msMensDif + #13 + 'LIV - CNT: ' + FormatFloat('000000', mnRegCntLiv) + ' LID: ' + FormatFloat('000000', mnRegLidLiv);
//..>=======================================================================


//..>=======================================================================
//..> Gerando arquivo de Log
{ $I- }
AssignFile(F, gPATH_ENV +
FormatDateTime('YYYYMMDD', mDt_Abertura) +
FormatFloat('000', gLoja) +
FormatFloat('00', gcd_caixa) +
FILE_LOG +
'.SEQ');
if IOResult <> 0 then
begin
sMensagem := gPATH_ENV +
FormatDateTime('YYYYMMDD', mDt_Abertura) +
FormatFloat('000', gLoja) +
FormatFloat('00', gcd_caixa) +
FILE_LOG + '.SEQ';
raise Exception.Create(sMensagem);
end;
{ $I+ }
Rewrite(F);
GeraArqLog(F);
CloseFile(F);
if CompVal(mnRegCntLog, mnRegLidLog, cmpDiferente) then
msMensDif := msMensDif + #13 + 'LOG - CNT: ' + FormatFloat('000000', mnRegCntLog) + ' LID: ' + FormatFloat('000000', mnRegLidLog);
//..>=======================================================================


//..>=======================================================================
CB_Geracao.Checked := True;
//..>=======================================================================

//..>=======================================================================
//..> Atualiza variaveis com Parâmetros da Loja.
Dm_Principal.SacParametro;
//..>=======================================================================


//..>=======================================================================
//Copia o banco para o dir de backup
CopyFile(pChar(gPATH_BANCO + 'SAC_DB.FDB'),pChar(gPATH_BACKUP+ 'SAC_DB.FDB'), False);
//..>=======================================================================


//..>=======================================================================
//Inicializa Tabela
//..>=======================================================================
InicializaTabelas;
CB_Inicializacao.Checked := True;
//..>=======================================================================


//..>=======================================================================
//..> Atualiza Flags de Encerramento Paulo..>
CDSINS.Close;
CDSINS.CommandText := ' UPDATE TB_SAC_PARAM_CAIXA SET' +
' FL_CX_ABERTO = ' + QuotedStr('N') +
' ,DT_ENCERRAMENTO = ' + QuotedStr(FormatDateTime('dd-mmm-yyyy', gDat)) +
' ,HR_ENCERRAMENTO = ' + QuotedStr(FormatDateTime('HH:NN:SS',Time));
CDSINS.Execute;//Aca pongo el error
CDSINS.Close;
//..>=======================================================================


//..>=======================================================================
gsDT_Encerramento := FormatDateTime('dd/mm/yyyy', gDat);
//..>=======================================================================


//..>=======================================================================
//..> Mensagem de diferença de contadores.
if Trim(msMensDif) <> '' then
Warning('- Sr.Operador, favor anotar a mensagem abaixo e avisar o CPD. Obrigado' + #13 + #13 +
' _ Módulo: Sac_Gerencial' + #13 +
' _ Programa: Encerramento [Verificação de Contadores com diferença]' + #13 +
' _ MENSAGEM:' + #13 + #13 + msMensDif);

Warning('Fechamento ConcluÍdo.');
MM_Fechamento.Lines.add('Fechamento concluido.');

BTN_Fechar.Enabled := True;
BTN_Fechar.SetFocus;

CommitTransacao(DM_Principal.SoConn_GER);

Except
on E: Exception do
begin
RollbackTransacao(DM_Principal.SoConn_GER);

Warning('.:: ERRO ::. Senhor Operador, por favor, comunique o erro ao CPD.' + #13 + #13 +
' _ Módulo: Sac_Gerencial' + #13 +
' _ Programa: Encerramento [Geração de Arquivos]' + #13 + #13 +
' .:: MENSAGEM ::.' + #13 + E.Message);
end;
End;
end;

Paulao
20-05-2008, 13:43:58
Esta no es mi Unit, pero si mi Procedure para hacer el cerre. Abajo una Procedure de INSERT comentada erriba. Mismo con error en la transacion, este Insert esta acontecendo, mismo que la transacion va a RollBack, pues esto estas acontecendo.
procedure TFrmEncerramento.AtualizaFunv;
const
MAX_CD_FUN = '99999';
var
sCd_Fun, sCD_FunDev: string;
begin
//..> Obtem Valor das Vendas agrupadas por Vendedor.
CDS.Close;
CDS.CommandText := 'SELECT'+
' TB_SAC_NF_CAPEADOR.CD_FUNC,'+
' SUM(COALESCE(TB_SAC_NF_CAPEADOR.VL_BRUTO,0) + COALESCE(TB_SAC_NF_CAPEADOR.VL_DESC_ACR,0)) AS VL_LIQ'+
' FROM'+
' TB_SAC_NF_CAPEADOR'+
' WHERE'+
' (TB_SAC_NF_CAPEADOR.CD_FUNC <> 99999) AND'+
' (TB_SAC_NF_CAPEADOR.ST_CANC = 0) AND'+
' ((TB_SAC_NF_CAPEADOR.SR_NF = ''D2'') OR ((TB_SAC_NF_CAPEADOR.SR_NF = ''B2'') AND'+
' (TB_SAC_NF_CAPEADOR.CD_CFOP = 6102)))'+
' GROUP BY'+
' TB_SAC_NF_CAPEADOR.CD_FUNC';
CDS.Open;
//..> Obtem Valor das Devoluções agrupadas por Vendedor.
CDSDEV.Close;
CDSDEV.CommandText := ' SELECT'+
' TB_SAC_NF_CAPEADOR.CD_FUNC,'+
' SUM(COALESCE(TB_SAC_NF_CAPEADOR.VL_BRUTO,0) + COALESCE(TB_SAC_NF_CAPEADOR.VL_DESC_ACR,0)) AS VL_DEV '+
' FROM' +
' TB_SAC_NF_CAPEADOR' +
' WHERE' +
' (TB_SAC_NF_CAPEADOR.CD_FUNC <> 99999) AND' +
' (TB_SAC_NF_CAPEADOR.ST_CANC = 0) AND' +
' (TB_SAC_NF_CAPEADOR.SR_NF = ''E2'')' +
' GROUP BY'+
' TB_SAC_NF_CAPEADOR.CD_FUNC';
CDSDEV.Open;
//..> Carrega variável de Funcionarios.
if CDS.Eof then begin
sCD_Fun := MAX_CD_FUN;
end
else begin
sCD_Fun := IntToStr(CDS.FieldByName('CD_FUNC').AsInteger);
end;
if cdsdev.Eof then begin
sCD_FunDev := MAX_CD_FUN;
end
else begin
sCD_FunDev := IntToStr(CDSDEV.FieldByName('CD_FUNC').AsInteger);
end;
//..> Loop.
while Not (sCD_Fun = MAX_CD_FUN) or Not (sCD_FunDev = MAX_CD_FUN) do
begin
if sCD_Fun < sCD_FunDev then begin
sacp_Funv_ins(sCD_FUN,
FormatDateTime('DD/MM/YYYY', gDat),
cds.FieldByName('VL_LIQ').AsFloat);
CDS.Next;
end
else if sCD_Fun = sCD_FunDev then begin
sacp_Funv_ins(sCD_FUN,
FormatDateTime('DD/MM/YYYY', gDat),
(CDS.FieldByName('VL_LIQ').AsFloat - CDSDEV.FieldByName('VL_DEV').AsFloat));
CDS.Next;
CDSDEV.Next;
end
else begin
sacp_Funv_ins(sCD_FunDev,
FormatDateTime('DD/MM/YYYY', gDat),
((-1) * CDSDEV.FieldByName('VL_DEV').AsFloat));
CDSDEV.Next;
end;
if cds.Eof then begin
sCD_Fun := MAX_CD_FUN;
end
else begin
sCD_Fun := CDS.FieldByName('CD_FUNC').AsString;
end;
if cdsdev.Eof then begin
sCD_FunDev := MAX_CD_FUN;
end
else begin
sCD_FunDev := CDSDEV.FieldByName('CD_FUNC').AsString;
end;
end;
CDS.Close;
CDSDEV.Close;
end;