我正在尝试编写一个包含编码查询的查询,但是不确定我的语法是否正确(99.9%完全错误)。我希望该查询遍历所有可用的知识文章,并根据工作序列和位置为用户提供正确的文章。第一步是获取用户的工作序列和位置并将其另存为变量,我在这里已经完成了这些工作:

var gr = new GlideRecord('hr_profile');
    gr.addQuery('user', gs.getUserID());
    gr.query();
    if(gr.next())
    {
  var occ = gr.job_series.getHTMLValue();
  var loc = gr.user.location.getHTMLValue();
     }


接下来,我想将occ和loc匹配到文章的系列和位置。我想包含一些规则,可以通过以下视觉效果更好地解释:

javascript - ServiceNow编码的查询语法-LMLPHP

假设我的occ = 2210,而我的位置= MD,Rockville,则将收到第5​​条(蓝色)。如果我的occ是2210,但是我位于加利福尼亚州的旧金山,我希望获得第4条报道,因为职务系列比地点优先。如果我的occ是1234,并且我位于罗克维尔,我将获得第一篇文章,因为我的工作系列不存在。最后,如果机会不多,我的occ是0101,并且我的位置在俄勒冈州波特兰(均不在此列表中),那么我将获得第7条。这样,我开始对下面的查询进行编码,但是它不起作用。

我非常确定语法是错误的,尤其是处理代码的编码部分。有人可以帮我解决问题吗?

var ka = new GlideRecord('x_knowledge_articles');
   ka.addQuery('workflow_state', 'published');
   ka.query();
   while(ka.next()) {
       if("seriesLIKE"+occ+"^locationLIKE"+loc) {
            data.article = ka.number.getHTMLValue(); }
       else if("seriesLIKE"+occ+"^locationNOT LIKE"+loc) {
            var occDefault = "seriesLIKE"+occ+"^locationISEMPTY"
            data.article = occDefault.number.getHTMLValue(); }
      else if("locationLIKE"+loc+"^seriesNOT LIKE"+occ) {
            var locDefault = "locationLIKE"+loc+"^seriesISEMPTY"
            data.article = locDefault.number.getHTMLValue();}
       else {
            data.article = 'KB0010050';
       }
  }

最佳答案

在我看来,当您对GlideRecord进行扩展会更有效时,您正在使用IF语句。我们还将利用'CONTAINS' operator of addQuery,它用作LIKE语句。如果occloc变量实际上是HTML字段,则需要使用'CONTAINS',但是如果该值为空,则需要使用更精确的'='(aka默认操作)。

试用以下代码,OP:

// To the best of my knowledge, the hr_profile code is fine
var gr = new GlideRecord('hr_profile');
gr.addQuery('user', gs.getUserID());
gr.query();
if(gr.next())
{
    var occ = gr.job_series.getHTMLValue();
    var loc = gr.user.location.getHTMLValue();
}


var ka = new GlideRecord('x_knowledge_articles');
ka.addQuery('workflow_state', 'published');

// We'll want to take blank values into account
// because using a CONTAINS addQuery on blank would return everything
if(occ == ''){
    // The line below is no different from ka.addQuery('series', occ)
    ka.addQuery('series', '=', occ);
}
else{
    ka.addQuery('series', 'CONTAINS', occ);
}

if(loc == ''){
    ka.addQuery('location', '=', loc);
}
else{
    ka.addQuery('location', 'CONTAINS', loc);
}
ka.query();

if(ka.hasNext()){
    // I don't know if you need .getHTMLValue() for a number. Have you tried a vanilla getValue()?
    data.article = ka.number.getValue();
}
// If the queries above fail, fall back on KB0010050
else{
    data.article = 'KB0010050';
}

09-25 19:48