Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Functions mit Delphi (https://www.delphipraxis.net/49493-functions-mit-delphi.html)

cell 12. Jul 2005 06:51

Datenbank: SQL • Zugriff über: DataModul

Functions mit Delphi
 
Morgen

Die aufgabenstellung lautet wie folgt:
ich habe in meinem Programm einige SQL statements drinnen, und um diese in dem Quelltext zu vermeiden, soll ich eine Funktion schreiben wo die SQL statements drinnen sind.
Ein SQL schaut ungefähr so aus:

'SELECT Datum, Material_Scheibe, Testnummer FROM friktionstest WHERE Testnummer=' + cbotestnummer.text' ORDER BY Datum'

so aber der SQL Befehl könnte aber auch nur so heißen
'SELECT Datum From friktionstest'

ich verstehe nicht wie die eingabe von den SELECT statements erfolgt bzw wie ich die aussuche.
oder wie ich die WHER und ORDER BY klausel weg lasse

kann mir da jemand helfen bzw versteht das jemand :mrgreen:

Matze 12. Jul 2005 06:57

Re: Functions mit Delphi
 
Du könntest einen Parameter übergeben und je nach dem das SQL-Statement anders zusammensetzen. Im Endeffekt ist das auch nur ein String.
Als Parameter kannst du natürlich auch die "SQL-Statement-Abschnitte" übergeben, nur sollten bei dir diese Abfragen in der Funktion sein, wie du es sagst, dann wird dir nichts anderes überig bleiben, als den String in der Funktion unterschiedlich zusammenzusetzen.

Duke_2004 12. Jul 2005 07:08

Re: Functions mit Delphi
 
Mal ganz schnell zusammengetibbelt...

Delphi-Quellcode:
procedure sql(Spalten, Tabelle, wherebedingung, sortierspalten: string);
begin
  if (sortierspalten= '') then //Keine Sortierspalten-> keine Sortierung
  begin
    if (wherebedingung = '') then //Kein Where -> keine Filterung
      sqltext := 'Select ' + spalten + ' from ' + tabelle
    else
      sqltext := 'Select ' + spalten + ' from ' + tabelle + ' where ' + wherebedingung;
  end
  else
  begin
    if (wherebedingung = '') then
      sqltext := 'Select ' + spalten + ' from ' + tabelle + ' order by ' + sortierspalten
    else
      sqltext := 'Select ' + spalten + ' from ' + tabelle + ' where ' + wherebedingung + ' order by ' + sortierspalten;
  end;
//Sqltext an zb IBSQL übergeben und ausführen
end;
Aufruf wäre zb:

Delphi-Quellcode:
sql('Spalte1,Spalte2','Tabelle','Spalte1=xxx','Spalte2,Spalte1');
Wie gesagt, nur schnell zusammengetibbelt... So würde ich anfangen, aber ist auf alle Fälle erweiterbar!
(Wer Fehler findet, darf sie behalten ;-) )

cell 12. Jul 2005 07:51

Re: Functions mit Delphi
 
Delphi-Quellcode:
Query.SQL.Text:= selectsql('Material_Belag','friktionstest','Testnummer'+cbotestnummer.text+'Testnummer');
was ist denn bei dem falsch wenn er sagt nicht genügend parameter???

Duke_2004 12. Jul 2005 07:54

Re: Functions mit Delphi
 
Zitat:

Zitat von cell
Delphi-Quellcode:
Query.SQL.Text:= selectsql('Material_Belag','friktionstest','Testnummer'+cbotestnummer.text+'Testnummer');
was ist denn bei dem falsch wenn er sagt nicht genügend parameter???


So müsste es gehen:

Delphi-Quellcode:
Query.SQL.Text:= selectsql('Material_Belag','friktionstest','Testnummer='+cbotestnummer.text+'Testnummer','');
Einfach für die Sortierbedingung einen leeren String übergeben...

(Prozedur funktioniert nicht direkt für Joins!)

Sidorion 12. Jul 2005 09:49

Re: Functions mit Delphi
 
Wenn Du mehr als eine Spalte zum selektieren zulassen willst, dann solltest Du ein Array of String übergeben lassen.
Beispiel

Delphi-Quellcode:
Function SqlQuery( _asFields: Array of String;
                   _asTables: Array of String;
                   Var _oResult: TStringList;
                   _asJoinOrFilterBed: Array of String=[];
                   _asSortFields: Array of String=[]): Boolean;
Var
  sStatement: String;
  iLoop: Integer;
Begin
  sStatement:='SELECT ';
  For iLoop:=0 To Pred(Length(_asFields))
  Do Begin
    If iLoop>0
    Then sStatement:=sStatement+', ';
    sStatement:=sStatement+_asFieds[iLoop];
  End;
  sStatement:=sStatement+' FROM ';
  For iLoop:=0 To Pred(Length(_asTables)
  Do Begin
    If iLoop>0
    Then sStatement:=sStatement+', ';
    sStatement:=sStatement+_asTables[iLoop];
  End;
  sStatement:=sStatement+' WHERE ';
  For iLoop:=0 To Pred(Length(_asJoinOrFilterBed)
  Do Begin
    If iLoop>0
    Then sStatement:=sStatement+' AND ';
    sStatement:=sStatement+_asJoinOrFilterBed[iLoop];
  End;
  sStatement:=sStatement+' ORDER BY ';
  For iLoop:=0 To Pred(Length(_asSortFields)
  Do Begin
    If iLoop>0
    Then sStatement:=sStatement+', ';
    sStatement:=sStatement+_asSortFields[iLoop];
  End;
End;

cell 12. Jul 2005 10:36

Re: Functions mit Delphi
 
ich will mit dem quelltext die daten von der datenbank in eine combobox eintragen
Delphi-Quellcode:
begin
frmmesswertauswahl.cbotestreihe.Items.Clear;
  with DataModule1 do
  begin
       Query.SQL.Text:= selectsql('Testreihe','Testreihe','Testnummer=' +frmmesswertauswahl.lblnummer.Caption,'');
       Query.Open;
       while not Query.Eof do
       begin
             frmmesswertauswahl.cbotestreihe.Items.Add(Query.Fields[0].AsString);
             Query.Next;
       end;
       Query.Close;
  end;
end;
end;
is ist schon einmal gegangen aber warum jetzt nichtmehr ??seht ihr einen Fehler??

Duke_2004 12. Jul 2005 10:46

Re: Functions mit Delphi
 
Zitat:

Zitat von cell
ich will mit dem quelltext die daten von der datenbank in eine combobox eintragen
Delphi-Quellcode:
begin
frmmesswertauswahl.cbotestreihe.Items.Clear;
  with DataModule1 do
  begin
       Query.SQL.Text:= selectsql('Testreihe','Testreihe','Testnummer=' +frmmesswertauswahl.lblnummer.Caption,'');
       Query.Open;
       while not Query.Eof do
       begin
             frmmesswertauswahl.cbotestreihe.Items.Add(Query.Fields[0].AsString);
             Query.Next;
       end;
       Query.Close;
  end;
end;
end;
is ist schon einmal gegangen aber warum jetzt nichtmehr ??seht ihr einen Fehler??

Versuch das mal so...

Delphi-Quellcode:
begin
  frmmesswertauswahl.cbotestreihe.Items.Clear;
  with DataModule1 do
  begin
    if Query.Open then
      Query.close;

    Query.SQL.Clear;
    Query.SQL.Text := selectsql('Testreihe', 'Testreihe', 'Testnummer=' + frmmesswertauswahl.lblnummer.Caption, ''); //achte darauf, dass Caption auch einen Wert hat
    Query.Open;

    while not Query.Eof do
    begin
      frmmesswertauswahl.cbotestreihe.Items.Add(Query.Fields[0].AsString);
      Query.Next;
    end;
    Query.Close;
  end;
end;
Ansonsten fällt mir spontan kein Fehler auf...
Oder gibt der irgendnen Fehler aus, das wär nämlich wichtig zu wissen...

cell 12. Jul 2005 11:54

Re: Functions mit Delphi
 
bei dem ersten quelltext sagt es mir keine fehlermeldung schreibt es auch nicht hinein, bei dem 2 schreibt es mir irgendwas von einer zugriffsverletzung (gleicher quelltext nur mit andren namen )
tja... =(

Jasocul 12. Jul 2005 12:19

Re: Functions mit Delphi
 
Delphi-Quellcode:
begin
  frmmesswertauswahl.cbotestreihe.Items.Clear;
  with DataModule1 do
  begin
    if Query.Active then Query.Close; // Reine Sicherheitsmaßnahme
    Query.SQL.Text:= selectsql('Testreihe','Testreihe','Testnummer=' +frmmesswertauswahl.lblnummer.Caption,'');
    Query.Open;
    while not Query.Eof do
    begin
      frmmesswertauswahl.cbotestreihe.Items.Add(Query.Fields[0].AsString);
      Query.Next;
    end;
    Query.Close;
  end;
end;
Es ging Duke_2004 imo nur um die eingefügte Sicherheitsmaßnahme.

Duke_2004 12. Jul 2005 12:25

Re: Functions mit Delphi
 
Jap... Und darum, dass der SQL-Text vor dem einfügen noch einmal geleert wird. Wenn die prozedure 2mal aufgerufen wird, kann es passieren, dass die Select-Anweisung 2mal drinsteht und dann meckert er auch rum. (Hatte ich bei mir zumindest schon) Setz am besten einmal einen Haltepunkt und geh mit F7 mal jede Zeile einzeln durch. Und dann sag wo er die Fehlermeldung bringt. Vielleicht hast du auch das andere Formular geschlossen (und dann freigegeben), somit kann er natürlich das Label nicht mehr finden...

cell 12. Jul 2005 12:41

Re: Functions mit Delphi
 
die fehlermeldung kommt bei dem satzt
Delphi-Quellcode:
if dlgResult = mrok then
ich hab das statt
Delphi-Quellcode:
frmtestauswahl.ShowModul
genommen weil das für die Datenrückgabe leichter ist
aber mit dem fehler was kommt kann ich nichts anfangen

Duke_2004 12. Jul 2005 12:47

Re: Functions mit Delphi
 
Delphi-Quellcode:
  case frmtestauswahl.ShowModal of
    mrok:
      begin
      //Anweisung, wenn Ok
      end;
    mrcancel:
      begin
      //Anweisung, wenn Abbruch
      end;
end;
Von wo aus rufst du dieses Formular auf? Am besten du schreibst mal hier den ganzen Quellcode rein, denn ohne zusammenhang erkennt man das ziemlich schlecht...

;-)

cell 12. Jul 2005 12:55

Re: Functions mit Delphi
 
das ist der quellcode von den beiden comboboxen
Delphi-Quellcode:
procedure Tfrmmesswertauswahl.FormShow(Sender: TObject);
begin
frmmesswertauswahl.cbotestreihe.Items.Clear;
  with DataModule1 do
  begin
       Query.SQL.Text:= selectsql('Testreihe','Testreihe','Testnummer=' +frmmesswertauswahl.lblnummer.Caption,'');
       Query.Open;
       while not Query.Eof do
       begin
             frmmesswertauswahl.cbotestreihe.Items.Add(Query.Fields[0].AsString);
             Query.Next;
       end;
       Query.Close;
  end;
frmmesswertauswahl.cbotestabschnitt.Items.Clear;
  with DataModule1 do
  begin
       Query.SQL.Text:= selectsql('Testabschnitt','Testreihe','Testnummer=' +frmmesswertauswahl.lblnummer.Caption,'');
       Query.Open;
       while not Query.Eof do
       begin
             frmmesswertauswahl.cbotestabschnitt.Items.Add(Query.Fields[0].AsString);
             Query.Next;
       end;
       Query.Close;
  end;
end;
das ist der quellcode für die showModal anweisung
Delphi-Quellcode:
var
   dlgResult: integer;
begin
  dlgResult:=frmtestauswahl.ShowModal;
  if dlgResult = mrok then
     frmmesswertauswahl.Showmodal;
  frmtestauswahl.close;
begin
  dlgResult :=frmmesswertauswahl.ShowModal;
  if dlgResult = mrok then
  begin
     frmmesswertauswahl.Close;
     frmtestauswahl.Close;
     CreateMDIChild('Unbenannt' + IntToStr(MDIChildCount + 1));
  end;
end;
end;

Duke_2004 12. Jul 2005 13:03

Re: Functions mit Delphi
 
Delphi-Quellcode:
procedure Tfrmmesswertauswahl.FormShow(Sender: TObject);
begin
{frmmesswertauswahl.}cbotestreihe.Items.Clear;
  with DataModule1 do
  begin
       Query.SQL.Text:= selectsql('Testreihe','Testreihe','Testnummer=' +{frmmesswertauswahl.}lblnummer.Caption,'');
       Query.Open;
       while not Query.Eof do
       begin
             {frmmesswertauswahl.}cbotestreihe.Items.Add(Query.Fields[0].AsString);
             Query.Next;
       end;
       Query.Close;

//frmmesswertauswahl.cbotestabschnitt.Items.Clear; //warum nocheinmal leeren -> dann wäre das drüber umsonst

       Query.SQL.Clear;
       Query.SQL.Text:= selectsql('Testabschnitt','Testreihe','Testnummer=' +{frmmesswertauswahl.}lblnummer.Caption,'');
       Query.Open;
       while not Query.Eof do
       begin
             {frmmesswertauswahl.}cbotestabschnitt.Items.Add(Query.Fields[0].AsString);
             Query.Next;
       end;
       Query.Close;
  end;
end;
Das in geschweiften Klammern brauchst du nicht, da sich alle Controls ja auf dem selben Formular befinden.(Sonst würde es ja auch nicht in dessen OnShow-Ereignis stehen)

^müsste so funktionieren

Zu deinen "Showmodalaufrufen": Von wo aus wird das aufgerufen? Was willst du damit bezwecken?

cell 12. Jul 2005 13:11

Re: Functions mit Delphi
 
nein leider der quelltext geht auch ned :(
mit dem ShowModul will ich erreichen dass ich alles vom main aufrufe.
dh.. das frmtestauswahl.ShowModal; muss nicht mehr in der procedure stehn sodern im main

Duke_2004 12. Jul 2005 13:15

Re: Functions mit Delphi
 
Das beste wird sein, du fragst mich das per ICQ :-D
(Oder schick mir deinen Quellcode einfach per mail...sonst drehen wir uns hier noch lange im Kreis ;-) )

Also das mit den Comboboxen füllen müsste schon so funktionieren... Aber deine Showmodal-Aufrufe sehen mir ziemlich wirr aus(Sorry)

Was für eine Fehlermeldung bringt er denn genau?

cell 12. Jul 2005 13:17

Re: Functions mit Delphi
 
ha das mit den comboboxen geht jetzt!!!!! :)

er bringt ned direkt eine fehlermeldung sondern er zeigt das formular doppelt an ich muss 2mal auf abbrechn klicken damit er es zu macht
sry hab in der firma kein icq :(

cell 12. Jul 2005 13:20

Re: Functions mit Delphi
 
ähmm was anderes :) kann ich in DBEdit felder was hineinschreiben von einer combobox.
wenn ja wie, weil bei einem DBEdit feld gibt es ja keine Caption und auch keinen Text???

und noch was wenn ich jetzt von anfang an was in meiner combobox stehen haben möchte, wie geht das ??
irgendetwas mit ItemIndex=1; oda so

Duke_2004 12. Jul 2005 13:25

Re: Functions mit Delphi
 
Naja...ICQ per Web gibts ja auch noch... ;-)

Zu deinen Showmodalen...

Delphi-Quellcode:
procedure Button1click(Sender:TObject);//Beispiel!!!
begin
  case frmtestauswahl.ShowModal of
  mrok:
  begin
    case frmmesswertauswahl.ShowModal of
    mrok:
    begin
      frmmesswertauswahl.Close;
      frmtestauswahl.Close;
      CreateMDIChild('Unbenannt' + IntToStr(MDIChildCount + 1));
    end;
    mrcancel:
    begin
 
    end;
  end;
  mrcancel:
  begin
    frmtestauswahl.close;
  end;
  end;
end;
Wenn ich deinen voherigen Quellcode richtig durchgeblickt hab... :-)

Zu DBEdit:

Delphi-Quellcode:
DBEdit.Field.AsString := 'irgendwas';
oder
DBEdit.Field.AsInteger := 5;
Zu Combobox:

Delphi-Quellcode:
if (Combobox.Items.Count > 0) then
begin
  Combobox.ItemIndex := 1;
end;

cell 12. Jul 2005 13:39

Re: Functions mit Delphi
 
thx 4 help jtzt muss ich mal das ganze ausprobiernen :)

cell 13. Jul 2005 06:45

Re: Functions mit Delphi
 
morgen

habe gerade versucht, dass ich in ein normales label was reinspiele, jedoch sagt er mir einen fehler

Das Programm oder die UNIT 'Childwin' ruft sich selbst wieder auf

was bedeutet das ?????

Jasocul 13. Jul 2005 07:07

Re: Functions mit Delphi
 
Dass die unit sich selbst aufruft. Steht doch da.

Vermutlich hast du die unit in der eigenen uses-klausel eingetragen.

CalganX 13. Jul 2005 07:44

Re: Functions mit Delphi
 
Hi cell,
grundsätzlich gilt: neue Frage :arrow: neuer Thread.
Wenn du also Fragen zu einem anderen Thema hast, stelle sie bitte in einem eigenen Thread.

Danke,
Chris


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