AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dictionary Probleme

Ein Thema von haentschman · begonnen am 22. Okt 2016 · letzter Beitrag vom 22. Okt 2016
Antwort Antwort
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.387 Beiträge
 
Delphi 12 Athens
 
#1

Dictionary Probleme

  Alt 22. Okt 2016, 12:53
Delphi-Version: 10 Seattle
Hallöle...

Ich bin am Modernisieren eines D5 Codes. Das bedeutet das ich viele Codenstellen erst in Generics austauschen muß. Das nimmt mir die Sichtbarkeit einer TObjectList z.B... Das Ergebnis ist eine TObjectliste mit Objekten die in der Schleife des Datasets produziert werden.

Gegeben ein Dataset (Query) unsortiert (fragt nicht warum... anders geht es nicht...sonst hätte ich die Probleme nicht) mit einer NUMMER(Feldname) (kann mehrfach vorkommen) und DETAILDATEN(Feldname).
Bsp:
NUMMER DETAILDATEN
1 1
1 2
2 2
1 3

Auf Grund der NICHT bestehen Sortierung wollte ich die Objekte anders zusammen setzen.
Prinzip:
1. Existiert das Objekt mit der NUMMER gehe zu 3. ansonsten erzeuge das Objekt bei 2.
2. Erzeuge das Objekt -> merken im Dictionary + in die Ergebnisliste
3. Detaildaten erzeugen (Liste)
4. Dictionary wegwerfen da alle Objekte in der Liste sind
Delphi-Quellcode:
Dict := TDictionary<string, Objekt>.Create;
.
.
while not DataSet.Eof do begin // ! unabhängig von der SQL Sortierung
  if Dict.TryGetValue(DataSet.FieldByName('NUMMER').AsString, Objekt) then begin
     // neues Objekt bei Änderung Nummer, ansonsten das Objekt aus dem Dictionary für die Detaildaten
    Objekt:= TObjekt.Create;
    Objekt.Number:= DataSet.FieldByName('NUMMER').AsString;
    ErgebnisListe.Add(Objekt); // sollte mit dem Pointer aus der Liste übereinstimmen ?
    Dict.Add(Objekt.Number, Objekt); // sollte mit dem Pointer aus der Liste übereinstimmen ?
  end;
  if DataSet.FieldByName('DETAILDATEN').AsString > '') then begin
    Detail:= TDetail.Create;
    Detail.Number:= Object.Number;
    Detail.Detaildaten := DataSet.FieldByName('DETAILDATEN').AsString;
    Objekt.DetailListe.Add(Detail); // Objekt sollte mit dem Pointer aus dem Dict übereinstimmen ?
  end;
  DataSet.Next;
end;
.
.
Dict.Free;
Es sieht danach aus das die Detailobjekte im Dictionary aktualisiert werden aber die Objekte in der Liste nicht. Wenn ich das ,temporäre' Dict wegwerfe das ist nur noch die Liste mit den Detaildaten.
Die Preisfrage ist ob die Objekte im Dict und der Liste den gleichen Pointer haben...

PS: Wenn ich das Dict weglasse sind zwar die Detaildaten da aber auch die Duplikate.(NUMMER)
PS: Die Ergebnisliste zu sortieren bringt nix da eigentlich nur eindeutige Objekte (NUMMER) enthalten sind.

PS: Sonst bleibt nur der Klassiker über die Suche in der Ergeblisliste und dem Iterieren;

Bitte erhellt mich.

Geändert von haentschman (22. Okt 2016 um 18:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Dictionarry Probleme

  Alt 22. Okt 2016, 13:32
Bin mir nicht sicher, aber das
if Dict.TryGetValue(DataSet.FieldByName('NUMMER').AsString, Objekt) then begin
sieht mir so aus, als fehlt da ein not .
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.387 Beiträge
 
Delphi 12 Athens
 
#3

AW: Dictionarry Probleme

  Alt 22. Okt 2016, 14:12
Danke...
Das ist ein Copy / Paste Fehler.

... war ein Test.

Korrekt:
Delphi-Quellcode:
if not Dict.TryGetValue(DataSet.FieldByName('NUMMER').AsString, Objekt) then begin
begin
Nachtrag:
Ich habe es jetzt mit dem Iterieren gemacht. Vieleicht hat jemand eine Idee was ich falsch gemacht habe.
Danke an Alle...

Geändert von haentschman (22. Okt 2016 um 18:07 Uhr)
  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 06:50 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