Ermitteln eines Recs abhängig einer Menge

22. Februar 2016 14:37

Hallo Forum,

für folgende Aufgabenstellung suche ich eine Lösung:
Ich möchte eine Liste anzeigen, basieren auf Tabelle 1. Es sollen aber nur Recs angezeigt werden, die nicht in Tabelle 2 enthalten sind.
Ich entwickel schon seit ca. 5 jahren für NAV, habe mich aber noch nie mit den Querys auseinandergesetzt. beispiele habe ich schon gefunden, aber leider keins, das mir bei meiner Aufgabe helfen könnte.

Das SQL-Statement würde in etwa so aussehen:

SELECT * FROM Tabelle 1
WHERE irgendein filter...
AND Tabelle1.No. NOT IN (SELECT Tabelle2.DocNo. FROM Tabelle2)

Tabelle 1 hat als Primätschlüssel das Feld No., Tabelle 2 FileNo. und DocNo. Das kann man so ähnlich sehen wie SalesHeader und SalesLine. (Als wolle ich mir alle Artikel anzeigen lassen, die noch niergendwo als Zeile existiert)
Vielleicht gibt es auch einen anderen Weg das zu realisieren, da bin ich aber noch am ausprobieren.

ich hoffe mein Beitrag ist verständlich und dass mir jemand helfen kann ;)

Re: Ermitteln eines Recs abhängig einer Menge

22. Februar 2016 15:22

Hallo,

die einfachste Lösung ist ein FlowField in Tabelle 1, das mit einem (Not) Exist das Vorhandensein eines Datensatzes in Tabelle 2 prüft.

Dieses Flowfield kannst du dann in Tabelle 1 passend filtern und hast dein Ergebnis :wink:

Gruß Fiddi

Re: Ermitteln eines Recs abhängig einer Menge

22. Februar 2016 15:59

Hallo Fiddi,

viele Dank für deine Antwort. Auf sowas einfaches bin ich natürlich nicht gekommen. Nichts desto trotz bin ich weiterhin an einer Lösung über Query's interessiert. Die Programmierung ist für meine Bachelor-Arbeit und eine Lösung über eine SQL-über-Query ist vermutlich "schöner" ;) Aber sollte ich das auf Biegen und Brechen nicht hinbekommen, werd ich wohl auf die Lösung über FlowField ausweichen..

Re: Ermitteln eines Recs abhängig einer Menge

22. Februar 2016 17:31

Hab gerade mal ein wenig rumgespielt

In der Regel löst man das ganze auf Datenbankebene mit

Select * FROM t1 LEFT JOIN t2 ON t1.fk = t2.pk WHERE t2.pk IS NULL;

Das ganze lässt sich recht simple in NAV abbilden...
Code:
OBJECT Query 50001 test
{
  OBJECT-PROPERTIES
  {
    Date=22.02.16;
    Time=16:29:32;
    Modified=Yes;
    Version List=;
  }
  PROPERTIES
  {
  }
  ELEMENTS
  {
    { 1000000000;;DataItem;                  ;
               DataItemTable=Table18 }

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

    { 1000000002;1;DataItem;                 ;
               DataItemTable=Table21;
               DataItemLink=Customer No.=Customer."No.";
               DataItemLinkType=SQL Advanced Options }

    { 1000000003;2;Column;                   ;
               ColumnFilter=Entry_No=CONST(0);
               DataSource=Entry No. }

  }
  CODE
  {

    BEGIN
    END.
  }
}


Wobei die Zeile ColumnFilter=Entry_No=CONST(0); die wichtigste ist.

Re: Ermitteln eines Recs abhängig einer Menge

23. Februar 2016 17:17

Hallo ted,

wow vielen lieben Dank schonmal für die Mühe! Ich werde das auf jedenfall ausprobieren. Ich habe gestern noch die Variante mit dem FlowField umgesetzt, die Query wäre natürlich wirklich schöner, weil die Info des FlowFields nach Aussen sichtbar ist. Ich werde das die nächsten tage auf jedenfall ausprobieren, leider sitze ich schon wieder an einer anderen Baustelle ;)

Dass man das mit nem JOINT macht hab ich mir auch schon gedacht, nur leider habe ich das in der Schule damals nicht ganz verstanden und im Studium wurde das nur erwähnt, gelernt haben wir das nicht weil das laut Prof. so wohl nicht mehr gemacht wird. Ob das stimmt weiß ich nicht ;)

Re: Ermitteln eines Recs abhängig einer Menge

23. Februar 2016 17:52

Dass man das mit nem JOINT macht hab ich mir auch schon gedacht, nur leider habe ich das in der Schule damals nicht ganz verstanden und im Studium wurde das nur erwähnt, gelernt haben wir das nicht weil das laut Prof. so wohl nicht mehr gemacht wird. Ob das stimmt weiß ich nicht ;)


Den SQL- Befehl, den TED da aufgeschrieben hat, ist das was seine NAV- Query tut, und nur das kann Sie auch.

in SQL würde man etwa so programmieren
Code:
SELECT * FROM t1
    WHERE NOT EXISTS ( SELECT 1 FROM t2 WHERE t2.PK = t1.PK)


also etwa das, was auch das Flowfield macht. Was schneller ist, muss man mal einer DB mit etwas mehr Daten probieren in SQL ist die EXISTS- Abfrage die schnellere.

Gruß Fiddi

Re: Ermitteln eines Recs abhängig einer Menge

23. Februar 2016 18:45

Mein Query macht eben genau das was seine Aufgabe sagt.
Es sucht alle Debitoren heraus, welche noch keinen Posten haben.

Im laufe meiner Entwicklerzeit wurde mir beigebracht subquery's zu vermeiden wo es nur geht. Aber ob dies nun aus Performance oder lesefreundlichkeit gemacht werden sollte kann ich nicht sagen.

Ted

Edit - muss auch sagen das ich aus dem mysql Bereich komme, da würde dein Query so gar nicht funktionieren

Re: Ermitteln eines Recs abhängig einer Menge

25. Februar 2016 09:00

Edit - muss auch sagen das ich aus dem mysql Bereich komme, da würde dein Query so gar nicht funktionieren


was meinst du damit?

Gruß Fiddi

Re: Ermitteln eines Recs abhängig einer Menge

25. Februar 2016 09:15

war falsch...

VG
Jörg
Zuletzt geändert von JoergR am 25. Februar 2016 11:16, insgesamt 1-mal geändert.

Re: Ermitteln eines Recs abhängig einer Menge

25. Februar 2016 10:55

Hallo,

ich habe mal gerade einen Test mit real vorhanden Daten gemacht
Code:
PRINT (CONVERT( VARCHAR(24), GETDATE(), 121))
Select COUNT(*) FROM dbo.[XXX$G_L Entry] t1 where NOT EXISTS ( SELECT 1 FROM dbo.[XXX$Cust_ Ledger Entry] t2 WHERE t2.[Entry No_] = t1.[Entry No_]);
PRINT (CONVERT( VARCHAR(24), GETDATE(), 121))
Select COUNT(*) FROM dbo.[XXX$G_L Entry] t1 LEFT JOIN dbo.[XXX$Cust_ Ledger Entry] t2 ON t1.[Entry No_] = t2.[Entry No_] WHERE t2.[Entry No_] IS NULL;
PRINT (CONVERT( VARCHAR(24), GETDATE(), 121))


Ergebnis in der DB 4535491 Datensätze

der Unterschied zwischen beiden Abfragen ist marginal und nicht reproduzierbar mit leichten Vorteilen für die EXIST- Abfrage (1-2%).

Gruß Fiddi

Re: Ermitteln eines Recs abhängig einer Menge

26. Februar 2016 18:26

Danke Fiddi, gut zu wissen :)
Interessant wäre nun noch zu wissen wie dagegen WHERE spalte IN (SELECT spalte ... ) arbeitet.

Um aber mal zum Thema Querys zurück zu kommen.
Leider haben diese wohl trotzdem ihre Grenzen und sind mit "echten" SQL's nicht vergleichbar.
Als beispiel wollt ich:
Code:
SELECT ... FROM glentry t1
LEFT JOIN dimension_set_entry t2 ON (t1.dimension_set_id = t2.dimension_set_id AND t2.dimension_code = "DIM3")


Bisher hab ich keine Möglichkeit im Query gefunden das abzubilden. Wenn t1 keinen t2 "DIM3" hat wird dieser aus dem ergebnis geschmissen (was ja eigentlich gegen den LEFT JOIN) spricht.

Ted