AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Abfragen mittels Join über TMS Aurelius
Thema durchsuchen
Ansicht
Themen-Optionen

Abfragen mittels Join über TMS Aurelius

Ein Thema von Maliko · begonnen am 23. Mär 2022 · letzter Beitrag vom 24. Mär 2022
Antwort Antwort
Maliko

Registriert seit: 20. Jun 2019
91 Beiträge
 
Delphi 10.3 Rio
 
#1

Abfragen mittels Join über TMS Aurelius

  Alt 23. Mär 2022, 09:14
Datenbank: Oracle • Version: 12 • Zugriff ü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:

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

Geändert von Maliko (23. Mär 2022 um 09:20 Uhr)
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
589 Beiträge
 
Delphi XE6 Enterprise
 
#2

AW: Abfragen mittels Join über TMS Aurelius

  Alt 23. Mär 2022, 09:51
Ohne jetzt Ahnung von Aurelius zu haben - wäre das Problem nicht einfach zu umgehen durch Verwendung eines Views auf Datenbankebene?
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: Abfragen mittels Join über TMS Aurelius

  Alt 23. Mär 2022, 10:06
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 .Where(Linq['MANDANTREFERENZID'] = aReferenz)
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.201 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Abfragen mittels Join über TMS Aurelius

  Alt 24. Mär 2022, 08:23
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.
  Mit Zitat antworten Zitat
Maliko

Registriert seit: 20. Jun 2019
91 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Abfragen mittels Join über TMS Aurelius

  Alt 24. Mär 2022, 08:28
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.

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 .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.

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.

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.

Geändert von Maliko (24. Mär 2022 um 08:30 Uhr)
  Mit Zitat antworten Zitat
Maliko

Registriert seit: 20. Jun 2019
91 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Abfragen mittels Join über TMS Aurelius

  Alt 24. Mär 2022, 12:29
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:

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;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:28 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