GARANTIR DESCONTO

Fórum ADO / Sql Server / Transação #177662

26/08/2003

0

Olá,

Desenvolvi uma rotina que não chega a ser complexa.

Problema: Quando executada esta rotina nenhum erro ocorre, porém o banco não é atualizado. Acredite: a rotina funciona normalmente(atualiza o banco) quando fora de transação!!!

Alguém já passou por algo parecido? utilizo o Delphi 5!

p.s.: não esqueci o commit!!!

Abraços,
Daniel Almeida.


Dwng

Dwng

Responder

Posts

26/08/2003

Marcelo.c

Coloque o código aqui para que possamos dar uma olhada.


Responder

Gostei + 0

27/08/2003

Dwng

Olá pessoal!

Apesar de não ser complexa a rotina tem em torno de 1000 linhas. Seu objetivo é ´pagar lançamentos´. Existem 2 tipos de lançamentos: elementares e não elementares. No segundo caso, o pagamento de um lançamento N implica na criação e pagamento automático de um lançamento N+1, de acordo com a regra de negócio.

[b:608b21c4a2]COMO DEVE FUNCIONAR[/b:608b21c4a2]: Estou pagando um lançamento NÃO ELEMENTAR de número 1 o que implica na criação e respectivos pagamentos dos lançamentos 2,3,4,5 e 6. Isto ocorre quando utilizada um BD MSSQL 2000 ou quando se comenta as linhas respectivas ao controle transacional. Caso se tente clicar no botão PAGAR outra vez, o sistema deve informar que não há pagamentos a serem efetuados.

COMO FUNCIONA NO MSSQL 7: A rotina só conclui seu objetivo após o sexto click consecutivo no botão pagar. Observando a base de dados notei que os 5 primeiros cliques no botão pagar nada realizam no BD: muito estranho!!! Já o sexto realiza as operação necessárias no BD!

Utilizo Delphi 5.0 com service pack 1 e MSSQL 7 com service pack 2.

Os testes foram realizados em 4 Servidores de Dados diferentes: 2 MSSQL 7 SP2 e 2 MSSQL 2000!
MSSQL 7 -> SEM SUCESSO
MSSQL 2000 - > COM SUCESSSO

Primeiro segue o DFM e em seguida o PAS.

Obs: A rotina não funciona corretamente no MSSQL 7.0, porém funciona no MSSQL 2000.

Como comentado na mensagem anterior, quando comentadas as linhas respectivas ao BEGINTRANS e COMMITTRANS

AGRADEÇO DESDE JÁ QUALQUER DICA!
ABRAÇOS!

//Código Fonte do arquivo DFM
object Form1: TForm1
Left = -2
Top = 103
Width = 660
Height = 108
Caption = ´Form1´
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = ´MS Sans Serif´
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Gauge: TGauge
Left = 7
Top = 8
Width = 641
Height = 19
ForeColor = clBlue
Font.Charset = DEFAULT_CHARSET
Font.Color = clWhite
Font.Height = -11
Font.Name = ´MS Sans Serif´
Font.Style = [fsBold]
ParentFont = False
Progress = 0
end
object btnPagar: TButton
Left = 224
Top = 48
Width = 75
Height = 25
Caption = ´Pagar´
TabOrder = 0
OnClick = btnPagarClick
end
object btnSair: TButton
Left = 328
Top = 48
Width = 75
Height = 25
Caption = ´Sair´
TabOrder = 1
OnClick = btnSairClick
end
object CnWinbonus: TADOConnection
Connected = True
ConnectionString =
´Provider=SQLOLEDB.1;Password=3j4n5r;Persist Security Info=True´ +
´;User ID=user;Initial Catalog=WINBONUS;Data Source=PROD03;Use Pro´ +
´cedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workst´ +
´ation ID=PROD03;Use Encryption for Data=False;Tag with column co´ +
´llation when possible=False´
ConnectOptions = coAsyncConnect
LoginPrompt = False
Provider = ´SQLOLEDB.1´
Left = 32
Top = 32
end
object SeqCabecLancamentos: TLDASequence
DataBaseName = ´dbwinbonus´
TableName = ´sequencias´
Left = 88
Top = 32
end
object dbWinBonus: TDatabase
Connected = True
DatabaseName = ´dbWinBonus´
DriverName = ´MSSQL´
LoginPrompt = False
Params.Strings = (
´DATABASE NAME=WINBONUS´
´SERVER NAME=PROD03´
´USER NAME=user´
´OPEN MODE=READ/WRITE´
´SCHEMA CACHE SIZE=8´
´BLOB EDIT LOGGING=´
´LANGDRIVER=´
´SQLQRYMODE=´
´SQLPASSTHRU MODE=SHARED AUTOCOMMIT´
´DATE MODE=0´
´SCHEMA CACHE TIME=-1´
´MAX QUERY TIME=300´
´MAX ROWS=-1´
´BATCH COUNT=200´
´ENABLE SCHEMA CACHE=FALSE´
´SCHEMA CACHE DIR=´
´HOST NAME=teste_hostname´
´APPLICATION NAME=xxx´
´NATIONAL LANG NAME=´
´ENABLE BCD=FALSE´
´TDS PACKET SIZE=4096´
´BLOBS TO CACHE=64´
´BLOB SIZE=32´
´PASSWORD=3j4n5r´)
SessionName = ´Default´
Top = 32
end
end

//Código Fonte do arquivo PAS
unit Baixa;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Db, ADODB, Gauges, vLDASequence, DBTables;

type
TForm1 = class(TForm)
btnPagar: TButton;
btnSair: TButton;
CnWinbonus: TADOConnection;
Gauge: TGauge;
SeqCabecLancamentos: TLDASequence;
dbWinBonus: TDatabase;

procedure Trata_ParcelasADO(argDocumento :String;
argParcela :Integer;
argDt_Venc :TDateTime);


function Pesquisa_Valor_RecebidoADO(argDocumento: String;
argProdutor, argRamo: Integer; argSubRamo: String; argParcela: Integer;
argTipoLancamento: String): Currency;

function Calcula_PL_SubRamo_ApoliceADO(const argDocumento : String;
const argRamo : Integer;
const argSubRamo : String) : Currency;

function PL_Apoe_NElemADO(argDocumento :String; argParcela :Integer) : Currency;

procedure btnPagarClick(Sender: TObject);

function Calcula_PL_SubRamo_PropostaADO(const argDocumento : String;
const argRamo : Integer;
const argSubRamo : String) : Currency;

function Retorna_SubRamo_Similar_RamoADO(argRamo : Integer): String;

function Calcula_Comis_CorretorADO(var argTemProducao :Boolean;
argDataModuleCriado: Boolean;
argCheia: Boolean;
argSubRamoSomado: Boolean;
argDocumento: String;
argCorretor: Integer;
argRamo: Integer;
argSubRamo: String;
argParcela: Integer;
argTipoLanc: String;
argRecursividade: Boolean;
argPercentual: Currency = -1;
(*******************************
* O argumento abaixo resolve *
* problema na distribuição do *
* total a receber,qdo subramo *
* somado *
*******************************)
argRedistribuindoTotal: Boolean = False): Currency;

function Receber_Proxima_ParcelaADO(argDocumento :String;
argCorretor,
argRamo :Integer;
argSubramo :string;
argParcelaN_Mais_1 :Integer) :Boolean;

procedure Trata_Receb_Comis_Apolice_NElemADO(argDocumento :String;
argCorretor,
argParcela :Integer;
argDt_Venc :TDateTime);

function Checa_Insere_CabecLancamentos(ArgSeguradora: Integer;
ArgDtRecebido: TDatetime; ArgNumDocSeg: String; ArgISS, ArgIR, ArgOutros : real; ArgSequencia: TLDASequence): Integer;

function Arredonda_Valores(argValor: Extended): Extended;
procedure btnSairClick(Sender: TObject);

private
{ Private declarations }
FTotal_A_Receber : Currency;
FPercComissao :Currency;
FPercSubRamoPrincipal :Double;
FTemProducao :Boolean;
FPercAlterado :Boolean;
public
{ Public declarations }
end;

const
parNUM_PROPOSTA = ´apoe_num_proposta´;

var
Form1: TForm1;
Qry, QryComis, QryAux : TADODataSet;
QryUpdt,QryImpostos: TADOCommand;

implementation

{$R *.DFM}

function TForm1.Arredonda_Valores(argValor: Extended): Extended;
begin
Result := ( ( Round( argValor * 100 ) ) / 100 );
end;

procedure TForm1.btnPagarClick(Sender: TObject);
const
valTIMEOUT_BACKUP_RESTORE = 900;
var
vTemProducao: Boolean;
i,j,k,l,seq : integer;
valcom : real;
iss,ir : string;
begin
Qry := TADODataSet.Create(Nil);
QryUpdt := TADOCommand.Create(Nil);
QryComis := TADODataSet.Create(Nil);
QryImpostos := TADOCommand.Create(Nil);
QryAux := TADODataSet.Create(Nil);
Try
Try
With Qry do
Begin
Connection := CnWinbonus;
CommandTimeout := valTIMEOUT_BACKUP_RESTORE;
Close;
CommandText := ´´;
CommandText := ´ SELECT lan.apoe_num_proposta, lan.corretor, lan.ramo, lan.sub_ramo, lan.apoepar_num_parcela, ´ +
´ lan.tipo_lancamento, lan.lan_perc_comiss_recebido, ´ +
´ aep.apoepar_dt_vencimento DATA, aep.apoepar_valor, ´ +
´ aep.apoepar_premio_liq, ae.apoe_tipo_apolice, ae.apoe_num_apolice, cor.cor_fantasia, ae.seguradora ´;
CommandText := CommandText + ´ FROM lancamentos lan, apolice_elem_parcelas aep, apolices_elem ae, corretores cor ´;
CommandText := CommandText + ´ WHERE aep.apoe_num_proposta = lan.apoe_num_proposta ´ +
´ AND aep.apoepar_num_parcela = lan.apoepar_num_parcela ´ +
´ AND lan.apoe_num_proposta = ae.apoe_num_proposta ´;
CommandText := CommandText + ´ AND aep.apoepar_dt_vencimento >= ´´01/01/1996´´ ´;
CommandText := CommandText + ´ AND aep.apoepar_dt_vencimento <= ´´12/31/2002´´ ´ +
´ AND lan.lan_status=´ + QuotedStr(´A´) +
´ AND aep.apoepar_premio_liq <> 0 ´ +
´ AND ((ae.apoe_status=´ + QuotedStr(´D´) + ´) or (ae.apoe_status=´ + QuotedStr(´P´) + ´ AND ae.apoe_tipo_apolice=´ + QuotedStr(´E´) + ´) ´ +
´ OR (ae.apoe_status=´ + QuotedStr(´P´) + ´ AND ae.apoe_tipo_documento=´ + QuotedStr(´E´) + ´)) ´ +
´ AND cor.corretor=lan.corretor ´;
CommandText := CommandText + ´ AND ae.cliente=1044 ´;
CommandText := CommandText + ´ ORDER BY ae.seguradora, DATA ´;
Open;

QryUpdt.Connection := CnWinbonus;
CommandTimeout := valTIMEOUT_BACKUP_RESTORE;
QryUpdt.CommandText := ´´;
QryUpdt.CommandText := ´ UPDATE lancamentos ´ +
´ SET lan_valor_recebido=:pvalor, ´ +
´ lan_status=´ + QuotedStr(´P´) + ´, ´ +
´ cl_seq = :seq, ´ +
´ lan_perc_comiss_recebido=:rec ´ +
´ WHERE apoe_num_proposta=:proposta ´ +
´ AND corretor=:corretor ´ +
´ AND ramo=:ramo ´ +
´ AND sub_ramo=:sub_ramo ´ +
´ AND apoepar_num_parcela=:parcela ´ +
´ AND tipo_lancamento=:tplanc ´;

QryImpostos.Connection := CnWinbonus;
CommandTimeout := valTIMEOUT_BACKUP_RESTORE;
QryImpostos.CommandText := ´´;
QryImpostos.CommandText := ´ UPDATE cabec_lancamentos ´ +
´ SET cl_iss = cl_iss + :iss, ´ +
´ cl_ir = cl_ir + :ir ´ +
´ WHERE cl_seq = :cl_seq ´ +
´ AND (cl_iss + :iss >= 0) ´ +
´ AND (cl_ir + :ir >= 0) ´;


QryAux.Connection := CnWinbonus;
CommandTimeout := valTIMEOUT_BACKUP_RESTORE;
QryAux.CommandText := ´´;
QryAux.CommandText := ´ SELECT iss_perc, ir_perc ´ +
´ FROM corretores ´ +
´ WHERE corretor = :corretor´;


QryComis.Connection := CnWinbonus;
CommandTimeout := valTIMEOUT_BACKUP_RESTORE;
QryComis.CommandText := ´´;
QryComis.CommandText := ´SELECT ccp.comcorperc_perc_comissao ´ +
´FROM comiss_corretor cc, comiss_corretor_perc ccp ´ +
´WHERE cc.apoe_num_proposta = ccp.apoe_num_proposta ´ +
´AND cc.corretor = ccp.corretor ´ +
´AND ccp.apoe_num_proposta = :proposta ´ +
´AND ccp.corretor = :corretor ´ +
´AND ccp.ramo = :ramo ´ +
´AND ccp.sub_ramo = :sub_ramo ´ +
´AND ( ( ccp.comcorperc_parcela_de <= :comcorperc_parcela_de ´ +
´AND ccp.comcorperc_parcela_ate >= :comcorperc_parcela_ate ) ´ +
´ OR ´ +
´ ( not( ccp.comcorperc_parcela_de <= :comcorperc_parcela_de ´ +
´AND ´ +
´ ccp.comcorperc_parcela_ate >= :comcorperc_parcela_ate ) ´ +
´ and (ccp.vitalicio = ´ + QuotedStr(´S´) + ´) ) ´ +
´ ) ´;
If not BOF Then
First;
If RecordCount = 0 Then
Begin
ShowMessage(´Não existem registros para o filtro selecionado.´);
Exit;
End;
Gauge.MaxValue := RecordCount;
Gauge.Progress := 0;

//Gera um sequencial
seq := SeqCabecLancamentos.GetProximoInt(´seq_cabec_lanc´);
While not EOF do
Begin
If Not CnWinbonus.Intransaction Then CnWinbonus.BeginTrans;

QryAux.Close;
QryAux.Parameters.Parambyname(´corretor´).value := Fieldbyname(´corretor´).asinteger;
QryAux.Open;

QryUpdt.Parameters.Parambyname(´proposta´).Value := Fieldbyname(´apoe_num_proposta´).asstring;
QryUpdt.Parameters.Parambyname(´corretor´).Value := Fieldbyname(´corretor´).asinteger;
QryUpdt.Parameters.Parambyname(´ramo´).Value := Fieldbyname(´ramo´).asinteger;
QryUpdt.Parameters.Parambyname(´sub_ramo´).Value := Fieldbyname(´sub_ramo´).asstring;
QryUpdt.Parameters.Parambyname(´parcela´).Value := Fieldbyname(´apoepar_num_parcela´).asinteger;
QryUpdt.Parameters.Parambyname(´tplanc´).Value := Fieldbyname(´tipo_lancamento´).asstring;
QryUpdt.Parameters.Parambyname(´seq´).Value := Checa_Insere_CabecLancamentos(Fieldbyname(´seguradora´).asinteger,
Fieldbyname(´data´).asdatetime,
´REC. AUTOMATICO´,
0,0,0,SeqCabecLancamentos);

QryComis.Close;
QryComis.Parameters.ParamByName(´proposta´).Value := Fieldbyname(´apoe_num_proposta´).asstring;
QryComis.Parameters.ParamByName(´corretor´).Value := Fieldbyname(´corretor´).asinteger;
QryComis.Parameters.ParamByName(´ramo´).Value := Fieldbyname(´ramo´).asinteger;
QryComis.Parameters.ParamByName(´sub_ramo´).Value := Fieldbyname(´sub_ramo´).asstring;
If Fieldbyname(´apoe_tipo_apolice´).asstring = ´N´ Then //nao-elementar
begin
For k := 0 to QryComis.Parameters.Count-1 do
begin
If (UpperCase(QryComis.Parameters.Items[k].Name) = ´COMCORPERC_PARCELA_DE´) or
(UpperCase(QryComis.Parameters.Items[k].Name) = ´COMCORPERC_PARCELA_ATE´) Then
QryComis.Parameters.Items[k].Value := Fieldbyname(´apoepar_num_parcela´).asinteger;
end;
end
else
begin
For k := 0 to QryComis.Parameters.Count-1 do
begin
If (UpperCase(QryComis.Parameters.Items[k].Name) = ´COMCORPERC_PARCELA_DE´) or
(UpperCase(QryComis.Parameters.Items[k].Name) = ´COMCORPERC_PARCELA_ATE´) Then
QryComis.Parameters.Items[k].Value := 1;
end;
end;
QryComis.Open;

QryUpdt.Parameters.Parambyname(´rec´).Value := QryComis.Fieldbyname(´comcorperc_perc_comissao´).asfloat;

valcom := Calcula_Comis_CorretorADO(vTemProducao,
False,
False,
False,
Fieldbyname(´apoe_num_proposta´).asstring,
Fieldbyname(´corretor´).asinteger,
Fieldbyname(´ramo´).asinteger,
Fieldbyname(´sub_ramo´).asstring,
Fieldbyname(´apoepar_num_parcela´).asinteger,
´N´,
False
{argRedistribuindoTotal -> Valor Padrão}
);

QryUpdt.Parameters.Parambyname(´pvalor´).Value := valcom;

iss := StringReplace(FormatFloat(´#0.00´,(valcom * QryAux.Fieldbyname(´iss_perc´).asfloat) / 100),´,´,´.´,[rfReplaceAll]);
ir := StringReplace(FormatFloat(´0.00´,(valcom * QryAux.Fieldbyname(´ir_perc´).asfloat) / 100),´,´,´.´,[rfReplaceAll]);
QryImpostos.CommandText := ´ UPDATE cabec_lancamentos ´ +
´ SET cl_iss = cl_iss + ´ + iss + ´ , ´ +
´ cl_ir = cl_ir + ´ + ir +
´ WHERE cl_seq = ´ + InttoStr(QryUpdt.Parameters.Parambyname(´seq´).Value) +
´ AND (cl_iss + ´ + iss + ´ >= 0) ´ +
´ AND (cl_ir + ´ + ir + ´ >= 0) ´;
QryImpostos.Execute;

QryUpdt.Execute;

If Fieldbyname(´apoe_tipo_apolice´).asstring = ´N´ Then //nao-elementar
Begin
i := Fieldbyname(´apoepar_num_parcela´).asinteger; // guarda parcela inicial
j := 1; //contador pra data
While (Receber_Proxima_ParcelaADO(Fieldbyname(´apoe_num_proposta´).asstring,
Fieldbyname(´corretor´).asinteger,
Fieldbyname(´ramo´).asinteger,
Fieldbyname(´sub_ramo´).AsString,
i + 1)) do
Begin
Trata_Receb_Comis_Apolice_NElemADO(Fieldbyname(´apoe_num_proposta´).asstring,
Fieldbyname(´corretor´).asinteger,
i,
IncMonth(Fieldbyname(´DATA´).asdatetime,j-1));
// 31/12/2002
If IncMonth(Fieldbyname(´DATA´).asdatetime,j)<=37621 Then
Begin
QryUpdt.Parameters.Parambyname(´proposta´).Value := Fieldbyname(´apoe_num_proposta´).asstring;
QryUpdt.Parameters.Parambyname(´corretor´).Value := Fieldbyname(´corretor´).asinteger;
QryUpdt.Parameters.Parambyname(´ramo´).Value := Fieldbyname(´ramo´).asinteger;
QryUpdt.Parameters.Parambyname(´sub_ramo´).Value := Fieldbyname(´sub_ramo´).asstring;
QryUpdt.Parameters.Parambyname(´parcela´).Value := i + 1; //Fieldbyname(´apoepar_num_parcela´).asinteger + i;
QryUpdt.Parameters.Parambyname(´tplanc´).Value := Fieldbyname(´tipo_lancamento´).asstring;

QryComis.Close;
QryComis.Parameters.ParamByName(´proposta´).Value := Fieldbyname(´apoe_num_proposta´).asstring;
QryComis.Parameters.ParamByName(´corretor´).Value := Fieldbyname(´corretor´).asinteger;
QryComis.Parameters.ParamByName(´ramo´).Value := Fieldbyname(´ramo´).asinteger;
QryComis.Parameters.ParamByName(´sub_ramo´).Value := Fieldbyname(´sub_ramo´).asstring;
If Fieldbyname(´apoe_tipo_apolice´).asstring = ´N´ Then //nao-elementar
begin
For k := 0 to QryComis.Parameters.Count-1 do
begin
If (UpperCase(QryComis.Parameters.Items[k].Name) = ´COMCORPERC_PARCELA_DE´) or
(UpperCase(QryComis.Parameters.Items[k].Name) = ´COMCORPERC_PARCELA_ATE´) Then
QryComis.Parameters.Items[k].Value := Fieldbyname(´apoepar_num_parcela´).asinteger;
end;
end
else
begin
For k := 0 to QryComis.Parameters.Count-1 do
begin
If (UpperCase(QryComis.Parameters.Items[k].Name) = ´COMCORPERC_PARCELA_DE´) or
(UpperCase(QryComis.Parameters.Items[k].Name) = ´COMCORPERC_PARCELA_ATE´) Then
QryComis.Parameters.Items[k].Value := 1;
end;
end;
QryComis.Open;

QryUpdt.Parameters.Parambyname(´rec´).Value := QryComis.Fieldbyname(´comcorperc_perc_comissao´).asfloat;

QryUpdt.Parameters.Parambyname(´seq´).Value := Checa_Insere_CabecLancamentos(Fieldbyname(´seguradora´).asinteger,
IncMonth(Fieldbyname(´DATA´).asdatetime,j),
´REC. AUTOMATICO´,
0,0,0,SeqCabecLancamentos);

valcom := Calcula_Comis_CorretorADO(vTemProducao,
False,
False,
False,
Fieldbyname(´apoe_num_proposta´).asstring,
Fieldbyname(´corretor´).asinteger,
Fieldbyname(´ramo´).asinteger,
Fieldbyname(´sub_ramo´).asstring,
i + 1, // Fieldbyname(´apoepar_num_parcela´).asinteger + i,
´N´,
False
{argRedistribuindoTotal -> Valor Padrão}
);
QryUpdt.Parameters.Parambyname(´pvalor´).Value := valcom;
QryUpdt.Execute;
end
else
break;
i := i + 1;
J := j + 1;
End;
If CnWinbonus.Intransaction Then CnWinbonus.CommitTrans;
End;
Qry.Next;
Gauge.Progress := Gauge.Progress + 1;
End;
End;
ShowMessage(´Baixa Automática efetuada com sucesso.´);
Except
on E: Exception do
begin
ShowMessage(´Erro na Baixa Automática! ´ + E.Message);
If CnWinbonus.Intransaction Then CnWinbonus.RollBackTRans;
end;
End;
Finally
Qry.Free;
QryUpdt.Free;
QryComis.Free;
QryImpostos.Free;
QryAux.Free;
End;
Gauge.MaxValue := 0;
Gauge.Progress := 0;
end;

function TForm1.Calcula_Comis_CorretorADO(var argTemProducao: Boolean;
argDataModuleCriado,
argCheia,
argSubRamoSomado: Boolean;
argDocumento: String;
argCorretor,
argRamo: Integer;
argSubRamo: String;
argParcela: Integer;
argTipoLanc: String;
argRecursividade: Boolean;
argPercentual: Currency = -1; //////////
(*********************************************************
* O problema abaixo resolve problema na distribuição do *
* total a receber, qdo subramo somado *
*********************************************************)
argRedistribuindoTotal: Boolean = False): Currency; //////////
var
vComis, vPL_Mais_ADFrac, vTotal_Comissao_SubRamo, vDescPerc :Currency;
vPL_Documento, vPL_SubRamo, vPL_SubRamo_Parcela, vPercentual_Comissao, vEsgotamento :Currency;
vRamo, vNumParcelas_Documento :Integer;
vSubRamo, vFormaPG, vStatus :String;
vqryDocumento :TADOQuery;
vqryComisCorretor : TADOQuery;
{RMC - 13/05/2002
Motivo : Sempre que Ramo for Elementar, vTEMPRODUCAO = TRUE}
vElementar, FIncideAdic : Boolean;
i: integer;
begin

//Calculos levando-se em conta TIPO DO PAGAMENTO/COMISSIONAMENTO,
//PERCENTUAL e NÚMERO de PARCELAS
vComis := 0;

{Obtendo informações do Documento ´argDocumento´}
vqryDocumento := TADOQuery.Create(nil);
with vqryDocumento do
begin

Connection := CnWinbonus;
Sql.Clear;
Parameters.Clear;

Sql.Add(´select apoe_premio_liquido_orig, apoe_adicfrac_valor_orig, ´ +
´ apoe_num_parcelas, apoe_status, apoe_desc_perc, ´ +
´ apoe_tipo_apolice ´ +
´from apolices_elem ´ +
´where apoe_num_proposta = :apoe_num_proposta ´);

Parameters.Parambyname(parNUM_PROPOSTA).DataType := ftString;
Parameters.Parambyname(parNUM_PROPOSTA).value := argDocumento;
Open;

vNumParcelas_Documento := FieldByName(´apoe_num_parcelas´).AsInteger;

end;

{Obtendo informações do Comissionamento do Corretor}
vqryComisCorretor := TADOQuery.Create(nil);
with vqryComisCorretor do
begin
Connection := CnWinbonus;
Sql.Clear;
Parameters.Clear;

Sql.Add(´select cc.corretor, cc.comcor_tipo_pagto, cc.comcor_incide_adic_frac, ´ +
´ ccp.comcorperc_perc_comissao ´ +
´from comiss_corretor cc, comiss_corretor_perc ccp ´ +
´where cc.apoe_num_proposta = ccp.apoe_num_proposta ´ +
´and cc.corretor = ccp.corretor ´ +
´and ccp.apoe_num_proposta = :apoe_num_proposta ´ +
´AND ccp.corretor = :corretor ´ +
´AND ccp.ramo = :ramo ´ +
´AND ccp.sub_ramo = :sub_ramo ´ +
´AND ( ( ccp.comcorperc_parcela_de <= :comcorperc_parcela_de ´ +
´ and ´ +
´ ccp.comcorperc_parcela_ate >= :comcorperc_parcela_ate ) ´ +
´ OR ´ +
´ ( not( ccp.comcorperc_parcela_de <= :comcorperc_parcela_de ´ +
´ and ´ +
´ ccp.comcorperc_parcela_ate >= :comcorperc_parcela_ate ) ´ +
´ and (ccp.vitalicio =´ + QuotedStr(´S´) + ´ ) ) ) ´);



//SETA PARÂMETROS
for i:=0 to Parameters.Count-1 do
begin
Parameters.Items[i].DataType := ftstring;
Parameters.Items[i].Direction := pdInput;
end;

Parameters.Parambyname(parNUM_PROPOSTA).value := argDocumento;
Parameters.Parambyname(´corretor´).value := argCorretor;
vRamo := argRamo;
Parameters.Parambyname(´ramo´).value := vRamo;

vSubRamo := argSubRamo;
if ( argSubramoSomado ) then
Parameters.Parambyname(´sub_ramo´).value := Retorna_SubRamo_Similar_RamoADO(vRamo)
else
Parameters.Parambyname(´sub_ramo´).value := vSubRamo;

vElementar := (vqryDocumento.FieldbyName(´apoe_tipo_apolice´).AsString = ´E´);

if vElementar then
begin
for i:=0 to Parameters.Count-1 do
begin
If Parameters.Items[i].DisplayName = ´comcorperc_parcela_de´ Then
Parameters.Items[i].value := ´1´;
If Parameters.Items[i].DisplayName = ´comcorperc_parcela_ate´ Then
Parameters.Items[i].value := ´1´;
end;
end
else
begin
for i:=0 to Parameters.Count-1 do
begin
If Parameters.Items[i].DisplayName = ´comcorperc_parcela_de´ Then
Parameters.Items[i].value := argParcela;
If Parameters.Items[i].DisplayName = ´comcorperc_parcela_ate´ Then
Parameters.Items[i].value := argParcela;
end;

end;
Open;

FIncideAdic := (FieldByName(´comcor_incide_adic_frac´).AsString = ´S´);

argTemProducao := vElementar OR (vqryComisCorretor.RecordCount > 0);
end;

{************************************************************************
* Se nada tiver sido cadastrado nas tabelas de comissionamento, trazer *
* INTEGRAL com comissão igual à 0(zero). *
************************************************************************}
if (vqryComisCorretor.RecordCount > 0) then
begin

vStatus := vqryDocumento.FieldByName(´apoe_status´).AsString;

if ( vStatus = ´P´ ) then
begin
vDescPerc := 1 - (vqryDocumento.FieldByName(´apoe_desc_perc´).AsCurrency / 100);
vPL_SubRamo := Arredonda_Valores(Calcula_PL_SubRamo_PropostaADO(argDocumento, vRamo, vSubRamo) * vDescPerc)
end
{SE APÓLICE RAMO NÃO ELEMENTAR => APOLICE_ELEM_PARCELAS.APOEPAR_PREMIO_VALOR}
else if ((vStatus = ´D´) and (vqryDocumento.FieldByName(´apoe_tipo_apolice´).AsString = ´N´)) then
vPL_SubRamo := PL_Apoe_NElemADO(argDocumento, argParcela)
{SE APÓLICE RAMO ELEMENTAR OU QUALQUER ENDOSSO}
else
vPL_SubRamo := Arredonda_Valores(Calcula_PL_SubRamo_ApoliceADO(argDocumento, vRamo, vSubRamo) {* vDescPerc} );

{Obtendo Percentual de Comissão}
if ( argPercentual = -1 ) then
vPercentual_Comissao := vqryComisCorretor.FieldByName(´comcorperc_perc_comissao´).AsFloat
else
vPercentual_Comissao := argPercentual;

{**********************************************************************
* A variável FPercSubRamoPrincipal deve receber o Valor Percentual e *
* não ( Valor Percentual / 100 ) *
**********************************************************************}
if (argDataModuleCriado) then
FPercSubRamoPrincipal := vPercentual_Comissao;

vPercentual_Comissao := ( vPercentual_Comissao / 100 );

{*************************************************************
* FORMA DE PAGAMENTO! Se estivermos calculando a comissão *
* de um lançamento de estorno e esta mesma função estiver *
* sendo chamada por recursividade(argRecursividade = True), *
* forçamos a forma de pagamento nas parcelas, de acordo com *
* a fórmula de cálculo da quantia a ser estornada *
*************************************************************}
if ( (( argTipoLanc = ´E´ ) and (argRecursividade))
or
argRedistribuindoTotal ) then
vFormaPg := ´P´
else if ( argCheia ) then
begin

//if (vqryDocumento.FieldByName(fldAPOE_STATUS).AsString = valSTATUS_DOC_APOLICE) then
if (vqryDocumento.FieldByName(´apoe_status´).AsString = ´D´)
AND
(vqryDocumento.FieldByName(´apoe_tipo_apolice´).AsString = ´N´) then
VFormaPg := ´P´
else
VFormaPg := ´I´;

end
else if ( argTipoLanc = ´N´ ) then
vFormaPg := vqryComisCorretor.FieldByName(´comcor_tipo_pagto´).AsString;

vPL_Documento := vqryDocumento.FieldByName(´apoe_premio_liquido_orig´).AsCurrency;

if ( vFormaPg = ´F´ ) then
BEGIN //////////
//Cálcula e Arredonda o Total de Comissão do Corretor => Pagamento no vEsgotamento
vTotal_Comissao_SubRamo := Arredonda_Valores( vPL_SubRamo * vPercentual_Comissao ); //////////
//Se o CORRETOR recebe sobre o Adicional de Fracionamento, somar um
//proporcional ao que o CORRETOR deve receber nesta Parcela/Subramo
if (vqryComisCorretor.FieldByName(´comcor_incide_adic_frac´).AsString = ´S´) then //////////
vTotal_comissao_SubRamo := vTotal_comissao_SubRamo + Arredonda_Valores( Arredonda_Valores( vqryDocumento.FieldByName(´apoe_adicfrac_valor_orig´).AsCurrency * (vPL_SubRamo / vPL_Documento) ) * vPercentual_Comissao);
END; //////////
//else //////////
//begin //////////
//Soma Prêmio Líquido Original da Apólice ao Adicional de Fracionamento,
//caso o corretor tenha direito ao mesmo
//Ramo Não Elementar NÃO tem Adicional de Fracionamento
if ( not (vqryDocumento.FieldByName(´apoe_tipo_apolice´).AsString = ´N´) ) then
begin

if (vPL_Documento <> 0) then
begin
if ((vPL_SubRamo / vPL_Documento) <> 0) and (vqryComisCorretor.FieldByName(´comcor_incide_adic_frac´).AsString = ´S´) then
//vPL_Mais_ADFrac := vPL_Documento + Arredonda_Valores( vqryDocumento.FieldByName(fldAPOE_ADICFRAC_VALOR_ORIG).AsCurrency * (vPL_SubRamo / vPL_Documento) )
vPL_Mais_ADFrac := vPL_SubRamo + Arredonda_Valores( vqryDocumento.FieldByName(´apoe_adicfrac_valor_orig´).AsCurrency * (vPL_SubRamo / vPL_Documento) )
else
vPL_Mais_ADFrac := vPL_SubRamo;

end
else
vPL_Mais_ADFrac := vPL_Documento;

end
else
vPL_Mais_ADFrac := vPL_SubRamo;
//end; //////////

{**********************
* PAGAMENTO INTEGRAL *
**********************}
if (vFormaPg = ´I´) and (argParcela = 1) then
begin
vComis := Arredonda_Valores( vPL_Mais_ADFrac * vPercentual_Comissao );
end
{**************************
* PAGAMENTO NAS PARCELAS *
**************************}
else if (vFormaPg = ´P´) then
begin

if ( (vqryDocumento.FieldByName(´apoe_tipo_apolice´).AsString = ´N´) ) then
begin
vComis := Arredonda_Valores( vPL_Mais_ADFrac * vPercentual_Comissao )
end
else
begin
vComis := Arredonda_Valores( Arredonda_Valores( vPL_Mais_ADFrac / vNumParcelas_Documento ) * vPercentual_Comissao );
end;

end
{**********************
* PAGAMENTO NO FLUXO *
**********************}
else if (vFormaPg = ´F´) then
begin

//////////
//vEsgotamento := vTotal_Comissao_SubRamo - Arredonda_Valores( Arredonda_Valores( vPL_SubRamo / vNumParcelas_Documento ) * ( argParcela - 1 ) );
vEsgotamento := vTotal_Comissao_SubRamo - Arredonda_Valores( Arredonda_Valores( vPL_Mais_ADFrac / vNumParcelas_Documento ) * ( argParcela - 1 ) );

{******************************************************************
* Comparar Valor do PL do do Subramo na Parcela e Esgotamento, *
* pois deve ser pago ao corretor o menor entre os dois. Se valor *
* do Esgotamento for igual ou menor que zero, nada deve ser pago.*
* A regra acima vale para PLs maiores que ZERO. Quando for *
* estorno deve receber esgotamento negativo. *
******************************************************************}
//if (vEsgotamento > 0) then
if ( ((vTotal_Comissao_SubRamo > 0) and (vEsgotamento > 0))
OR
((vTotal_Comissao_SubRamo < 0) and (vEsgotamento < 0))
) then
begin

{*******************************************************************
* Atenção!!! O trecho de código comentado abaixo foi subustituido *
* pelo codigo logo a seguir! Motivos: critica sem pé nem cabeça e *
* erro no pagamento por fluxo, pois não havia a comparação do *
* esgotamento com *
*******************************************************************}
//if (vPL_SubRamo_Parcela <> 0) then
// vPL_SubRamo_Parcela := Arredonda_Valores( vPL_SubRamo / vNumParcelas_Documento )
//else
// vPL_SubRamo_Parcela := 0;
//vPL_SubRamo_Parcela := Arredonda_Valores(vPL_SubRamo / vNumParcelas_Documento); //////////
vPL_SubRamo_Parcela := Arredonda_Valores(vPL_Mais_ADFrac / vNumParcelas_Documento); //////////

if ( ((vTotal_Comissao_SubRamo > 0)
and
(vEsgotamento > vPL_SubRamo_Parcela))
OR
((vTotal_Comissao_SubRamo < 0)
and
(vEsgotamento < vPL_SubRamo_Parcela))
) then
vEsgotamento := vPL_SubRamo_Parcela;
end
else
vEsgotamento := 0;

vComis := vEsgotamento;
end;

end;

// ***********************************************************************
// * RECURSIVIDADE PARA TRATAR OS REGISTROS DE ESTORNO *
// * Para calcularmos a quantia a ser estornada, usamos a regra abaixo: *
// * Quantia calculada quando lançamento do tipo ´N´ e tipo de pagamento *
// * definido pelo campo comcor_tipo_pagto menos a quantia calculada *
// * quando lançamento do tipo ´E´ e tipo de pagamento ´Nas Parcelas´ *
// ***********************************************************************
if ( ( not argRecursividade) and ( argTipoLanc = ´E´ ) ) then
begin

//testar se é primeira parcela (caso que foge à regra)
if ( (argParcela = 1) and ( vStatus = ´P´ ) ) then
begin

if ( argPercentual = -1 ) then
begin
Result := (-1) * Pesquisa_Valor_RecebidoADO(argDocumento,
argCorretor,
argRamo,
argSubRamo,
1,
´N´);
end
else
//Quando alterado o total_a_receber, é calculado um novo percentual.
//Tratando-se de um estorno, este seria negativo, porém calculamos
//o valor absoluto dele e aqui multiplicamos por -1 (menos um) ...
Result := (-1) * vComis;

end
else
begin
{Result := vComis - Calcula_Comis_Corretor(False,
False,
argSubRamoSomado,
argDocumento,
argCorretor,
argRamo,
argSubRamo,
argParcela,
argTipoLanc,
True,
argPercentual);}
{PARCELA 1(primeira) e STATUS DOCUMENTO PROPOSTA}
if (argParcela = 1) then
begin
Result := 0;
end
else
begin
Result := vComis - Calcula_Comis_CorretorADO(FTemProducao,
False,
False,
argSubRamoSomado,
argDocumento,
argCorretor,
argRamo,
argSubRamo,
argParcela,
argTipoLanc,
True,
argPercentual);
end;

end;
end
else
begin
//Result := vComis;

if (argDatamoduleCriado) then
begin

// ********************************************************************
// * Se Alterado o Total_a_Receber e este novo for negativo, *
// * temos que testar e tornar a nova comissão negativa! *
// * Proteção devido ao valor default do parâmetro argPercentual = -1 *
// * Para tal trabalhamos somente com valores absolutos(positivos) de *
// * percentuais *
// ********************************************************************
if ( (not FPercAlterado) and (argPercentual <> -1) and (FTotal_a_Receber < 0) ) then
Result := (-1) * vComis
else
{Cuidado ao tentar otimizar o código abaixo!}
Result := vComis;
end
else
{Cuidado ao tentar otimizar o código abaixo!}
Result := vComis;

end;

FPercComissao := vqryComisCorretor.FieldByName(´comcorperc_perc_comissao´).AsFloat;
vqryDocumento.Close;
vqryDocumento.Free;
vqryComisCorretor.Close;
vqryComisCorretor.Free;

end;

function TForm1.Calcula_PL_SubRamo_ApoliceADO(const argDocumento: String;
const argRamo: Integer;
const argSubRamo: String): Currency;
var
qryPL_Apolice :TADOQuery;
begin
Result := 0;

qryPL_Apolice := TADOQuery.Create(nil);

with qryPL_Apolice do
begin
if Active then
Close;

Connection := CnWinbonus;

Sql.Clear;

Sql.Add(´SELECT apoepremio_premio ´ +
´FROM apoe_premio_subramo ´ +
´WHERE apoe_num_proposta = ´´´ + argDocumento + ´´´ ´ +
´AND ramo = ´ + IntToStr(argRamo) + ´ ´ +
´AND sub_ramo = ´´´ + argSubRamo + ´´´ ´);
Open;

if ( RecordCount > 0 ) then
Result := FieldByName(´apoepremio_premio´).AsCurrency;

Close;
Free;
end;
end;

function TForm1.Calcula_PL_SubRamo_PropostaADO(const argDocumento: String;
const argRamo: Integer;
const argSubRamo: String): Currency;
const
fldPL_Total = ´pl_subramo´;
var
qryTotalPL :TADOQuery;
begin
Result := 0;

qryTotalPL := TADOQuery.Create(nil);

with qryTotalPL do
begin
if Active then
Close;

Connection := CnWinbonus;

Sql.Clear;

Sql.Add(´SELECT SUM(apoeitcob_premio) AS ´ + fldPL_Total + ´ ´ +
´FROM apoeit_coberturas ´ +
´WHERE apoe_num_proposta = ´´´ + argDocumento + ´´´ ´ +
´AND cob_sequencial in ( SELECT cob_sequencial ´ +
´FROM ramos_coberturas ´ +
´WHERE ramo = ´ + IntToStr(argRamo) + ´ ´ +
´AND sub_ramo = ´´´ + argSubRamo + ´´´ ) ´);
Open;

if ( RecordCount > 0 ) then
Result := FieldByName(fldPL_Total).AsCurrency;

Close;
Free;
end;
end;

function TForm1.Checa_Insere_CabecLancamentos(ArgSeguradora: Integer;
ArgDtRecebido: TDatetime; ArgNumDocSeg: String; ArgISS, ArgIR, ArgOutros : real; ArgSequencia: TLDASequence): Integer;
var
Qry : TADOQuery;
i: integer;
begin

Qry := TADOQuery.Create(Nil);
Try
With Qry do
begin
Connection := CnWinbonus;
Sql.Add(´select cl_seq from cabec_lancamentos where seguradora=´ + InttoStr(ArgSeguradora) +
´ and cl_dt_recebido=´ + QuotedStr(FormatDateTime(´mm/dd/yyyy´,ArgDtRecebido)) +
´ and cl_num_doc_seg=´ + QuotedStr(ArgNumDocSeg));
Open;
If IsEmpty Then
begin
Close;
Sql.Clear;
i := ArgSequencia.GetProximoInt(´seq_cabec_lanc´);
Sql.Add(´ insert into cabec_lancamentos (cl_seq, seguradora, cl_dt_recebido, cl_num_doc_seg,´ +
´ cl_iss, cl_ir, cl_outros_valores) values ´);
Sql.Add(´ (:cl_seq, :seguradora,´ + QuotedStr(FormatDateTime(´mm/dd/yyyy´,ArgDtRecebido)) + ´, :cl_num_doc_seg,´ +
´ :cl_iss, :cl_ir, :cl_outros_valores) ´);
Parameters.Parambyname(´cl_seq´).value := i;
Parameters.Parambyname(´seguradora´).value := ArgSeguradora;
// Parameters.Parambyname(´cl_dt_recebido´).value := ArgDtRecebido;
Parameters.Parambyname(´cl_num_doc_seg´).value := ArgNumDocSeg;
Parameters.Parambyname(´cl_iss´).value := ArgISS;
Parameters.Parambyname(´cl_ir´).value := ArgIR;
Parameters.Parambyname(´cl_outros_valores´).value := ArgOutros;
ExecSql;
Result := i;
end
else
Result := Qry.Fieldbyname(´cl_seq´).asinteger;
end;
Finally
Qry.Free;
End;
end;

function TForm1.Pesquisa_Valor_RecebidoADO(argDocumento: String;
argProdutor, argRamo: Integer; argSubRamo: String; argParcela: Integer;
argTipoLancamento: String): Currency;
var qryValorRecebido :TADOQuery;
begin
Result := 0;
qryValorRecebido := TADOQuery.Create(nil);

with qryValorRecebido do
begin

Connection := CnWinbonus;

Sql.Add(´SELECT DISTINCT lanprod_valor_recebido ´ +
´FROM lancamentos_prod ´ +
´WHERE apoe_num_proposta = ´´´ + argDocumento + ´´´ ´ +
´AND produtor = ´ + IntToStr(argProdutor) + ´ ´ +
´AND ramo = ´ + IntToStr(argRamo) + ´ ´ +
´AND sub_ramo = ´´´ + argSubRamo + ´´´ ´ +
´AND apoepar_num_parcela = ´ + IntToStr(argParcela) + ´ ´ +
´AND tipo_lancamento = ´´´ + argTipoLancamento + ´´´ ´);

Open;

if (RecordCount > 0) then
Result := FieldByName(´lanprod_valor_recebido´).AsCurrency;

Close;
Free;
end;
end;

function TForm1.PL_Apoe_NElemADO(argDocumento :String; argParcela :Integer) : Currency;
var
qryPL_Apoe_NElem :TADOQuery;
begin
Result := 0;

qryPL_Apoe_NElem := TADOQuery.Create(nil);

with qryPL_Apoe_NElem do
begin
Connection := CnWinbonus;

Sql.Add(´SELECT apoepar_premio_liq FROM apolice_elem_parcelas ´ +
´WHERE apoe_num_proposta = ´ + QuotedStr(argDocumento) +
´ AND apoepar_num_parcela = ´ + IntToStr(argParcela) + ´ ´);
Open;

if (Recordcount > 0) then
Result := FieldbyName(´apoepar_premio_liq´).AsCurrency;

Close;
Free;
end;
end;

function TForm1.Receber_Proxima_ParcelaADO(argDocumento :String;
argCorretor,
argRamo :Integer;
argSubramo :string;
argParcelaN_Mais_1 :Integer) :Boolean;
var
vqryReceberProxima :TADODataSet;
begin

vqryReceberProxima := TADODataSet.Create(nil);
with vqryReceberProxima do
begin
Connection := CnWinbonus;
CommandText := ´SELECT 1 FROM comiss_corretor_perc ´ +
´ WHERE apoe_num_proposta = ´ + QuotedStr(argDocumento) +
´ AND corretor = ´ + IntToStr(argCorretor) +
´ AND ramo = ´ + IntToStr(argRamo) +
´ AND sub_ramo = ´ + QuotedStr(argSubramo) +
´ AND ( (vitalicio = ´ + QuotedStr(´S´) + ´)´ +
´ or ´ +
´ ( (comcorperc_parcela_de <= ´ + IntToStr(argParcelaN_Mais_1) + ´) ´ +
´ and ´ +
´ (comcorperc_parcela_ate >= ´ + IntToStr(argParcelaN_Mais_1) + ´) ) ) ´;
Open;
Result := (Recordcount > 0);
Close;
Free;
end;
end;

function TForm1.Retorna_SubRamo_Similar_RamoADO(argRamo: Integer): String;
var qrySubRamo: TADOQuery;
begin
qrySubRamo := TADOQuery.Create(nil);

with qrySubRamo do
begin
Connection := CnWinbonus;

SQL.Add(´SELECT r.ram_codigo, sr.sub_ramo´);
SQL.Add(´FROM ramos r, sub_ramos sr´);
SQL.Add(´WHERE r.ramo = sr.ramo ´ +
´AND sr.sub_ramo = r.ram_codigo ´ +
´AND r.ramo = ´ + IntToStr(argRamo) + ´ ´);
Open;

Result := FieldByName(´sub_ramo´).AsString;

Close;
Free;
end;
end;

procedure TForm1.Trata_ParcelasADO(argDocumento :String;
argParcela :Integer;
argDt_Venc :TDateTime);


procedure Cria_Proxima_Parcela(argDocumento :String;
argParcela :Integer;
argDt_Venc :TDateTime);
var
vqryNovaParcela :TADOCommand;
begin

vqryNovaParcela := TADOCommand.Create(nil);

with vqryNovaParcela do
begin
Connection := CnWinbonus;
CommandText := ´INSERT INTO apolice_elem_parcelas ´ +
´ (apoe_num_proposta, apoepar_num_parcela, ´ +
´ apoepar_dt_vencimento, apoepar_valor, ´ +
´ apoepar_premio_liq) ´ +
´ SELECT apoe_num_proposta, apoepar_num_parcela + 1 ´ +
´ , :parNovaData, apoepar_valor, ´ +
´ apoepar_premio_liq ´ +
´ FROM apolice_elem_parcelas ´ +
´ WHERE apoe_num_proposta = ´ + QuotedStr(argDocumento) +
´ AND apoepar_num_parcela = ´ + IntToStr(argParcela);

//**********************************************
//* INCREMENTAR DATA ATUAL EM 1 MES *
//ParambyName(´parNovaData´).AsDateTime := Date;
Parameters.ParambyName(´parNovaData´).Value := IncMonth(argDt_Venc, 1);
//**********************************************
Execute;
Free;
end;
end;

function Existe_Proxima_Parcela(argDocumento :String;
argParcela :Integer) :Boolean;
var
vqryExiste :TADODataSet;
begin

vqryExiste := TADODataSet.Create(nil);

with vqryExiste do
begin
Connection := CnWinbonus;
CommandText := ´SELECT 1 FROM apolice_elem_parcelas ´ +
´ WHERE apoe_num_proposta = ´ + QuotedStr(argDocumento) +
´ AND apoepar_num_parcela = ´ + IntToStr(argParcela + 1);
Open;
Result := (Recordcount > 0);
Close;
Free;
end;
end;
begin

if (not Existe_Proxima_Parcela(argDocumento, argParcela)) then
Cria_Proxima_Parcela(argDocumento, argParcela, argDt_Venc);

end;

procedure TForm1.Trata_Receb_Comis_Apolice_NElemADO(argDocumento :String;
argCorretor,
argParcela :Integer;
argDt_Venc :TDateTime);

procedure Cria_Proximo_Lancamento(argDocumento :String;
argCorretor ,
argParcela :Integer);
var
vqryNovoLanc :TADOCommand;
begin
vqryNovoLanc := TADOCommand.Create(nil);
with vqryNovoLanc do
begin
Connection := CnWinbonus;
CommandText := ´INSERT INTO lancamentos ´ +
´ (apoe_num_proposta, corretor, ramo, sub_ramo, ´ +
´ apoepar_num_parcela, tipo_lancamento, lan_valor_recebido, ´ +
´ lan_controlar_dif, lan_valor_rec_dif) ´ +
´ SELECT apoe_num_proposta , corretor, ramo, sub_ramo, ´ +
´ (apoepar_num_parcela + 1), tipo_lancamento, 0, ´ + QuotedStr(´N´) + ´, 0 ´ +
´ FROM lancamentos ´ +
´ WHERE apoe_num_proposta = ´ + QuotedStr(argDocumento) +
´ AND corretor = ´ + IntToStr(argCorretor) + ´ ´ +
´ AND apoepar_num_parcela = ´ + IntToStr(argParcela) + ´ ´ +
´ AND tipo_lancamento = ´+ QuotedStr(´N´);

Execute;
Free;
end;
end;

function Existe_Proximo_Lancamento(argDocumento :String;
argCorretor :Integer;
argParcela :Integer) :Boolean;
var
vqryExiste :TADODataSet;
begin
vqryExiste := TADODataSet.Create(nil);
with vqryExiste do
begin
Connection := CnWinbonus;
CommandText := ´SELECT 1 FROM lancamentos ´ +
´ WHERE apoe_num_proposta = ´ + QuotedStr(argDocumento) +
´ AND corretor = ´ + IntToStr(argCorretor) + ´ ´ +
´ AND apoepar_num_parcela = ´ + IntToStr(argParcela + 1);
Open;
Result := (Recordcount > 0);
Close;
Free;
end;
end;
begin

Trata_ParcelasADO(argDocumento, argParcela, argDt_Venc);

if (not Existe_Proximo_Lancamento(argDocumento, argCorretor, argParcela)) then
Cria_Proximo_Lancamento(argDocumento, argCorretor, argParcela);

end;

procedure TForm1.btnSairClick(Sender: TObject);
begin
Application.Terminate;
end;

end.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar