Benutzer-Werkzeuge

Webseiten-Werkzeuge


engine:procedures:im_modifyconditionparts_ad

im_ModifyConditionParts_Ad

Prozedur zum Bearbeiten von (Artikel-)Bedingungs-Teilen.

Ein Bedingungs-Teil ist Bestandteil einer sogenannten Artikel-Bedingung, deren Aufbau kurz beschrieben so aussieht :

Eine Artikel-Bedingung besteht aus Bedingungs-Gruppen, die jeweils aus Bedingungs-Teilen bestehen, die ihrerseits immer drei Bedingungs-Arten (Hierarchie-Bedingung, Vorgänger-Bedingung und Eigenschafts-Bedingung) definieren.

Im folgenden werden die Bestandteile einzeln erläutert. Beginnen wir mit der „kleinsten Einheit“ :

1.) Ein sogenannter Bedingungs-Teil („ItemConditionPart“) definiert drei Bedingungs-Arten :

a) Hierarchie-Bedingung („LevelIDs“)

Diese besteht aus einer Menge von Hierarchien („LevelIDs“), wobei es auch möglich ist, den Wert „,,“ zu definieren, der für „beliebige Hierarchie“ steht.

b) Vorgänger-Bedingung („DomainTreeNodeIDs“)

Dabei handelt es sich um eine Menge von Vorgänger-IDs („TreeNodeIDs“), wobei es auch möglich ist, den Wert „,,“ zu definieren, der „beliebiger Vorgänger“ bedeutet.

c) Eigenschafts-Bedingung

Sie ist immer zu einem Merkmal („NodeCharacteristicID“) definiert und besteht aus einem „Operator1“ und der dazugehörigen „Condition1“, sowie optional aus einem weiteren „Operator2“ und der dazugehörigen „Condition2“. Dazu können Optionen hinsichtlich Vererbung und rekursiver Auswertung bei der Ermittlung der Eigenschaft definiert werden.
Es ist auch möglich, den Wert „-1“ als Merkmal („NodeCharacteristicID“) zu definieren, was den speziellen Fall „KEINE Eigenschafts-Bedingung“ darstellen soll.

Ein Artikel-Element erfüllt einen Bedingungs-Teil genau dann, wenn alle drei Bedingungs-Arten erfüllt sind. Der spezielle (in einer Standard-Installation bereits definierte) Teil …

  • „beliebige Hierarchie“ und
  • „beliebiger Vorgänger“ und
  • „KEINE Eigenschafts-Bedingung“

wird von jedem (nicht gelöschten) Artikel-Element erfüllt.

Hinweis : Der „Active“-Status eines Elementes spielt grundsätzlich keine Rolle !

2.) Durch eine logische Verknüpfung entweder mit „AND“ oder „OR“ von solchen Bedingungs-Teilen ergibt sich eine sogenannte Bedingungs-Gruppe („ItemConditionGroup“).
Artikel-Elemente erfüllen also eine solche Bedingungs-Gruppe, wenn sie entweder alle (bei „AND“) oder mindestens einen (bei „OR“) ihrer Bedingungs-Teile erfüllen.

3.) Mehrere solcher Gruppen können dann ihrerseits wiederum entweder mit „AND“ oder „OR“ verknüpft werden und bilden letztlich eine Artikel-Bedingung.
Artikel-Elemente erfüllen also eine solche (Gesamt-)Artikel-Bedingung, wenn sie entweder alle (bei „AND“) oder mindestens eine (bei „OR“) ihrer Bedingungs-Gruppen erfüllen.

Somit lassen sich einfache und komplexe Bedingungen formulieren. Beispiele :

1.) „Artikel-Elemente der Kategorie X oder Y der Marke Z“
⇒ Dies ließe sich mit einem Bedingungs-Teil …
„Beliebige Hierarchie UND X,Y als DomainTreeNodeIDs UND Eigenschaft Z zum Merkmal Marke“
… abbilden, der als einziger Teil einer Bedingungs-Gruppe angehören würde, die ihrerseits alleine dann schon die gesamte Bedingung darstellt.

2.) „Rot gefärbte Produkte der Marke X oder blau gefärbte Produkte in Kategorie A der Marke Y“
⇒ Dieses etwas kompliziertere Beispiel läßt sich beispielsweise wie folgt mit vier Bedingungs-Teilen und zwei -Gruppen abbilden :
Die beiden Teile …

  • „Produkt-Hierarchie UND beliebiger Vorgänger UND Eigenschaft rot zum Merkmal Farbe“

und

  • „Produkt-Hierarchie UND beliebiger Vorgänger UND Eigenschaft X zum Merkmal Marke“

… werden mit „AND“ zu einer Gruppe „1“ verknüpft.
Außerdem verknüpft man die beiden Teile …

  • „Produkt-Hierarchie UND A als DomainTreeNodeID UND Eigenschaft blau zum Merkmal Farbe“

und

  • „Produkt-Hierarchie UND A als DomainTreeNodeID UND Eigenschaft Y zum Merkmal Marke“

… wiederum mit „AND“ zu einer Gruppe „2“.
Durch eine „OR“-Verknüpfung der beiden Gruppen ist dann schließlich die gesamte Bedingung definiert.
Anmerkung : Es gibt oftmals mehrere Möglichkeiten der Abbildung, da gerade z.B. die Hierarchie-Bedingung bei einer Verknüpfung zweier Bedinungs-Teile mit „UND“ nur bei einer der Teile definiert werden muß - in unserem obigen Beispiel 2 haben wir die Hierarchie hingegen bei ALLEN Bedingungs-Teilen definiert.

Hinweise :

1.) Das einzige, was an einem bestehenden Bedingungs-Teil, der bereits VERWENDET wird, geändert werden kann, ist die „ConditionPartDescription“ (→ Parameter „ConditionPartDescription“) !

2.) Löschen ist nur möglich, wenn der Bedingungs-Teil nicht verwendet wird.

Anmerkungen zu den Parametern „Operator1“, „Condition1“, „Operator2“, „Condition2“, „InheritDepth“ und „RecursiveEvaluation“, die die „Eigenschafts-Bedingung“ definieren :

Grundsätzlich besteht eine „Eigenschafts-Bedingung“ aus einem „Operator1“ und der dazugehörigen „Condition1“, sowie optional aus einem weiteren „Operator2“ und der dazugehörigen „Condition2“ (→ gleichnamige Parameter). Folgende Möglichkeiten für „Operator1“ gibt es :

  • „=“
  • „!=“ / „<>“ → Diese beiden Operatoren sind grundsätzlich identisch und bedeuten „ungleich“.
  • „~“ / „!~“ → Es wird der „LIKE“-Operator („~“) angewandt bzw. mit „NOT LIKE“ („!~“) ausgewertet, die üblichen wildcards (s. ASE-Doku) können also in „Condition1“ verwendet werden
  • „>“
  • „<“
  • „>=“
  • „⇐“
  • „IN“ / „!I“ → „Condition1“ muß eine „¶“-separierte Liste von „Value“-Werten (aus „NodeCharacteristicValues“) enthalten, wobei „¶“ auch am Anfang und am Ende vorkommen muß. Man definiert auf diese Weise eine Menge von erlaubten („IN“) bzw. NICHT erlaubten („!I“) Eigenschaften. Wenn ein anderes Trennzeichen als „¶“ gewünscht ist, gibt man dieses in „Operator2“ an.
  • „E“ / „!E“ → „E“ steht für den „Existenz-Operator“ und bedeutet, daß IRGENDEINE („E“) bzw. KEINE („!E“) Eigenschaft da sein muß bzw. darf. „Condition1“ wird nicht beachtet, also so behandelt, als ob „NULL“ übergeben wurde.

Wenn „Operator2“ etwas enthält, dann muß es eines der folgenden Zeichen sein (Ausnahme bei „IN“ bzw. „!I“ s.o.) :

  • „<“
  • „⇐“

Außerdem muß in einem solchen Fall „Operator1“ dann etweder „>“ oder „>=“ enthalten !

Bei Vergleichs-Operatoren wird immer der „Basis-Feldtyp“ beachtet, also wird z.B. bei einer „>“-Bedingung in einem Merkmal, das Zahl-Eigenschaften besitzt, versucht, den Wert in „Condition1“ bzw. „Condition2“ in ein „decimal(30,10)“ zu konvertieren.

Zur Ermittlung der Eigenschaft (um dann gegen die Bedingung zu prüfen) gibt es noch weitere Optionen, die mit „InheritDepth“ und „RecursiveEvaluation“ gesetzt werden. Wenn eine Eigenschafts-Bedingung definiert ist („NodeCharacteristicID“ also NICHT „-1“ ist), MUSS auch ein Wert für diese Optionen gewählt werden !

Mit „InheritDepth“ hat man die Möglichkeit, GEERBTE Eigenschaften zuzulassen oder nicht :

  • -1 : geerbte Eigenschaften zulassen
  • 0 : keine geerbten Eigenschaften erlauben
  • 1 : nur einfach geerbte Eigenschaften erlauben
  • 2 : nur einfach oder zweifach geerbte Eigenschaften erlauben

usw.

Mit „RecursiveEvaluation“ kann man die Auswertung für sogenannte „rekursive“ Merkmale steuern (genaueres ist der Dokumentation zum gleichnamigen Parameter der Prozedur im_GetNodeProperties entnehmen) :

  • 0 : Es wird die Eigenschaft selbst (also eine Merkmal-ID) verwendet
  • 1 : Die Eigenschaft wird rekursiv ausgewertet
  • 2 : Es wird die zugehörige Beschreibung („CharacteristicDescription“) der Eigenschaft (also der Merkmal-ID) gewählt

Die Parameter („Operator1“, „Condition1“, „Operator2“, „Condition2“, „InheritDepth“ und „RecursiveEvaluation“) MÜSSEN ALLE „NULL“ sein, falls „-1“ für „NodeCharacteristicID“ übergeben wurde !

HTTP-MethodPOST
HTTP-AuthOptional
Tags
Engine-Kategorieitem management
Engine-TypDaten-Änderung
Letzte Aktualisierung7.0.7 (2015-01-29)

Parameter

ConditionPartDescription Bezeichnung des (Artikel-)Bedingungs-Teils „ConditionPartID“ (muß immer vorhanden sein, „NULL“ ist nicht erlaubt)
varchar(255)6.0.0
LevelIDs',,' Durch „,“ getrennte IDs von Hierarchiestufen („,“ muß auch am Anfang und am Ende sein !). Definiert die möglichen Hierarchien, denen die Artikel-Elemente angehören müssen, um die Bedingung zu erfüllen. Besonderheit : „,,“ bedeutet „KEINE Einschränkung“.
varchar(255)6.0.0
DomainTreeNodeIDs',0,' Durch „,“ getrennte IDs von Elementen im Artikel-Baum („,“ muß auch am Anfang und am Ende sein !). Definiert die möglichen Vorgänger, die Artikel-Elemente haben müssen, um die Bedingung zu erfüllen. Besonderheit : „,,“ bedeutet „KEINE Einschränkung“.
varchar(200)6.0.0
NodeCharacteristicID-1 Entweder „-1“ (⇒ Artikel-Elemente müssen KEINE Eigenschafts-Bedingung erfüllen) oder die ID des Artikel-Merkmals zu dem die Elemente eine Eigenschaft besitzen müssen, die der durch die restlichen Einstellungen definierten Bedingung entsprechen.
smallint6.0.0
Operator1NULL Operator für die Bedingung „Condition1“. Mögliche Werte :
- „=„
- “!=“ / „<>“
- „~“ / „!~“ (LIKE / NOT LIKE)
- „>„
- “<„
- “>=„
- “⇐„
- „IN“ / “!I“ (in / NICHT in Menge von „Value“-Werten)
- „E“ / „!E“ (IRGENDEINE / KEINE Eigenschaft)
varchar(2)6.0.0
Condition1NULL Bedingung, die in Verbindung mit „Operator1“ anzuwenden ist („NULL“, falls „Operator1“ den Wert „E“ oder „!E“ hat)
varchar(2000)6.0.0
Operator2NULL Operator für die Bedingung „Condition2“. Mögliche Werte :
- „<“ oder „⇐“, falls „Operator1“ „>“ oder „>=“ enthält
- bel. Zeichen (Trennzeichen für Werte-Menge), falls „Operator1“ „IN“ oder „!I“ enthält
varchar(2)6.0.0
Condition2NULL Bedingung, die in Verbindung mit „Operator2“ anzuwenden ist (nur belegt, wenn „Operator2“ den Wert „<“ oder „⇐“ enthält)
varchar(1000)6.0.0
InheritDepthNULL Welche Eigenschaften zu „NodeCharacteristicID“ hinsichtlich Vererbung sollen bei Prüfung der Eigenschafts-Bedingung beachtet werden :
„-1“ : Alle
„0“ : unvererbte
„1“ : direkte u. einfach geerbte
„2“ : direkte u. einfach oder zweifach geerbte
usw.
smallint6.0.0
RecursiveEvaluationNULL Was soll zwecks Prüfung der Bedingung zu „NodeCharacteristicID“ (wenn rekursiv) gewählt werden ?
„0“ : direkte Eigenschaft (also eine Merkmal-ID)
„1“ : rekursiv ausgewertete Eigenschaft
„2“ : zugehör. Beschreibung der Eigenschaft (also der Merkmal-ID)
tinyint6.0.0
DeleteConditionPart0 Wird nur beachtet, wenn „ConditionPartID“ angegeben ist ! Entscheidet, ob die bestehende „ConditionPartID“ geändert („0“) oder gelöscht („1“) wird (s. Beschreibung !)
bit6.0.0
Country'german' Gibt an, in welchem Format „Condition1“ bzw. „Condition2“ ist, falls zu „NodeCharacteristicID“ nur Datums-Angaben erlaubt sind (Groß-/Kleinschreibung wird nicht beachtet) :
'german', 'germany' : Tag-Monat-Jahr
'english', 'england' : Monat-Tag-Jahr
varchar(10)6.0.0

Rückgabe

Die Prozedur hat keine Rückgaben.

Output-Parameter

ConditionPartIDID eine (Artikel-)Bedingungs-Teils. „NULL“ angeben, um einen neuen Teil anzulegen (die neue ID wird dann über diesen Parameter zurückgegeben). Sonst wird ein bestehender Teil je nach „DeleteConditionPart“ geändert oder gelöscht.
ConditionPartIDWithSameConfigDie Neu-Anlage oder Änderung schlägt fehl (Fehler „-141“), wenn es dazu kommt, daß zwei Bedingungs-Teile mit denselben Einstellungen existieren. In diesem Fall findet man hier die ID des Teils, der bereits mit den Einstellungen vorhanden ist.

Mögliche Return-Codes

Code Beschreibung Quelle 1)
-569Der Benutzer hat kein Ausführungsrecht für die Prozedurnur indirekt
-567Die Prozedur darf z. Zt. nicht ausgeführt werdennur indirekt
-566Die Prozedur darf mit den übergebenen Parametern nicht ausgeführt werdennur indirekt
-535Das Datum liegt nicht in der Vergangenheitnur indirekt
-530Der Wert ist nicht konvertierbarnur indirekt
-510Der Benutzer ist nicht registriertnur indirekt
-504Es ist ein Problem aufgetreten, das nicht gelöst werden kann, Prozedur wird daher abgebrochennur indirekt
-502Die Parameter-Werte der Prozedur können nicht verarbeitet werden (kein passendes Trennzeichen)nur indirekt
-500Falsche Parameterdirekt und indirekt
-141Es existiert bereits ein Bedingungs-Teil mit denselben Einstellungennur direkt
-140Der Bedingungs-Teil darf nicht mehr geändert/gelöscht werden, da er bereits verwendet wirdnur direkt

XML-Schema

Die Rückgabe erfolgt als XML-Dokument welches gegen das Schema Response/EngineProcedure_v1_0.xsd validiert.

Historie

7.0.7 2015-01-29Interne Änderung : Datentyp-Erweiterung des „ReferenceKey“ [für „_mi_StartProcedure“-Aufruf]
7.0.5 2014-05-26Parameter „Condition1“ und „Condition2“ auf „varchar[2000]“ bzw. „varchar[1000]“ erweitert
6.5.3 2013-03-18Anpassungen an aktuellen Code-Standard, u.a. wg. UTF8-Unterstützung
6.0.7 2012-05-081. Ab jetzt wird auch beachtet, ob der Aufruf dieser Prozedur innerhalb einer Transaktion stattfindet
2. Kleine interne Änderung : Statt mehrfach in eine Tabelle einzufügen „UNION ALL“-Technik verwendet
6.0.0 2010-03-26Erstmalig in dieser Version erstellt

Code-Snippets

Engine Playground

Der folgende Link öffnet in einem separaten Fenster den Engine Playground der fest mit dem dbap-demo System verbunden ist:

cURL

Unformatierte Ausgabe:

curl -X POST  'http://<partner>-<project>.dstore.de/default/engine/im_ModifyConditionParts_Ad?ConditionPartDescription=<value>'

Mit xmllint 2) formatierte Ausgabe:

curl -X POST  'http://<partner>-<project>.dstore.de/default/engine/im_ModifyConditionParts_Ad?ConditionPartDescription=<value>' | xmllint --format -
dStore_php
use dStore_php\WebService;
 
$service = new WebService\Service( WebService\Scheme::HTTP,'<partner>-<project>.dstore.de', 80);
 
$request = new WebService\Requests\Engine\Procedure\Request(
			new WebService\Requests\AccessData('default'),
	'im_ModifyConditionParts_Ad',
		array(
			'ConditionPartDescription' => '<value>',
			// 'LevelIDs' => ',,',
			// 'DomainTreeNodeIDs' => ',0,',
			// 'NodeCharacteristicID' => -1,
			// 'Operator1' => NULL,
			// 'Condition1' => NULL,
			// 'Operator2' => NULL,
			// 'Condition2' => NULL,
			// 'InheritDepth' => NULL,
			// 'RecursiveEvaluation' => NULL,
			// 'DeleteConditionPart' => 0,
			// 'Country' => 'german'
		)
);
 
$service->execute($request);
 
			$xml_result = $request->getResponse()->getBody()->toSimpleXmlDocument();
			$ResultSet = $xml_result->getRowsAsArray();
 
$OutputParams = $xml_result->getOutputParametersAsArray();
engine/execute

XML zur Ausführung mit der Methode engine/execute, z.B. per

curl --header 'Content-Type: application/xml' -X POST 'http://<partner>-<kunde>.dstore.de/default/engine/execute' -d '<xml-daten>'
<?xml version="1.0" encoding="UTF-8"?>
<ListOfBatches>
	<Batch No="0">
		<Procedure Name="im_ModifyConditionParts_Ad">
			<Parameters>
				<Parameter Name="ConditionPartDescription"><!-- varchar value --></Parameter>
				<!-- <Parameter Name="LevelIDs">',,'</Parameter> -->
				<!-- <Parameter Name="DomainTreeNodeIDs">',0,'</Parameter> -->
				<!-- <Parameter Name="NodeCharacteristicID">-1</Parameter> -->
				<!-- <Parameter Name="Operator1">NULL</Parameter> -->
				<!-- <Parameter Name="Condition1">NULL</Parameter> -->
				<!-- <Parameter Name="Operator2">NULL</Parameter> -->
				<!-- <Parameter Name="Condition2">NULL</Parameter> -->
				<!-- <Parameter Name="InheritDepth">NULL</Parameter> -->
				<!-- <Parameter Name="RecursiveEvaluation">NULL</Parameter> -->
				<!-- <Parameter Name="DeleteConditionPart">0</Parameter> -->
				<!-- <Parameter Name="Country">'german'</Parameter> -->
			</Parameters>
		</Procedure>
	</Batch>
</ListOfBatches>
1)
direkt meint „von der Prozedur selber“ und indirekt meint „von intern aufgerufenen Unterprozeduren“
2)
I.d.R. auf Unix-artigen Systemen bereits installiert, Bestandteil der libxml2, siehe http://www.xmlsoft.org
engine/procedures/im_modifyconditionparts_ad.txt · Zuletzt geändert: 11.01.2016 (Externe Bearbeitung)