for ... in bei TFDQuery

    for ... in bei TFDQuery

    Hallo,

    ich nutze zur Zeit exzessiv die FireDAC - Queries. (Delphi Berlin)
    Dabei kommen sehr oft do-while - Konstrukte vor.

    Frage: Gibt es die sehr schicken und modernen for...in Schleifen auch für das Durchmustern eines Datasets ?
    Bsp:

    Delphi-Code

    1. AQuery.close;
    2. AQuery.open('Select * from kunden where sonstwas');
    3. AQuery.first;
    4. while not AQuery.eof do
    5. begin
    6. // hole Infos
    7. AQuery.next;
    8. end;


    soll zu

    Delphi-Code

    1. AQuery.close;
    2. AQuery.open('Select * from kunden where sonstwas');
    3. AQuery.first;
    4. for Satz in AQuery do
    5. begin
    6. // hole Infos
    7. end;


    Im Internet findet sich nichts.
    Kennt Ihr sowas ?

    ism

    Edit: Dabei könnte natürlich auch das zweite AQuery.First wegfallen...
    Morgen ist Heute schon Gestern
    Hallöle... 8o
    Kennt Ihr sowas ?

    ...in Verbindung mit Query?...nö. 8o
    Was gefällt dir an while/do nicht?

    Dabei könnte natürlich auch das zweite AQuery.First wegfallen...

    ...ich kenne keine Query die nach dem Open nicht automatisch auf FIRST sitzt. Das heißt das FIRST nicht nötig ist.

    Delphi-Code

    1. //AQuery.close; // vor dem Open wird die Datenmenge automatisch geschlossen
    2. AQuery.SQL.Text := 'Select * from kunden where sonstwas';
    3. AQuery.Open;
    4. //AQuery.first; // nach dem Open wird die Datenmenge automatisch auf FIRST gesetzt
    5. while not AQuery.Eof do
    6. begin
    7. // hole Infos
    8. AQuery.Next;
    9. end;


    docwiki.embarcadero.com/RADStu…ners_Using_For_statements
    The following classes and their descendants support the for-in syntax:
    Classes.TList
    Classes.TCollection
    Classes.TStrings
    Classes.TInterfaceList
    Classes.TComponent
    Menus.TMenuItem
    ActnList.TCustomActionList
    DB.TFields
    ComCtrls.TListItems
    ComCtrls.TTreeNodes
    ComCtrls.TToolBar

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „haentschman“ ()

    This isn't much simpler at all, in fact it is more complicated because anyone who has not seen this code before will have to try to work it out.

    And then there's always that annoying missing semicolon on the end of the anonymous method.

    Not really simpler at all.
    Pointless.

    Das sehe ich ähnlich.
    10 Minuten Nachdenken ersparen oftmals 10 Stunden Fehlersuche.
    Danke erstmal für die Antworten.
    Fazit: "Dann eben nicht" .

    Delphi enthält soviel syntaktischen Zucker, da hätte das auch nicht mehr geschadet.
    Das mit dem Query.Open ==> bin auf First war mir neu.
    Fazit: "Man lernt nie aus".

    Das Beispiel bei Anonymous (oder wars Embarcadero ?) ist akademisch und abgedreht. Pointless, auf gut Deutsch 8o

    Schönes WE,

    ism
    Morgen ist Heute schon Gestern
    Grundsatzlich wäre schon eine Forschleife denkbar, wenn man die RecNo benutzt. Sinnvoll wäre das aber nicht, weil in der Zwischenzeit vielleicht der eine oder andere Datensatz hinzukommen oder gelöscht werden könnte.

    Delphi-Code

    1. var i,z: Integer;
    2. begin
    3. AQuery.Last;
    4. z := AQuery.RecNo;
    5. for i := 1 to z do
    6. begin
    7. Query.RecNo := i;
    8. ...
    9. end;
    Hallo... 8o
    Jetzt habe ich den Faden verloren... :/ Die Schleifen dienen dazu den Inhalt der Query nach dem Öffnen zum Beispiel in Objekte zu wandeln und in eine Liste zu legen.
    Das Bearbeiten der Datensätze innerhalb der Schleife geht nur über EDIT / POST in jedem Durchlauf. ?(
    das Löschen und Bearbeiten von Datensätzen einfach unbemerkt bleiben.

    ...verstehe ich nicht. ?(

    Was willst du denn erreichen?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „haentschman“ ()

    ismirschlecht schrieb:


    Fazit: "Dann eben nicht" .
    Delphi enthält soviel syntaktischen Zucker, da hätte das auch nicht mehr geschadet.

    Wie wäre es damit:

    Delphi-Code

    1. unit DataSetHelper;
    2. interface
    3. uses
    4. Data.DB;
    5. type
    6. TInterfacedEnumerator = class(TInterfacedObject,IEnumerator)
    7. public
    8. procedure Reset; virtual; abstract;
    9. function GetCurrent: TObject; virtual; abstract;
    10. function MoveNext: Boolean; virtual; abstract;
    11. end;
    12. TDataSetEnumerator = class(TInterfacedEnumerator,IEnumerator<TDataSet>)
    13. private
    14. FDataSet: TDataSet;
    15. FIsFirst: Boolean;
    16. public
    17. constructor Create(const DataSet: TDataSet);
    18. procedure Reset; override;
    19. function GetCurrent: TDataSet; reintroduce;
    20. function MoveNext: Boolean; override;
    21. end;
    22. TDataSetHelper = class helper for TDataSet
    23. public
    24. function GetEnumerator: IEnumerator<TDataSet>;
    25. end;
    26. implementation
    27. //----------------------------------------------------------------------------------------------------------------------
    28. //TDataSetEnumerator
    29. constructor TDataSetEnumerator.Create(const DataSet: TDataSet);
    30. begin
    31. inherited Create;
    32. FDataSet:=DataSet;
    33. Reset;
    34. end;
    35. procedure TDataSetEnumerator.Reset;
    36. begin
    37. FDataSet.First;
    38. FIsFirst:=True;
    39. end;
    40. function TDataSetEnumerator.GetCurrent: TDataSet;
    41. begin
    42. Result:=FDataSet;
    43. end;
    44. function TDataSetEnumerator.MoveNext: Boolean;
    45. begin
    46. if FIsFirst
    47. then FIsFirst:=False
    48. else FDataSet.Next;
    49. Result:=not FDataSet.Eof;
    50. end;
    51. //----------------------------------------------------------------------------------------------------------------------
    52. //TDataSetHelper
    53. function TDataSetHelper.GetEnumerator: IEnumerator<TDataSet>;
    54. begin
    55. Result:=TDataSetEnumerator.Create(Self);
    56. end;
    57. //----------------------------------------------------------------------------------------------------------------------
    58. end.


    Und damit ist eine Iteration über for...in kein Problem mehr:

    Delphi-Code

    1. uses
    2. DataSetHelper;
    3. procedure TForm1.Button1Click(Sender: TObject);
    4. var
    5. DataSet: TDataSet;
    6. begin
    7. for DataSet in Table do
    8. Memo.Lines.Add(Format('%d: %s',[DataSet.FieldByName('ID').AsInteger,DataSet.FieldByName('Value').AsString]));
    9. end;


    Dateien
    • Screenshot.png

      (25,49 kB, 62 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thom“ ()