Is not a valid floating point value

Здравствуйте. Как по нормальному записать этот код, чтобы не было ошибки? Тут что из некоторых Edit высчитывается результат(1), и из этого результата(1) должен рассчитаться результат(2) и данные записаться в dbgrid
procedure TForm14.Button1Click(Sender: TObject);
begin
DataModule11.ADOQuery4.Insert;
DataModule11.ADOQuery4.disablecontrols;
DataModule11.ADOQuery4.FieldByName('Дата').Value :=(DBDateTimeEditEh1.Value);
DataModule11.ADOQuery4.FieldByName('11').Value :=FloatToStr((StrToFloat(DBEdit9.Text))+((StrToFLoat(DBEdit16.Text)))+((StrToFLoat(DBEdit23.Text))) ); //  DBEdit2
DataModule11.ADOQuery4.FieldByName('12').Value :=FloatToStr((StrToFloat(DBEdit10.Text))+((StrToFLoat(DBEdit17.Text)))+((StrToFLoat(DBEdit24.Text))) );  //  DBEdit3
DataModule11.ADOQuery4.FieldByName('13').Value :=FloatToStr((StrToFloat(DBEdit11.Text))+((StrToFLoat(DBEdit18.Text)))+((StrToFLoat(DBEdit25.Text))) );  //  DBEdit4
DataModule11.ADOQuery4.FieldByName('21').Value :=FloatToStr((StrToFloat(DBEdit13.Text))+((StrToFLoat(DBEdit20.Text)))+((StrToFLoat(DBEdit27.Text))) );  //   DBEdit6
DataModule11.ADOQuery4.FieldByName('22').Value :=FloatToStr((StrToFloat(DBEdit14.Text))+((StrToFLoat(DBEdit21.Text)))+((StrToFLoat(DBEdit28.Text))) );   //         DBEdit7
 
if (DBEdit2.Text = '0') or (DBEdit3.Text = '0') then
begin
  DataModule11.ADOQuery4.FieldByName('14').Value := '0';
  end
  else
  begin
  DataModule11.ADOQuery4.FieldByName('14').Value :=FloatToStr((StrToFloat(DBEdit2.Text))/((StrToFLoat(DBEdit3.Text)))* 100 );
end;
 
if (DBEdit6.Text = '0') or (DBEdit3.Text = '0') then
  begin
    DataModule11.ADOQuery4.FieldByName('23').Value := '0';
    end
  else
  begin
DataModule11.ADOQuery4.FieldByName('23').Value :=FloatToStr((StrToFloat(DBEdit6.Text))/((StrToFLoat(DBEdit3.Text)))* 100 );
  end;
 
 if (DBEdit9.Text = '0') or (DBEdit10.Text = '0') then
 begin
   DataModule11.ADOQuery4.FieldByName('34').Value :='0';
    end
  else
  begin
     DataModule11.ADOQuery4.FieldByName('34').Value :=FloatToStr((StrToFloat(DBEdit9.Text))/((StrToFLoat(DBEdit10.Text)))* 100 );
 end;
 
 if (DBEdit13.Text = '0') or (DBEdit10.Text = '0') then
 begin
   DataModule11.ADOQuery4.FieldByName('43').Value :='0';
     end
  else
  begin
     DataModule11.ADOQuery4.FieldByName('43').Value :=  FloatToStr((StrToFloat(DBEdit13.Text))/((StrToFLoat(DBEdit10.Text)))*100 );
 end;
 
 if (DBEdit16.Text = '0') or (DBEdit17.Text = '0') then
begin
  DataModule11.ADOQuery4.FieldByName('54').Value := '0';
  end
  else
  begin
  DataModule11.ADOQuery4.FieldByName('54').Value :=FloatToStr((StrToFloat(DBEdit16.Text))/((StrToFLoat(DBEdit17.Text)))* 100 );
end;
 
if (DBEdit20.Text = '0') or (DBEdit17.Text = '0') then
  begin
    DataModule11.ADOQuery4.FieldByName('63').Value := '0';
    end
  else
  begin
DataModule11.ADOQuery4.FieldByName('63').Value :=FloatToStr((StrToFloat(DBEdit20.Text))/((StrToFLoat(DBEdit17.Text)))* 100 );
  end;
 
 if (DBEdit23.Text = '0') or (DBEdit24.Text = '0') then
 begin
   DataModule11.ADOQuery4.FieldByName('74').Value :='0';
    end
  else
  begin
     DataModule11.ADOQuery4.FieldByName('74').Value :=FloatToStr((StrToFloat(DBEdit23.Text))/((StrToFLoat(DBEdit24.Text)))* 100 );
 end;
 
 if (DBEdit27.Text = '0') or (DBEdit24.Text = '0') then
 begin
   DataModule11.ADOQuery4.FieldByName('83').Value :='0';
     end
  else
  begin
     DataModule11.ADOQuery4.FieldByName('83').Value :=  FloatToStr((StrToFloat(DBEdit27.Text))/((StrToFLoat(DBEdit24.Text)))*100 );
 end;
 
DataModule11.ADOQuery4.enablecontrols;
DataModule11.ADOQuery4.Edit;
DataModule11.ADOQuery4.Post;
DataModule11.ADOQuery2.Edit;
DataModule11.ADOQuery2.Post;
Form14.Close;
end;
13 ответов

Как вводятся числа? С запятой или с точкой? StrTofloat и floattoStr преобразуют числа соответственно заданной в Винде локали.


Как вводятся числа? С запятой или с точкой? StrTofloat и floattoStr преобразуют числа соответственно заданной в Винде локали.
Там вводится целые числа


А какого типа поля? Если целого, почему всё преобразуется при помощи StrTofloat и Floattostr, а не StrToInt и intToStr?


Числовой. Постоянно через этот код делаю, и все работает. Тут проблема кажется в том что тут считает и и никуда не сохраняет
DataModule11.ADOQuery4.FieldByName('Дата').Value :=(DBDateTimeEditEh1.Value);
DataModule11.ADOQuery4.FieldByName('11').Value :=FloatToStr((StrToFloat(DBEdit9.Text))+((StrToFLoat(DBEdit16.Text)))+((StrToFLoat(DBEdit23.Text))) ); //  DBEdit2
DataModule11.ADOQuery4.FieldByName('12').Value :=FloatToStr((StrToFloat(DBEdit10.Text))+((StrToFLoat(DBEdit17.Text)))+((StrToFLoat(DBEdit24.Text))) );  //  DBEdit3
DataModule11.ADOQuery4.FieldByName('13').Value :=FloatToStr((StrToFloat(DBEdit11.Text))+((StrToFLoat(DBEdit18.Text)))+((StrToFLoat(DBEdit25.Text))) );  //  DBEdit4
DataModule11.ADOQuery4.FieldByName('21').Value :=FloatToStr((StrToFloat(DBEdit13.Text))+((StrToFLoat(DBEdit20.Text)))+((StrToFLoat(DBEdit27.Text))) );  //   DBEdit6
DataModule11.ADOQuery4.FieldByName('22').Value :=FloatToStr((StrToFloat(DBEdit14.Text))+((StrToFLoat(DBEdit21.Text)))+((StrToFLoat(DBEdit28.Text))) );   //         DBEdit7
по этому этому коду нету от куда брать данные и оно выбивает ошибку
if (DBEdit2.Text = '0') or (DBEdit3.Text = '0') then
begin
  DataModule11.ADOQuery4.FieldByName('14').Value := '0';
  end
  else
  begin
  DataModule11.ADOQuery4.FieldByName('14').Value :=FloatToStr((StrToFloat(DBEdit2.Text))/((StrToFLoat(DBEdit3.Text)))* 100 );
end;
 
if (DBEdit6.Text = '0') or (DBEdit3.Text = '0') then
  begin
    DataModule11.ADOQuery4.FieldByName('23').Value := '0';
    end
  else
  begin
DataModule11.ADOQuery4.FieldByName('23').Value :=FloatToStr((StrToFloat(DBEdit6.Text))/((StrToFLoat(DBEdit3.Text)))* 100 );
  end;
 
 if (DBEdit9.Text = '0') or (DBEdit10.Text = '0') then
 begin
   DataModule11.ADOQuery4.FieldByName('34').Value :='0';
    end
  else
  begin
     DataModule11.ADOQuery4.FieldByName('34').Value :=FloatToStr((StrToFloat(DBEdit9.Text))/((StrToFLoat(DBEdit10.Text)))* 100 );
 end;
 
 if (DBEdit13.Text = '0') or (DBEdit10.Text = '0') then
 begin
   DataModule11.ADOQuery4.FieldByName('43').Value :='0';
     end
  else
  begin
     DataModule11.ADOQuery4.FieldByName('43').Value :=  FloatToStr((StrToFloat(DBEdit13.Text))/((StrToFLoat(DBEdit10.Text)))*100 );
 end;
 
 if (DBEdit16.Text = '0') or (DBEdit17.Text = '0') then
begin
  DataModule11.ADOQuery4.FieldByName('54').Value := '0';
  end
  else
  begin
  DataModule11.ADOQuery4.FieldByName('54').Value :=FloatToStr((StrToFloat(DBEdit16.Text))/((StrToFLoat(DBEdit17.Text)))* 100 );
end;
 
if (DBEdit20.Text = '0') or (DBEdit17.Text = '0') then
  begin
    DataModule11.ADOQuery4.FieldByName('63').Value := '0';
    end
  else
  begin
DataModule11.ADOQuery4.FieldByName('63').Value :=FloatToStr((StrToFloat(DBEdit20.Text))/((StrToFLoat(DBEdit17.Text)))* 100 );
  end;
 
 if (DBEdit23.Text = '0') or (DBEdit24.Text = '0') then
 begin
   DataModule11.ADOQuery4.FieldByName('74').Value :='0';
    end
  else
  begin
     DataModule11.ADOQuery4.FieldByName('74').Value :=FloatToStr((StrToFloat(DBEdit23.Text))/((StrToFLoat(DBEdit24.Text)))* 100 );
 end;
 
 if (DBEdit27.Text = '0') or (DBEdit24.Text = '0') then
 begin
   DataModule11.ADOQuery4.FieldByName('83').Value :='0';
     end
  else
  begin
     DataModule11.ADOQuery4.FieldByName('83').Value :=  FloatToStr((StrToFloat(DBEdit27.Text))/((StrToFLoat(DBEdit24.Text)))*100 );
 end;


Постоянно через этот код делаю, и все работает.
Значит везло до сих пор. Ибо код "дурной". Возвратимся к коду в топике. 1.В 3 строке написано
DataModule11.ADOQuery4.Insert;
В родной для Дельфи BDE такой код у меня не вызвал бы сомнений. (Отвращение бы вызвал, но это другое). BDE всё-таки умеет на очень ограниченном пространстве нормально редактировать результат запроса, вызывая нужные изменения таблиц задействованных в запросе. Умеет ли это делать затычка от ADO? 2. В 4 строке
DataModule11.ADOQuery4.disablecontrols;
А нафига? 3. И в добавок. Нафига нужна строчка 85
DataModule11.ADOQuery4.Edit;
4. Про строчки 87,88 я уже даже молчу.


Про строчки 87,88 я уже даже молчу.
Даже несмотря на ваша помощь, программа так же не работает. И дело тут не в том коде про который вы писал, он работает все нормально. Тут проблема что данные которые считаются тут
DataModule11.ADOQuery4.FieldByName('11').Value :=FloatToStr((StrToFloat(DBEdit9.Text))+((StrToFLoat(DBEdit16.Text)))+((StrToFLoat(DBEdit23.Text))) ); //  DBEdit2
DataModule11.ADOQuery4.FieldByName('12').Value :=FloatToStr((StrToFloat(DBEdit10.Text))+((StrToFLoat(DBEdit17.Text)))+((StrToFLoat(DBEdit24.Text))) );  //  DBEdit3
DataModule11.ADOQuery4.FieldByName('13').Value :=FloatToStr((StrToFloat(DBEdit11.Text))+((StrToFLoat(DBEdit18.Text)))+((StrToFLoat(DBEdit25.Text))) );  //  DBEdit4
DataModule11.ADOQuery4.FieldByName('21').Value :=FloatToStr((StrToFloat(DBEdit13.Text))+((StrToFLoat(DBEdit20.Text)))+((StrToFLoat(DBEdit27.Text))) );  //   DBEdit6
DataModule11.ADOQuery4.FieldByName('22').Value :=FloatToStr((StrToFloat(DBEdit14.Text))+((StrToFLoat(DBEdit21.Text)))+((StrToFLoat(DBEdit28.Text))) );   //         DBEdit7
не сохраняются. а они требуются уже тут
if (DBEdit2.Text = '0') or (DBEdit3.Text = '0') then
begin
  DataModule11.ADOQuery4.FieldByName('14').Value := '0';
  end
  else
  begin
  DataModule11.ADOQuery4.FieldByName('14').Value :=FloatToStr((StrToFloat(DBEdit2.Text))/((StrToFLoat(DBEdit3.Text)))* 100 );
end;
 
if (DBEdit6.Text = '0') or (DBEdit3.Text = '0') then
  begin
    DataModule11.ADOQuery4.FieldByName('23').Value := '0';
    end
  else
  begin
DataModule11.ADOQuery4.FieldByName('23').Value :=FloatToStr((StrToFloat(DBEdit6.Text))/((StrToFLoat(DBEdit3.Text)))* 100 );
  end;
 
 if (DBEdit9.Text = '0') or (DBEdit10.Text = '0') then
 begin
   DataModule11.ADOQuery4.FieldByName('34').Value :='0';
    end
  else
  begin
     DataModule11.ADOQuery4.FieldByName('34').Value :=FloatToStr((StrToFloat(DBEdit9.Text))/((StrToFLoat(DBEdit10.Text)))* 100 );
 end;
 
 if (DBEdit13.Text = '0') or (DBEdit10.Text = '0') then
 begin
   DataModule11.ADOQuery4.FieldByName('43').Value :='0';
     end
  else
  begin
     DataModule11.ADOQuery4.FieldByName('43').Value :=  FloatToStr((StrToFloat(DBEdit13.Text))/((StrToFLoat(DBEdit10.Text)))*100 );
 end;
 
 if (DBEdit16.Text = '0') or (DBEdit17.Text = '0') then
begin
  DataModule11.ADOQuery4.FieldByName('54').Value := '0';
  end
  else
  begin
  DataModule11.ADOQuery4.FieldByName('54').Value :=FloatToStr((StrToFloat(DBEdit16.Text))/((StrToFLoat(DBEdit17.Text)))* 100 );
end;
 
if (DBEdit20.Text = '0') or (DBEdit17.Text = '0') then
  begin
    DataModule11.ADOQuery4.FieldByName('63').Value := '0';
    end
  else
  begin
DataModule11.ADOQuery4.FieldByName('63').Value :=FloatToStr((StrToFloat(DBEdit20.Text))/((StrToFLoat(DBEdit17.Text)))* 100 );
  end;
 
 if (DBEdit23.Text = '0') or (DBEdit24.Text = '0') then
 begin
   DataModule11.ADOQuery4.FieldByName('74').Value :='0';
    end
  else
  begin
     DataModule11.ADOQuery4.FieldByName('74').Value :=FloatToStr((StrToFloat(DBEdit23.Text))/((StrToFLoat(DBEdit24.Text)))* 100 );
 end;
 
 if (DBEdit27.Text = '0') or (DBEdit24.Text = '0') then
 begin
   DataModule11.ADOQuery4.FieldByName('83').Value :='0';
     end
  else
  begin
     DataModule11.ADOQuery4.FieldByName('83').Value :=  FloatToStr((StrToFloat(DBEdit27.Text))/((StrToFLoat(DBEdit24.Text)))*100 );
 end;
Из за этого и возникает ошибка, а не из за чего то другого !!! По этому и прошу, помогите по нормальному код записать. Или эти данные по отдельности считать?


переменные ADOQuery4 и ADOQuery2 какого типа?


RatWar, думаю что TADOQuery


переменные ADOQuery4 и ADOQuery2 какого типа?
если вы имеете в виду сам компонент тогда TADOQueryПодскажите, что делать?


Пример работы с TADOQuery:
procedure SetState1(const Account, PayNumber, DateB, DateE, Par, IP: string; Kassa, SrvNum, OrderSum: Integer);
var
  qryGorod: TADOQuery;
begin
  qryGorod := TADOQuery.Create(nil);
  try
    qryGorod.ConnectionString := CS;
    qryGorod.SQL.Text := 'insert into Payment(KASSA, PayNumber, SRVNUM, ACCOUNT, ORDERSUM, DATEB, DATEE, STATE, PARAMS, IP) values(:P1,:PayNumber,:P2,:P3,:P4,:P5,:P6,1,:P7,:P8)';
    qryGorod.Parameters.ParamValues['P1'] := Kassa;
    qryGorod.Parameters.ParamValues['PayNumber'] := PayNumber;
    qryGorod.Parameters.ParamValues['P2'] := SrvNum;
    qryGorod.Parameters.ParamValues['P3'] := Account;
    qryGorod.Parameters.ParamValues['P4'] := OrderSum;
    qryGorod.Parameters.ParamValues['P5'] := DateB;
    qryGorod.Parameters.ParamValues['P6'] := DateE;
    qryGorod.Parameters.ParamValues['P7'] := Par;
    qryGorod.Parameters.ParamValues['P8'] := IP;
    qryGorod.ExecSQL;
  finally
    qryGorod.Free;
  end;
end;


Пример работы с TADOQuery:
И как этот код поможет мне в решение моей проблемы?


Этот код показывает принципы работы с ADOQuery, используемые свойства и методы. В начале пишите про Edit и DbGrid, но в коде работа с ADOQuery. Разберитесь для чего нужны запросы(ADOQuery) и компоненты отображения данных(DbGrid).


попробуйте заменить
if (DBEdit2.Text = '0') or (DBEdit3.Text = '0') then
begin
  DataModule11.ADOQuery4.FieldByName('14').Value := '0';
  end
  else
  begin
  DataModule11.ADOQuery4.FieldByName('14').Value :=FloatToStr((StrToFloat(DBEdit2.Text))/((StrToFLoat(DBEdit3.Text)))* 100 );
end;
на
if (DBEdit2.Text = '0') or (DBEdit3.Text = '0') or (not TryStrToFloat(DBEdit2.Text, val1))  or (not TryStrToFloat(DBEdit3.Text, val2)) then
  DataModule11.ADOQuery4.FieldByName('14').Value := '0'
else
  DataModule11.ADOQuery4.FieldByName('14').Value :=FloatToStr((val1/val2)* 100 );
не забудьте объявить переменные val1, val2: ******; сделайте тоже самое с DBEdit6.Text и DBEdit3.Text и т.д.