Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Zum gewünschten Datensatz springen (https://www.delphipraxis.net/154378-zum-gewuenschten-datensatz-springen.html)

Metallicwar 8. Sep 2010 19:36

Datenbank: ADS • Version: 9 • Zugriff über: Delphi 9 Enterprise

Zum gewünschten Datensatz springen
 
Hallo zusammen,
hier erstmal mein Code, ich erkläre aber nochmal kurz:
Die ADSQuery holt sich Datensätze aus DB und schreibt diese in eine Checkbox. Die wo ich anhacke sollen dann ausgedruckt werden (Mitarbeiterausweis).
Mein Problem, mit dem ich mich heute Abend schon eine ganze Weile beschäftige ist folgendes:
Es wird immer nur der letzte Datenbankeintrag ausgedruckt. Das liegt warscheinlich dadran: SQL --> while not EoF, Datensätze aus DB (Datensatz 1, Datensatz2, etc...) holen und diese in die Checkbox schreiben. Der letzte Datensatz ist beispielsweise Datensatz 4, an diesem bleibt die ADSQuery stehn --> Datensätze in Checkbox schreiben --> Items anhacken --> Frames werden erstellt (allerdings alle Frames mit Inhalt des Datensatzes 4. (Inhalt der Frames, cxDBLabels, mit Bindung an die ADSQuery.)
Ich hoffe mal ihr versteht mein Problem und hoffe mal ihr könnt mir weiter helfen.
Was könnte ich tun und wo am Besten im Code einbauen?
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, adsdata, adsfunc, adstable, adscnnct, StdCtrls, CheckLst, Unit4,
  Contnrs, Buttons, ComCtrls, ExtCtrls, Printers;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    btnAlle: TButton;
    btnKeine: TButton;
    CheckListBox1: TCheckListBox;
    cZMIZime: TAdsConnection;
    DataSource1: TDataSource;
    AdsQuery1: TAdsQuery;
    bitbtnDrucken: TBitBtn;
    Panel1: TPanel;
    ProgressBar1: TProgressBar;
    Label2: TLabel;
    Label3: TLabel;
    procedure btnAlleClick(Sender: TObject);
    procedure btnKeineClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure bitbtnDruckenClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Formular: TForm;
  Frames: TFrame4;
  L: TComponentList;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.BitBtnDruckenClick(Sender: TObject);
var
  iChecked, iGesamt, iZaehler, iGecheckteItems, iY, iRunter, iErstellteFrames, i: Integer; // hier schon einrücken
begin
  Formular := TForm.Create(Self);
  Formular.ClientHeight := 2000;
  Formular.ClientWidth := 900;
  L := TComponentList.Create;
  L.OwnsObjects := False;
  iGecheckteItems := 0;
  iErstellteFrames := 0;
  iGesamt := 0;
  iY := 0;
  iRunter := 0;
  iZaehler := 0;
  for iChecked := 0 to CheckListBox1.Items.Count - 1 do
    begin
    if CheckListBox1.Checked[iChecked] then
      iGesamt := iGesamt + 1;
    end;

  for iGecheckteItems := 0 to CheckListBox1.Items.Count - 1 do
  begin
    if CheckListBox1.Checked[iGecheckteItems] then
    begin
      if iZaehler < 10 then
      begin
        Frames := TFrame4.Create(Self);
        L.Add(Frames);
        Frames.ClientHeight := 200;
        Frames.Name:='';
        iZaehler := iZaehler + 1;
        iErstellteFrames := iErstellteFrames + 1;
        Frames.Parent := Formular;

        if iErstellteFrames = iGesamt then
          Formular.Print;
      end;

      case iZaehler of
        10: begin
              for I := l.Count -1 downto 0 do
              begin
                Frames:= (L[i] as TFrame4);
                Frames.Free;
                iZaehler := 0;
              end;
              if iErstellteFrames = iGesamt then
                Formular.Print;
            end;
         0: begin
              Frames.Top := iY;
            end;
      2..5: begin
              Frames.Top := iY + Frames.ClientHeight;
              iY := Frames.Top;
              Frames.Parent := Formular;
            end;
         6: begin
              Frames.ClientHeight := 200;
              Frames.Name := '';
              Frames.Left := 350;
            end;
      7..9: begin
              Frames.Left := 350;
              Frames.Top := iRunter + Frames.ClientHeight;
              iRunter:= Frames.Top;
            end;
      end;
    end;
    //Form1.AdsQuery1.Next;
    //Formular.Show;
  end;
end;

procedure TForm1.btnAlleClick(Sender: TObject);
var
  ichecked: Integer;
begin
  for ichecked := 0 to CheckListbox1.Count - 1 do
    CheckListBox1.Checked[ichecked] := True;
end;

procedure TForm1.btnKeineClick(Sender: TObject);
var
  ichecked: Integer;
begin
  for ichecked := 0 to CheckListbox1.Count - 1 do
    CheckListBox1.Checked[ichecked]:= False;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  sName: String;
begin
  Panel1.Visible:= False;
  with AdsQuery1 do
  begin
    Active:=True;
    while not Eof do
    begin
      sname := FieldByName('name').AsString + ', ' + FieldByName('Vorname').AsString;
      CheckListBox1.Items.AddObject(sName,TObject(FieldByName('id').AsInteger));
      Next;
    end;
  end;
end;

end.

haentschman 8. Sep 2010 19:40

AW: Zum gewünschten Datensatz springen
 
Hallo...

Zitat:

Die ADSQuery holt sich Datensätze aus DB und schreibt diese in eine Checkbox.
heißt das, daß du für jeden Datensatz eine Checkbox erzeugst ?

ok... CheckListBox

du machst folgendes:
- Du gehst die Query durch um die ListBox zu füllen
-> damit steht der Datensatzzeiger auf dem letzten Datensatz
- dann hast du die Schleife über die ListBox. Der Datensatzzeiger steht aber trotzdem immer noch auf dem letzten.
- du mußt den Datensatzzeiger mit deiner Schleife mitführen (Wenn du die Daten aus der Query holst)

Stichworte:
Query.First um an den Anfang zu setzen
Query.RecNo:= ichecked +1
Query.Next

Bummi 8. Sep 2010 19:50

AW: Zum gewünschten Datensatz springen
 
Wenn Du bei Deinem Ansatz beleiben willst, überschreibe den Konstruktor von TFrame4

ruf Ihn mit Frames := TFrame4.Create(Self,Integer(CheckListBox1.Items.Ob jects[iGecheckteItems]));

auf und verwalte dort Dein eigenes Dataset das mit "where ID = DeinConstrutorParameter"
geöffnet wird...

Ansonsten würde ich hier z.B. Fastreports mit einem Dataset mit "where in in (VonDirGefüllt)' bevorzugen

Metallicwar 8. Sep 2010 20:19

AW: Zum gewünschten Datensatz springen
 
hi, danke erstmal für die Antworten:
Ich habe es mit der Methode von haentschman probiert:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, adsdata, adsfunc, adstable, adscnnct, StdCtrls, CheckLst, Unit4,
  Contnrs, Buttons, ComCtrls, ExtCtrls, Printers;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    btnAlle: TButton;
    btnKeine: TButton;
    CheckListBox1: TCheckListBox;
    cZMIZime: TAdsConnection;
    DataSource1: TDataSource;
    AdsQuery1: TAdsQuery;
    bitbtnDrucken: TBitBtn;
    Panel1: TPanel;
    ProgressBar1: TProgressBar;
    Label2: TLabel;
    Label3: TLabel;
    procedure btnAlleClick(Sender: TObject);
    procedure btnKeineClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure bitbtnDruckenClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Formular: TForm;
  Frames: TFrame4;
  L: TComponentList;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.BitBtnDruckenClick(Sender: TObject);
var
  iChecked, iGesamt, iZaehler, iGecheckteItems, iY, iRunter, iErstellteFrames, i: Integer; // hier schon einrücken
begin
  Formular := TForm.Create(Self);
  Formular.ClientHeight := 2000;
  Formular.ClientWidth := 900;
  L := TComponentList.Create;
  L.OwnsObjects := False;
  iGecheckteItems := 0;
  iErstellteFrames := 0;
  iGesamt := 0;
  iY := 0;
  iRunter := 0;
  iZaehler := 0;
  Form1.AdsQuery.First;
  for iChecked := 0 to CheckListBox1.Items.Count - 1 do
    begin
    if CheckListBox1.Checked[iChecked] then
      iGesamt := iGesamt + 1;
    end;

  for iGecheckteItems := 0 to CheckListBox1.Items.Count - 1 do
  begin
    if CheckListBox1.Checked[iGecheckteItems] then
    begin
      if iZaehler < 10 then
      begin
        Frames := TFrame4.Create(Self);
        L.Add(Frames);
        Frames.ClientHeight := 200;
        Frames.Name:='';
        iZaehler := iZaehler + 1;
        iErstellteFrames := iErstellteFrames + 1;
        Frames.Parent := Formular;4
   Form1.AdsQuery1.RecNo := ichecked + 1;

        if iErstellteFrames = iGesamt then
          Formular.Print;
      end;

      case iZaehler of
        10: begin
              for I := l.Count -1 downto 0 do
              begin
                Frames:= (L[i] as TFrame4);
                Frames.Free;
                iZaehler := 0;
              end;
              if iErstellteFrames = iGesamt then
                Formular.Print;
            end;
         0: begin
              Frames.Top := iY;
            end;
      2..5: begin
              Frames.Top := iY + Frames.ClientHeight;
              iY := Frames.Top;
              Frames.Parent := Formular;
            end;
         6: begin
              Frames.ClientHeight := 200;
              Frames.Name := '';
              Frames.Left := 350;
            end;
      7..9: begin
              Frames.Left := 350;
              Frames.Top := iRunter + Frames.ClientHeight;
              iRunter:= Frames.Top;
            end;
      end;
    end;
    Form1.AdsQuery1.Next;
  end;
end;

procedure TForm1.btnAlleClick(Sender: TObject);
var
  ichecked: Integer;
begin
  for ichecked := 0 to CheckListbox1.Count - 1 do
    CheckListBox1.Checked[ichecked] := True;
end;

procedure TForm1.btnKeineClick(Sender: TObject);
var
  ichecked: Integer;
begin
  for ichecked := 0 to CheckListbox1.Count - 1 do
    CheckListBox1.Checked[ichecked]:= False;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  sName: String;
begin
  Panel1.Visible:= False;
  with AdsQuery1 do
  begin
    Active:=True;
    while not Eof do
    begin
      sname := FieldByName('name').AsString + ', ' + FieldByName('Vorname').AsString;
      CheckListBox1.Items.AddObject(sName,TObject(FieldByName('id').AsInteger));
      Next;
    end;
  end;
end;

end.
Hoffe mal du / ihr seht wo ich deine Vorschläge eingebaut habe... Es ändert sich auch was, nur leider wieder etwas falsch ^^

Außerdem hab ich noch eine Hinweismeldung erhalten:
w1037-FOR-Schleifenvariable 'ichecked' kann nach Durchlauf undefiniert sein.

haentschman 8. Sep 2010 20:29

AW: Zum gewünschten Datensatz springen
 
wenn du
Zitat:

Form1.AdsQuery1.RecNo := ichecked + 1;
hast brauchst du nicht mehr
Zitat:

Form1.AdsQuery1.Next;
benutzen. RecNo setzt auf den entsprechenden Datensatz, Next rückt immer einen weiter. Welche Variante für dich besser ist entscheidest du. Ich würde in diesem Falle RecNo bevorzugen.

Nachtrag: das ichecked+1 geht so nicht. iGecheckteItems + 1 sollte da besser sein:zwinker:
...sollte die Ursache für
Zitat:

w1037-FOR-Schleifenvariable 'ichecked' kann nach Durchlauf undefiniert sein.
sein.

Metallicwar 8. Sep 2010 20:50

AW: Zum gewünschten Datensatz springen
 
Ohhh man, wer suche der findet.. Ich nicht^^ :D :D
Habs bestimmt mal wieder in die falsche Zeile geschrieben

Delphi-Quellcode:

procedure TForm1.BitBtnDruckenClick(Sender: TObject);
var
  iChecked, iGesamt, iZaehler, iGecheckteItems, iY, iRunter, iErstellteFrames, i: Integer; // hier schon einrücken
begin
  Formular := TForm.Create(Self);
  Formular.ClientHeight := 2000;
  Formular.ClientWidth := 900;
  L := TComponentList.Create;
  L.OwnsObjects := False;
  iGecheckteItems := 0;
  iErstellteFrames := 0;
  iGesamt := 0;
  iY := 0;
  iRunter := 0;
  iZaehler := 0;
  Form1.AdsQuery.First;
  for iChecked := 0 to CheckListBox1.Items.Count - 1 do
    begin
    if CheckListBox1.Checked[iChecked] then
      iGesamt := iGesamt + 1;
    end;

  for iGecheckteItems := 0 to CheckListBox1.Items.Count - 1 do
  begin
    if CheckListBox1.Checked[iGecheckteItems] then
    begin
      if iZaehler < 10 then
      begin
        Frames := TFrame4.Create(Self);
        L.Add(Frames);
        Frames.ClientHeight := 200;
        Frames.Name:='';
        iZaehler := iZaehler + 1;
        iErstellteFrames := iErstellteFrames + 1;
        Frames.Parent := Formular;4
   Form1.AdsQuery1.RecNo := ichecked + 1;
......
und unten eben dieses Form1.AdsQuer1.Next rausgenommen.
Habe jetzte nur noch AdsQuery1.First und RecNo in Verwendung. Jetzte wird mir aber nur der erste Datensatz angezeigt vorher wars eben der letzte jeztte ist es der Erste.

Metallicwar 8. Sep 2010 21:46

AW: Zum gewünschten Datensatz springen
 
mhhm ganze Zeit am testen und ausprobieren, aber er zeigt mir immer den selben Ausweis an. Manchmal den Ersten dann mal den zweiten.. aber nie unteschiedliche..
was mach ich falsch? :)

joachimd 9. Sep 2010 09:50

AW: Zum gewünschten Datensatz springen
 
Zitat:

Zitat von Metallicwar (Beitrag 1048304)
mhhm ganze Zeit am testen und ausprobieren, aber er zeigt mir immer den selben Ausweis an. Manchmal den Ersten dann mal den zweiten.. aber nie unteschiedliche..
was mach ich falsch? :)

Vergiss mal die Recno ... die ist nämlich wenig aussagekräftig;)
Hast Du eine eindeutige Id auf Deinem Dataset? Wenn ja, speichere diese in Checklistbox.Items.Objects und mach dann ein Locate auf der Query.

Metallicwar 9. Sep 2010 10:05

AW: Zum gewünschten Datensatz springen
 
Hallo zusammen, ich hab dass jetzte ein bisschen anderst gelöst:

Delphi-Quellcode:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, adsdata, adsfunc, adstable, adscnnct, StdCtrls, CheckLst, fAusweis,
  Contnrs, Buttons, ComCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    btnAlle: TButton;
    btnKeine: TButton;
    Label1: TLabel;
    CheckListBox1: TCheckListBox;
    bitbtnDrucken: TBitBtn;
    cZMIZime: TAdsConnection;
    qryGetDAta: TAdsQuery;
    DataSource1: TDataSource;
    qryGetDAtaName: TAdsStringField;
    qryGetDAtaVorname: TAdsStringField;
    qryGetDAtaBezeichnung: TAdsStringField;
    qryGetDAtaAustritt: TDateField;
    qryGetDAtaBezeichnung_1: TAdsStringField;
    qryGetDAtaStrasse: TAdsStringField;
    qryGetDAtaPlz: TAdsStringField;
    qryGetDAtaOrt: TAdsStringField;
    qryGetDAtaID: TIntegerField;
    qryGetDAtaZusatz: TAdsStringField;
    procedure btnAlleClick(Sender: TObject);
    procedure btnKeineClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure bitbtnDruckenClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Formular: TForm;
  Frames: TFrameAusweis;
  L: TComponentList;

implementation

{$R *.dfm}

procedure TForm1.bitbtnDruckenClick(Sender: TObject);
var
  iChecked, iGesamt, iZaehler, iGecheckteItems, iY, iRunter, iErstellteFrames, i: Integer; // hier schon einrücken
begin
  Formular := TForm.Create(Self);
  Formular.ClientHeight := 1800;
  Formular.ClientWidth := 670;
  L := TComponentList.Create;
  L.OwnsObjects := False;
  iGecheckteItems := 0;
  iErstellteFrames := 0;
  iGesamt := 0;
  iY := 0;
  iRunter := 0;
  iZaehler := 0;
  Form1.qryGetDAta.First;
  for iChecked := 0 to CheckListBox1.Items.Count - 1 do
    begin
    if CheckListBox1.Checked[iChecked] then
      iGesamt := iGesamt + 1;
    end;

  for iGecheckteItems := 0 to CheckListBox1.Items.Count - 1 do
  begin
    if CheckListBox1.Checked[iGecheckteItems] then
    begin
      if iZaehler < 10 then
      begin
        Frames := TFrameAusweis.Create(Self);
        L.Add(Frames);
        Frames.ClientHeight := 200;
        Frames.Name:='';

        Frames.lNachname.Caption := qryGetDAtaName.Value;

        Frames.lVorname.Caption := qryGetDAtaVorname.Value;

        Frames.lPLZ.Caption := qryGetDAtaPlz.Value;

        Frames.lOrt.Caption := qryGetDAtaOrt.Value;

        Frames.lStraße.Caption := qryGetDAtaStrasse.Value;

        Frames.lFirmenname.Caption := qryGetDAtaBezeichnung_1.Value;

        Frames.lZusatz.Caption := qryGetDAtaZusatz.Value;

        Frames.lAbteilung.Caption := qryGetDAtaBezeichnung.Value;

        iZaehler := iZaehler + 1;
        iErstellteFrames := iErstellteFrames + 1;
        Frames.Parent := Formular;
        if iErstellteFrames = iGesamt then
          begin
          Formular.Show;
          end;
      end;

      case iZaehler of
        10: begin
              for I := l.Count -1 downto 0 do
              begin
                Frames:= (L[i] as TFrameAusweis);
                Frames.Free;
                iZaehler := 0;
              end;
              if iErstellteFrames = iGesamt then
                begin
                Formular.Show;
                end;
            end;
         0: begin
              Frames.Top := iY;
            end;
      2..5: begin
              Frames.Top := iY + Frames.ClientHeight;
              iY := Frames.Top;
              Frames.Parent := Formular;
            end;
         6: begin
              Frames.ClientHeight := 200;
              Frames.Name := '';
              Frames.Left := 350;
            end;
      7..9: begin
              Frames.Left := 350;
              Frames.Top := iRunter + Frames.ClientHeight;
              iRunter:= Frames.Top;
            end;
      end;
    end;
    qryGetDAta.Next;
    Formular.Show;
  end;
end;

procedure TForm1.btnAlleClick(Sender: TObject);
var
  ichecked: Integer;
begin
  for ichecked := 0 to CheckListbox1.Count - 1 do
    CheckListBox1.Checked[ichecked] := True;
end;

procedure TForm1.btnKeineClick(Sender: TObject);
var
  ichecked: Integer;
begin
  for ichecked := 0 to CheckListbox1.Count - 1 do
    CheckListBox1.Checked[ichecked]:= False;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  sName: String;
begin
  with qryGetDAta do
  begin
    Active:=True;
    while not Eof do
    begin
      sname := FieldByName('name').AsString + ', ' + FieldByName('Vorname').AsString;
      CheckListBox1.Items.AddObject(sName,TObject(FieldByName('id').AsInteger));
      Next;
    end;
  end;
end;

end.
Danke dennoch für die Hilfe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:56 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