[gelöst]Anfängerfragen zur Verwendung von tiOPF (Relationen)

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

[gelöst]Anfängerfragen zur Verwendung von tiOPF (Relationen)

Beitrag von MacWomble »

Hallo,

ich versuche seit geraumer Zeit mit tiOPF klar zu kommen. Einiges habe ich mir in der Zwischenzeit zusammen gesucht und ein Testprojekt geschrieben.
Nun versuche ich, zwei DB-Tabellen in Relation zueinander einzulesen, was mir nicht gelingen möchte. Ich habe alles versucht, was in den Beispielen zu finden war, aber leider sind diese nicht oder unzureichend dokumentiert - zumindest für LCL. Auch ist die Verwendung der XML und die Ableitung der Klassen daraus nicht wirklich verständlich dokumentiert. Da ich noch nicht lange objektorientiert arbeite, vermute ich meine Probleme im Verständnis der Ableitungen von Klassen.

Deswegen versuche ich nun hier geeignete Hinweise zu bekommen, wie das zu realisieren ist. Dafür lade ich mein (sehr kleines) Testprojekt inklusive MySQL-Dump hier hoch.

Zunächst noch zur Erklärung des Aufbaus meines Projekts:

Code: Alles auswählen

xxx = Placeholder
 
xxx.xml
   Handcrafted XML with all base definitions of the business model
   will be used by timap tool to generate xxx_bom.pas
 
unit xxx_bom.pas;
   This ist automatically generated from xxx.xml and should not be
   edited by hand ! 
 
unit xxxmodel.pas;
   In this unit I can inherit from the base classes and expand
   the Objects. Only this unit has access to the business
   object model unit (xxx_bom.pas)
 
unit xxxmanager.pas;
   To make saving and loading easier, a single class
   which owns all global listes is implemented
 
unit xxxdisplay.pas;
   In this unit the Display classes for the GUI will be inherited
   Here should also done the formatting tasks


Was ich erhalte ist:

Code: Alles auswählen

 
TContactManager, posEmpty, OID=,
  TContactTitles, posClean, OID=,
    TBaseContactTitle, posClean, OID=5D89ED10-353C-4972-B222-2EA9506E0EC0,
      TitleType = ttMulti
      Title = Group for Hotels
      SearchTitle = Hotel
    TBaseContactTitle, posClean, OID=D2D00F3E-1DE4-4A7E-BC48-16DC9EA9027A,
      TitleType = ttSingle
      Title = Group for People
      SearchTitle =
  TBusinesses, posClean, OID=,
    TBaseBusiness, posClean, OID=17C445C7-C5FB-4328-B894-EF417EEAFED6,
      OIDContactTitle = D2D00F3E-1DE4-4A7E-BC48-16DC9EA9027A
      Name1 = CTR Klaus Riesterer
      Name2 = Computertechnik
      Name3 = its me :-)
      Addition =
    TBaseBusiness, posClean, OID=535B18A8-8AE2-46BE-BBCA-E087AECFA46E,
      OIDContactTitle = 5D89ED10-353C-4972-B222-2EA9506E0EC0
      Name1 = Hotel Adlon
      Name2 =
      Name3 =
      Addition =
    TBaseBusiness, posClean, OID=965DA620-E822-41BE-8FBB-0AFFE555FF32,
      OIDContactTitle = 5D89ED10-353C-4972-B222-2EA9506E0EC0
      Name1 = Riverside Hotel
      Name2 =
      Name3 =
      Addition =


Benötigt wird:

Code: Alles auswählen

 
TContactManager, posEmpty, OID=,
  TContactTitles, posClean, OID=,
    TContactTitle, posClean, OID=5D89ED10-353C-4972-B222-2EA9506E0EC0,
      TitleType = ttMulti
      Title = Group for Hotels
      SearchTitle = Hotel
            TBusiness, posClean, OID=535B18A8-8AE2-46BE-BBCA-E087AECFA46E,
              OIDContactTitle = 5D89ED10-353C-4972-B222-2EA9506E0EC0
              Name1 = Hotel Adlon
              Name2 =
              Name3 =
              Addition =
            TBusiness, posClean, OID=965DA620-E822-41BE-8FBB-0AFFE555FF32,
              OIDContactTitle = 5D89ED10-353C-4972-B222-2EA9506E0EC0
              Name1 = Riverside Hotel
              Name2 =
              Name3 =
              Addition =
    TContactTitle, posClean, OID=D2D00F3E-1DE4-4A7E-BC48-16DC9EA9027A,
      TitleType = ttSingle
      Title = Group for People
      SearchTitle =
           TBusinesses, posClean, OID=,
             TBusiness, posClean, OID=17C445C7-C5FB-4328-B894-EF417EEAFED6,
               OIDContactTitle = D2D00F3E-1DE4-4A7E-BC48-16DC9EA9027A       
               Name1 = CTR Klaus Riesterer
               Name2 = Computertechnik
               Name3 = its me :-)
               Addition =


!!! In der unteren Ausgabe sollte nicht auf die TBase.. -Klassen zugegriffen werden und die Klassen entsprechend unter dem jeweiligen TContactTitle sein. !!!
Dies ist vermutlich ein Problem in contactmodel.pas Stichwort Owner.
Hinweis: Benennung der Klasse in Einzahl, die zugehörige Liste in Mehrzahl (TContactTitle, TContactTitles)

Da ich im tiOPF-Forum nicht fündig wurde hoffe ich hier auf Hilfe. Ich denke nicht, dass es so kompliziert ist.
Da ich derzeit ein neues Projekt beginnen möchte, ist die Lösung dieses Problems für mich relativ dringend.

Es wäre schön, wenn sich jemand bereit erklären würde, mir hier behilflich zu sein.

Sonnige Grüße aus dem Markgräflerland
Klaus
Dateianhänge
CTR-TEST.zip
Beispielprojekt
(13.21 KiB) 86-mal heruntergeladen
Zuletzt geändert von MacWomble am Do 16. Mär 2017, 11:11, insgesamt 2-mal geändert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Anfängerfragen zur Verwendung von tiOPF (Relationen)

Beitrag von af0815 »

..\tiopf\Demos\LCL -> dort liegen Demos für die LCL, für dich am interessantesten das Demo 21 Adressbook.

Code: Alles auswählen

Da ich im tiOPF-Forum nicht fündig wurde hoffe ich hier auf Hilfe. Ich denke nicht, dass es so kompliziert ist.

Es gibt kein direktes Forum, sondern eine Mailinglist. Die sollte man sich aber komplett besorgen, da ist relativ viel Info drinnen (wenn man sie findet :-) ).

In der lazaruswiki wichtigsten Links zu Artikeln drinnen.

Edit: Hier in der Website sind auch einige Infos als PDF verborgen. https://sourceforge.net/p/tiopf/tiopf_website/ci/master/tree/ siehe auch das Verzeichnis \Doc\ADUGSymposium2008
Dateianhänge
tiopf.chm
tiOPF Helpdatei
(855.21 KiB) 83-mal heruntergeladen
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Anfängerfragen zur Verwendung von tiOPF (Relationen)

Beitrag von MacWomble »

Danke, die Newsgroup meinte ich. Die Dokumentationen kenne ich alle, in der Newsgroup bin ich aktiv, habe aber bislang nicht die gewünschten Infos bekommen.

Gruß
Klaus
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Anfängerfragen zur Verwendung von tiOPF (Relationen)

Beitrag von af0815 »

Das kennst du sicherlich auch:

tiOPFMapper.pdf
tiOPFMapper Kurzbeschreibung
(97.67 KiB) 89-mal heruntergeladen
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Anfängerfragen zur Verwendung von tiOPF (Relationen)

Beitrag von MacWomble »

Danke, kenne ich auch.

Ich denke, ich kenne alle Dokumentationen und auch die drei Videos bei YouTube. Die helfen mir bei meinen Problemen aber nicht weiter :-(

Das Prinzip verstehe ich ja. Wie ich oben schon schrieb, bauen aber alle Beispiele auf handgeschriebene BOMs (das würde ich hin bekommen) und nicht auf die Definition über XML auf.
Wenn ich die XML verwende, darf ich in der generierten BOM keien Änderungen vornehmen. Deswegen habe ich die contactmodel.pas, um dort die Klassen aus der BOM abzuleiten und entsprechende Anpassungen zu machen, welche durch die XML-Definition nicht gedeckt werden können. Dies soll auch die einzige Unit im Projekt sein, welche Zugriff auf die automatisch aus der XML generierte BOM hat!

Ich denke die Probleme liegen in den Ableitungen: Muss ich die Listen erst in der contactmodel.pas generieren, damit die abgeleiteten Items dort vorhanden sind?

Gruß Klaus
Zuletzt geändert von MacWomble am So 12. Mär 2017, 17:15, insgesamt 1-mal geändert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Anfängerfragen zur Verwendung von tiOPF (Relationen)

Beitrag von af0815 »

Hier noch ein Beispiel von einem meiner Versuchsprojekte mit tiOPF. Wie immer ohne Gewähr etc.
Dateianhänge
Importer.zip
tiOPF Projekt für CSV-Konverter und SQLite
(123.47 KiB) 94-mal heruntergeladen
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Anfängerfragen zur Verwendung von tiOPF (Relationen)

Beitrag von MacWomble »

Ich zweifle langsam an mir. Stelle ich so unklare Fragen, dass ich nur ausweichende - wenn auch gut gemeinte - Antworten bekomme?
Ich sehe leider keinerlei Zusammenhang zwischen Deinem Projekt und meinen Problemen, außer dass sie beide auf tiOPF basieren. :shock:

Gruß Klaus
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Anfängerfragen zur Verwendung von tiOPF (Relationen)

Beitrag von af0815 »

MacWomble hat geschrieben:Ich habe alles versucht, was in den Beispielen zu finden war, aber leider sind diese nicht oder unzureichend dokumentiert - zumindest für LCL. Auch ist die Verwendung der XML und die Ableitung der Klassen daraus nicht wirklich verständlich dokumentiert.


Ich habe mal geschaut was ich zu tiOPF finde, das passen könnte. Bei der Verwendung der XML habe ich mit tiOPFMapper assoziert. Deshalb das PDF und das Demo-Projekt.

Ansonsten bin ich gerade dabei meinen Lazarus wieder tiOPF einzubinden und mir das von dir genauer anzusehen. Sorry das es nicht ganz das war was du aktuell gesucht hast.

Andreas

Edit:
Damit man bei tiOPF was sieht, sollte man das Log aktivieren, das kann einem eine Menge Hinweise geben. (Ich hoffe das ist nicht wieder am Ziel vorbei)

Ich habe aktuell keine MySQL-DB vorhanden, damit muss ich auf SQLite ausweichen, mal sehen ob ich Zeit habe, die SQL-Scripts anzupassen.

Code: Alles auswählen

program test;
 
{$mode objfpc}{$H+}
 
uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, zcomponent
//  , tiQuerySqldbSQLite3 // SQLite 3 with SqlDB is used
  , SysUtils
  , tiQueryZeosMySQL50
  , tiUtils
  , tiOPFManager
  , tiConstants
  , tiLog
  , tiLogToFile
  , GuiTest, contact_bom, frm_edittitle, contactdisplay,
  contactmodel;
 
{$R *.res}
 
procedure StartLog;
var
  aFileName : String;
  i : Integer;
  LS : String;
begin
  // Log
  aFileName := tiSwapExt(ParamStr(0),'log');
  gLog.RegisterLog(TtiLogToFile.CreateWithFileName(ExtractFilePath(aFileName),ExtractFileName(aFileName),True));
  gLog.SevToLog :=  [
    lsNormal
    ,lsUserInfo
    ,lsObjCreation
    ,lsVisitor
    ,lsConnectionPool
    ,lsAcceptVisitor
    ,lsQueryTiming
    ,lsDebug
    ,lsWarning
    ,lsError
    ,lsSQL
    ];
  Log('Starting', lsNormal);
  GTIOPFManager.DefaultPersistenceLayerName := cTIPersistZeosMySQL50;
  LS := '';
  for i := 0 to GTIOPFManager.PersistenceLayers.Count - 1 do
  begin
    if LS <> '' then
      LS := LS + cLineEnding;
    if Trim(GTIOPFManager.PersistenceLayers.Items[i].DBConnectionPools.DetailsAsString) = '' then
      LS := LS + 'Persistence layer: "'+ GTIOPFManager.PersistenceLayers.Items[i].PersistenceLayerName +
            '" loaded, but not connected to a database.'
    else
      LS := LS + GTIOPFManager.PersistenceLayers.Items[i].DBConnectionPools.DetailsAsString
  end;
  if LS <> '' then
    Log(LS, lsDebug)
  else
    Log('No persistence layers loaded', lsDebug);
end;
 
 
begin
  Application.Title:='CTR-NEU';
  RequireDerivedFormResource:=True;
  StartLog;
  Application.Initialize;
  Application.CreateForm(TfrmGuiTest, frmGuiTest);
  Application.CreateForm(TEditTitle, EditTitle);
  Application.Run;
end.
 
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Anfängerfragen zur Verwendung von tiOPF (Relationen)

Beitrag von MacWomble »

Danke dass du dir die Arbeit machst. Ich habe eben noch einen Fehler in meiner XML entdeckt, deswegen im Anhang nochmal die neue XML und bom.

Nun bekomme ich allerdings bei der Übergabe der OID (GUID, string 36) in der contact.bom einen Fehler:

Code: Alles auswählen

 
procedure TBaseBusiness_Create.SetupParams;
var
lObj: TBaseBusiness;
begin
lObj := TBaseBusiness(Visited);
lObj.OID.AssignToTIQuery('OID',Query);
Query.ParamAsString['OIDContactTitle'] := lObj.Owner.OID;   // contact_bom.pas (468,57) Error: Incompatible type for arg no. 2: Got "TtiOID", expected "AnsiString"
Query.ParamAsString['Name1'] := lObj.Name1;
Query.ParamAsString['Name2'] := lObj.Name2;
Query.ParamAsString['Name3'] := lObj.Name3;
Query.ParamAsString['Addition'] := lObj.Addition;
end;
 


Gruß Klaus
Dateianhänge
contact_bom.pas
(20.61 KiB) 84-mal heruntergeladen
Contacts.xml
(2.24 KiB) 84-mal heruntergeladen
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Anfängerfragen zur Verwendung von tiOPF (Relationen)

Beitrag von af0815 »

Ok, werde ich aufnehmen.

Hast du den tiMapper selbst kompiliert oder eine (alte) fertige Exe genommen ? Da sind ein paar Fixes gemacht worden.

Die aktuelleste Version sollte das hineinschreiben

Code: Alles auswählen

 
 
unit contact_bom;
// ---------------------------------------------
// Automated generated 12.03.2017 18:46:03
// Warning:
//   if you rerun the tool, your changes are lost
// ---------------------------------------------
 
 
{$IFDEF FPC}
{$mode objfpc}{$H+}
{$ENDIF}
 
 
interface
 
 
uses
SysUtils
,tiObject
,typinfo
,tiAutoMap
......
 
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Anfängerfragen zur Verwendung von tiOPF (Relationen)

Beitrag von MacWomble »

Da ich mit Linux arbeite habe ich keine Exe. Ich verwende die sourcen aus tiOPF2, Quellen vom 21.08.2016. tiMap vom 24.10.2016

Den Header schreibt der nicht rein ...

Ich schau noch mal auf Sourceforge, ob es was neueres gibt. Mom ...

Nein, habe die aktuellen Sourcen (für Linux)
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Anfängerfragen zur Verwendung von tiOPF (Relationen)

Beitrag von af0815 »

tiOPF: https://github.com/graemeg/tiopf.git
tiOPF_Apps: https://github.com/graemeg/tiopf_apps.git letzte Änderung 23.9.2016

Edit:
Hast du beim tiMapper das -v verwendet ? Oder habe ich das nur in meinem Repository :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Anfängerfragen zur Verwendung von tiOPF (Relationen)

Beitrag von MacWomble »

Nein, -v habe ich nicht verwendet, aber das bringt doch nur ein paar Meldungen mehr - oder?
Der timap aus den von dir genannten Quellen ist zwar nach dem Kompilieren 1,5MB größer, ändert aber an der Sache wohl nichts.

Komisch ist das, weil die Quellen auf sourceforge angeblich identisch sind - außer dass dort auch noch ältere Sachen mit dabei sind.

Edit
Ich habe jetzt erst mal das tiOPF aus 'deinen' Quellangaben installiert und mein Programm damit getestet.
Den Fehler bekomme ich nach wie vor.
Ach und mit -v bekomme ich auch den Header in der BOM-Datei, das war aber zuvor wohl doch auch schon so..
Zuletzt geändert von MacWomble am So 12. Mär 2017, 22:50, insgesamt 1-mal geändert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Anfängerfragen zur Verwendung von tiOPF (Relationen)

Beitrag von af0815 »

"Owner.OID" ist vom Typ TtiOID und nicht string. Damit der Typ richtig zugeordnet wird, muss man das ".AsString" anhängen.

Code: Alles auswählen

 
           <mapping table="ctr_Business" pk="OID" pk-field="OID" oid-type="string">
            <prop-map prop="Owner.OID.AsString" field="OIDContactTitle" type="String" />
            <prop-map prop="Name1" field="Name1" type="String" />
            <prop-map prop="Name2" field="Name2" type="String" />
 
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Anfängerfragen zur Verwendung von tiOPF (Relationen)

Beitrag von MacWomble »

Das ergibt eine Exception:

(Owner.OID.AsString is not a published property on TBaseBusiness)
Gefezúert in tiAutoMap:

Code: Alles auswählen

function TtiClassMap.AddAttrMap(const AAttrName: string): TtiAttrMap;
begin
  if FindByAttrName(AAttrName) <> NIL then
    raise Exception.Create(
      'Attempt to register duplicate TtiAttrMap' + tiLineEnd +
      'ClassName: ' + PerObjAbsClass.ClassName + tiLineEnd +
      'AttrName:  ' + AAttrName + tiLineEnd +
      '. Called in ' + ClassName + '.AddAttrMap');
  if not _IsPublishedProp(AAttrName) then
    raise Exception.Create(
      AAttrName + ' is not a published property on ' +
      PerObjAbsClass.ClassName + tiLineEnd +
      '. Called in ' + ClassName + '.AddAttrMap');
  Result          := TtiAttrMap.Create;
  Result.AttrName := AAttrName;
  Result.ObjectState := posClean;
  Add(Result);
end;   


Edit:

Eben ist mir aufgefallen, dass in einem Beispielprojekt in der BOM der Fremdschlüssel markiert ist.
Den fetten Part habe ich nicht in der contact_bom.pas:

GTIOPFManager.ClassDBMappingMgr.RegisterMapping(TBaseBusiness,
'ctr_Business','Owner.OID', 'OIDContactTitle', [pktFK]);

Ändert aber erst mal nichts.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Antworten