Query: OData WebService Filter auf Dataitem wie Inner Join?

24. April 2023 18:04

Query + Odata (unter Web Services einrichtbar) schien mir ein schöner, performanter Weg zu sein, um mit einem Partner Daten auszutauschen.

Allerdings habe ich jetzt die Herausforderung, dass ich ein untergeordnetes DataItem verlinke und von diesem möchte ich nur Werte haben, wenn ein bestimmtes Filterkriterium erfüllt ist

So sieht die Query als Textexport aus:

Code:
OBJECT Query 50000 Query Test
{
  OBJECT-PROPERTIES
  {
    Date=24.04.23;
    Time=16:30:41;
    Modified=Yes;
    Version List=;
  }
  PROPERTIES
  {
  }
  ELEMENTS
  {
    { 50000;   ;DataItem;                    ;
               DataItemTable=Table50000 }

    { 50001;1  ;Column  ;                    ;
               DataSource=No. }

    { 50002;1  ;Column  ;                    ;
               DataSource=Amount (FCY) }

    { 50003;1  ;Column  ;                    ;
               DataSource=Remaining Amount (FCY) }

    { 50004;1  ;Column  ;                    ;
               DataSource=Open }

    { 50005;1  ;Column  ;                    ;
               DataSource=Customer No. }

    { 50006;1  ;Column  ;                    ;
               DataSource=Insert Date }

    { 50007;1  ;Column  ;                    ;
               DataSource=Stamped by No. }

    { 50008;1  ;Column  ;                    ;
               DataSource=Reason Code }

    { 50009;1  ;DataItem;                    ;
               DataItemTable=Table50001;
               DataItemTableFilter=Entry Type=FILTER(<>Initial Entry);
               DataItemLink=Header Entry No.=My_Table."Entry No." }

    { 50010;2  ;Column  ;                    ;
               DataSource=Entry No. }

    { 50011;2  ;Column  ;                    ;
               ColumnFilter=Entry_Type=FILTER(<>Initial Entry);
               DataSource=Entry Type }

  }
  CODE
  {

    BEGIN
    END.
  }
}


Da sind jetzt ColumnFilter und DataItemTableFilter drin. Ich hatte beides unabhängig voneinander ausprobiert und es führt jeweils dazu, dass ich gar kein Ergebnis mehr bekomme in einer Konstellation, bei der es keinen Datensatz in Tabelle 50001 gibt, bei dem der Entry Type nicht Initial Entry ist.
Ich hätte gerne in so einem Fall einfach gerne 0 als Entry No. und die Kopfdaten von Tabelle 50000. Weiß jemand, ob das in einer Query geht?

Ich verstehe nicht richtig, warum sich die Query so verhält. Bei folgender SQL Query bekomme ich eine No_ (und in [Entry No_] von T2 steht halt "NULL") und nicht einfach gar keinen Wert als hätte ich einen Inner Join gemacht:
Code:
SELECT TOP 1
   T1.[No_]
   ,T2.[Entry No_]
FROM [Table50000] AS T1
   LEFT JOIN [Table50001] AS T2
      ON T2.[Header Entry No_] = T1.[Entry No_]
         AND T2.[Entry Type] <> 1
WHERE T1.[Entry No_] = 123


Ich hatte noch überlegt, ob es am DataItemLinkType hängen könnte, aber "Use Default Values if No Match" klingt doch eigentlich auch schon richtig und nicht nach Inner Join?

Ansonsten ist das, was ich eigentlich möchte, basierend auf Feldern in diesen Tabellen einen Status (fixe Textwerte) zu übergeben. Das kann ich mit einer Query aber nicht dynamisch abbilden; dazu müssten diese Werte in der Tabelle stehen, richtig? Ich gehe davon aus, dass der Partner damit umgehen kann.

Edit: ich hatte jetzt noch rausgefunden, dass sowohl ColumnFilter als auch DataItemTableFilter wie ein Where wirken und das SQL-Äquivalent somit so wäre:
Code:
SELECT TOP 1
   T1.[No_]
   ,T2.[Entry No_]
FROM [Table50000] AS T1
   LEFT JOIN [Table50001] AS T2
      ON T2.[Header Entry No_] = T1.[Entry No_]
WHERE T1.[Entry No_] = 123
        AND T2.[Entry Type] <> 1


Ich müsste den Filter auf Entry Type <> 1 also irgendwie im DataItemLink verankern? Da gibt es aber denke ich keine Möglichkeit?