pixiItemGetByTags
Liefert Artikel, deren zugeordnete Tags einem XML-Tagfilter mit AND-, OR- und NOT-Gruppen entsprechen; Tags werden per ID oder (Teil-)Name bestimmt.
Sucht Artikel anhand der ihnen zugeordneten Tags (Tabelle TagMatch).
1. Filter einlesen
TagFilter ist ein XML-Dokument mit dem Wurzelelement TagFilter und den Gruppen AND, OR und NOT. Jede Gruppe kann beliebig viele TagId- und TagName-Elemente enthalten. Namen werden getrimmt; leere Namen gelten als fehlend.
2. Tags auflösen
Jeder Eintrag wird gegen Tags mit TypeId = 1 aufgelöst:
TagIdwird mit der Tag-ID verglichen.TagNamewird beiPartialTagNameMatch = 0exakt verglichen, beiPartialTagNameMatch = 1perLIKE '%name%'. Ein Teilname kann mehrere Tags treffen.
3. Prüfung
Der Aufruf bricht mit einer Status-Ergebnismenge ab und liefert keine Artikel, wenn:
- ein Eintrag keinem Tag zugeordnet werden kann oder
- dasselbe Tag mehrfach aufgelöst wird. Das gilt gruppenübergreifend, innerhalb einer Gruppe und wenn ein Tag sowohl per ID als auch per Name angegeben ist.
Dann wird je Filtereintrag eine Zeile geliefert:
- Fehlerhafte Einträge erhalten
Status = ERROR. - Gültige Einträge erhalten
OKmitComplete match on TagName,Partial match on TagNameoderComplete match on TagId.
4. Artikelauswahl
Berücksichtigt werden nur Artikel, denen in TagMatch mindestens ein Tag zugeordnet ist. Ein Artikel wird geliefert, wenn er keines der NOT-Tags hat und mindestens eine der folgenden Bedingungen gilt:
- es wurden weder AND- noch OR-Tags angegeben (nur NOT oder leerer Filter);
- er hat alle AND-Tags. Bei
StrictANDCondition = 1darf er zusätzlich keine weiteren Tags haben; seine Tag-Menge muss also genau der AND-Menge entsprechen; - er hat mindestens ein OR-Tag.
AND und OR werden mit ODER verknüpft. OR-Tags erweitern das Ergebnis also, statt es einzuschränken.
Das Ergebnis enthält ItemId, ItemNrInt und ItemName. Die Zeilen sind eindeutig und nicht sortiert.
Hinweise
- Alle Tabellen werden mit
NOLOCKgelesen; nicht festgeschriebene Daten sind möglich. - Die Umwandlung von
TagFilterin XML erfolgt vor der Fehlerbehandlung. Ungültiges XML führt daher zu einem SQL-Fehler (SqlMessage) statt zu einer Statuszeile. - Ein nicht numerischer
TagId-Wert verursacht einen Konvertierungsfehler innerhalb der Fehlerbehandlung. Ergebnis ist die einzelne StatuszeileUnexpected error occured while parsing the @TagFilter parameter. - Das Verhalten bei
TagFilter = NULList im Code nicht explizit behandelt. - Im Filter sind nur Tags mit
TypeId = 1verwendbar. - Die strikte AND-Prüfung berücksichtigt alle dem Artikel in
TagMatchzugeordneten Tags, unabhängig vom Typ. - Nach einer Status-Ergebnismenge liefert die Prozedur den Rückgabewert 1. Statuszeilen und Artikelzeilen kommen nie im selben Aufruf vor; beide erscheinen als
SqlRowSet1. Zur Unterscheidung auf eine SpalteStatusprüfen. - Bei
PartialTagNameMatch = 1kann ein kurzer Name mehrere Tags treffen. Er überschneidet sich dann leicht mit anderen Einträgen und löstTag used in another operationaus.
Parameter
| Parameter | Typ | Standardwert | Beschreibung |
|---|---|---|---|
TagFilter
Pflicht
|
varchar(max) xml |
– |
XML-Filter mit Wurzel Beispiel:
|
PartialTagNameMatch
|
bit boolean |
0 |
Steuert, wie Erlaubte Werte
Beispiel: |
StrictANDCondition
|
bit boolean |
0 |
Steuert, wie streng die AND-Gruppe auf die Tags eines Artikels angewendet wird. Erlaubte Werte
Beispiel: |
Antwort
Result-Set 1 · Bei Erfolg (Filter vollständig aufgelöst, keine doppelten Tags)
Eindeutige Artikel, die dem Tagfilter entsprechen, unsortiert.
| Spalte | Typ | Beschreibung |
|---|---|---|
ItemId
|
int |
Artikelschlüssel ( |
ItemNrInt
Kann leer sein |
string |
Interne Artikelnummer. |
ItemName
Kann leer sein |
string |
Artikelbezeichnung. |
Result-Set 2 · Anstelle der Artikelliste, wenn ein Filtereintrag nicht gefunden wird, ein Tag mehrfach aufgelöst wird oder das Einlesen fehlschlägt
Eine Statuszeile je Filtereintrag mit dem Auflösungsergebnis. Bei einem unerwarteten Fehler eine einzelne Zeile, in der alle Spalten außer Status und StatusMessage NULL sind.
| Spalte | Typ | Beschreibung |
|---|---|---|
Operation
Kann leer sein |
varchar(3) string |
Filtergruppe: |
XMLTagId
Kann leer sein |
nvarchar(1024) string |
|
XMLTagName
Kann leer sein |
nvarchar(1024) string |
|
TagId
Kann leer sein |
int |
Aufgelöste Tag-ID; NULL, wenn nicht gefunden. |
TagName
Kann leer sein |
varchar(50) string |
Aufgelöster Tag-Name; NULL, wenn nicht gefunden. |
Status
|
varchar(10) string |
|
StatusMessage
|
varchar(255) string |
Erläuterung des Status, z. B. |
Beispielantwort
<SqlRowSet1>
<row>
<ItemId>4711</ItemId>
<ItemNrInt>ART-10023</ItemNrInt>
<ItemName>Garden chair teak</ItemName>
</row>
<row>
<ItemId>4712</ItemId>
<ItemNrInt>ART-10024</ItemNrInt>
<ItemName>Garden table teak</ItemName>
</row>
</SqlRowSet1>
Fehlermeldungen
| Status | Meldung | Ursache |
|---|---|---|
| ERROR | TagId or TagName not found | Ein `TagId`- oder `TagName`-Eintrag trifft kein Tag mit `TypeId = 1` oder ein Name ist leer. Vorhandene Tag-IDs oder -Namen verwenden. |
| ERROR | Tag used in another operation | Dasselbe Tag wird von mehreren Filtereinträgen aufgelöst: in verschiedenen Gruppen, doppelt in einer Gruppe, per ID und Name oder über überlappende Teilnamen. Jedes Tag darf im gesamten Filter nur einmal vorkommen. |
| ERROR | Insufficient data to identify Error | Ein aufgelöster Eintrag konnte beim Aufbau der Statusliste nach einem anderen Fehler nicht eingeordnet werden. Die übrigen Statuszeilen prüfen. |
| ERROR | Unexpected error occured while parsing the @TagFilter parameter | Beliebiger Fehler beim XML-Verarbeiten oder Auflösen der Tags, z. B. ein nicht numerischer `TagId`-Wert. Numerische Tag-IDs und eine gültige Struktur senden. |
Beispiele
POST https://apigateway.descartes.com/tms/pixi/
Content-Type: text/xml; charset=utf-8
Authorization: Basic BASE64(USERNAME:PASSWORD)
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://apigateway.descartes.com/tms/pixi/">
<SOAP-ENV:Body>
<ns1:pixiItemGetByTags>
<TagFilter><![CDATA[<TagFilter><AND><TagId>12</TagId><TagName>Summer</TagName></AND><OR><TagId>15</TagId><TagName>New</TagName></OR><NOT><TagId>20</TagId><TagName>Discontinued</TagName></NOT></TagFilter>]]></TagFilter>
<!-- <PartialTagNameMatch>0</PartialTagNameMatch> -->
<!-- <StrictANDCondition>0</StrictANDCondition> -->
</ns1:pixiItemGetByTags>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
curl -X POST 'https://apigateway.descartes.com/tms/pixi/' \
--user 'USERNAME:PASSWORD' \
--header 'Content-Type: text/xml; charset=utf-8' \
--data-binary @- <<'XML'
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://apigateway.descartes.com/tms/pixi/">
<SOAP-ENV:Body>
<ns1:pixiItemGetByTags>
<TagFilter><![CDATA[<TagFilter><AND><TagId>12</TagId><TagName>Summer</TagName></AND><OR><TagId>15</TagId><TagName>New</TagName></OR><NOT><TagId>20</TagId><TagName>Discontinued</TagName></NOT></TagFilter>]]></TagFilter>
<!-- <PartialTagNameMatch>0</PartialTagNameMatch> -->
<!-- <StrictANDCondition>0</StrictANDCondition> -->
</ns1:pixiItemGetByTags>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
XML
<?php
$soapClient = new SoapClient(null, [
'login' => 'USERNAME',
'password' => 'PASSWORD',
'location' => 'https://apigateway.descartes.com/tms/pixi/',
'uri' => 'https://apigateway.descartes.com/tms/pixi/',
]);
$arguments = [
'TagFilter' => '<TagFilter><AND><TagId>12</TagId><TagName>Summer</TagName></AND><OR><TagId>15</TagId><TagName>New</TagName></OR><NOT><TagId>20</TagId><TagName>Discontinued</TagName></NOT></TagFilter>',
// 'PartialTagNameMatch' => '0',
// 'StrictANDCondition' => '0',
];
$soapArguments = [];
foreach ($arguments as $name => $value) {
$soapArguments[] = new SoapVar($value, XSD_STRING, '', '', $name);
}
$response = $soapClient->__soapCall('pixiItemGetByTags', $soapArguments);
Verwendete Tabellen
- SQL-Objekt:
- dbo.pipiItemGetByTags