在 /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."}}
按照您的建议,我从代码中删除了“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。"}}"""
尽管存在错误,但我使用的 FetchXML 是在 xrmtool 上经过测试的提取,它正确返回了与客户端 ID 匹配的与“OM”关联的说明记录(如屏幕截图所示)。