根据关联账户过滤曝光记录的问题

问题描述 投票:0回答:1

在 /exposure reports/=/relevé d'exposition/ 部分中,我只想显示那些与 /clientid/ 中的帐户名称相同的关联帐户名称。我编写的这段代码似乎工作正常,因为所有 console.log 消息都按预期显示。但是,应用过滤器后,暴露记录中不会出现任何内容。您可以查看屏幕截图来了解问题。这是我使用的代码:

function filterExpositions() {
  debugger;
  // Affiche un message dans la console pour indiquer le début du filtrage des relevés d'exposition
  console.log("Début du filtrage des relevés d'exposition.");

  // Récupère l'ID du compte depuis le champ de recherche 'sfa_clientid' sur le formulaire actuel
  var accountLookup = Xrm.Page.getAttribute('sfa_clientid').getValue();
  // Extrait l'ID du compte de la valeur récupérée, s'il existe
  var accountId = accountLookup ? accountLookup[0].id.replace('{', '').replace('}', '') : null;
  // Affiche l'ID du compte dans la console
  console.log("ID du compte récupéré depuis le champ 'sfa_clientid':", accountId);

  // Vérifie si l'ID du compte est null ou non
  if (!accountId) {
    // Affiche un message dans la console si aucun ID de compte n'est trouvé et arrête l'exécution de la fonction
    console.log("Aucun ID de compte trouvé, filtrage des relevés d'exposition non effectué.");
    return;
  }

  // Récupère la référence de la grille de relevé d'exposition sur le formulaire actuel
  var expositionGrid = Xrm.Page.getControl('Subgrid_new_3');
  // Vérifie si la grille de relevé d'exposition existe
  if (!expositionGrid) {
    // Affiche un message dans la console si la grille n'est pas trouvée et arrête l'exécution de la fonction
    console.log("Grille de relevé d'exposition non trouvée.");
    return;
  }

  // Construit le FetchXML avec l'ID de compte dynamique pour le filtrage des relevés d'exposition
  var fetchXml = "<fetch top='50'>" +
    "<entity name='sfa_relev'>" +
    "<attribute name='sfa_name' />" +
    "<attribute name='sfa_famille4' />" +
    "<attribute name='sfa_famille3' />" +
    "<attribute name='sfa_famille2' />" +
    "<attribute name='sfa_famille1' />" +
    "<attribute name='sfa_famille5' />" +
    "<attribute name='sfa_mise_en_place' />" +
    "<attribute name='sfa_famille6' />" +
    "<order attribute='sfa_mise_en_place' descending='true' />" +
    "<attribute name='sfa_compte_to_releves' />" +
    "<attribute name='ownerid' />" +
    "<attribute name='sfa_relevid' />" +
    "<link-entity name='account' from='accountid' to='sfa_compte_to_releves'>" +
    "<filter>" +
    "<condition attribute='accountid' operator='eq' value='" + encodeURIComponent(accountId) + "' />" +
    "</filter>" +
    "</link-entity>" +
    "</entity>" +
    "</fetch>";
  // Affiche le FetchXML dans la console
  console.log("FetchXML construit avec l'ID du compte dynamique:", fetchXml);

  // Applique le FetchXML à la sous-grille et rafraîchit la grille
  var ok = applyFilterAndRefreshGrid(fetchXml);
  // Vérifie si le filtrage et le rafraîchissement de la grille se sont déroulés avec succès
  if (ok) {
    // Affiche un message dans la console si le filtrage et le rafraîchissement sont réussis
    console.log("Grille de relevé d'exposition rafraîchie avec le nouveau filtre.");
  } else {
    // Affiche un message dans la console s'il y a une erreur lors de l'application du filtre
    console.log("Erreur lors de l'application du filtre.");
  }
}

// Fonction responsable de l'envoi de la requête pour récupérer les données de l'entité
function applyFilterAndRefreshGrid(fetchXml) {
  // Initialise une variable pour indiquer si le filtrage et le rafraîchissement de la grille sont réussis
  var ok = false;
  // Crée une nouvelle requête XMLHttp
  var req = new XMLHttpRequest();
  // Configure la requête pour récupérer les données de l'entité 'sfa_relev' avec le FetchXML spécifié
  req.open("GET", Xrm.Utility.getGlobalContext().getClientUrl() + "/api/data/v9.2/sfa_relevs?fetchXml=" + encodeURIComponent(fetchXml), false);
  // Configure les en-têtes de la requête
  req.setRequestHeader("OData-MaxVersion", "4.0");
  req.setRequestHeader("OData-Version", "4.0");
  req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
  req.setRequestHeader("Accept", "application/json");
  // Envoie la requête
  req.send();

  // Attend la fin de la requête
  if (req.readyState === 4) {
    // Vérifie si la requête a réussi
    if (req.status === 200) {
      // Analyse la réponse JSON de la requête
      var results = JSON.parse(req.response);
      // Vérifie s'il y a des résultats de la requête
      if (results.value.length > 0) {
        // Met à jour la variable ok pour indiquer que le filtrage et le rafraîchissement sont réussis
        ok = true;
        // Récupère la référence de la grille de relevé d'exposition sur le formulaire actuel
        var expositionGrid = Xrm.Page.getControl('Subgrid_new_3');
        // Ajoute un console log pour vérifier le FetchXML utilisé pour filtrer la grille
        console.log("FetchXML utilisé pour filtrer la grille:", fetchXml);
        expositionGrid.setFilterXml(fetchXml);
        // Rafraîchit la grille
        expositionGrid.refresh();
      }
    } else {
      // Affiche le message d'erreur dans la console en cas d'échec de la requête
      console.log("Erreur lors de la récupération des données:", req.responseText);
    }
  }
  // Retourne la valeur de la variable ok pour indiquer si le filtrage et le rafraîchissement sont réussis ou non
  return ok;
}

// Écouteur d'événements pour appeler filterExpositions lorsque le formulaire est chargé
document.addEventListener("DOMContentLoaded", function() {
  // Affiche un message dans la console pour indiquer que le document est chargé et appelle filterExpositions
  console.log("Document chargé, appel de filterExpositions.");
  filterExpositions();
});

以及我在控制台中拥有的内容:

"Début du filtrage des relevés d'exposition.

sfa_owner:11 ID du compte récupéré depuis le champ 'sfa_clientid': 15087B86-EDAB-EE11-BE37-000D3A28949E

sfa_owner:52 FetchXML construit avec l'ID du compte dynamique: <fetch top='50'><entity name='sfa_relev'><attribute name='sfa_name' /><attribute name='sfa_famille4' /><attribute name='sfa_famille3' /><attribute name='sfa_famille2' /><attribute name='sfa_famille1' /><attribute name='sfa_famille5' /><attribute name='sfa_mise_en_place' /><attribute name='sfa_famille6' /><order attribute='sfa_mise_en_place' descending='true' /><attribute name='sfa_compte_to_releves' /><attribute name='ownerid' /><attribute name='sfa_relevid' /><link-entity name='account' from='accountid' to='sfa_compte_to_releves'><filter><condition attribute='accountid' operator='eq' value='15087B86-EDAB-EE11-BE37-000D3A28949E' /></filter></link-entity></entity></fetch>

sfa_owner:95 FetchXML utilisé pour filtrer la grille: <fetch top='50'><entity name='sfa_relev'><attribute name='sfa_name' /><attribute name='sfa_famille4' /><attribute name='sfa_famille3' /><attribute name='sfa_famille2' /><attribute name='sfa_famille1' /><attribute name='sfa_famille5' /><attribute name='sfa_mise_en_place' /><attribute name='sfa_famille6' /><order attribute='sfa_mise_en_place' descending='true' /><attribute name='sfa_compte_to_releves' /><attribute name='ownerid' /><attribute name='sfa_relevid' /><link-entity name='account' from='accountid' to='sfa_compte_to_releves'><filter><condition attribute='accountid' operator='eq' 
value='15087B86-EDAB-EE11-BE37-000D3A28949E' /></filter></link-entity></entity></fetch>

sfa_owner:59 Grille de relevé d'exposition rafraîchie avec le nouveau filtre.

sfa_owner:102 Erreur lors de la récupération des données: {"error":{"code":"0x80040201","message":"Invalid XML."}}

我已经使用了所有这些代码,并且通过这些代码,应用了过滤器,因为我们再也看不到记录了。但是,问题在于该过滤器也适用于具有相同客户端 ID 的记录,这就是问题所在。现在,使用上面显示的代码,我遇到了这个似乎无法解决的错误:

{"error":{"code":"0x80040201","message":"Invalid XML."}}
javascript java dynamic error-handling dynamics-crm
1个回答
0
投票

按照您的建议,我从代码中删除了“encodeURIComponent”:

"""函数filterExpositions() { 调试器; // 在控制台上添加有关相关展览过滤器首次亮相的消息 console.log("相关展览过滤首次亮相。");

// Récupère l'ID du compte depuis le champ de recherche 'sfa_clientid' sur le formulaire actuel
var accountLookup = Xrm.Page.getAttribute('sfa_clientid').getValue();
// Extrait l'ID du compte de la valeur récupérée, s'il existe
var accountId = accountLookup ? accountLookup[0].id.replace('{', '').replace('}', '') : null;
// Affiche l'ID du compte dans la console
console.log("ID du compte récupéré depuis le champ 'sfa_clientid':", accountId);

// Vérifie si l'ID du compte est null ou non
if (!accountId) {
    // Affiche un message dans la console si aucun ID de compte n'est trouvé et arrête l'exécution de la fonction
    console.log("Aucun ID de compte trouvé, filtrage des relevés d'exposition non effectué.");
    return;
}

// Récupère la référence de la grille de relevé d'exposition sur le formulaire actuel
var expositionGrid = Xrm.Page.getControl('Subgrid_new_3');
// Vérifie si la grille de relevé d'exposition existe
if (!expositionGrid) {
    // Affiche un message dans la console si la grille n'est pas trouvée et arrête l'exécution de la fonction
    console.log("Grille de relevé d'exposition non trouvée.");
    return;
}

// Construit le FetchXML avec l'ID de compte dynamique pour le filtrage des relevés d'exposition
var fetchXml = "<fetch top='50'>" +
               "<entity name='sfa_relev'>" +
               "<attribute name='sfa_name' />" +
               "<attribute name='sfa_famille4' />" +
               "<attribute name='sfa_famille3' />" +
               "<attribute name='sfa_famille2' />" +
               "<attribute name='sfa_famille1' />" +
               "<attribute name='sfa_famille5' />" +
               "<attribute name='sfa_mise_en_place' />" +
               "<attribute name='sfa_famille6' />" +
               "<order attribute='sfa_mise_en_place' descending='true' />" +
               "<attribute name='sfa_compte_to_releves' />" +
               "<attribute name='ownerid' />" +
               "<attribute name='sfa_relevid' />" +
               "<link-entity name='account' from='accountid' to='sfa_compte_to_releves'>" +
               "<filter>" +
               "<condition attribute='accountid' operator='eq' value='" + accountId + "' />" +
               "</filter>" +
               "</link-entity>" +
               "</entity>" +
               "</fetch>";
// Affiche le FetchXML dans la console
console.log("FetchXML construit avec l'ID du compte dynamique:", fetchXml);

// Applique le FetchXML à la sous-grille et rafraîchit la grille
var ok = applyFilterAndRefreshGrid(fetchXml);
// Vérifie si le filtrage et le rafraîchissement de la grille se sont déroulés avec succès
if (ok) {
    // Affiche un message dans la console si le filtrage et le rafraîchissement sont réussis
    console.log("Grille de relevé d'exposition rafraîchie avec le nouveau filtre.");
} else {
    // Affiche un message dans la console s'il y a une erreur lors de l'application du filtre
    console.log("Erreur lors de l'application du filtre.");
}

}

// 负责恢复实体的请求的功能 函数 applyFilterAndRefreshGrid(fetchXml) { // 初始化用于过滤和格栅过滤的变量 var 好=假; // Crée une nouvelle requête XMLHttp var req = new XMLHttpRequest(); // 配置“sfa_relev”实体和 FetchXML 规范的请求 req.open("GET", Xrm.Utility.getGlobalContext().getClientUrl() + "/api/data/v9.2/sfa_relevs?fetchXml=" + fetchXml, false); // 配置请求的内容 req.setRequestHeader("OData-MaxVersion", "4.0"); req.setRequestHeader("OData-版本", "4.0"); req.setRequestHeader("Content-Type", "application/json; charset=utf-8"); req.setRequestHeader("接受", "application/json"); // 请求请求 请求.send();

// Attend la fin de la requête
if (req.readyState === 4) {
    // Vérifie si la requête a réussi
    if (req.status === 200) {
        // Analyse la réponse JSON de la requête
        var results = JSON.parse(req.response);
        // Vérifie s'il y a des résultats de la requête
        if (results.value.length > 0) {
            // Met à jour la variable ok pour indiquer que le filtrage et le rafraîchissement sont réussis
            ok = true;
            // Récupère la référence de la grille de relevé d'exposition sur le formulaire actuel
            var expositionGrid = Xrm.Page.getControl('Subgrid_new_3');
            // Ajoute un console log pour vérifier le FetchXML utilisé pour filtrer la grille
            console.log("FetchXML utilisé pour filtrer la grille:", fetchXml);
            expositionGrid.setFilterXml(fetchXml);
            // Rafraîchit la grille
            expositionGrid.refresh();
        }
    } else {
        // Affiche le message d'erreur dans la console en cas d'échec de la requête
        console.log("Erreur lors de la récupération des données:", req.responseText);
    }
}
// Retourne la valeur de la variable ok pour indiquer si le filtrage et le rafraîchissement sont réussis ou non
return ok;

}

// Écouteur d'événements pour appeler filterExpositions lorsque le Formulaire est charge document.addEventListener("DOMContentLoaded", function() { // 在控制台上添加一条消息,该消息是由 filterExpositions 负责并上诉的文档 console.log("文档负责,appel de filterExpositions。"); 过滤器展示(); });“

但是,尽管进行了此更改,我仍然在控制台中遇到错误,并显示以下消息:

展览相关过滤首次亮相。 sfa_owner:11 'sfa_clientid' 的计算机 ID: 15087B86-EDAB-EE11-BE37-000D3A28949E sfa_owner:52 FetchXML 构建完整的动态 ID: sfa_owner:95 FetchXML 使用格栅过滤器: sfa_owner:59 与新过滤器相关的展览格栅。 sfa_owner:102 Erreur lors de la récupération des données: {"error":{"code":"0x80040201","message":"无效的 XML。"}}"""enter image description here

尽管存在错误,但我使用的 FetchXML 是在 xrmtool 上经过测试的提取,它正确返回了与客户端 ID 匹配的与“OM”关联的说明记录(如屏幕截图所示)。

© www.soinside.com 2019 - 2024. All rights reserved.