Осторожно баг: JSONGetElement Number

Практические советы по работе с FileMaker, типичные задачи и их решения. У вас вопрос? Пишите сюда.
Ответить
andrey volkov
Сообщения: 338
Зарегистрирован: 11 сен 2017, 13:42
Откуда: Санкт-Петербург

Осторожно баг: JSONGetElement Number

Сообщение andrey volkov » 25 окт 2017, 17:51

JSONGetElement возвращает число как текст
этот баг был в версии 16.01 и починен в клиенте в версии 16.02
Вошло ли исправление в обновление для сервера - узнаю завтра, отпишусь

Здесь все достаточно сурово: число, переданное с дробной частью, при извлечении из JSON может быть неправильно распознано.

Аватара пользователя
Arcady
Администратор
Сообщения: 201
Зарегистрирован: 10 сен 2017, 20:45
Контактная информация:

Re: Осторожно баг: JSONGetElement Number

Сообщение Arcady » 25 окт 2017, 18:54

Там наверное как всегда конфликт точек и запятых. Я все через Substitute от греха прогоняю.
Аркадий Перла.
ТриА. Разработка решений для FileMaker
http://tria.pw

andrey volkov
Сообщения: 338
Зарегистрирован: 11 сен 2017, 13:42
Откуда: Санкт-Петербург

Re: Осторожно баг: JSONGetElement Number

Сообщение andrey volkov » 26 окт 2017, 07:12

там просто тупо баг. Его осознали и исправили в обновлениях.
В JSON любой текст обрамляется кавычками, любое число записывается без кавычек и разделитель всегда точка, независимо от системных настроек.
Собственно, функция JSONSetElement потому и требует параметра Тип Данных, для того, чтобы правильно записать (с кавычками или без кавычек), а потом правильно извлечь данные.
В 16.01 до исправления число 0.55 извлекалось как "0.55" (что при переводе в число превращает дробь в целое 55 или в дробь 0,55 в зависимости от настроек), более того, целое число 49 извлекалось как "49" и если бы задумали немедленно, без преобразования в число, провести операцию сравнения, то ваш результат был бы меньше 9, например (ибо "49" < 9)/
То есть это принципиальный страшный косяк.
Будьте внимательны и не забывайте обновляться :)

andrey volkov
Сообщения: 338
Зарегистрирован: 11 сен 2017, 13:42
Откуда: Санкт-Петербург

Re: Осторожно баг: JSONGetElement Number

Сообщение andrey volkov » 26 окт 2017, 07:13

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

khalex
Сообщения: 13
Зарегистрирован: 12 сен 2017, 03:31
Откуда: Краснодар

Re: Осторожно баг: JSONGetElement Number

Сообщение khalex » 27 окт 2017, 18:33

Кстати.
ExecuteSQL
Тоже возвращает число как текст. :(
По крайней мере у меня SELECT COUNT(... возвращает число как текст..

Аватара пользователя
Arcady
Администратор
Сообщения: 201
Зарегистрирован: 10 сен 2017, 20:45
Контактная информация:

Re: Осторожно баг: JSONGetElement Number

Сообщение Arcady » 29 окт 2017, 07:50

ExecuteSQL вообще по сути всегда возвращает текст. С другой стороны FileMaker неплохо справляется с преобразованием типов на лету.
Аркадий Перла.
ТриА. Разработка решений для FileMaker
http://tria.pw

khalex
Сообщения: 13
Зарегистрирован: 12 сен 2017, 03:31
Откуда: Краснодар

Re: Осторожно баг: JSONGetElement Number

Сообщение khalex » 07 янв 2018, 11:38

В продолжение темы..
Столкнулся с таким багом ( я считаю это багом )
$k - результат SQL, в частности 10

Set Value [$k; Value: GetAsNumber ( $к )]
Set Value [$t; Value: GetAsNumber ( $к )]
Set Value [$d; Value: 100]
Set Value [$d1; Value: $d-$k]
Set Value [$d2; Value: $d-$t]

В результате $d1=100 , а $d1=90 :(((

FMA16rus, MAC OS 10.13.2

Аватара пользователя
Arcady
Администратор
Сообщения: 201
Зарегистрирован: 10 сен 2017, 20:45
Контактная информация:

Re: Осторожно баг: JSONGetElement Number

Сообщение Arcady » 07 янв 2018, 12:28

у вас в самом примере явные опечатки, поэтому непонятно, что. у вас не работает.

ExecuteSQL возвращает как текст, который (если это в реальности число) можно сразу работать как с цифрой, так как FM преобразует типы на лету. Однако нужно внимательно следить, что именно вернул ExecuteSQL.

Например, есть проблема десятичных знаков - ExecuteSQL, всегда вернет число, с десятичной точкой, вне зависимости от настройки вашей системы. Поэтом если нужны дальнейшие преобразования, то может потребоваться "прогнать" через замену "." на "," - если у вас русские настройки (что скорее всего).
Ну или например, вместо ожидаемого одного числа, из-за некорректного SELECT может вернуться несколько значений (столбиком) - понятно, что ФМ не преобразует подобное корректное, если пытаться работать с таким значением как с цифрой.
Аркадий Перла.
ТриА. Разработка решений для FileMaker
http://tria.pw

andrey volkov
Сообщения: 338
Зарегистрирован: 11 сен 2017, 13:42
Откуда: Санкт-Петербург

Re: Осторожно баг: JSONGetElement Number

Сообщение andrey volkov » 09 янв 2018, 07:29

1) по описанию это явный баг. Причем настолько нелепый, что поверить в него невозможно. Лучше, если бы нам показали реальный код (скриншот) с результатами исполнения

либо на вывести в кастом диалоге следующие вычисления (одно под другим):
$k
GetAsNumber($k)
$k = GetAsNumber($k)

2)как уже заметил Аркадий, файлмейкер сам производит преобразование переменных при выполнении определенных операций с ними: в числа при выполнении арифметических операций. в строки при применении текстовых функций, в булево при выполнении операций типа NOT, AND, OR, XOR
так что в примере некоторые строки явно лишнее. "A1" + "B2" идентично записи GetAsNumber("A1") + GetAsNumber("B2") потому что сложение - арифметическая операция

Ответить