Sie befinden sich hier:
Erstellen von benutzerdefinierten Feldern und Definieren von Apex-Auslösern
Erstellen Sie die erforderlichen benutzerdefinierten Felder und definieren Sie Apex-Auslöser für die Objekte "Angebotsbelegposten" und "Auftragsprodukt (OrderItem)".
Erforderliche Editionen
| Verfügbarkeit: Lightning Experience |
| Verfügbarkeit: Enterprise, Unlimited und Developer Edition der Umsatzverwaltung (ehemals Revenue Cloud) mit der Revenue Cloud Growth-Lizenz oder der Revenue Cloud Advanced-Lizenz |
Erstellen des benutzerdefinierten Felds ConstraintEngineNodeStatus
Erstellen Sie ein benutzerdefiniertes Feld in den Objekten "Quelle für Angebotsbelegposten", "Auftragsprodukt" und "Vermögenswertaktion", um Daten zu speichern, die das Modul für Einschränkungsregeln für die interne Verarbeitung verwendet.
Wechseln Sie zu den Objektverwaltungseinstellungen dieser Objekte und erstellen Sie ein benutzerdefiniertes Feld mit den folgenden Werten:
- Wählen Sie Textbereich (Lang) als Datentyp aus.
- Geben Sie Status des Einschränkungsmodulknotens als Feldbezeichnung ein.
- Geben Sie 131072 als Länge ein.
- Geben Sie ConstraintEngineNodeStatus als Feldnamen ein.
- Wählen Sie Sichtbarer Zugriff und deaktivieren Sie Schreibgeschützten Zugriff für die Profile der Benutzer, die das Modul für Einschränkungsregeln verwenden, sowie für Kunden-Community- und Partner-Community-Benutzer.
- Deaktivieren Sie die Seitenlayouts.
Definieren von Apex-Auslösern für Angebots- und Auftragsbelegposten
Definieren Sie Auslöser für die Objekte "Angebotsbelegposten" und "Auftragsprodukt (OrderItem)" mithilfe von Apex Code.
Verwenden Sie diesen Apex Code für das Objekt "Angebotsbelegposten".
trigger QuoteItemTrigger on QuoteLineItem (before insert) {
//collect QuoteActionIds
Set<Id> quoteActionIds = new Set<Id>();
for (QuoteLineItem qi : Trigger.new) {
if (qi.QuoteActionId != null && qi.ConstraintEngineNodeStatus__c == null) {
quoteActionIds.add(qi.QuoteActionId);
}
}
if (!quoteActionIds.isEmpty()) {
// Step 1: Get QuoteAction → SourceAsset
Map<Id, Id> quoteActionToAssetId = new Map<Id, Id>();
for (QuoteAction qAction : [
SELECT Id, SourceAssetId
FROM QuoteAction
WHERE SourceAssetId != null
AND Id IN :quoteActionIds
]) {
quoteActionToAssetId.put(qAction.Id, qAction.SourceAssetId);
}
// Step 2: Get AssetActions
List<AssetAction> assetActions = [
SELECT Id, AssetId, ActionDate
FROM AssetAction
WHERE AssetId IN :quoteActionToAssetId.values()
];
// Step 3: Get latest AssetAction per Asset
Map<Id, AssetAction> assetIdToLatestAction = new Map<Id, AssetAction>();
for (AssetAction aAction : assetActions) {
AssetAction existing = assetIdToLatestAction.get(aAction.AssetId);
if (existing == null || aAction.ActionDate > existing.ActionDate) {
assetIdToLatestAction.put(aAction.AssetId, aAction);
}
}
// Step 4: Get related AssetActionSource records
Map<Id, Id> assetIdToActionId = new Map<Id, Id>();
for (Id assetId : assetIdToLatestAction.keySet()) {
assetIdToActionId.put(assetId, assetIdToLatestAction.get(assetId).Id);
}
List<AssetActionSource> assetActionSources = [
SELECT ConstraintEngineNodeStatus__c, AssetAction.AssetId
FROM AssetActionSource
WHERE AssetActionId IN :assetIdToActionId.values() ORDER BY CreatedDate DESC
];
// Step 5: Map AssetId → Status
Map<Id, String> assetIdToStatus = new Map<Id, String>();
for (AssetActionSource actionSource : assetActionSources) {
if (!assetIdToStatus.containsKey(actionSource.AssetAction.AssetId) &&
actionSource.ConstraintEngineNodeStatus__c != null) {
assetIdToStatus.put(
actionSource.AssetAction.AssetId,
actionSource.ConstraintEngineNodeStatus__c
);
}
}
List<QuoteLineItem> toUpdate = new List<QuoteLineItem>();
// Step 6: Set ConstraintEngineNodeStatus__c directly on Trigger.new records
for (QuoteLineItem qi : Trigger.new) {
if (qi.QuoteActionId != null && qi.ConstraintEngineNodeStatus__c == null) {
Id assetId = quoteActionToAssetId != null ? quoteActionToAssetId.get(qi.QuoteActionId) : null;
if (assetId != null && assetIdToStatus != null) {
String status = assetIdToStatus.get(assetId);
if (status != null) {
qi.ConstraintEngineNodeStatus__c = status;
}
}
}
}
}
}Verwenden Sie diesen Apex Code für das Objekt "Auftragsprodukt (OrderItem)".
trigger OrderItemTrigger on OrderItem (before insert) {
//collect orderActionIds
Set<Id> orderActionIds = new Set<Id>();
for (OrderItem oi : Trigger.new) {
if (oi.OrderActionId != null && oi.ConstraintEngineNodeStatus__c == null) {
orderActionIds.add(oi.OrderActionId);
}
}
if (!orderActionIds.isEmpty()) {
// Step 1: Get OrderAction → SourceAsset
Map<Id, Id> orderActionToAssetId = new Map<Id, Id>();
for (OrderAction oAction : [
SELECT Id, SourceAssetId
FROM OrderAction
WHERE SourceAssetId != null
AND Id IN :orderActionIds
]) {
orderActionToAssetId.put(oAction.Id, oAction.SourceAssetId);
}
// Step 2: Get AssetActions
List<AssetAction> assetActions = [
SELECT Id, AssetId, ActionDate
FROM AssetAction
WHERE AssetId IN :orderActionToAssetId.values()
];
// Step 3: Get latest AssetAction per Asset
Map<Id, AssetAction> assetIdToLatestAction = new Map<Id, AssetAction>();
for (AssetAction aAction : assetActions) {
AssetAction existing = assetIdToLatestAction.get(aAction.AssetId);
if (existing == null || aAction.ActionDate > existing.ActionDate) {
assetIdToLatestAction.put(aAction.AssetId, aAction);
}
}
// Step 4: Get related AssetActionSource records
Map<Id, Id> assetIdToActionId = new Map<Id, Id>();
for (Id assetId : assetIdToLatestAction.keySet()) {
assetIdToActionId.put(assetId, assetIdToLatestAction.get(assetId).Id);
}
List<AssetActionSource> assetActionSources = [
SELECT ConstraintEngineNodeStatus__c, AssetAction.AssetId
FROM AssetActionSource
WHERE AssetActionId IN :assetIdToActionId.values() ORDER BY CreatedDate DESC
];
// Step 5: Map AssetId → Status
Map<Id, String> assetIdToStatus = new Map<Id, String>();
for (AssetActionSource actionSource : assetActionSources) {
if (!assetIdToStatus.containsKey(actionSource.AssetAction.AssetId) &&
actionSource.ConstraintEngineNodeStatus__c != null) {
assetIdToStatus.put(
actionSource.AssetAction.AssetId,
actionSource.ConstraintEngineNodeStatus__c
);
}
}
List<OrderItem> toUpdate = new List<OrderItem>();
// Step 6: Set ConstraintEngineNodeStatus__c directly on Trigger.new records
for (OrderItem oi : Trigger.new) {
if (oi.OrderActionId != null && oi.ConstraintEngineNodeStatus__c == null) {
Id assetId = orderActionToAssetId != null ? orderActionToAssetId.get(oi.OrderActionId) : null;
if (assetId != null && assetIdToStatus != null) {
String status = assetIdToStatus.get(assetId);
if (status != null) {
oi.ConstraintEngineNodeStatus__c = status;
}
}
}
}
}
}
Siehe Definieren von Apex Auslösern.
Nachdem Sie die Apex-Auslöser definiert haben, richten Sie das Modul für Einschränkungsregeln ein.
