Einzelnen Beitrag anzeigen

Benutzerbild von Nico93
Nico93

Registriert seit: 6. Sep 2011
Ort: Grafschaft
48 Beiträge
 
Delphi 2007 Architect
 
#1

Units mit DB-Zugriff stürzen ab

  Alt 12. Okt 2011, 14:26
Datenbank: Firebird • Version: 2.1 • Zugriff über: ibexpert
hallo zusammen,
leider habe ich wieder ein Problemchen.
Ich habe ein kleines Programm programmiert welches auf dem Entwickler Pc (mit Delphi 2007) super läuft.
Jedoch stürzt das Programm auf allen Pcs, welche kein Delphi installiert haben sofort ab.
Unter Windows xp stürzt es einfach ab ohne was zu sagen und unter Windows 7 kriege ich wenigstens noch die Fehlermeldung, dass die MIDAS.dll nicht gefunden werden kann, obwohl ich unter uses die MIDASLIB eingebunden habe.

Nach langem ausprobieren habe ich herausgefunden dass das Programm nur abstürzt wenn ich eine bestimmte Unit, welche einen Datenbankzugriff hat, in das Projekt eingebunden ist.
Nach weiterem Probieren habe ich festgestellt, dass das Programm läuft wenn ich alle Komponenten von der Unit entferne, welche irgendwas mit dataset, datasource, query, connection oder sonst was zu tun haben.

Leider weiß ich jetzt gar nicht mehr weiter woran es liegen könnte.
Auf dem dazugehörigen Form befinden sich: 1x SQLConnection, 2xDataSource, 2xSimpleDataSet, 2xSQLQuery.
Hier der Quellcode der besagten Unit, welche das Programm zum Absturz bringt:


Delphi-Quellcode:
unit berichte;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus, jpeg, ExtCtrls, DBCtrls,
  Registry, DB, ComCtrls, Buttons, SqlExpr, WideStrings, Printers,
  MIDASLIB, Mask, FMTBcd;

type
  TForm7 = class(TForm)
    Label1: TLabel;
    DateTimePicker1: TDateTimePicker;
    Label2: TLabel;
    DateTimePicker2: TDateTimePicker;
    Label3: TLabel;
    BitBtn1: TBitBtn;
    SQLConnection1: TSQLConnection;
    DataSource1: TDataSource;
    SQLQuery1: TSQLQuery;
    SQLQuery2: TSQLQuery;
    PrintDialog1: TPrintDialog;
    DataSource2: TDataSource;
    procedure einnahmen_zaehlen();
    procedure ausgaben_zaehlen();
    procedure BitBtn1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);

  private
    { Private declarations }
    einnahmen: integer;
    ausgaben: integer;
    von: string;
    bis: string;
    DBEdit2: TDbEdit;
    DBEdit3: TDbEdit;
    DBEdit4: TDBEdit;
    DBEdit5: TDBEdit;
    datum_einnahmen: TDBEdit;
    rechnungsnr_einnahmen: TDbEdit;
    artikel_einnahmen: TDbEdit;
    betrag_einnahmen: TDbEdit;
  public
    { Public declarations }
  end;

var
  Form7: TForm7;

implementation

{$R *.dfm}
uses Unit2;

{ TForm7 }

procedure TForm7.ausgaben_zaehlen;
begin
SQLQuery1.Close;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('SELECT COUNT (*) AS Z FROM AUSGABEN WHERE DATUM BETWEEN :von AND :bis');
SQLQuery1.ParamByName('von').value := von;
SQLQuery1.ParamByName('bis').value := bis;
SQLQuery1.Open;
ausgaben := SQLQuery1.FieldByName('Z').AsInteger;
end;

procedure TForm7.BitBtn1Click(Sender: TObject);
var I, J: integer;
breite, hoehe, randlinks, randoben: integer;
begin
von:=DateToStr(DateTimePicker1.Date);
bis:=DateToStr(DateTimePicker2.Date);
einnahmen_zaehlen;
ausgaben_zaehlen;

if PrintDialog1.Execute then begin
    Printer.BeginDoc; //Druckjob beginnen
    Printer.Canvas.Font.Name:='Arial';
    Printer.Canvas.Brush.Color:=clWhite;
    Printer.Canvas.Font.Size:=10;
    Printer.Canvas.Font.Style:=[fsBold];
    Printer.Canvas.TextOut(200, 400, 'Finanzbericht vom '+DateToStr(DateTimePicker1.Date)+' bis zum '+DateToStr(DateTimePicker2.Date));
    Printer.Canvas.Font.Size:=8;
    Printer.Canvas.Font.Style:=[];
    Printer.Canvas.TextOut(200, 600, 'Einnahmen(gesamt): '+IntToSTr(einnahmen)+', Ausgaben(gesamt): '+IntToSTr(ausgaben));
    Printer.Canvas.Font.Style:=[fsBold];
    Printer.Canvas.Font.Size:=10;
    Printer.Canvas.TextOut(200, 800, 'Einnahmen');
    Printer.Canvas.TextOut(2500, 800, 'Ausgaben');
    Printer.Canvas.Font.Size:=8;
    Printer.Canvas.TextOut(200, 1000, 'Datum');
    Printer.Canvas.TextOut(700, 1000, 'Rechnungsnr');
    Printer.Canvas.TextOut(1200, 1000, 'Artikel');
    Printer.Canvas.TextOut(2000, 1000, 'Betrag');
    Printer.Canvas.TextOut(2500, 1000, 'Datum');
    Printer.Canvas.TextOut(3000, 1000, 'Rechnungsnr');
    Printer.Canvas.TextOut(3500, 1000, 'Artikel');
    Printer.Canvas.TextOut(4300, 1000, 'Betrag');
    Printer.Canvas.Font.Style:=[];

  begin
    {SimpleDataSet1.First;
    SimpleDataSet2.First;}

    for I := 0 to ausgaben-1 do
    begin
      Printer.Canvas.TextOut(2500, 1100+I*100, DBEdit2.Text);
      Printer.Canvas.TextOut(3000, 1100+I*100, DBEdit3.Text);
      Printer.Canvas.TextOut(3500, 1100+I*100, DBEdit4.Text);
      Printer.Canvas.TextOut(4300, 1100+I*100, DBEdit5.Text + '');
      //SimpleDataSet1.Next;
    end;
    for J := 0 to einnahmen-1 do
    begin
      Printer.Canvas.TextOut(200, 1100+J*100, datum_einnahmen.Text);
      Printer.Canvas.TextOut(700, 1100+J*100, rechnungsnr_einnahmen.Text);
      Printer.Canvas.TextOut(1200, 1100+J*100, artikel_einnahmen.Text);
      Printer.Canvas.TextOut(2000, 1100+J*100, betrag_einnahmen.Text + '');

    end;
      
  end;
  begin

  for I := 1 to einnahmen do



  end;
    breite:=GetDeviceCaps(Printer.Canvas.Handle, HORZSIZE)*10;
    hoehe:=GetDeviceCaps(Printer.Canvas.Handle, VERTSIZE)*10;

    randlinks:=250; //2,5 cm
    randoben:=250; //2,5 cm

    end;
    Printer.EndDoc;

end;

procedure TForm7.einnahmen_zaehlen;
begin
SQLQuery2.Close;
SQLQuery2.SQL.Clear;
SQLQuery2.SQL.Add('SELECT COUNT (*) AS Z FROM EINNAHMEN WHERE DATUM BETWEEN :von AND :bis');
SQLQuery2.ParamByName('von').value := von;
SQLQuery2.ParamByName('bis').value := bis;
SQLQuery2.Open;
einnahmen := SQLQuery2.FieldByName ('Z').AsInteger;
end;

procedure TForm7.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form2.BringToFront;
end;

procedure TForm7.FormCreate(Sender: TObject);
var list:TStringList;
    conn_str: string;
begin
//DBEdit2.Create
DBEdit2 := TDBEdit.Create(Self);
with DBEdit2 do
begin
  Name:='DBEdit2';
  Parent:=Self;
  Left:=0;
  Top:=0;
  Width:=121;
  Height:=21;
  DataSource:=DataSource1;
  DataField:='DATUM';
  visible:=false;
end;
//DBEdit3.Create
DBEdit3 := TDBEdit.Create(Self);
with DBEdit3 do
begin
  Name:='DBEdit3';
  Parent:=self;
  left:=0;
  top:=0;
  Width:=121;
  Height:=21;
  DataSource:=DataSource1;
  DataField:='RECHNUNGSNUMMER';
  visible:=false;
end;
//DBEdit4.Create
DBEdit4 := TDBEdit.Create(self);
with DBEdit4 do
begin
  Name:='DBEdit4';
  Parent:=self;
  left:=0;
  top:=0;
  width:=121;
  height:=21;
  DataSource:=DataSource1;
  DataField:='ARTIKEL';
  visible:=false;
end;
//DBEdit5.Create
DBEdit5 := TDbEdit.Create(self);
with DBEdit5 do
begin
  name:='DBEdit5';
  parent:=self;
  left:=0;
  top:=0;
  width:=121;
  height:=21;
  DataSource:=DataSource1;
  DataField:='BETRAG';
  visible:=false;
end;
//datum_einnahmen.Create
datum_einnahmen := TDBEdit.Create(self);
with datum_einnahmen do
begin
  name:='datum_einnahmen';
  parent:=self;
  left:=0;
  top:=0;
  width:=121;
  height:=21;
  DataSource:=DataSource2;
  DataField:='DATUM';
  visible:=false;
end;
//rechnungsnr_einnahmen.Create
rechnungsnr_einnahmen := TDbEdit.Create(self);
with rechnungsnr_einnahmen do
begin
  name:='rechnungsnr_einnahmen';
  parent:=self;
  left:=0;
  top:=0;
  width := 121;
  height:=21;
  DataSource:=DataSource2;
  DataField:='RECHNUNGSNR';
  visible:=false;
end;
//artikel_einnahmen.Create
artikel_einnahmen := TDBEdit.Create(Self);
with artikel_einnahmen do
begin
  name:='artikel_einnahmen';
  parent:=self;
  left:=0;
  top:=0;
  width:=121;
  height:=21;
  DataSource:=DataSource2;
  DataField:='ARTIKEL';
  visible:=false;
end;
//betrag_einnahmen.Create
betrag_einnahmen := TDbEdit.Create(Self);
with betrag_einnahmen do
begin
  name:='betrag_einnahmen';
  parent:=self;
  left:=0;
  top:=0;
  width:=121;
  height:=21;
  DataSource:=DataSource2;
  DataField:='BETRAG';
  visible:=false;
end;

{SimpleDataSet1.DataSet.First;
SimpleDataSet2.DataSet.First;}


//Connection aktualisieren
list:=TStringList.Create;
list.loadfromfile('database.txt');
conn_str:=list.strings[0];

SQLConnection1.Params.Values['Database'] := conn_str;
end;

end.
Vielen Dank für die Hilfe.
Nico

Geändert von mkinzler (12. Okt 2011 um 14:28 Uhr) Grund: Code-Tag durch Delphi-Tag ersetzt
  Mit Zitat antworten Zitat