Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.21.104.72] |
|
Сообщ.
#1
,
|
|
|
Всем привет. Если кто сталкивался, помогите с решением оч. неприятной ошибки. Суть такова: пишу прогу для работы с БД абонентов. Для каждого абонента в БД "резервируются" строки для заполнения по месяцам. Проблема при редактировании записей, а именно для "первой" - т.е. неважно, буду я заполнять январь или другой месяц - вылетает ошибка "...econverterror with message is not a valid float point value...". Причем, после этой ошибки, все данные в БД вносятся нормально, и прога продолжает работать. Вот код для кнопки "Добавить запись":
... if DV1>0 then - именно здесь Form1.ADOQuery2.FieldByName('DV').AsFloat :=DV1 else Form1.ADOQuery2.FieldByName('DV').AsInteger :=0; ... Переменная DV1 - тип extended. Расчет значения для переменной ... if StrToInt(Form2.Edit35.Text)>0 then begin DV1:=(((p52*StrToFloat(Form2.Edit35.Text)*StrToFloat(Form2.Edit7.Text))*StrToFloat(Form2.Edit18.Text)*0.01)); end else begin DV1:=0; end; .... Подскажите плиз как обойти эту неприятность |
Сообщ.
#2
,
|
|
|
возможно, дело в региональных настройка и DecimalSeparator
|
Сообщ.
#3
,
|
|
|
Ок. Но как быть с моментом, что ошибка возникает только при попытке первичной записи для абонента, а потом нормально?
|
Сообщ.
#4
,
|
|
|
Цитата WinFack @ ошибка возникает только при попытке первичной записи для абонента, а потом нормально? отладчиком надо пройти да глянуть, где именно вылетает |
Сообщ.
#5
,
|
|
|
Цитата Relaxander @ Цитата WinFack @ ошибка возникает только при попытке первичной записи для абонента, а потом нормально? отладчиком надо пройти да глянуть, где именно вылетает Методом исключения было определено, что "затык" происходит на строке ... if DV1>0 then ... т.е. в обработчике срабатывания кнопки отправки данных в БД |
Сообщ.
#6
,
|
|
|
Цитата WinFack @ Таблица ПУСТАЯ. Соответственно, этого поля в запросе просто не существует.Form1.ADOQuery2.FieldByName('DV').AsFloat :=DV1 ЗЫ - сам запрос в каком состоянии? |
Сообщ.
#7
,
|
|
|
Цитата WinFack @ "затык" происходит на строке на строке if DV1>0 then никак не может быть затыка, если ее пропустил компилятор. Либо выше, либо ниже |
Сообщ.
#8
,
|
|
|
Полагаю, так будет проще:
procedure TForm2.Button2Click(Sender: TObject); var dolgN: integer; fort: integer; id3: integer; dgl: double; DV2: extended; begin begin try Form1.ADOQuery1.Edit; Form1.ADOQuery1.FieldByName('FIO').AsString := Form2.Edit1.Text; Form1.ADOQuery1.FieldByName('Order').AsString := Form2.Edit2.Text; Form1.ADOQuery1.FieldByName ('House').AsString := Form2.Edit3.Text; Form1.ADOQuery1.FieldByName ('Street').AsString := Form2.ComboBox1.Text; if Form2.ComboBox3.Text='ßíâàðü' then begin try Form1.ADOQuery2.Open; Form1.ADOQuery2.Edit; Form1.ADOQuery2.FieldByName('God').AsString := Form2.ComboBox2.Text; Form1.ADOQuery2.FieldByName('Mes').AsString := Form2.ComboBox3.Text; Form1.ADOQuery2.FieldByName('Data').AsDateTime := Form2.DateTimePicker1.Date; Form1.ADOQuery2.FieldByName('Dolg').AsFloat := StrToFloat(Form2.Edit4.Text); if Form2.RadioButton1.Checked then begin Form1.ADOQuery2.FieldByName('Pok_pred').AsInteger := StrToInt(Form2.Edit5.Text); Form1.ADOQuery2.FieldByName('Pok_new').AsInteger := StrToInt(Form2.Edit14.Text); end else if Form2.RadioButton2.Checked then begin Form1.ADOQuery2.FieldByName('Pok_Pred').AsInteger := 0; Form1.ADOQuery2.FieldByName('Pok_new').AsInteger := 0; end; Form1.ADOQuery2.FieldByName('Tarif').AsFloat := StrToFloat(Form2.Edit7.Text); Form1.ADOQuery2.FieldByName('Kol_chel').AsInteger := StrToInt(Form2.Edit6.Text); Form1.ADOQuery2.FieldByName('Nachisl').AsFloat := StrToFloat(Form2.Edit38.Text); Form1.ADOQuery2.FieldByName('Opl').AsFloat := StrToFloat(Form2.Edit12.Text); Form1.ADOQuery2.FieldByName('Dolg_new').AsFloat := StrToFloat(Form2.Edit13.Text); //////////////////////////////// if DV1>0 then Form1.ADOQuery2.FieldByName('DV').AsFloat :=DV1 else Form1.ADOQuery2.FieldByName('DV').AsInteger :=0; ...... Запрос активен... |
Сообщ.
#9
,
|
|
|
Цитата WinFack @ а именно для "первой" Наверное в DV1 просто мусор или null, а дальше она принимает определенное значение. |
Сообщ.
#10
,
|
|
|
Цитата Bas @ Цитата WinFack @ а именно для "первой" Наверное в DV1 просто мусор или null, а дальше она принимает определенное значение. Ok. На счет null даже и не предполагал . А как можно обойти? Плиз... |
Сообщ.
#11
,
|
|
|
а как может быть null, если DV1 - тип extended?
нет, тут дело в несоответствии типов где-то на этапе преобразования. AsFloat или StrToFloat |
Сообщ.
#12
,
|
|
|
Всем привет. Перерыл проект... и таки нашел кусок, из-за которого вся эта хренотень происходила. Как оказалось - в куске кода, который отвечает за запись в БД, висело обращение к полю, которое действительно не имело значения т.ч. теперь всё работает и записывает как надо + решился вопрос с обновлением нужных полей при записи. Всем огромное спасибо за то, что "не бросили" на произвол судьбы и натолкнули на мысль, где м.б. ошибка.
|