如何避免 EntitySelection.toCollection($fieldNames) 中不正确的字段名引发错误
How Can I Avoid Throwing Errors From Incorrect FieldNames in EntitySelection.toCollection($fieldNames)
我正在尝试将代码转换为 ORDA。给我带来问题的一件事是关系。示例设置:
Tables:
[CallLogs]
, [Employees]
关系:
[CallLogs]EmployeeID
(M)---->(O) [Employees]UniqueID
MtO 关系名称:"RelatedEmployee".
使用ORDA,我可以这样做:
ds["CallLogs"].query("......").toCollection("Date, Subject, RelatedEmployee.Name")
如果我在 .toCollection()
中输入一个不真实的字段名,4D 将抛出错误。当我控制输入时,这很好。但是,在客户端可以指定字段的 Web API 中,我不想抛出错误,而是静静地删除任何不正确的字段名称,或者 return 一条错误消息。抛出 4D 错误会停止进程。
以前,当我使用 Selection to JSON
时,我会将链接的 table 中的字段指定为 TableName_FieldName
,然后我可以拆分它,然后验证 table和 table 结构对象的字段名称。但是,由于 ORDA 使用 Relation Name,而不是 Table Name,我不知道该怎么做。我找不到任何可以使用关系名称并返回 table 的内容。或者,我找不到抑制 .toCollection()
中错误的方法。理想情况下,.toCollection()
会忽略不真实的字段名称。
任何关于如何进行的帮助都将不胜感激。
您提到了一个网络 API。您使用的是 4D REST server 吗?如果是这样,使用正确名称的负担就真正落到了调用者身上。他们可以先拿到目录。
如果您正在使用 Web Server 并通过它管理您的 API 调用,您将需要自己解析查询字符串并验证字段拼写。如果它是一个开放的 API 我无论如何都想这样做以防止任何恶意代码注入尝试。
since ORDA uses Relation Name, instead of Table Name
当您在相关 table 的上下文中引用 table 时为真。这实际上是我发现的一个很棒的功能。例如,我会简单地将 M->O 关系称为 "Employee",因为它更具可读性。而 O->M 我称之为 "Logs" 或 "CallLogs"。
OTOH 有些人更喜欢 "r_Employee" 来明确识别关系。
并且 dataStore ds
也是一个对象 ds.CallLogs
。因此,您可以使用
轻松获得 table 字段的完整列表
$o:=ds.CallLogs
无需将实体选择转换为常规选择然后使用 Selection to JSON
。
I can't find a way to suppress errors
结帐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 服务器和网络服务器上 运行 的方法来说是个好主意,这样您就不会被阻止。我更喜欢捕获并记录错误,但是您只需要忽略这些示例即可。
如果您在网页上提供输入,您可以使用某种选择列表来控制输入。但如果你做不到,你必须自己管理它。
希望对您有所帮助
我正在尝试将代码转换为 ORDA。给我带来问题的一件事是关系。示例设置:
Tables:
[CallLogs]
, [Employees]
关系:
[CallLogs]EmployeeID
(M)---->(O) [Employees]UniqueID
MtO 关系名称:"RelatedEmployee".
使用ORDA,我可以这样做:
ds["CallLogs"].query("......").toCollection("Date, Subject, RelatedEmployee.Name")
如果我在 .toCollection()
中输入一个不真实的字段名,4D 将抛出错误。当我控制输入时,这很好。但是,在客户端可以指定字段的 Web API 中,我不想抛出错误,而是静静地删除任何不正确的字段名称,或者 return 一条错误消息。抛出 4D 错误会停止进程。
以前,当我使用 Selection to JSON
时,我会将链接的 table 中的字段指定为 TableName_FieldName
,然后我可以拆分它,然后验证 table和 table 结构对象的字段名称。但是,由于 ORDA 使用 Relation Name,而不是 Table Name,我不知道该怎么做。我找不到任何可以使用关系名称并返回 table 的内容。或者,我找不到抑制 .toCollection()
中错误的方法。理想情况下,.toCollection()
会忽略不真实的字段名称。
任何关于如何进行的帮助都将不胜感激。
您提到了一个网络 API。您使用的是 4D REST server 吗?如果是这样,使用正确名称的负担就真正落到了调用者身上。他们可以先拿到目录。
如果您正在使用 Web Server 并通过它管理您的 API 调用,您将需要自己解析查询字符串并验证字段拼写。如果它是一个开放的 API 我无论如何都想这样做以防止任何恶意代码注入尝试。
since ORDA uses Relation Name, instead of Table Name
当您在相关 table 的上下文中引用 table 时为真。这实际上是我发现的一个很棒的功能。例如,我会简单地将 M->O 关系称为 "Employee",因为它更具可读性。而 O->M 我称之为 "Logs" 或 "CallLogs"。
OTOH 有些人更喜欢 "r_Employee" 来明确识别关系。
并且 dataStore ds
也是一个对象 ds.CallLogs
。因此,您可以使用
$o:=ds.CallLogs
无需将实体选择转换为常规选择然后使用 Selection to JSON
。
I can't find a way to suppress errors
结帐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 服务器和网络服务器上 运行 的方法来说是个好主意,这样您就不会被阻止。我更喜欢捕获并记录错误,但是您只需要忽略这些示例即可。
如果您在网页上提供输入,您可以使用某种选择列表来控制输入。但如果你做不到,你必须自己管理它。
希望对您有所帮助