Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
33 / 28 / 6
Регистрация: 24.03.2020
Сообщений: 219
1

Конвертация Edit.Text -> FLOAT -> MySQL

07.08.2020, 00:30. Показов 2395. Ответов 9

Author24 — интернет-сервис помощи студентам
Здравствуйте!

Вопрос таков.
В edit вводят дробное значение. В БД Decimal хранится с точкой, однако в DBGrid отображение с запятой.
Проверку edit.text на вводимое подымали на форуме, я же реализовал конвертацию таким образом:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
try
   convertedit:=StrtoFloat(edit1.Text);
   Str(convertedit:8:4, converted_info);
with myqry do
begin
   SQL.Clear;
   .... //добавляю все необходимые значения, вплоть до сконвертированного
   SQL.Add(QuotedStr(converted_info) + ';');
   ExecSQL;
   SQL.Clear;
end;
except showmessage('Wrong decimal in edit text');
end;
Вопрос таков: как корректно конвертировать дробные значения из Edit в запросы, округлять их по знакам просто после запятой, а не по кол-во_всех_знаков:знаков_после_запятой, использовать Decimal-значения из dbgrid-а в дальнейших запросах?

Всем заранее спасибо за помощь!!!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.08.2020, 00:30
Ответы с готовыми решениями:

Конвертация IBM float в IEEE float
Добрый день, Мне необходимо конвертировать IBM float в IEEE float. По этой ссылке...

Конвертация string в float
Подскажиете, пожалуйста, есть строка string s= "832.26"; хочу переконвертировать ее в тип float...

Конвертация string в float
Добрый вечер. Возникла небольшая проблема, при конвертации textBox2.Text =...

Конвертация в тип Float
Добрый вечер, подскажите пожалуйста, как правильно необходимо конвертировать строку в тип float?...

9
1074 / 987 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
07.08.2020, 08:17 2
Лучший ответ Сообщение было отмечено Komandor_Yan как решение

Решение

"Конвертировать" можно и проще, заменив запятую на точку перед вставкой значения в запрос:
Delphi
1
Edit1.Text := StringReplace(Edit1.Text, ',', '.', []);
Примечание. Числа в тексте запроса не заворачивают в кавычки. Т.е. функция QuotedStr для числового значения неуместна.
1
33 / 28 / 6
Регистрация: 24.03.2020
Сообщений: 219
07.08.2020, 12:37  [ТС] 3
Скандербег, спасибо.
А вставка DECIMAL в запрос тогда тоже должна осуществляться без QuotedStr? И они вставляются в запрос с точкой или с запятой? (просто уточняю)

Как бороться с тем, что их дбгрида DECIMAL достаются с запятыми? Так же в запросы пихать StringReplace?

Как в случае StringReplace проводить проверку на корретные символы "0-9 + ."? NumbersOnly в Edit не дает вводить точку/запятую.
0
1074 / 987 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
07.08.2020, 14:19 4
Цитата Сообщение от Komandor_Yan Посмотреть сообщение
А вставка DECIMAL в запрос тогда тоже должна осуществляться без QuotedStr?
Именно об этом и была речь, что числовые значения, вставляемые в текст запроса, не могут быть обрамлены кавычками.
Цитата Сообщение от Komandor_Yan Посмотреть сообщение
И они вставляются в запрос с точкой или с запятой?
Запросы SQL придуманы на западе и у них принято было всегда отделять целую часть числа от дробной только точкой, а не как в Союзе, запятой. Поэтому и в запрос они должны вставляться только с точкой.
Цитата Сообщение от Komandor_Yan Посмотреть сообщение
Как бороться с тем, что их дбгрида DECIMAL достаются с запятыми?
В дбгрид нет данных, они происходят из датасета (к примеру, ADOQuery, ADOTable и иже с ними).
А как бороться, я уже сказал: перед вставкой в текст запроса значение, которое находится в TEdit или в датасете надо препарировать и затем просто вставить в текст.
Что-то в этом роде:
Delphi
1
2
3
4
5
  Edit1.Text := StringReplace(Edit1.Text, ',', '.', []);
  myqry.SQL.Text := '... +Edit1.Text+...'; //метод Add лучше не использовать
  //или
  S := StringReplace(DataSet.FieldByName('поле_число').AsString, ',', '.', []);
  myqry.SQL.Text := '... +S+...';
Где "DataSet" - условное название того компонента, который поставляет данные в DBGrid;
'поле_число' - тоже условное наименование того поля, которое содержит данные типа DECIMAL (мы здесь не знаем как оно называется в базе);
S наименование переменной типа String (ее использование нужно лишь для наглядности).
1
33 / 28 / 6
Регистрация: 24.03.2020
Сообщений: 219
07.08.2020, 14:35  [ТС] 5
А положение в датасете (который будет являться ADOQuery) будет изменяться на то же, что и выбирают в гриде, да?
В чем преимущество метода SQL.Text над SQL.Add? Я поднял этот вопрос здесь, но пока так и не разобрался, добавляется какая-то фигня на конце.
0
1074 / 987 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
07.08.2020, 14:46 6
Символы перевода каретки и перевода строки [#13#10] всегда присутствуют когда текст запроса создается методом Add (это не опасно - парсеры "не видят" их).
Но лучше и проще присваивать текст запроса именно свойству Text, т.к. при этом, первое - не будет символов перевода каретки, второе - не будет необходимости при присвоении другого запроса использовать метод Clear (когда датасет применяется для разных запросов), третье - ну, хотя бы внешне, мы лучше контролируем наполнение текста запроса, если он достаточно громоздкий.
1
33 / 28 / 6
Регистрация: 24.03.2020
Сообщений: 219
07.08.2020, 14:51  [ТС] 7
Скандербег, большое спасибо!
Воспользуюсь моментом и спрошу еще одну вещь.
На второй форме для дефолтного onshow делаю обнуление запроса Query через Close; и SQL.Clear;. Стала вылазить ошибка AV, при этом дебаггер указывает на SQL.Clear сначала, а потом на свойство датасета onclose Active:=False;. При этом я даже на форму2 не захожу, просто закрываю после начала работы главную форму, и тут...
0
1074 / 987 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
07.08.2020, 15:00 8
Лучший ответ Сообщение было отмечено Komandor_Yan как решение

Решение

Такая ошибка (AV) бывает только тогда, когда есть обращение к несуществующему объекту.
Т.е. либо он уже убит (удален из памяти), либо еще не создан. Первое бывает чаще всего .
Так что надо разбираться что происходит при "обнулении" компонента Query, если это действительно так.

Но ранее уже говорено, что, если использовать при присвоении текста запроса свойство Text, ничего не надо "обнулять" - любое новое присвоение уже обнулит всё что в компоненте было. Мало того, это присвоение еще и закроет набор данных, т.е. и Close сработает автоматом.
1
33 / 28 / 6
Регистрация: 24.03.2020
Сообщений: 219
07.08.2020, 16:54  [ТС] 9
Т.е. если я заменю все свои SQL.Add на SQL.Text и поубираю Close с SQL.Clear перед строкой запроса, то запрос нормально будет работать? Класс! Спасибо)

А как высвобождать все query от запросов и close их при завершении работы программы, чтобы освободить БД от всех запросов?
0
1074 / 987 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
07.08.2020, 19:06 10
Ничего освобождать не надо. В БД запросы, которые отправлены из приложения не хранятся.
При завершении программы надо делать Close, если query содержит набор данных, полученный селективным запросом (select ...).
А при модифицирующих запросах (insert, update и delete) и вызывать Close нужды нет, т.к. никакие данных при этом в qury не хранятся.
0
07.08.2020, 19:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.08.2020, 19:06
Помогаю со студенческими работами здесь

Конвертация Float to wchar_t
Здравствуйте, уважаемые форумчане. Помогите, мне, пожалуйста. Как правильно перевести float в...

QDoubleValidator и конвертация во float
Здравствуйте. Имеется QLineEdit. Устанавливаю на него валидатор QDoubleValidator(0.99, 99.99,...

Конвертация float в datetime
Как конвертировать float в datetime.

Конвертация string в float
string to float или double обычная консоль как перевести

Точность операций с Float, и конвертация данных
#include <stdio.h> int fac(int a) { if(a>1)return a*fac(a-1); else return 1; } void main()...

Не происходит конвертация типа int в float
int r = 130; r = (float)r/255; r равен 0. Почему не произошла конвертация типа?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru