Tyr*_*ang 3 sql netsuite ansi-sql-92 suitescript suiteql
我有一个简单的表 ItemMapping,2 个字段,一个字段是单个项目列表字段 SingleSelectField,值为“A”,其他为多个项目列表字段 MultiSelectField,值为(“B”、“C”、“D”)。
我想得到这个映射关系 通过“B”,我尝试设置一个数据集,并像以前一样尝试一些单一的 SuiteQL,但我总是返回空结果。
SELECT *
FROM ItemMapping
WHERE ItemMapping.MultiSelectField IN ('B')
Run Code Online (Sandbox Code Playgroud)
任何提示都可以帮助我。先感谢您。
小智 7
正如所指出的,Marty Zigman 的文章描述了 Boban D. 如何找到 SuiteQL 中未记录的可用“功能”。
我将把大部分解释留给本文,但总而言之,NetSuite 自动创建一个名为 map_ sourcTableId _ fieldId的关系表,其中包含两列:mapone和maptwo。mapone是源表中的记录 id,maptwo是连接表的记录 id。
如果您习惯使用 SQL,此方法似乎效果很好,并且可能是最直接的方法。
作为替代方案,我构造了一个本机 SuiteScriptQuery对象,该对象在多选字段上具有条件。然后我使用该toSuiteQL()方法将其转换为 SuiteQL,看看 NetSuite 本身是如何处理这个问题的。我发现的是另一个未记录的“功能”。生成的查询使用了一个BUILTIN.MNFILTER函数。例如,如果您有一个自定义交易主体字段 ,custbody_link_type这是一个多重选择字段,并且想要获取其中 te 值之一的交易custbody_link_type,4那么这里就是生成的 SuiteQL:
SELECT T.tranid, T.custbody_link_types
FROM "transaction" as T
WHERE BUILTIN.MNFILTER(T.custbody_link_types , 'MN_INCLUDE', '', 'FALSE', NULL, 4) = 'T'
Run Code Online (Sandbox Code Playgroud)
如果您想要的交易custbody_link_types不包含以下所有内容:1、2、3 ...
SELECT T.tranid, T.custbody_link_types
FROM "transaction" as T
WHERE BUILTIN.MNFILTER(T.custbody_link_types , 'MN_EXCLUDE_ALL', '', 'FALSE', NULL, 1, 2, 3) = 'T'
OR T.custbody_link_types IS NULL
Run Code Online (Sandbox Code Playgroud)
总而言之,BUILTIN.MNFILTERNetSuite 的查询模块使用未记录的函数来过滤多个选择字段。它接受多重选择列、枚举的内部字符串值query.Operator、一些我一无所知的其他内容,最后是一个或多个要比较的值。当满足条件时,它似乎返回一个字符串“T”,否则返回“F”。
最终,我不确定这是否是解决需求的“更好”方法,但我认为值得记录下来。