Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 749

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Не получается запись значения в базу Access через фукцию ADO когда в базе чистое числовое поле, обычно равное нулю, а требуется записать дробное выражение. Например запись числа 0,383 из текстовой маски следующим выражением
frmDR0.ADOTable1.Fields[22]. AsFloat:= StrToReal(Excurrent.Text);
После отработки этой команды в поле БД остается 0.
Впечатление, что нужно каким-то образом заранее задать число десятичных знаков в поле записи. Если же это сделать вручную заранее например записать в поле число 0,001, то проблема исчезает, команда выполняется. В чем здесь нюанс?

sergey vasilev Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: sergey vasilev (статус: Посетитель)
Вопрос отправлен: 9 февраля 2010, 01:21
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 22; последнее сообщение — 10 февраля 2010, 06:56; участников в обсуждении: 4.

Страницы: [1] [2] [Следующая »]

Вадим К

Вадим К (статус: Академик), 9 февраля 2010, 01:48 [#1]:

я надеюсь, что после этой строки (ну если там несколько полей заполняется, то после них всех вместе) есть строка вида
frmDR0.ADOTable1.post;
?
Галочка "подтверждения прочтения" - вселенское зло.
Егор

Егор (статус: 10-ый класс), 9 февраля 2010, 04:22 [#2]:

команда StrToReal(Excurrent.Text) точно число возвращает?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 9 февраля 2010, 05:32 [#3]:

Fields[22] - точно то поле, которое нужно? Вообще использование такого обращения к полям таблицы чревато. Стоит поменять структуру таблицы и придется переписывать всю программу.
sergey vasilev

sergey vasilev (статус: Посетитель), 9 февраля 2010, 11:46 [#4]:

Ошибки в поле нет.Strtoreal число возвращает, в конце группы присвоения естественно стоит Post. Но я проверяю в отладчике - после прохождения этой строки в правой части остается значение числа, а левой попрежнему ноль. Ошибки в поле нет.
Вадим К

Вадим К (статус: Академик), 9 февраля 2010, 12:27 [#5]:

странно конечно. но есть ещё такие идеи
- для поля написан обработчик. он верифицирует данные и если что - бракует.
- поле нельзя присвоить. уточните точный тип поля.
Галочка "подтверждения прочтения" - вселенское зло.
sergey vasilev

sergey vasilev (статус: Посетитель), 9 февраля 2010, 12:40 [#6]:

Access для цифр дает только один вариант - числовое поле (я не считаю спецформаты денежный и т.д.)и количество десятичных знаков не фиксируется. А Delfi почему-то упирается в отсутствие в поле запятой и игнорирует присвоение.Относительно обработчика - где он может быть?
Вадим К

Вадим К (статус: Академик), 9 февраля 2010, 13:43 [#7]:

первое - давайте заменим StrToReal на более "политически корректную" - StrToFloat, а ещё лучше на одну с серии StrToFloatDef (эта функция в случае неверного числа возвращает не ошибку, а наперёд заданное число).
А Обработчик может быть
- в акссесе для поля, хотя это надо постараться
- в аксессе может быть задана маска.
- в делфи, кликнуть правой по нужном ADOTable, там есть Edit Field, и найти свое поле и смотреть, что для него в инспекторе объектов.


Последний вариант. то, что индекс поля 22 наводит на странные мысли. много это полей и это ошибка в проектировке. Вполне возможно что Вы где то не туда попадаете (и данные пишутся в другое поле, а отладчику верить надо с умом. он иногда чудит). А может это глюк самого ADO - вполне может быть, уже с одним стыкался, когда в ADOQuery задается многострочный запрос (то есть так
ADOQuery.SQL.Add('SELECT * ');
ADOQuery.SQL.Add('FROM ');
ADOQuery.SQL.Add('MyTable');
)
при некоторой "удачной комбинации" происходит исключение. Такое ощущение, что запрос парситься на лету и ... "не осиливает"
Галочка "подтверждения прочтения" - вселенское зло.
sergey vasilev

sergey vasilev (статус: Посетитель), 9 февраля 2010, 14:14 [#8]:

Подскажите пожалуйста синтаксис StrToFloatDef, по подсказке у меня не получается.
Можно ли использовать функцию TextToFloat, но здесь тоже проблемы с синтаксисом.
Вообще похоже дело не в Access, я попытался просто присвоить значение после преобразования, но и это не проходит.
ex:= strtofloat(Excurrent.EditText); для ех остается 0, если число 0,383(или 1, если число 1,383). т.е.присваивается только целая часть числа
Я менял тип переменной ех на разные real type? но итог одинаков. Я чуствую, что причина простая, но пока не могу понять.
sergey vasilev

sergey vasilev (статус: Посетитель), 9 февраля 2010, 14:31 [#9]:

Я еще раз проверил - присвоение в переменную проходит, просто на всплывающей подсказке почему-то не отображается. А вот присвоение в базу данных не проходит даже через промежуточную переменную.
Егор

Егор (статус: 10-ый класс), 9 февраля 2010, 14:39 [#10]:

а если попробовать так:
frmDR0.ADOTable1.Fields[22].Value:= StrToReal(Excurrent.Text);
т.е. через Value - ...Fields[22].Value:=...
никогда не любил эти AsХХХ, ну, кроме AsString :)
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
sergey vasilev

sergey vasilev (статус: Посетитель), 9 февраля 2010, 15:31 [#11]:

Похоже дело в том, что почему-то программа не видит поля базы данных. Когда нажимаешь точку после fields[22] подсказка не возникает(точка после fields срабатывает), хотя при отладке программы все значения из базы извлекаются. Что может быть причиной?
Вадим К

Вадим К (статус: Академик), 9 февраля 2010, 16:31 [#12]:

это не "программа не видит", а просто автодополнение не видит. это две разные вещи. Часто это просто глюки парсера и на работоспособность програмы никак не влияют.
Галочка "подтверждения прочтения" - вселенское зло.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 9 февраля 2010, 16:41 [#13]:

попробуйте вместо fields[22] использовать fieldbyname('имя поля')
Егор

Егор (статус: 10-ый класс), 9 февраля 2010, 16:59 [#14]:

а напрямую тоже не записывает? если вот так:

frmDR0.ADOTable1.Fields[22].AsFloat:=3.14;
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Егор

Егор (статус: 10-ый класс), 9 февраля 2010, 16:59 [#15]:

и хорошо бы побольше кода, а не одну строчку.
начиная с frmDR0.ADOTable1.Open (или что там у вас?) и ещё немного после frmDR0.ADOTable1.Post
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Егор

Егор (статус: 10-ый класс), 9 февраля 2010, 17:05 [#16]:

а, вот ещё - вы проверяете в отладчике. а там, как говорил Вадим К, могут быть и глюки при отображении.
точно в базу число не попадает? или вы это просто в отладчике обнаружили? (уж извините за такой вопрос, но посетители у нас всякие бывают)

и что значит фраза

Цитата (sergey vasilev):

Впечатление, что нужно каким-то образом заранее задать число десятичных знаков в поле записи. Если же это сделать вручную заранее например записать в поле число 0,001, то проблема исчезает, команда выполняется.

пример приведите, пожалуйста
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 9 февраля 2010, 18:32 [#17]:

Добавьте в ADOTable список полей (это делается по двойному щелчку мыши на компоненте) и обращайтесь к полям по их именам. В этом случае Delphi будет точно знать какое поле из таблицы какого типа. Думаю, что это поможет в решении проблемы. У меня однажды такое было, правда с BDE. С тех давних пор, как я простился с BDE, я не пользуюсь компонентами Table. Только Query.
sergey vasilev

sergey vasilev (статус: Посетитель), 9 февраля 2010, 22:27 [#18]:

Спасибо за советы,отвечу по порядку
Прямая запись тоже не проходит
Отсутствие записи в базе данных проверяю прямо в Access
Переходить к именам полей вместо их номеров для меня достаточно сложно, потому что часто используется цикличная запись достаточно больших массивов, а это удобней делать с увеличением номера поля одновременно с с увеличением номера переменной в массиве. Кусок программы с записью переменных в базу данных приведен ниже. (функция ValidateReal построена на базе StrToFloat и выдает числовое значение переменной).
frmDR0.ADOTable1.Edit;
frmDR0.ADOTable1.Fields[0].AsString := manufac.Text ;
frmDR0.ADOTable1.Fields[1].AsString := type_trafo.Text;
frmDR0.ADOTable1.Fields[22].asfloat:= ValidateReal(Excurrent.editText);
frmDR0.ADOTable1.Fields[11].AsInteger:= strtoint(wind_temp.edittext);
frmDR0.ADOTable1.Post;
sergey vasilev

sergey vasilev (статус: Посетитель), 9 февраля 2010, 22:42 [#19]:

И еще попутный вопрос, должны ли в окне DBGrids отражаться данные полей базы данных на этапе написания программы. Ранее я видел эти данные, а сейчас они не отражаются. Может ди быть это связано с проблемами доступа к базе данных через ADOConnection. При запуске программы считывание данных идет без проблем
Вадим К

Вадим К (статус: Академик), 10 февраля 2010, 00:26 [#20]:

Лучше "включать базу" непосредственно в своем коде. Так получается более гибко. А то в противном случае получается бардак.
Когда приложение запущено, то к базе получается два подключения - одно это собственно приложение, и второе - это делфи. А в некоторых случаях такие подключения могут быть крайне нежелательны или давать веселый побочный эффект. Проверьте и это.

Если это не сработает, попробуйте собрать минимально работающий неправильно пример. И выложить сюда.
Галочка "подтверждения прочтения" - вселенское зло.

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:49
Выполнено за 0.03 сек.