AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Zum gewünschten Datensatz springen
Thema durchsuchen
Ansicht
Themen-Optionen

Zum gewünschten Datensatz springen

Ein Thema von Metallicwar · begonnen am 8. Sep 2010 · letzter Beitrag vom 9. Sep 2010
Antwort Antwort
Metallicwar

Registriert seit: 5. Feb 2010
Ort: Bad Kissingen
293 Beiträge
 
Delphi XE Architect
 
#1

Zum gewünschten Datensatz springen

  Alt 8. Sep 2010, 20:36
Datenbank: ADS • Version: 9 • Zugriff über: Delphi 9 Enterprise
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.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

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

AW: Zum gewünschten Datensatz springen

  Alt 8. Sep 2010, 20:40
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

Geändert von haentschman ( 8. Sep 2010 um 20:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: Zum gewünschten Datensatz springen

  Alt 8. Sep 2010, 20:50
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
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Metallicwar

Registriert seit: 5. Feb 2010
Ort: Bad Kissingen
293 Beiträge
 
Delphi XE Architect
 
#4

AW: Zum gewünschten Datensatz springen

  Alt 8. Sep 2010, 21:19
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.

Geändert von Metallicwar ( 8. Sep 2010 um 21:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

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

AW: Zum gewünschten Datensatz springen

  Alt 8. Sep 2010, 21:29
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
...sollte die Ursache für
Zitat:
w1037-FOR-Schleifenvariable 'ichecked' kann nach Durchlauf undefiniert sein.
sein.

Geändert von haentschman ( 8. Sep 2010 um 21:36 Uhr)
  Mit Zitat antworten Zitat
Metallicwar

Registriert seit: 5. Feb 2010
Ort: Bad Kissingen
293 Beiträge
 
Delphi XE Architect
 
#6

AW: Zum gewünschten Datensatz springen

  Alt 8. Sep 2010, 21:50
Ohhh man, wer suche der findet.. Ich nicht^^
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.
  Mit Zitat antworten Zitat
Metallicwar

Registriert seit: 5. Feb 2010
Ort: Bad Kissingen
293 Beiträge
 
Delphi XE Architect
 
#7

AW: Zum gewünschten Datensatz springen

  Alt 8. Sep 2010, 22:46
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?
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
679 Beiträge
 
Delphi 12 Athens
 
#8

AW: Zum gewünschten Datensatz springen

  Alt 9. Sep 2010, 10:50
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.
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Metallicwar

Registriert seit: 5. Feb 2010
Ort: Bad Kissingen
293 Beiträge
 
Delphi XE Architect
 
#9

AW: Zum gewünschten Datensatz springen

  Alt 9. Sep 2010, 11:05
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.
  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:00 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