Fórum Código com Array #259784
24/11/2004
0
Amigos, o meu código está me retornando um Access Violation, porém ele é intermitente.. ora em uma linha ora em outra linha e as vezes nem acontece... Estou deseperado.... Seria alguma coisa relacionada aos Arrays Dinamicos ????
Segue o código:
Será que alguma coisa relacionada a variavel do tipo REAL..... eu vou trabalhar com índices financeiros.... e os campos com valor do índice são do tipo Float !
Abs,
Obrigado a Todos !!
Segue o código:
procedure TFrmProcReajuste.BtnProcessaReajusteClick(Sender: TObject);
Var
i, z, V1, V2, V3, V4, V5, V6: Integer;
V7, V8, V9, V10: Real;
L : array of Real;
Begin
GU1.MaxValue:= FDMReajuste.CdsReajuste.RecordCount;
For i:=0 to FDMReajuste.CdsReajuste.RecordCount -1 do
Begin
FDMReajuste.CdsReajuste.RecNo := i;
GU1.Progress := i;
FDMReajuste.CdsDetReajuste.Close;
FDMReajuste.CdsDetReajuste.Params[0].AsInteger := FDMReajuste.CdsReajustectrCodigo.AsInteger;
FDMReajuste.CdsDetReajuste.Open;
// Calcula mês de inicio de período (Data Base de Último Reajuste)
V1 := MonthOf(FDMReajuste.CdsDetReajustectrDataReajuste.AsDateTime);
// Calcula Ano de inicio de período (Data Base de Último Reajuste)
V2 := YearOf(FDMReajuste.CdsDetReajustectrDataReajuste.AsDateTime);
// Calcula mês de Fim de período (Data Base de Último Reajuste+Periodo - 1Dia)
V3 := MonthOf(IncDay(IncMonth(FDMReajuste.CdsDetReajustectrDataReajuste.AsDateTime,FDMReajuste.CdsDetReajustemes.Value),-1));
// Calcula Ano de Fim de período (Data Base de Último Reajuste+Periodo - 1Dia)
V4 := YearOf(IncDay(IncMonth(FDMReajuste.CdsDetReajustectrDataReajuste.AsDateTime,FDMReajuste.CdsDetReajustemes.Value),-1));
// Calcula Dias Pro-Rata Inicio do Periodo
V5 := DayOf(FDMReajuste.CdsDetReajustectrDataReajuste.AsDateTime);
// Se dia = 31, então V5 = 1 se não será 30 - (V5 - 1)
If V5 = 31 Then
Begin
V5:= 1;
End
Else
Begin
V5 := 30-(V5-1);
end;
// Calcula Dias Pro-Rata Fim do Periodo
V6 := DayOf(IncDay(IncMonth(FDMReajuste.CdsDetReajustectrDataReajuste.AsDateTime,FDMReajuste.CdsDetReajustemes.Value),-1));
// Se dia = 31, então V6 = 30 se não será o mesmo valor
If V6 = 31 Then
Begin
V6:= 30;
End
Else
Begin
V6 := V6;
end;
// Seleciona os valores de índices entre as datas
FDMReajuste.QryItemReajuste.SQL.Text :=
´Select * From DetIndice Where ´ +
´IcrCodigo = ´ + FDMReajuste.CdsReajustectr_icrCodigo.AsString + ´ And ´ +
´(MesAno Between CONVERT(DATETIME, ´ + QuotedStr(DateToStr(EncodeDate(V2,v1,01))) + ´ ,103)´ + ´ AND ´ +
´ CONVERT(DATETIME, ´ + QuotedStr(DateToStr(EncodeDate(V4,v3,01))) + ´ ,103))´ +
´ Order by MesAno ´;
FDMReajuste.CdsItemReajuste.Open;
{If FDMReajuste.CdsItemReajuste.RecordCount = 0 Then
Raise Exception.Create(´Não Existe Índice... Favor Verifique´);
}
// Coloca o Array com o tamanho da tabela de índice
SetLength(L,FDMReajuste.CdsItemReajuste.RecordCount);
GU2.MaxValue := FDMReajuste.CdsItemReajuste.RecordCount;
For Z := 0 to FDMReajuste.CdsItemReajuste.RecordCount -1 do
Begin
FDMReajuste.CdsItemReajuste.RecNo := Z;
FDMReajuste.CdsItemReajusteValor.Precision := 4;
If Z = 1 Then
Begin
L[1] := SimpleRoundTo((1 + (FDMReajuste.CdsItemReajusteValor.AsFloat/100) /30 * V5),-4);
End
Else
Begin
if Z = FDMReajuste.CdsItemReajuste.RecordCount Then
Begin
L[z] := SimpleRoundTo((L[z-1] * (1 + (FDMReajuste.CdsItemReajusteValor.AsFloat/100) /30 * V6)),-4);
end
Else
Begin
L[z] := SimpleRoundTo((L[z-1] * (1 + (FDMReajuste.CdsItemReajusteValor.AsFloat/100))),-4);
End;
GU2.Progress := z;
end;
End;
V7 := SimpleRoundTo(FDMReajuste.CdsDetReajusteValor_Atual.AsFloat,-4);
V8 := SimpleRoundTo(FDMReajuste.CdsDetReajusteValor_Atual.AsFloat * L[FDMReajuste.CdsItemReajuste.RecordCount],-4);
FDMReajuste.CdsDetReajuste.Edit;
FDMReajuste.CdsDetReajusteValor_Atual.AsFloat:= V8;
FDMReajuste.CdsDetReajustectrDataReajuste.AsDateTime := IncMonth(FDMReajuste.CdsDetReajustectrDataReajuste.AsDateTime,FDMReajuste.CdsDetReajustemes.Value);
FDMReajuste.CdsDetReajustectrDataProcReajuste.AsDateTime := Now;
FDMReajuste.CdsDetReajuste.Post;
FDMReajuste.CdsDetReajuste.ApplyUpdates(-1);
// Criar Log
If Not DayOf(FDMReajuste.CdsDetReajustectrDataReajuste.AsDateTime) = 1 Then
Begin
V9 := ( V8-V7)/30;
V10 := (30-(DayOf(FDMReajuste.CdsDetReajustectrDataReajuste.AsDateTime)-1)*V9);
// Insert na Tabela de Contas a Pagar
end;
end;
end;
Será que alguma coisa relacionada a variavel do tipo REAL..... eu vou trabalhar com índices financeiros.... e os campos com valor do índice são do tipo Float !
Abs,
Obrigado a Todos !!
Marcos.rio
Curtir tópico
+ 0
Responder
Posts
24/11/2004
Marcos.rio
Amigos, o meu código está me retornando um Access Violation, porém ele é intermitente.. ora em uma linha ora em outra linha e as vezes nem acontece... Estou deseperado.... Seria alguma coisa relacionada aos Arrays Dinamicos ????
Segue o código:
Será que alguma coisa relacionada a variavel do tipo REAL..... eu vou trabalhar com índices financeiros.... e os campos com valor do índice são do tipo Float !
Abs,
Obrigado a Todos !!
procedure TFrmProcReajuste.BtnProcessaReajusteClick(Sender: TObject);
Var
i, z, V1, V2, V3, V4, V5, V6: Integer;
V7, V8, V9, V10: Real;
L : array of Real;
Begin
GU1.MaxValue:= FDMReajuste.CdsReajuste.RecordCount;
For i:=1 to FDMReajuste.CdsReajuste.RecordCount do
Begin
FDMReajuste.CdsReajuste.RecNo := i;
GU1.Progress := i;
FDMReajuste.CdsDetReajuste.Close;
FDMReajuste.CdsDetReajuste.Params[0].AsInteger := FDMReajuste.CdsReajustectrCodigo.AsInteger;
FDMReajuste.CdsDetReajuste.Open;
// Calcula mês de inicio de período (Data Base de Último Reajuste)
V1 := MonthOf(FDMReajuste.CdsDetReajustectrDataReajuste.AsDateTime);
// Calcula Ano de inicio de período (Data Base de Último Reajuste)
V2 := YearOf(FDMReajuste.CdsDetReajustectrDataReajuste.AsDateTime);
// Calcula mês de Fim de período (Data Base de Último Reajuste+Periodo - 1Dia)
V3 := MonthOf(IncDay(IncMonth(FDMReajuste.CdsDetReajustectrDataReajuste.AsDateTime,FDMReajuste.CdsDetReajustemes.Value),-1));
// Calcula Ano de Fim de período (Data Base de Último Reajuste+Periodo - 1Dia)
V4 := YearOf(IncDay(IncMonth(FDMReajuste.CdsDetReajustectrDataReajuste.AsDateTime,FDMReajuste.CdsDetReajustemes.Value),-1));
// Calcula Dias Pro-Rata Inicio do Periodo
V5 := DayOf(FDMReajuste.CdsDetReajustectrDataReajuste.AsDateTime);
// Se dia = 31, então V5 = 1 se não será 30 - (V5 - 1)
If V5 = 31 Then
Begin
V5:= 1;
End
Else
Begin
V5 := 30-(V5-1);
end;
// Calcula Dias Pro-Rata Fim do Periodo
V6 := DayOf(IncDay(IncMonth(FDMReajuste.CdsDetReajustectrDataReajuste.AsDateTime,FDMReajuste.CdsDetReajustemes.Value),-1));
// Se dia = 31, então V6 = 30 se não será o mesmo valor
If V6 = 31 Then
Begin
V6:= 30;
End
Else
Begin
V6 := V6;
end;
// Seleciona os valores de índices entre as datas
FDMReajuste.QryItemReajuste.SQL.Text :=
´Select * From DetIndice Where ´ +
´IcrCodigo = ´ + FDMReajuste.CdsReajustectr_icrCodigo.AsString + ´ And ´ +
´(MesAno Between CONVERT(DATETIME, ´ + QuotedStr(DateToStr(EncodeDate(V2,v1,01))) + ´ ,103)´ + ´ AND ´ +
´ CONVERT(DATETIME, ´ + QuotedStr(DateToStr(EncodeDate(V4,v3,01))) + ´ ,103))´ +
´ Order by MesAno ´;
FDMReajuste.CdsItemReajuste.Open;
{If FDMReajuste.CdsItemReajuste.RecordCount = 0 Then
Raise Exception.Create(´Não Existe Índice... Favor Verifique´);
}
// Coloca o Array com o tamanho da tabela de índice
SetLength(L,FDMReajuste.CdsItemReajuste.RecordCount);
GU2.MaxValue := FDMReajuste.CdsItemReajuste.RecordCount;
For Z := 1 to FDMReajuste.CdsItemReajuste.RecordCount do
Begin
FDMReajuste.CdsItemReajuste.RecNo := Z;
FDMReajuste.CdsItemReajusteValor.Precision := 4;
If Z = 1 Then
Begin
L[1] := SimpleRoundTo((1 + (FDMReajuste.CdsItemReajusteValor.AsFloat/100) /30 * V5),-4);
End
Else
Begin
if Z = FDMReajuste.CdsItemReajuste.RecordCount Then
Begin
L[z] := SimpleRoundTo((L[z-1] * (1 + (FDMReajuste.CdsItemReajusteValor.AsFloat/100) /30 * V6)),-4);
end
Else
Begin
L[z] := SimpleRoundTo((L[z-1] * (1 + (FDMReajuste.CdsItemReajusteValor.AsFloat/100))),-4);
End;
GU2.Progress := z;
end;
End;
V7 := SimpleRoundTo(FDMReajuste.CdsDetReajusteValor_Atual.AsFloat,-4);
V8 := SimpleRoundTo(FDMReajuste.CdsDetReajusteValor_Atual.AsFloat * L[FDMReajuste.CdsItemReajuste.RecordCount],-4);
FDMReajuste.CdsDetReajuste.Edit;
FDMReajuste.CdsDetReajusteValor_Atual.AsFloat:= V8;
FDMReajuste.CdsDetReajustectrDataReajuste.AsDateTime := IncMonth(FDMReajuste.CdsDetReajustectrDataReajuste.AsDateTime,FDMReajuste.CdsDetReajustemes.Value);
FDMReajuste.CdsDetReajustectrDataProcReajuste.AsDateTime := Now;
FDMReajuste.CdsDetReajuste.Post;
FDMReajuste.CdsDetReajuste.ApplyUpdates(-1);
// Criar Log
If Not DayOf(FDMReajuste.CdsDetReajustectrDataReajuste.AsDateTime) = 1 Then
Begin
V9 := ( V8-V7)/30;
V10 := (30-(DayOf(FDMReajuste.CdsDetReajustectrDataReajuste.AsDateTime)-1)*V9);
// Insert na Tabela de Contas a Pagar
end;
end;
end;
Responder
Gostei + 0
24/11/2004
Marcelo Saviski
vc tentou debugar para ver em qual linha que acontece o erro?
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)