AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Zuweisung KeyFields zur Laufzeit

Zuweisung KeyFields zur Laufzeit

Ein Thema von denny85 · begonnen am 21. Apr 2020 · letzter Beitrag vom 27. Apr 2020
Antwort Antwort
denny85

Registriert seit: 15. Apr 2020
3 Beiträge
 
Delphi 10.3 Rio
 
#1

Zuweisung KeyFields zur Laufzeit

  Alt 21. Apr 2020, 10:05
Datenbank: MongoDB • Version: 4.2.3 • Zugriff über: FireDAC NoSQL
Hallo,

ich teste im Moment ein wenig mit Delphi Rio 10.3 und MongoDB. Hierbei habe ich derzeit ein Problem mit der Feldlängenermittlung. Es scheint, als ob Delphi immer nur das als Feldlänge in Stringfeldern zulässt, was beim "Fetch" als längstes Feld im Datenbestand aktuell vorhanden ist unabhängig von der im Objektinspektor eingetragenen Feldlänge. MongoDB kennt nur pauschal String. Ich nutze eine TFDMongoConnection und TFDMongoQuery und habe hier schon erfolglos quer durch mögliche Einstellungen experimentiert. Hinweise hierzu weiterhin herzlich Willkommen.

Mittlerweile habe ich festgestellt, dass die Feldlängen wie vorgegeben genutzt werden können, wenn ich die Feldzuweisung nicht im Entwurf sondern wie folgend zur Laufzeit vornehme.
Delphi-Quellcode:
  with qrTest1.FieldDefs do
  begin
    Add('_id', ftString, 24);
    Add('name', ftString, 10);
    Add('Bezeichnung', ftString, 10);
  end;
Leider stehe ich gerade bei Objekten und der dynamischen Zuweisung auf dem Schlauch. Nach Erstellung im Objektinspektor finde ich im dfm folgendes (übrigens mit Feldlängenproblem):
Delphi-Quellcode:
    object qrTest2ipvoice: TADTField
      FieldName = 'ipvoice'
      object qrTest2ipvoiceaddress: TWideStringField
        FieldName = 'address'
        KeyFields = 'ipvoice'
        Size = 10
      end
      object qrTest2ipvoicemask: TWideStringField
        FieldName = 'mask'
        KeyFields = 'ipvoice'
        Size = 15
      end
      object qrTest2ipvoicegw: TWideStringField
        FieldName = 'gw'
        KeyFields = 'ipvoice'
        Size = 11
      end
    end
Hier weiß ich nicht so recht, wie ich das zwingend notwendige KeyField im Objekt mit zugewiesen bekomme ohne den Fehler "Feld nicht gefunden" oder dergleichen zu erhalten. Hat hier jemand eine Idee?

Grüße Denny

Ps: Solltest ihr eine Vorstellungsrunde haben (spontan nichts gefunden) kann ich gern auch noch etwas zu mir schreiben.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: Zuweisung KeyFields zur Laufzeit

  Alt 21. Apr 2020, 16:36
Nur mal so auf dem Trockenen, da ich das hier nicht testen oder nachvollziehen kann.

Was sollen die Keyfields sein?
Wie sieht mal so platt gefragt, Dein Document aus?

Ich kenne in Document DB key : value Datenhaltung, das scheint aber nicht zu den dargestellten Fieldname, Keyfields zu passen.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.993 Beiträge
 
Delphi 12 Athens
 
#3

AW: Zuweisung KeyFields zur Laufzeit

  Alt 21. Apr 2020, 16:50
Was sollen die Keyfields sein?
KeyFields werden eigentlich für Lookup-Fields verwendet. Vermutlich kommen sie hier aus dem übergeordneten ADT-Field, dessen FieldName sich in diesen KeyFields Properties wiederfindet.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#4

AW: Zuweisung KeyFields zur Laufzeit

  Alt 21. Apr 2020, 17:09
KeyFields werden eigentlich für Lookup-Fields verwendet. ..
Genau, klassiche LookupComboboxen kenne ich. Das hier kenne ich anscheinend nicht.
Gruß, Jo
  Mit Zitat antworten Zitat
denny85

Registriert seit: 15. Apr 2020
3 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Zuweisung KeyFields zur Laufzeit

  Alt 23. Apr 2020, 15:32
Hallo,

vielen Dank für eure Antworten.

Ich habe mal versucht Ausgangsbasis und Ablauf im Anhang etwas darzustellen. Keyfields glaube ich einsetzen zu müssen um zugreifen zu können (nach try and error festgestellt ). Ursache ist wie vermutet der übergeordnete ADT.

Die Zugriffe funktionieren grundsätzlich erste einmal auch beim Zurückschreiben. Nur bekomme ich immer wieder Probleme mit der Feldlänge wie begrenzte Eingabelänge in DBEdits, abgeschnittene Bezeichnungen, Fehler beim Scrollen wenn ich nur über den Objektinspektor arbeite. Zur Laufzeit zugewiesen passiert dies nicht mehr. Leider bekomme ich da gerade an dieser Stelle nicht die Brücke geschlagen auch diese Objekte zur Laufzeit zu zuweisen.

Nachbauversuche wie folgender enden in "Feld nicht gefunden" an der Stelle KeyFields.
Delphi-Quellcode:
  with qrTest.FieldDefs do
  begin
    Add('_id', ftString, 24);
    Add('ipvoice', ftADT);
    Add('ipvoice.address', ftString, 15);
  end;
  qrTest.FieldByName('ipvoice.address').KeyFields := 'ipvoice';
Bei den relationalen Datenbanken hatte ich solche Probleme bisher nicht, da passte die Feldlänge im Objektinspektor zur Datenbank. Bei MongoDB habe ich da so meine Sorgen...

Grüße Denny
Miniaturansicht angehängter Grafiken
ablauf-zuweisung.jpg  
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#6

AW: Zuweisung KeyFields zur Laufzeit

  Alt 23. Apr 2020, 21:18
Der gesamte Zusammenhang bei Dir fehlt mir immer noch. Aber das ist auch Wurscht.

Ich arbeite gerade mit MongoDB, daher interessiert es mich ein wenig. Und was ich etwas verwunderlich finde:
Feldlängen, Fielddefs, ... das klingt alles sehr statisch. Das klingt nach dem Gegenteil von MongoDB.
Ich meine Delphi und MongoDB klingt nicht nach einem natural fit. Wieso nimmt man Delphi für MongoDB, wo kein einziges Feld garantiert ist, geschweige welche Längen da vorkommen?

Mein Tipp: Verschiedene Stadien im Formular Editor speichern und die Formdaten untersuchen.

Hier ist noch ein Hinweis, der sagt, man baut erst die Fields und setzt dann das Parent ADTField. Auch interessant der Hinweis auf Unterschiede beim Field Editor der IDE und dem Fielddefs Editor.
https://stackoverflow.com/questions/...fields-in-code
Gruß, Jo
  Mit Zitat antworten Zitat
denny85

Registriert seit: 15. Apr 2020
3 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Zuweisung KeyFields zur Laufzeit

  Alt 27. Apr 2020, 15:24
Hallo Jo,

vielen Dank für deine schnelle Rückantwort und vor allem auch für das sehr gute Beispiel. Hiermit konnte ich meine Zuweisung tatsächlich passend umbauen.
Delphi-Quellcode:
  ADTField := TADTField.Create(nil);
  ADTField.FieldName := 'ipvoice';
  ADTField.DataSet := FDMongoQuery;

  Field := TWideStringField.Create(nil);
  Field.FieldName := 'address';
  Field.Size := 15;
  Field.DataSet := FDMongoQuery;
  Field.ParentField := ADTField;

  FDMongoQuery.Open;

  FDMongoQuery.Insert;
  ADTField.Fields.FieldByName('address').AsString := '192.168.222.111';
  FDMongoQuery.Post;
Leider ändert das in diesem Fall anscheinend nichts am „Abschneiden“ nach dem Post.

Zur Erläuterung und hoffentlich die Antwort auf deine Frage: Die MongoDB mit den Objekten ist so vorgegeben und wird auch anderweitig bereits verwendet. Ich hatte die Hoffnung mittels Delphi die Anpassung von Daten vereinfacht zu bekommen, in dem ich beispielsweise in einem Grid die IP-Adressen schnell anpassen und zurückschreiben kann. Einen Teil der Adressen möchte ich weiterhin gern in einer Schleife durchlaufen und zurückschreiben um Arbeitsaufwand und Fehleranfälligkeit zu verringern.

Ich habe bis 2010 mit Delphi Software entwickelt (Oracle mit OraTools, MS SQL-Server mit ADO). Bin danach aber von der Softwareentwicklung weg gegangen. Daher wohl auch der statische Ansatz und der Gedanke mir bekannte DB-Komponenten nutzen zu können. MongoDB und NoSQL waren mir bis vor kurzem völlig unbekannt. Delphi ist wiederum die einzige Sprache mit der ich bisher Programmiererfahrung habe.

Grüße Denny

Edit: Ich habe jetzt mal das mitgelieferte Restaurants-Beispiel zerlegt und sollte nun die Lösung für das Zurückschreiben gefunden haben. Ich probier nochmal und schreibe dann gern die Lösung abschließend hier rein.

Geändert von denny85 (27. Apr 2020 um 16:52 Uhr) Grund: Lösung
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#8

AW: Zuweisung KeyFields zur Laufzeit

  Alt 27. Apr 2020, 21:16
Schön! Das Beispiel ist ja nicht von mir.
Ist das nun die vollständige Lösung mit passenden Längen?

Dein Ansatz ist verständlich, aber ich weiß nicht, ob es ein gute Entscheidung ist. Vielleicht ist alles übersichtlich genug und der Aufwand hält sich in Grenzen.

Letztlich ist MongoDB nicht nur die Feldlänge egal, auch die Struktur des Dokuments. Wenn man in Delphi damit arbeitet, sollte man sich also vielleicht in diese Richtung bewegen. MongoDB hat letztlich kein nennenswertes Verhalten eines RDBMS, das für Struktur oder Zusicherung von Eigenschaften sorgt. Die Struktur der Dokumente wird eigentlich nur durch die Anwendung definiert. Sobald man 2 Anwendungen gegen eine DB schreibend einsetzt, beginnt dann der Eiertanz. Es ist dann maximal als Konvention zu bezeichnen, welche Daten wie in der DB stehen, vielleicht auch eher nur als Wette.

Wenn Du Delphi einsetzen möchtest, wäre es vielleicht sinnvoll, eine REST API zu entwerfen und zu implementieren. Das macht aber auch eigentlich auch nur Sinn, wenn alle "Apps" diese benutzen, statt im Direktzugriff in die MongoDB zu schreiben.

Hier ist noch ein Thread mit "Material"
https://www.delphipraxis.net/181405-nosql-mongodb.html
Gruß, Jo
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 01:40 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