33 / 28 / 6
Регистрация: 24.03.2020
Сообщений: 219
|
||||||
1 | ||||||
Конвертация Edit.Text -> FLOAT -> MySQL07.08.2020, 00:30. Показов 2395. Ответов 9
Здравствуйте!
Вопрос таков. В edit вводят дробное значение. В БД Decimal хранится с точкой, однако в DBGrid отображение с запятой. Проверку edit.text на вводимое подымали на форуме, я же реализовал конвертацию таким образом:
Всем заранее спасибо за помощь!!!
0
|
07.08.2020, 00:30 | |
Ответы с готовыми решениями:
9
Конвертация IBM float в IEEE float Конвертация string в float Конвертация string в float Конвертация в тип Float |
1074 / 987 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
|
||||||
07.08.2020, 08:17 | 2 | |||||
Сообщение было отмечено Komandor_Yan как решение
Решение
"Конвертировать" можно и проще, заменив запятую на точку перед вставкой значения в запрос:
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 | |||||
Именно об этом и была речь, что числовые значения, вставляемые в текст запроса, не могут быть обрамлены кавычками.
Запросы SQL придуманы на западе и у них принято было всегда отделять целую часть числа от дробной только точкой, а не как в Союзе, запятой. Поэтому и в запрос они должны вставляться только с точкой. В дбгрид нет данных, они происходят из датасета (к примеру, ADOQuery, ADOTable и иже с ними). А как бороться, я уже сказал: перед вставкой в текст запроса значение, которое находится в TEdit или в датасете надо препарировать и затем просто вставить в текст. Что-то в этом роде:
'поле_число' - тоже условное наименование того поля, которое содержит данные типа 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 | |
07.08.2020, 19:06 | |
Помогаю со студенческими работами здесь
10
Конвертация Float to wchar_t QDoubleValidator и конвертация во float Конвертация float в datetime Конвертация string в float Точность операций с Float, и конвертация данных Не происходит конвертация типа int в float Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |