Стас пишет:Если коротко, то я имел в виду, что функция OnTransReply(trans_reply) в таблице trans_reply поле trans_id с 6 июля имеет тип number.
А еще на прошлой неделе было вроде string
Я прав или что-то напутал?
Здравствуйте, уважаемый Стас. Я заглянул в справочник по функции OnTransReply от ноября 2018 года, там числится поле
Параметр Тип Описание
trans_id NUMBER Пользовательский идентификатор транзакции
То есть, он всегда был числом типа NUMBER. Однако, при отправке транзакции функцией sendTransaction поле ["TRANS_ID"] должно быть числом, но типа STRING, иначе транзакция не будет принята сервером.
Может, Ваша история связана именно с этой особенностью...
Lua, иногда, может автоматически преобразовывать типы строки-числа при сравнении, но даже сам автор этого языка Роберту Иерузалимски пишет, что это было плохой идеей и не рекомендует пользоваться этим свойством языка, а всегда явно приводить типы к единому.
Из опыта - лучше оба номера транзакции привести к типу NUMBER, потому, что при преобразовании в строку числа 695980319 - можно неожиданно получить что-то вроде "695980319.0000000" и это будут разные строки.
Все дело в том, что число может быть в QLUA представлено как STRING в поле одной таблицы и как NUMBER в поле другой.
А при сравнении чисел в типе NUMBER, даже если одно из них будет как 695980319, а второе 695980319.0000000 - QLUA поймет, что это один и тот же номер.
Такие случаи имеют место быть, когда лень заглядывать в справочник по функциям QLUA
То есть, если выполнить код в общем виде:
String_Number = "2"
Number_String = tostring(2.00000)
message(tostring(String_Number == Number_String))
Все получится и функция message выведет результат true
Но в QLUA можно запутаться, например, получая какое-либо значение из таблиц. В качестве примера возможной запутки приведу получение номинала ОФЗ из таблицы "Текущие торги". В поле номинал значение хранится так: "1000.0000".
Привычным значение номинала является 1000 рублей, а не 1000.0000 рублей.
Пример немного надуман, но я полагаю, что он даст немного наглядности той мысли, которую я пытаюсь выразить в этом сообщении.
ParamRequest("TQOB", "SU26205RMFS3", "SEC_FACE_VALUE")
Nominal = getParamEx2("TQOB", "SU26205RMFS3", "SEC_FACE_VALUE").param_value
Out_1 = "Приводим номинал к типу STRING : "..tostring(tostring(Nominal) == tostring(1000)).."\n"
Out_2 = "Приводим номинал к типу NUMBER : "..tostring(tonumber(Nominal) == tonumber(1000))
Out = Out_1..Out_2
message(Out)
При выполнении этого кода - первое сравнение tostring(Nominal) == tostring(1000) даст результат false, а второе tonumber(Nominal) == tonumber(1000) даст результат true