Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Abfragen mittels Join über TMS Aurelius (https://www.delphipraxis.net/210242-abfragen-mittels-join-ueber-tms-aurelius.html)

Maliko 23. Mär 2022 08:14

Datenbank: Oracle • Version: 12 • Zugriff über: TMS Aurelius

Abfragen mittels Join über TMS Aurelius
 
Moin,

ich hoffe, jemand von euch kennt sich mit dem Framework aus. Wir benutzen ganz neu Aurelius und bisher hat auch alles wunderbar funktioniert. Allerdings habe ich jetzt das Problem Daten über Aurelius abzurufen, wo sich die Where-Spalten in unterschiedlichen Tabellen befinden. Ich bekomme dann immer die Fehlermeldung:

Zitat:

Property "MANDANTREFERENZID" not found on class "TBkpo".
Das ist auch korrekt, denn das Property befindet sich in der Klasse TVG. Für die Abfrage benutze ich folgenden Code:

Delphi-Quellcode:
FManager.Find<TBkpo>.Where(Linq['kundennummer'] = aKundennummer).Where(Dic.Vg.MANDANTREFERENZID = aReferenz).Where(Dic.Vg.MANDANTVORGANGID = aKundenvorgangid).OrderBy('datum', false).OrderBy('posid', False).List;
Das ist der entsprechende Teil der Entities die ich nutze:

Delphi-Quellcode:
  [Entity]
  [Table('BKPO')]
  [Id(...)]
  TBkpo = class
  private
    [Column('KUNDENNUMMER', [TColumnProp.Required])]
    FKUNDENNUMMER: string;

    [Association([TAssociationProp.Lazy, TAssociationProp.Required], CascadeTypeAll - [TCascadeType.Remove])]
    [JoinColumn('VGFK_KUNDENNUMMER', [TColumnProp.Required], 'KUNDENNUMMER')]
    [JoinColumn('VGFK_VORGANGID', [TColumnProp.Required], 'VORGANGID')]
    [JoinColumn('VGFK_VERSIONID', [TColumnProp.Required], 'VERSIONID')]
    FVorgang: Proxy<TVg>;
    function GetVorgang: TVg;
    procedure SetVorgang(const Value: TVg);
  public
    property Kundennummer: string read FKUNDENNUMMER write FKUNDENNUMMER;
    property Vorgang: TVg read GetVorgang write SetVorgang;

  [Entity]
  [Table('VG')]
  [Id(...)]
  TVg = class
  private
    [Column('KUNDENNUMMER', [TColumnProp.Required])]
    FKUNDENNUMMER: string;

    [Column('VORGANGID', [TColumnProp.Required])]
    FVORGANGID: Double;

    [Column('VERSIONID', [TColumnProp.Required])]
    FVERSIONID: Double;

    [Column('MANDANTREFERENZID', [], 50)]
    FMANDANTREFERENZID: string;

    [Column('MANDANTVORGANGID', [], 50)]
    FMANDANTVORGANGID: string;
  public
    property Kundennummer: string read FKUNDENNUMMER write FKUNDENNUMMER;
    property Vorgangid: Double read FVORGANGID write FVORGANGID;
    property Versionid: Double read FVERSIONID write FVERSIONID;
    property Mandantreferenzid: string read FMANDANTREFERENZID write FMANDANTREFERENZID;
    property Mandantvorgangid: string read FMANDANTVORGANGID write FMANDANTVORGANGID;
  end;
Nicht wundern, ich hab die Entities etwas zusammengekürzt und nur das aufgeschrieben, was für dieses Query benötigt wird. Alle anderen Properties, IDs und Uniques hab ich weggelassen.

Und das hier ist das betroffene Dictionary das ich abrufe:
Delphi-Quellcode:
  IDictionary = interface(IAureliusDictionary)
    function Vg: IVgDictionary;
  end;

  TDictionary = class(TAureliusDictionary, IDictionary)
  public
    function Vg: IVgDictionary;
  end;

  IVgDictionary = interface(IAureliusEntityDictionary)
    function KUNDENNUMMER : TLinqProjection;
    function VORGANGID : TLinqProjection;
    function VERSIONID : TLinqProjection;
    function MANDANTREFERENZID : TLinqProjection;
    function MANDANTVORGANGID : TLinqProjection;
  end;

  TVgDictionary = class(TAureliusEntityDictionary, IVgDictionary)
  public
    function KUNDENNUMMER: TLinqProjection;
    function VORGANGID: TLinqProjection;
    function VERSIONID: TLinqProjection;
    function MANDANTREFERENZID : TLinqProjection;
    function MANDANTVORGANGID : TLinqProjection;
  end;

{ TVGDictionary }

function TVGDictionary.KUNDENNUMMER: TLinqProjection;
begin
  Result := Prop('KUNDENNUMMER');
end;

function TVgDictionary.MANDANTREFERENZID: TLinqProjection;
begin
  Result := Prop('MANDANTREFERENZID');
end;

function TVgDictionary.MANDANTVORGANGID: TLinqProjection;
begin
  Result := Prop('MANDANTVORGANGID');
end;

function TVGDictionary.VERSIONID: TLinqProjection;
begin
  Result := Prop('VERSIONID');
end;

function TVGDictionary.VORGANGID: TLinqProjection;
begin
  Result := Prop('VORGANGID');
end;
Hat vielleicht jemand ne Ahnung was ich da falsch mache? Wenn noch irgendwelche Infos fehlen, reiche ich die natürlich nach.

Viele Grüße
Maliko

Frickler 23. Mär 2022 08:51

AW: Abfragen mittels Join über TMS Aurelius
 
Ohne jetzt Ahnung von Aurelius zu haben - wäre das Problem nicht einfach zu umgehen durch Verwendung eines Views auf Datenbankebene?

Union 23. Mär 2022 09:06

AW: Abfragen mittels Join über TMS Aurelius
 
Ich habe leider das letzte Mal vor 5 Jahren intensiver mit Aurelius gearbeitet. Und auch nie das TAureliusdictionary eingesetzt - das gab es damals nicht. Warum verwendest Du nicht
Delphi-Quellcode:
.Where(Linq['MANDANTREFERENZID'] = aReferenz)

TigerLilly 24. Mär 2022 07:23

AW: Abfragen mittels Join über TMS Aurelius
 
Der TMS Support ist wirklich gut+schnell, dort solltest du eine rasche Antwort bekommen.

Sonst meine ich im Kopf zu haben, dass du mit Find<>.CreateAlias arbeiten muss, um die gejointen Tabellen nachzubilden.

Maliko 24. Mär 2022 07:28

AW: Abfragen mittels Join über TMS Aurelius
 
Zitat:

Zitat von Frickler (Beitrag 1503812)
Ohne jetzt Ahnung von Aurelius zu haben - wäre das Problem nicht einfach zu umgehen durch Verwendung eines Views auf Datenbankebene?

Nein. Ich habe keinen Bock auf der Datenbank nachher mit 2,5 Millionen Views arbeiten zu müssen, nur weil ich für jede Datenbankabfrage welche nen Join braucht ne View benutze.

Zitat:

Zitat von Union (Beitrag 1503814)
Ich habe leider das letzte Mal vor 5 Jahren intensiver mit Aurelius gearbeitet. Und auch nie das TAureliusdictionary eingesetzt - das gab es damals nicht. Warum verwendest Du nicht
Delphi-Quellcode:
.Where(Linq['MANDANTREFERENZID'] = aReferenz)

Soweit ich das Verstanden habe funktioniert die von dir Vorgeschlagene Syntax nur wenn das Feld sich auch in der entsprechenden Klasse befindet, und das tut es nun mal nicht.

Zitat:

Zitat von TigerLilly (Beitrag 1503854)
Der TMS Support ist wirklich gut+schnell, dort solltest du eine rasche Antwort bekommen.

Das die gut sein sollen wusste ich. Nur kann ich erheblich besser Englisch lesen als schreiben. Englisch ins Deutsche übersetzen ist für mich überhaupt kein Problem, doch beim Schreiben von Englischen Texten tue ich mich immer relativ schwer und dachte daher ich versuch es erst einmal hier.

Zitat:

Zitat von TigerLilly (Beitrag 1503854)
Sonst meine ich im Kopf zu haben, dass du mit Find<>.CreateAlias arbeiten muss, um die gejointen Tabellen nachzubilden.

Das werd ich definitiv mal ausprobieren. Danke für den Tipp.

Maliko 24. Mär 2022 11:29

AW: Abfragen mittels Join über TMS Aurelius
 
Zitat:

Zitat von TigerLilly (Beitrag 1503854)
Sonst meine ich im Kopf zu haben, dass du mit Find<>.CreateAlias arbeiten muss, um die gejointen Tabellen nachzubilden.

Jap genau das war es. Damit funktioniert es dann. Falls noch jemand das Problem haben sollte, hier einmal das obere korregierte Query wie es funktioniert:

Delphi-Quellcode:
FManager.Find<TBkpo>.CreateAlias('Vorgang', 'vg').Where(Linq['kundennummer'] = aKundennummer).Where(Linq['vg.mandantreferenzid'] = aReferenz).Where(Linq['vg.mandantvorgangid'] = aKundenvorgangid).OrderBy('datum', false).OrderBy('posid', False).List;


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz