На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Обязательно указание:
1) типа базы данных (Paradox/Oracle/Interbase и т.п.)
2) способа доступа к базе данных (ODBC/ADO/DAO/BDE и т.п.)
Например: Paradox/BDE, MS Access/ADO

Наиболее часто задаваемые вопросы:
Базы даных для начинающих. Первые шаги. Понятие о BDE.
Переход на клиент-сервер и начала ADO
Приёмы работы с BLOB (OLE/Memo) полями
Запросы и параметры или как избавиться от многих проблем. Проблемы с датами в запросах.
Нужели мне нужно устанавливать BDE? (или почему не работает программа на другом компьютере)
Модераторы: Bas, Rouse_
  
> Tfloat ADO ошибка
    Всем привет. Если кто сталкивался, помогите с решением оч. неприятной ошибки. Суть такова: пишу прогу для работы с БД абонентов. Для каждого абонента в БД "резервируются" строки для заполнения по месяцам. Проблема при редактировании записей, а именно для "первой" - т.е. неважно, буду я заполнять январь или другой месяц - вылетает ошибка "...econverterror with message is not a valid float point value...". Причем, после этой ошибки, все данные в БД вносятся нормально, и прога продолжает работать. Вот код для кнопки "Добавить запись":
    ExpandedWrap disabled
      ...
      if DV1>0 then - именно здесь
        Form1.ADOQuery2.FieldByName('DV').AsFloat :=DV1
            else
                Form1.ADOQuery2.FieldByName('DV').AsInteger :=0;
      ...

    Переменная DV1 - тип extended. Расчет значения для переменной
    ExpandedWrap disabled
      ...
      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;
      ....

    Подскажите плиз как обойти эту неприятность
      возможно, дело в региональных настройка и DecimalSeparator
        Ок. Но как быть с моментом, что ошибка возникает только при попытке первичной записи для абонента, а потом нормально?
        Сообщение отредактировано: WinFack -
          Цитата WinFack @
          ошибка возникает только при попытке первичной записи для абонента, а потом нормально?

          отладчиком надо пройти да глянуть, где именно вылетает
            Цитата Relaxander @
            Цитата WinFack @
            ошибка возникает только при попытке первичной записи для абонента, а потом нормально?

            отладчиком надо пройти да глянуть, где именно вылетает

            Методом исключения :) было определено, что "затык" происходит на строке
            ExpandedWrap disabled
              ...
              if DV1>0 then
              ...

            т.е. в обработчике срабатывания кнопки отправки данных в БД
              Цитата WinFack @
              Form1.ADOQuery2.FieldByName('DV').AsFloat :=DV1
              Таблица ПУСТАЯ. Соответственно, этого поля в запросе просто не существует.
              ЗЫ - сам запрос в каком состоянии?
              Сообщение отредактировано: #SI# -
                Цитата WinFack @
                "затык" происходит на строке

                на строке if DV1>0 then никак не может быть затыка, если ее пропустил компилятор.
                Либо выше, либо ниже
                  Полагаю, так будет проще:
                  ExpandedWrap disabled
                    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;
                    ......

                  Запрос активен...
                    Цитата WinFack @
                    а именно для "первой"

                    Наверное в DV1 просто мусор или null, а дальше она принимает определенное значение.
                      Цитата Bas @
                      Цитата WinFack @
                      а именно для "первой"

                      Наверное в DV1 просто мусор или null, а дальше она принимает определенное значение.

                      Ok. На счет null даже и не предполагал :wall: . А как можно обойти? Плиз... :blush:
                        а как может быть null, если DV1 - тип extended?
                        нет, тут дело в несоответствии типов где-то на этапе преобразования. AsFloat или StrToFloat
                          Всем привет. Перерыл проект... и таки нашел кусок, из-за которого вся эта хренотень происходила. Как оказалось - в куске кода, который отвечает за запись в БД, висело обращение к полю, которое действительно не имело значения :wall: т.ч. теперь всё работает и записывает как надо + решился вопрос с обновлением нужных полей при записи. Всем огромное спасибо за то, что "не бросили" на произвол судьбы и натолкнули на мысль, где м.б. ошибка. :blush:
                          1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0652 ]   [ 15 queries used ]   [ Generated: 17.05.24, 08:02 GMT ]