![]() |
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: |
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. |
Re: Functions mit Delphi
Mal ganz schnell zusammengetibbelt...
Delphi-Quellcode:
Aufruf wäre zb:
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;
Delphi-Quellcode:
Wie gesagt, nur schnell zusammengetibbelt... So würde ich anfangen, aber ist auf alle Fälle erweiterbar!
sql('Spalte1,Spalte2','Tabelle','Spalte1=xxx','Spalte2,Spalte1');
(Wer Fehler findet, darf sie behalten ;-) ) |
Re: Functions mit Delphi
Delphi-Quellcode:
was ist denn bei dem falsch wenn er sagt nicht genügend parameter???
Query.SQL.Text:= selectsql('Material_Belag','friktionstest','Testnummer'+cbotestnummer.text+'Testnummer');
|
Re: Functions mit Delphi
Zitat:
So müsste es gehen:
Delphi-Quellcode:
Einfach für die Sortierbedingung einen leeren String übergeben...
Query.SQL.Text:= selectsql('Material_Belag','friktionstest','Testnummer='+cbotestnummer.text+'Testnummer','');
(Prozedur funktioniert nicht direkt für Joins!) |
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; |
Re: Functions mit Delphi
ich will mit dem quelltext die daten von der datenbank in eine combobox eintragen
Delphi-Quellcode:
is ist schon einmal gegangen aber warum jetzt nichtmehr ??seht ihr einen Fehler??
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; |
Re: Functions mit Delphi
Zitat:
Delphi-Quellcode:
Ansonsten fällt mir spontan kein Fehler auf...
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; Oder gibt der irgendnen Fehler aus, das wär nämlich wichtig zu wissen... |
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... =( |
Re: Functions mit Delphi
Delphi-Quellcode:
Es ging Duke_2004 imo nur um die eingefügte Sicherheitsmaßnahme.
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; |
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...
|
Re: Functions mit Delphi
die fehlermeldung kommt bei dem satzt
Delphi-Quellcode:
ich hab das statt
if dlgResult = mrok then
Delphi-Quellcode:
genommen weil das für die Datenrückgabe leichter ist
frmtestauswahl.ShowModul
aber mit dem fehler was kommt kann ich nichts anfangen |
Re: Functions mit Delphi
Delphi-Quellcode:
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...
case frmtestauswahl.ShowModal of
mrok: begin //Anweisung, wenn Ok end; mrcancel: begin //Anweisung, wenn Abbruch end; end; ;-) |
Re: Functions mit Delphi
das ist der quellcode von den beiden comboboxen
Delphi-Quellcode:
das ist der quellcode für die showModal anweisung
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;
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; |
Re: Functions mit Delphi
Delphi-Quellcode:
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)
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; ^müsste so funktionieren Zu deinen "Showmodalaufrufen": Von wo aus wird das aufgerufen? Was willst du damit bezwecken? |
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 |
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? |
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 :( |
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 |
Re: Functions mit Delphi
Naja...ICQ per Web gibts ja auch noch... ;-)
Zu deinen Showmodalen...
Delphi-Quellcode:
Wenn ich deinen voherigen Quellcode richtig durchgeblickt hab... :-)
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; Zu DBEdit:
Delphi-Quellcode:
Zu Combobox:
DBEdit.Field.AsString := 'irgendwas';
oder DBEdit.Field.AsInteger := 5;
Delphi-Quellcode:
if (Combobox.Items.Count > 0) then
begin Combobox.ItemIndex := 1; end; |
Re: Functions mit Delphi
thx 4 help jtzt muss ich mal das ganze ausprobiernen :)
|
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 ????? |
Re: Functions mit Delphi
Dass die unit sich selbst aufruft. Steht doch da.
Vermutlich hast du die unit in der eigenen uses-klausel eingetragen. |
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 21:24 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 by Thomas Breitkreuz