Topic: Точка или запятая ? Что делать ?

Добрый день !
Наткнулся на проблему . В скрипте формирую SQL запрос UPDATE  типа  X(real)= Y(REAL) / Z(REAL)*100 .
В гриде и в таблицах БД разделителем записывается точка . А функции преобразований для FLOAT требуют разделителем
запятую  и выдают ошибку( типа это не FLOAT) . Тоже когда беру из Грида .
Помогите !  Четыре дня потерял. Проект очень большой (автоматизация тех процессов целой фабрики).

Re: Точка или запятая ? Что делать ?

Приветствую,


Странно, судя по описанию не должно быть ошибки.
Какая именно функция подразумевается под "А функции преобразований для FLOAT" ?


ошибка возникает при использовании скриптов или SQL запроса?
можете отправить мне свой проект на support@drive-software.com
постараюсь помочь.

Dmitry.

Re: Точка или запятая ? Что делать ?

Добрый день !
StrToFloat(s: String): Extended

Сначала делаю так :

SQLExecute(' UPDATE MatZayav2 SET EffektPlan=(SELECT (SumVesKroyPlan/MaterKolPlan*100) FROM MatZayav2 WHERE  MatZayav2.id = ' + IntToStr(frmZakroyniyCeh.TableGrid3.dbItemID) +'),EffektReal=(SumVesKroyFakt/MaterKolFakt*100),EffektFakt=(SumVesKroyFakt/(VesLista*ZayavKol)*100) WHERE  MatZayav2.id = ' + IntToStr(frmZakroyniyCeh.TableGrid3.dbItemID) +' ;');

Потом мне надо раскрасить  EffektFakt в гриде если он хуже факта на 2,5 (%) .
Первоначальные данные  вводятся с точкой по режиму SQL ЗАПРОС

Re: Точка или запятая ? Что делать ?

Предыдущее сообщение аннулирую , чтобы не запутать .
В Edit3 ввожу к-во отпускаемого материала фактическое
В TableGrid1.Cells[10,i] записано к-во материала плановое
В Edit5 к-во упаковок , а в CheckBox2 - тип упаковки ( разная масса )
Делаю защиту , чтобы не отпустили меньше ( больше можно )
Под Button2 SQL ЗАПРОС с :

INSERT INTO Nakladnie (Nomer,NakData,Otkuda,Kuda,Rasxod,PrixRasx,id_Materials,
ZayavNom,ZayavData,id_employees)
SELECT {Edit4},{DateTimePicker1},MatZayav2.Otkuda,MatZayav2.Kuda,{Edit3},
{CheckBox1},
MatZayav2.id_Materials,MatZayav2.NomerZayav,MatZayav2.DataZayav,{TableGrid2}
FROM MatZayav2
WHERE MatZayav2.id LIKE "{TableGrid1}"
AND MatZayav2.MatZaPriz<>1;

А в Button2_OnClick собственно проверка :

procedure frmZayavRashodMat_Button2_OnClick (Sender: string; var Cancel: boolean);
var
    i,c: integer;
    d: Extended;
begin
    i := frmZayavRashodMat.TableGrid1.dbItemID -1;
   if  frmZayavRashodMat.TableGrid1.Cells[11,i] = '1' then
     begin
      ShowMessage('  Материал по заявке уже выдан.');
      Cancel := True; // отменяем действие кнопки
    end;
    c := StrToInt(frmZayavRashodMat.Edit5.Text);
   if frmZayavRashodMat.CheckBox2.Checked then d:= c*0.75
   else  d:= c*0.2;
   if StrToFloat(frmZayavRashodMat.Edit3.Text) < (d + StrToFloat(frmZayavRashodMat.TableGrid1.Cells[10,i])) then
     begin
      ShowMessage('  Мало');
      Cancel := True;
    end;
end;


Происходит следующее :
Если я ввожу в Edit3  число с точкой в разделителе , то выходит сообщение об ошибке от функции StrToFloat , что  значение не Float
Если ввожу с запятой , то StrToFloat  пропускает , ругается SQL ЗАПРОС Под Button2 ( что я пытаюсь вставить 11 значений в 10 столбцов)
видимо запятая в Edit3 воспринимается как разделитель двух параметров.

Где не пользуюсь обработкой чисел скриптами , ввод разделителя в виде точки ( по Edit - ам) проходит норм.
С уважением .

Re: Точка или запятая ? Что делать ?

Моя ошибка, то что SQL запрос ругается  Под Button2, исправил, скачайте пожалуйста бета версию 1.45
https://www.dropbox.com/s/88lx13h9cw5ro … 5.zip?dl=0


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



Также добавил новую функция в скрипт, позволяющая заменить в строке один символ, на другой
ReplaceStr(const AText, AFromText, AToText: string): string


т.о. перед использованием StrToFloat, если вам необходимо, можете на всякий случай проверять правильность пользовательского ввода и исправлять десятичный разделитель, т.к. пользователю может быть неизвестно, какой знак используется в качестве разделителя, например так

if not ValidFloat(sFloat) then sFloat := ReplaceStr(ReplaceStr, '.', ','); // если строка не может быть приведена к FLOAT, меняет точку на запятую
if not ValidFloat(sFloat) then sFloat := ReplaceStr(ReplaceStr, ',', '.'); // если строка не может быть приведена к FLOAT, меняет запятую на точку
Dmitry.

Re: Точка или запятая ? Что делать ?

Спасибо !
Теперь все нормально .
И новая функция ко двору , т.к. на клавиатуре где цифрополе работает именно точка.

7 (edited by iacovlogica 2016-07-10 11:45:41)

Re: Точка или запятая ? Что делать ?

День добрый всем .

Если из компонента Edit ,  который заполняется скриптом в результате расчетов ,
попытаться вещественное число сохранить в базу скриптом например так :

SQLExecute('INSERT INTO Chisla ( chislo ) VALUES ( '+ Form1.Edit1.sqlValue +' )');

то в базу будет записано число у которого  десятичный разделитель такой какой указан в региональных настройках
( в русских рег настройках это почему-то запятая )
...Причем запись по кнопке "Сохранить запись" работает корректно 
т.е пишется точка независимо от рег. настроек .
Собственно как и положено по букварю http://www.mysql.ru/docs/man/Number_syntax.html

Суть проблемы в том что эти числа ( с запятой в качестве разделителя )
при обработке средствами SQL вызывают цепь ошибок в вычислениях в которых они участвуют .

Сменить региональные настройки или обойти сию проблему труда не составляет , но время на поиск проблемы уже потрачено.

Дмитрий , поправьте пожалуйста эту ошибку.
 
...Если в поле Edit ввести не системный разделитель ( в моём случае точка ) то и по кнопе будет сохранен ноль.
Контролировать ввод несложно , НО как вариант могу предложить добавить в программу компонент "Числовое поле" с соответствующими ограничениями на ввод всего что отлично от чисел и системного разделителя.
Так проще для понимания будет новичкам да и не только.

Post's attachments

Attachment icon Testi.7z 275.63 kb, 456 downloads since 2016-07-10 

Re: Точка или запятая ? Что делать ?

iacovlogica
Установите для данного компонента свойство NumbersOnly=True

Dmitry.