Как я могу избежать выдачи ошибок из неправильных имен полей в EntitySelection.toCollection ($ fieldNames) - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь преобразовать код в ORDA. Одна вещь, которая вызывает у меня проблемы, это отношения. Пример настройки:

Таблицы:

[CallLogs], [Employees]

Соотношение:

[CallLogs]EmployeeID (M) ----> ( O) [Employees]UniqueID

Имя отношения MtO: "RelatedEmployee".

Используя ORDA , я могу сделать это:

ds["CallLogs"].query("......").toCollection("Date, Subject, RelatedEmployee.Name")

Если я должен был вставить имя поля в .toCollection(), которое не было реальным, 4D выдаст ошибку. Это нормально, когда я контролирую ввод. Однако в веб-API, где клиент может указывать поля, я не хочу выбрасывать ошибки, а вместо этого просто молча отбрасываю любые неправильные имена полей или возвращает сообщение об ошибке. Создание 4D-ошибки останавливает процесс.

Ранее, когда я использовал Selection to JSON, я определял поля из связанных таблиц как TableName_FieldName, и я мог разделить его, а затем проверял имя таблицы и поля для объекта структуры таблицы. Однако, поскольку ORDA использует имя отношения вместо имени таблицы, я не знаю, что делать. Я не могу найти ничего, что могло бы взять имя отношения и вернуть мне стол. Или я не могу найти способ подавления ошибок в .toCollection(). В идеале .toCollection() будет просто игнорировать имена полей, которые не являются реальными.

Буду признателен за любую помощь в том, как поступить.

1 Ответ

1 голос
/ 27 апреля 2020

Вы упоминаете веб-API. Используете ли вы 4D REST сервер ? Если это так, бремя действительно на вызывающего абонента, чтобы использовать правильные имена. Они могли бы получить каталог первым.

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

, поскольку ORDA использует имя отношения вместо имени таблицы

Истина, когда вы ссылаетесь на таблицу в контексте связанной таблицы. Это действительно отличная особенность, которую я нахожу. Например, я бы назвал отношение M-> O просто «Сотрудник», потому что оно более читабельно. И O-> M я бы назвал «Журналы» или «CallLogs».

OTOH некоторые люди предпочитают "r_Employee" явно идентифицировать отношение.

И хранилище данных ds также является объектом ds.CallLogs. Таким образом, вы можете легко получить полный список полей таблицы с помощью

$o:=ds.CallLogs

, не преобразовывая выбор сущности в обычный выбор, а затем используя Selection to JSON.

Я не могу найти способ подавления ошибок

Оформить заказ ON ERR CALL Вы можете создать метод обработки ошибок, который ничего не делает. Просто создайте метод с именем Err_ignore. Чтобы использовать его:

$err_method:=Method called on error  // get the current error method
ON ERR CALL("Err_ignore")
 <  do some stuff >
ON ERR CALL($err_method)  //  restore the original err handler

Это хорошая идея для методов, которые запускаются на 4D-сервере и веб-сервере, чтобы вас не блокировали. Я предпочитаю регистрировать и регистрировать ошибки, но пример - это все, что вам нужно, чтобы их игнорировать.

Если вы предоставляете ввод на веб-странице, вы можете использовать какой-то список выбора для управления вводом. Но если вы не можете этого сделать, вы должны сами справиться с этим.

Надеюсь, это поможет

...