lazreport geht das nur über feste SQL abfragen ?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Biertrinker
Beiträge: 16
Registriert: Mo 18. Mär 2013, 17:19
OS, Lazarus, FPC: MAC OSX
CPU-Target: xxBit

lazreport geht das nur über feste SQL abfragen ?

Beitrag von Biertrinker »

Hallo,
ich möchte gern in mein PRG einen Report einbauen, nun habe ich schon einige
ANleitungen gegoogelt, aber be diesen ist immer eine feste abfrage in der
SQL-Komponente eingetragen,

Mein Prg habe ich aber so aufgebaut das die Abfragen im Quelltext stehen
und es nur eine SQL Komponente gibt welcher den abfragestring zugewiesen bekommt

Frage: bin ich jetzt in einer Sackgasse

oder kann mann einen Report auch erstellen ohne feste SQLabfragen in den Komponenten
einzutragen

Code: Alles auswählen

 
 
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, sqlite3conn, sqldb, db, FileUtil, TAGraph, TARadialSeries,
  TASeries, Forms, Controls, Graphics,
  Dialogs, StdCtrls, DBGrids, DbCtrls, ComCtrls, ExtDlgs, ExtCtrls, Grids,
 strutils;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Bu_grid: TButton;
    Bu_Einbuchen: TButton;
    But_Calender: TButton;
    CalendarDialog1: TCalendarDialog;
    Chart1: TChart;
    Chart1BarSeries1: TBarSeries;
    ComboKostenarten: TComboBox;
    Label2: TLabel;
    Label_datum: TLabel;
    LabeledEdit1: TLabeledEdit;
    LabeledEdit2: TLabeledEdit;
    LabeledEdit3: TLabeledEdit;
    LabeledEdit4: TLabeledEdit;
    PageControl1: TPageControl;
    SQLite3Connection: TSQLite3Connection;
    SQLQuery1: TSQLQuery;
    SQLTransaction1: TSQLTransaction;
    StringGrid1: TStringGrid;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Bu_EinbuchenClick(Sender: TObject);
    procedure But_CalenderClick(Sender: TObject);
    procedure Bu_gridClick(Sender: TObject);
    procedure ComboBox1Select(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure StringGrid1Enter(Sender: TObject);
    procedure TabSheet2Enter(Sender: TObject);
 
    procedure GRID1_fuellen();
    procedure alle_Daten_laden();
    procedure FEHLERBEHANDLUNG(fehlertext,fehlerinhalt:string);
    procedure benzinpreisdarstellung();
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  form1.Close;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin {
  SQLQuery1.close;
  SQLQuery1.SQL.Text:='select * from kostenarten';
  SQLQuery1.open;
  ComboBox1.Items.Clear;
  while SQLQuery1.EOF = false do
begin
 // ListBox1.Items.Add(SQLQuery1.FieldByName('id').AsString);
 
  ComboBox1.Items.Add(SQLQuery1.FieldByName('id').AsString);
  SQLQuery1.Next;
end;
}
 //
   benzinpreisdarstellung();
 
    end;
 
procedure TForm1.Bu_EinbuchenClick(Sender: TObject);
Var
  TT,MM,JJ:Word ;
  kmstand,benzinpreis,getanktemenge,kommentar, buchungsdatum,TTT : String;
  kostenart : integer;
  testvar1   : Real;
begin
   DecodeDate(CalendarDialog1.date,JJ,MM,TT);  // das Datum aufbröseln
   buchungsdatum:=(IntToStr(JJ)+'-'+IntToStr(MM)+'-'+IntToStr(TT));
   kostenart:=(ComboKostenarten.ItemIndex+1);
   kmstand:=LabeledEdit1.Text;
   kommentar:=LabeledEdit4.Text;
   benzinpreis:=StringReplace((LabeledEdit2.Text),',','.',[rfreplaceall]);
   getanktemenge:=StringReplace((LabeledEdit3.Text),',','.',[rfreplaceall]);
 
   try        // Testen das keine Buchstaben eingeben werden //
    StrToFloat(kmstand);
    StrToFloat(benzinpreis);
    StrToFloat(getanktemenge);
   Except
     FEHLERBEHANDLUNG('FEHLER','es könen nur Zahlen gebucht werden');
     exit    // Procedure abrechen = also keine SQL mehr ausführen //
   end;
 
   SQLQuery1.close;
 SQLQuery1.SQL.Text:='insert into buchungen Values (NULL,:kostenart_fk, :preis, :menge, :kmstand, :datum, :beschreibung,:kmstart)';
 SQLQuery1.ParamByName('kostenart_fk').AsInteger:=kostenart;
 SQLQuery1.ParamByName('preis').AsString:=benzinpreis;
 SQLQuery1.ParamByName('menge').AsString:=getanktemenge;
 SQLQuery1.ParamByName('kmstand').AsString:=kmstand;
 SQLQuery1.ParamByName('datum').AsString:=buchungsdatum;
 SQLQuery1.ParamByName('beschreibung').AsString:=kommentar;
 SQLQuery1.ParamByName('kmstart');
  SQLQuery1.ExecSQL;
  SQLTransaction1.Commit;
   FEHLERBEHANDLUNG('PERFEKT','Buchung ist eingtragen');
end;
 
procedure TForm1.But_CalenderClick(Sender: TObject);
 
var
  TMPD:double;
  T,M,J: Word;
begin
  CalendarDialog1.Date:=now(); // Standard = heute
  CalendarDialog1.Execute;
 
  TMPD:=CalendarDialog1.Date;
  DecodeDate(TMPD,J,M,T);   // die Datumszahl als Double Aufteilen im Tag Monat Jahr
  Label_datum.Caption:=FloatToStr(T)+'.'+FloatToStr(M)+'.'+FloatToStr(J);
 
end;
 
procedure TForm1.Bu_gridClick(Sender: TObject);
    begin
   GRID1_fuellen();
end;
 
procedure TForm1.ComboBox1Select(Sender: TObject);
 
begin
 // label1.Caption:=IntToStr(ComboBox1.ItemIndex+1);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  alle_Daten_laden();
  { TODO 4 : Die Auswertung auf Tab3 mit eintragen und nur noch per Label  }
  benzinpreisdarstellung();
  //TabSheet2.;
end;
 
procedure TForm1.StringGrid1Enter(Sender: TObject);
begin
  GRID1_fuellen();
end;
 
procedure TForm1.TabSheet2Enter(Sender: TObject);
 
begin
  SQLQuery1.Close;
  SQLQuery1.SQL.Text:='select * from kostenarten';
  SQLQuery1.Open;
  ComboKostenarten.Clear;
  while SQLQuery1.EOF = False do     // Füllen der ComboBox //
  begin
  ComboKostenarten.Items.Add(SQLQuery1.FieldByName('id').AsString + ' - ' + SQLQuery1.FieldByName('kosten').AsString);
  SQLQuery1.Next;
  end;
  SQLQuery1.Close;
  ComboKostenarten.ItemIndex:=0;
end;
 
procedure TForm1.GRID1_fuellen();
   var
  reihe : integer;
begin
  StringGrid1.Clean;
  SQLQuery1.close;
  SQLQuery1.SQL.Text:='select * from auswertung order by kmstand desc';
  SQLQuery1.open;
  reihe:=1;
 
  StringGrid1.Cells[0,0]:='datum';
  StringGrid1.Cells[1,0]:='kmstand';
  StringGrid1.Cells[3,0]:='LtrPreis';
  StringGrid1.Cells[2,0]:='gefahren';
  StringGrid1.Cells[4,0]:='menge';
  StringGrid1.Cells[5,0]:='bezahlt';
  StringGrid1.Cells[6,0]:='Verbrauch';
 
 
 
  while SQLQuery1.EOF = False do
  begin
    StringGrid1.RowCount:=reihe+1;
    StringGrid1.Cells[0,reihe]:=(SQLQuery1.FieldByName('datum').AsString);
    StringGrid1.Cells[1,reihe]:=(SQLQuery1.FieldByName('kmstand').AsString);
    StringGrid1.Cells[3,reihe]:=(SQLQuery1.FieldByName('LtrPreis').AsString);
    StringGrid1.Cells[2,reihe]:=(SQLQuery1.FieldByName('gefahren').AsString);
    StringGrid1.Cells[4,reihe]:=(SQLQuery1.FieldByName('menge').AsString);
    StringGrid1.Cells[5,reihe]:=(SQLQuery1.FieldByName('bezahlt').AsString);
    StringGrid1.Cells[6,reihe]:=(SQLQuery1.FieldByName('Verbrauch').AsString);
 
    reihe:=reihe+1;
    SQLQuery1.Next;
  end;
  SQLQuery1.Close;
end;
 
procedure TForm1.alle_Daten_laden();
begin
// Alle Daten sofort laden //
  { TODO 4 : TEST3 gegen VIEW kostenauswertung ändern }
  { TODO 2 : eine Grafische Komponente einfügen die den Kostenverlauf BENZINPREIS grafisch darstellt }
 SQLQuery1.Close;
 SQLQuery1.SQL.Text:='select * from test3 order by id desc';
 SQLQuery1.open;
 
  {
 // memo1.Clear;
 while SQLQuery1.eof = false do
 begin
  Memo1.Lines.Add(SQLQuery1.FieldByName('GETANKT').AsString + '  Ltr getankt ' + SQLQuery1.FieldByName('gefahren').AsString + ' gefahren ergibt einen Verbrauch von:  ' + SQLQuery1.FieldByName('VERBRAUCHT_auf_100').AsString + '  Ltr');
  Memo1.Lines.Add('');
  SQLQuery1.Next;
 end;
 }
 SQLQuery1.Close;
 
 
 // zweite abfrage //
 SQLQuery1.sql.Text:='select * from kostenauswertung';
 SQLQuery1.open;
 while SQLQuery1.EOF = false do
 begin
  Label2.Caption:=('Bislang ' + SQLQuery1.Fields[0].AsString +' € inkl ' + SQLQuery1.Fields[1].AsString + ' € Steuern bezahlt um ' + SQLQuery1.Fields[3].AsString + ' KM zu fahren' +#13#10+
  'Getankt wurden dafür ' + SQLQuery1.Fields[2].AsString +' Ltr Benzin' + #13#10 + 'was einen Verbrauch von ' + SQLQuery1.Fields[5].AsString + ' Ltr auf 100 KM ausmacht')+#13#10+('und  ' + SQLQuery1.Fields[4].AsString + ' € Kosten pro KM ergibt');
//  Label3.Caption:=('Getankt wurden dafür ' + SQLQuery1.Fields[2].AsString +' Ltr Benzin  was einen Verbrauch von ' + SQLQuery1.Fields[5].AsString + ' Ltr auf 100 KM ausmacht')+#13#10+('und  ' + SQLQuery1.Fields[4].AsString + ' € Kosten pro KM ergibt');
 
 
SQLQuery1.Next;
 end;
  SQLQuery1.Close;
  end;
 
procedure TForm1.FEHLERBEHANDLUNG(fehlertext,fehlerinhalt:string);
begin
 
 MessageDlg(fehlertext,fehlerinhalt +#13#10+'Setze alle Eingaben auf 000',mtConfirmation,[mbOK],0);
     LabeledEdit1.Text:='000';
     LabeledEdit2.Text:='000';
     LabeledEdit3.Text:='000';
end;
 
procedure TForm1.benzinpreisdarstellung();
var balken : integer;
    erg : Real;
begin
 // 3D Effekt
 Chart1BarSeries1.Depth:=2;
 // und die Balken in Blau
 Chart1BarSeries1.BarBrush.Color:=clblue;
 // x und Y Leiste in 1er Schritten
 Chart1.BottomAxis.Intervals.NiceSteps:='1';
  Chart1.LeftAxis.Intervals.NiceSteps:='1.1';
 // Eine Textbeschreibung was der Chart Anzeigt
 Chart1.Title.Text.Add('Benzinkosten Verlauf');
 Chart1.Title.Visible:=true;
  // Doppelzeichnen vermeiden
  Chart1BarSeries1.Clear;
  Chart1.Title.Text.Clear;
 
 balken:=0;
 SQLQuery1.close;
  SQLQuery1.SQL.Text:='select LtrPreis from auswertung';
 SQLQuery1.Open;
 
 while SQLQuery1.EOF = False do
 begin
  erg := (SQLQuery1.FieldByName('LtrPreis').AsFloat)  ;
  Chart1BarSeries1.Add(erg);
  balken:=balken+1;
  SQLQuery1.Next;
 end;
 
 
end;
 
end.
 
 
 
 
 
 
 
mfg
Horst Sammler

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6765
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: lazreport geht das nur über feste SQL abfragen ?

Beitrag von af0815 »

Biertrinker hat geschrieben:Frage: bin ich jetzt in einer Sackgasse

oder kann mann einen Report auch erstellen ohne feste SQLabfragen in den Komponenten
einzutragen
Nö, warum in einer Sackgasse ? Sackgassen sind immer ein Problem der Geisteshaltung beim Programmieren :-) IMHO gibts mal nicht so optimale Zwischenlösungen :mrgreen:

Für welchen Report hast du dich entschieden ? Man kann Reports auch komplett ohne SQL Komponenten erzeugen, es ist meistens nur bequemer mit.

LazReport Tutorial: Wiki . Ganz unten ist auch beschrieben wie man ohne Datenbankverbindung was machen kann. Bei reicht es aber aus, wenn du zur Laufzeit die Query dem Report zuweist, was du selbst erstellt hast. Für das Design ist es besser wenn du da eine fixe Query hast. Später dürfen die Spalten in deinem SQL Statement dem entsprechen was du im Design verwendest hast.

Andreas

Edit: Die Deutsche Seite des LazReport_Tutorial ist 'etwas' Outdated =:-) :shock:
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Biertrinker
Beiträge: 16
Registriert: Mo 18. Mär 2013, 17:19
OS, Lazarus, FPC: MAC OSX
CPU-Target: xxBit

Re: lazreport geht das nur über feste SQL abfragen ?

Beitrag von Biertrinker »

Hallo Andreas

danke das ist das was ich gesucht habe.
damit werde ich dann mal mein Glück probieren . :D
mfg
Horst Sammler

Antworten