2017-03-15 8 views
1

Ich versuche, eine Abfrage zu schreiben, die codierte Abfragen enthält, bin mir aber nicht sicher, ob meine Syntax sogar richtig ist (99,9% ist völlig falsch). Ich möchte, dass diese Abfrage alle verfügbaren Wissensartikel durchläuft und basierend auf der Jobserie und dem Standort dem Benutzer den richtigen Artikel zur Verfügung stellt. Der erste Schritt ist die Job-Serie und Standort des Benutzers zu greifen und sie als Variablen speichern, die ich hier gemacht habe:ServiceNow codierte Abfragesyntax

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(); 
    } 

Als nächstes möchte ich occ und loc auf die Reihe und Position des entsprechen Artikel. Es gibt ein paar Regeln, die ich aufgenommen werden soll, und es kann besser durch diese visuelle erklären:

enter image description here

Unter der Annahme, meine occ = 2210 und meine loc = Rockville, MD, würde ich mit Artikel # 5 (blau serviert). Wenn meine Adresse 2210 ist, aber ich bin in San Francisco, CA, möchte ich Artikel Nr. 4 serviert werden, weil Job-Serie Vorrang vor Ort hat. Wenn meine Adresse 1234 ist und ich in Rockville bin, würde ich mit Artikel # 1 bedient werden, da meine Jobserie nicht vorhanden ist. Schließlich, wenn ich zufällig 0101 und mein Standort in Portland, OR (beide nicht auf dieser Liste) ist, würde ich mit Artikel # 7 serviert werden. Damit habe ich angefangen, die folgende Abfrage zu codieren, aber es funktioniert nicht.

Ich bin mir ziemlich sicher, dass die Syntax falsch ist, insbesondere mit dem codierten Teil des Codes. Kann mir jemand bei der Fehlersuche helfen?

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'; 
     } 
    } 

Antwort

2

Es scheint mir, Sie verwenden IF-Anweisungen, wenn eine Erweiterung Ihres GlideRecord effektiver wäre. Wir werden auch die 'CONTAINS'operator of addQuery nutzen, die als eine LIKE-Anweisung dient. Wenn die occ und loc Variablen tatsächlich HTML-Felder sind, müssen wir 'CONTAINS' verwenden, aber wir müssen die genauere '=' (alias die Standardoperation) verwenden, wenn der Wert leer ist.

Versuchen Sie den Code aus, 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'; 
} 
+0

... und du wirst einen Anruf 'ka.next()' müssen, um tatsächlich auf die Daten in dem abgefragten GlideRecord zu bewegen, so dass der Aufruf von 'ka.number' hat Daten bereit. – Joey