Ermitteln eines Recs abhängig einer Menge

Bild Microsoft Dynamics NAV 2016

Ermitteln eines Recs abhängig einer Menge

Beitragvon Yuna1016 » 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 ;)
Yuna1016
 
Beiträge: 6
Registriert: 8. September 2014 11:22
Bezug zu Microsoft Dynamics: SchĂĽler / Student
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2009 R2,2013/R2,2015,2016

Re: Ermitteln eines Recs abhängig einer Menge

Beitragvon fiddi » 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
Wer aufhört besser zu werden, hat aufgehört gut zu sein. (frei nach Philip Rosenthal)
Frage beantwortet? Schreibe bitte [Gelöst] vor den Titel des ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, Mail, IM oder Telefon! DafĂĽr ist dieses Forum da.
fiddi
Moderator
Moderator
 
Beiträge: 7091
Registriert: 9. Juni 2008 10:13
Realer Name: Hans Heinrich Fiddelke
Arbeitsort: Bremen
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: NAV2.6-aktuell

Re: Ermitteln eines Recs abhängig einer Menge

Beitragvon Yuna1016 » 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..
Yuna1016
 
Beiträge: 6
Registriert: 8. September 2014 11:22
Bezug zu Microsoft Dynamics: SchĂĽler / Student
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2009 R2,2013/R2,2015,2016

Re: Ermitteln eines Recs abhängig einer Menge

Beitragvon Ted » 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: Alles auswählen
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.
GruĂź
Ted
Ted
 
Beiträge: 328
Registriert: 18. September 2014 11:16
Realer Name: Dennis Reinecke
Arbeitsort: Berlin
Bezug zu Microsoft Dynamics: End-Anwender
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2015+

Re: Ermitteln eines Recs abhängig einer Menge

Beitragvon Yuna1016 » 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 ;)
Yuna1016
 
Beiträge: 6
Registriert: 8. September 2014 11:22
Bezug zu Microsoft Dynamics: SchĂĽler / Student
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2009 R2,2013/R2,2015,2016

Re: Ermitteln eines Recs abhängig einer Menge

Beitragvon fiddi » 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: Alles auswählen
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
Wer aufhört besser zu werden, hat aufgehört gut zu sein. (frei nach Philip Rosenthal)
Frage beantwortet? Schreibe bitte [Gelöst] vor den Titel des ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, Mail, IM oder Telefon! DafĂĽr ist dieses Forum da.
fiddi
Moderator
Moderator
 
Beiträge: 7091
Registriert: 9. Juni 2008 10:13
Realer Name: Hans Heinrich Fiddelke
Arbeitsort: Bremen
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: NAV2.6-aktuell

Re: Ermitteln eines Recs abhängig einer Menge

Beitragvon Ted » 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
GruĂź
Ted
Ted
 
Beiträge: 328
Registriert: 18. September 2014 11:16
Realer Name: Dennis Reinecke
Arbeitsort: Berlin
Bezug zu Microsoft Dynamics: End-Anwender
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2015+

Re: Ermitteln eines Recs abhängig einer Menge

Beitragvon fiddi » 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
Wer aufhört besser zu werden, hat aufgehört gut zu sein. (frei nach Philip Rosenthal)
Frage beantwortet? Schreibe bitte [Gelöst] vor den Titel des ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, Mail, IM oder Telefon! DafĂĽr ist dieses Forum da.
fiddi
Moderator
Moderator
 
Beiträge: 7091
Registriert: 9. Juni 2008 10:13
Realer Name: Hans Heinrich Fiddelke
Arbeitsort: Bremen
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: NAV2.6-aktuell

Re: Ermitteln eines Recs abhängig einer Menge

Beitragvon JoergR » 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.
mfg,
Jörg
JoergR
 
Beiträge: 156
Registriert: 7. Oktober 2011 08:32
Arbeitsort: NĂĽrnberg
Bezug zu Microsoft Dynamics: End-Anwender
Microsoft Dynamics Produkt: Microsoft Dynamics NAV

Re: Ermitteln eines Recs abhängig einer Menge

Beitragvon fiddi » 25. Februar 2016 10:55

Hallo,

ich habe mal gerade einen Test mit real vorhanden Daten gemacht
Code: Alles auswählen
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
Wer aufhört besser zu werden, hat aufgehört gut zu sein. (frei nach Philip Rosenthal)
Frage beantwortet? Schreibe bitte [Gelöst] vor den Titel des ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, Mail, IM oder Telefon! DafĂĽr ist dieses Forum da.
fiddi
Moderator
Moderator
 
Beiträge: 7091
Registriert: 9. Juni 2008 10:13
Realer Name: Hans Heinrich Fiddelke
Arbeitsort: Bremen
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: NAV2.6-aktuell

Re: Ermitteln eines Recs abhängig einer Menge

Beitragvon Ted » 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: Alles auswählen
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
GruĂź
Ted
Ted
 
Beiträge: 328
Registriert: 18. September 2014 11:16
Realer Name: Dennis Reinecke
Arbeitsort: Berlin
Bezug zu Microsoft Dynamics: End-Anwender
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2015+


ZurĂĽck zu NAV 2016

Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 1 Gast