![]() |
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. |
AW: Zum gewünschten Datensatz springen
Hallo...
Zitat:
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 |
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 |
AW: Zum gewünschten Datensatz springen
hi, danke erstmal für die Antworten:
Ich habe es mit der Methode von haentschman probiert:
Delphi-Quellcode:
Hoffe mal du / ihr seht wo ich deine Vorschläge eingebaut habe... Es ändert sich auch was, nur leider wieder etwas falsch ^^
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. Außerdem hab ich noch eine Hinweismeldung erhalten: w1037-FOR-Schleifenvariable 'ichecked' kann nach Durchlauf undefiniert sein. |
AW: Zum gewünschten Datensatz springen
wenn du
Zitat:
Zitat:
Nachtrag: das ichecked+1 geht so nicht. iGecheckteItems + 1 sollte da besser sein:zwinker: ...sollte die Ursache für Zitat:
|
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:
und unten eben dieses Form1.AdsQuer1.Next rausgenommen.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; ...... 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. |
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? :) |
AW: Zum gewünschten Datensatz springen
Zitat:
Hast Du eine eindeutige Id auf Deinem Dataset? Wenn ja, speichere diese in Checklistbox.Items.Objects und mach dann ein Locate auf der Query. |
AW: Zum gewünschten Datensatz springen
Hallo zusammen, ich hab dass jetzte ein bisschen anderst gelöst:
Delphi-Quellcode:
Danke dennoch für die Hilfe.
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz