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:

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

Marcos.rio

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



Responder

Gostei + 0

24/11/2004

Marcelo Saviski

vc tentou debugar para ver em qual linha que acontece o erro?


Responder

Gostei + 0

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

Aceitar