| Autor |
Beitrag |
MikeP
Hält's aus hier
Beiträge: 15
|
Verfasst: Mi 29.01.03 12:03
Ich habe mit SQL in Delphi noch einige Probleme!
zB
Quelltext 1:
| Query1.SQL.Add('DELETE FROM ort WHERE id='+DBText1.Field.Value); |
funzt nicht!
Hauptsächlich liegt mein Problem darin, dass ich die Werte von DB Komponenten nicht auslesen kann! DBGrid, DBEdit etc.
|
|
kiwicht
      
Beiträge: 1021
Win 7, MacOS
Delphi x, VBA, PHP, ...
|
Verfasst: Mi 29.01.03 12:12
ich würds der Übersicht halber den DBEditFeld-Text vorher in einer Variable ablegen, ergibt zwar mehr Code, dafür musst du aber die SQL-Befehle nicht so vollknallen, also:
Quelltext 1: 2: 3: 4: 5: 6: 7:
| meinstring := QuotedStr(DBEdit1.Text);
Query1.SQL.Clear; Query1.SQL.Add('DELETE FROM ort WHERE id = ' + meinstring);
oder für feste Werte: Query1.SQL.Add('DELETE FROM ort WHERE id = "berlin"'); |
und fertig ist die Wurst.
wichtig ist vielleicht auch 'AnsiUpperCase' ... dazu kannst du dir ja mal folgenden Thread von mir anschauen, da hatte ich nämlich auch so meine Problem mit Umlauten....
www.delphi-forum.de/viewtopic.php?t=5075
mfg kiwicht
ps. was du bei dir falsch gemacht hast:
wenn du Variablen an SQL übergibst, also in deinem Fall den Inhalt von deinem DBText-Feld, müssen jene in Gänsefüsschen gesetzt werden, deshalb bei mir auch 'QuotedStr' ... das wird leider in den meistens Tutorials, so hatte ich jedenfalls das Gefühl, nicht so richtig herausgestellt!
|
|
MikeP 
Hält's aus hier
Beiträge: 15
|
Verfasst: Mi 29.01.03 13:08
Titel: Danke erstmal für die Hilfe!
Danke! Das hat mir wirklich geholfen!
Hätte da aber noch so ein kleines Problem!
Daten in einem DBGrid darzustellen ist meistens nicht sehr schön, da die Felder in die Länge gezogen werden!
1) Kann ich die Spaltenbreite irgendwie einstellen?
2) Kann ich über Table in einem DBGrid nur bestimmte Spalten anzeigen?
|
|
kiwicht
      
Beiträge: 1021
Win 7, MacOS
Delphi x, VBA, PHP, ...
|
Verfasst: Mi 29.01.03 13:24
nichts einfacher als das...
so hab ich das Problem gelöst, da ich ja von vornherein weiß, wieviel spalten ich in dem Grid brauch.
1. Rechte Mausklick auf Grid - Columns-Editor
2. Hier fügst du beliebig viele Columns hinzu, hier ist erstmal egal, wieviele
Columns du einfügst
3. folgender Code weist deinen Columns die Felder deiner Wahl zu,
ausserdem kannst du diverse Eigenschaften festlegen:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| // zuweisen der Datenbankfelder MeinGrid.Columns[0].FieldName := 'feld1'; // und wenn du jetzt noch mehr Felder anzeigen willst, einfach MeinGrid.Columns[1].FieldName := 'feld2'; MeinGrid.Columns[2].FieldName := 'feld5';
// eigenschaften ändern: MeinGrid.Columns[0].Width := 40; |
Die Syntax dürfte sich von selber erklären.
die Zahl in der eckigen Klammer steht für den Bezeichner, den du vorher im Columns-Editor festgelegt hast, d.h. der muss unbedingt existieren.
Feld1 steht für die Feldbezeichnung aus deiner Datenbank.
Hier kannst du die Felder einfügen, die du halt brauchst. Die Reihenfolge spielt hier keine rolle...
Ich geh mal davon aus, das du deinem Grid bereits zur Entwicklungszeit gesagt hast, aus welcher Datenbank-Source es seine Daten bezieht, wenn nicht einfach ganz am Anfang noch:
Quelltext 1:
| MeinGrid.DataSource := DatenbankSource; |
hoffe das war einigermaßen übersichtlich und verständlich... wenn nicht, einfach noch ma nachhaken..
mfg
|
|
MikeP 
Hält's aus hier
Beiträge: 15
|
Verfasst: Mi 29.01.03 13:42
Titel: Danke!
Das war super erklärt! Ganz im Gegensatz zu meinem Skriptum, das ich vor mir liegen habe! Da steht eingentlich nix drin was ich nicht weiß! :)
Wie vielleicht zu erahnen ist, schreibe ich gerade an einem Programm, und immer wenn ich irgendwo nicht weiter weiß, suche ich (meist vergeblich) in der Hilfe und komme dann ins Forum! (Man sieht ich hänge oft! :? )
Jetzt mache ich gerade eine Bearbeitungsfunktion!
Ich habe ein DBGrid und kann dort einen Datensatz auswählen! Dann kann ich entweder über das Popup oder über einen Button entweder löschen oder bearbeiten!
Löschen funktioniert! Ist aber wirklich nicht schön programmiert Table1.Delete :lol:
Bei Bearbeiten habe ich einfacht DataSource und Table an mein Bearbeitungsformular weitergegeben. Dort initialisiere ich meine DBEdits bzw. DBMemos mit DS und Table! Ich war verwundert, dass ich dann tatsächlich den Wert den ich vorher im DBGrid ausgewählt habe auch wirklich angezeigt bekomme! :) Jetzt möchte ich aber in meinen DBEdit's und Memo's den Wert verändern! Er lässt mich aber nicht! Ich kann ihn markieren aber nicht ändern!
Sollte ich das mit dem Ändern irgendwann hinbekommen möchte ich über die übergebenen Variablen Table und DS gleich ein Update machen! Geht das mit Table überhaupt?? :?:
Vielleicht krieg ich das mit eurer Hilfe wieder hin! :lol:
|
|
kiwicht
      
Beiträge: 1021
Win 7, MacOS
Delphi x, VBA, PHP, ...
|
Verfasst: Mi 29.01.03 14:51
Erstmal: Ging mir genauso: hab 2 Delphi-Bücher zuhause, Kaufwert bestimmt 80 €. Lesenswert: 0! Weil die Sachen die wirklich wichtig sind, konnt ich erst durch selbst probieren und die Hilfe der Profs hier im Forum erfahren! Selbst diverse Tut´s bringen nicht viel, da diese schon zuviel spezielles Wissen voraussetzten, das passiert z.B. wenn der Autor von seinem Wissen auf das Wissen anderer schliesst, also einen falschen Kenntnis-Stand impliziert!
egal, soviel dazu...
zu deinem Prob:
Ich meine, irgendwie ist es möglich, hab mir aber darüber nicht weiter den Kopf zerbrochen, und ganz einfach neben den Formular mit den DBEditFelder noch ein Formular mit normalen Edit-Feldern! umständlich, ich weiß. Jedenfalls werden den Edit-Feldern einfach die Inhalte der DBEdit-Felder zugewiesen, und dann auf Knopf-Druck dieser Inhalt wiederum in die DB geschrieben.
Also:
FormView.DBEditFeld1 ---- Inhalt -----> FormEdit.EditFeld1 ----- Inhalt ------> Datenbank
fertig.
jetzt die Syntax (schematisch!!!)
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| on ButtonEditClick begin FormEdit.EditFeld1.Text := FormViewDBEditFeld1.Text; [...] end
on ButtonSaveClick begin
// zuerst den Text der EditFelder in Variablen legen: meinstring1 := QuotedStr(EditFeld1.Text); // wichtig ist vielleicht, eine Variable zu benutzen, anhand welcher ich // meinen Datensatz nachher wiederfinde in der datenbank, z.B. die // Laufende Nr: lfdnr := QuotedStr(EditFeld1.Text); [...]
// dann in die DB schreiben with QueryDB do begin clear; add('UPDATE meinedb SET feld1 = ' + meinstring1); add(, feld2 = ' + meinstring2); add(, feld3 = ' + meinstring3); add(' WHERE lfdnr = ' + LfdNr); [...] end; QueryDB.ExecSQL; |
Wichtig: unten die WHERE-Klausel, damit NUR dieser datensatz geändert wird... logisch...
fertig. wie gesagt, etwas umständlich, aber so hab ichs bei mir auch, wenn jemand ne (schnellerer) bessere Methode kennt, immer her damit!
ansonsten... mfg
kiwicht
|
|
MikeP 
Hält's aus hier
Beiträge: 15
|
Verfasst: Mi 29.01.03 16:33
Titel: Ok!
Erstmal Danke für die schnelle Hilfe!
Ich muss dir recht geben, sehr schön ist die Lösung wirklich nicht aber wie soll das sonst gehen :roll: !
Ich hab jetzt einfach ein DBText Feld auf dem Formular ausgegeben, welches die ID enthält! Dort steht jetzt einfach "Datensatz # DBText.Field.Value" Mit diesem Wert lässt sich eine SQL abfrage formulieren!
Das Ergebnis wird dann einfach in den Feldern eingesetzt! Das Update mache ich dann so wie oben erklärt!
THX!
PS: Wer eine Ahnung von PHP hat, und weiß wie einfach es sich dort mit Datenbanken arbeiten läßt der wird bei Delphi ebenso verzweifeln wie ich :D
|
|
MikeP 
Hält's aus hier
Beiträge: 15
|
Verfasst: Mi 29.01.03 16:54
Wo liegt hier der Fehler????
Fehlermeldung: "" ist kein gültiger Integerwert
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| var kz:string; bs : string; px,py:integer; begin kz := QuotedStr(Edit1.Text); bs := QuotedStr(Memo1.Text); px := StrToInt(Edit2.Text); py := StrToInt(Edit3.Text);
with Query1.SQL do begin clear; add('UPDATE ort SET kurzzeichen = ' + kz); add(',beschreibung = ' + bs); if Edit2.Text<>'' then add(',positionx = px'); if Edit3.Text<>'' then add(',positiony = py'); add(' WHERE id ='+id1); end; Query1.ExecSQL; end; |
Habe jetzt eine andere DB in einem DBGrid angezeigt! Wenn man eine Zeile markiert und den Text verändert wird dieser in der DB gespeichert! WARUM??? Wie kann ich das verhindern! Ich möchte den Usern nur Leserecht geben! (Im DBGrid jedenfalls!!!!)
HILFE!!!!!!!!
|
|
kiwicht
      
Beiträge: 1021
Win 7, MacOS
Delphi x, VBA, PHP, ...
|
Verfasst: Mi 29.01.03 17:42
Kein Panik, Sie werden geholfen!
aaaalso:
1. Du hast BS als String deklariert, aber weist BS später den Inhalt eines Memo-Feldes zu... bin mir nicht wirklich sicher, aber ich meine das könnte Probleme geben. Lösung wäre: Falls du das MemoFeld nicht zwingend brauchst, benutze auch hier ein normales Edit-Feld!
2. du deklarierst PX und PY als Integer. Auch hier weiß ich nicht, wie sich Delphi verhält, wenn du in den EditFeldern mal keine Zahlen eingibst, sondern Text.. hier würde ich noch eine Abfrage einbauen, um sicher zu gehen, das an PX und PY AUSSCHLIEßLICH (!) Zahlen übergeben werden.
3. Und das ist meiner Meinung nach ein schwerwiegender FauxPas
Und zwar
Quelltext 1: 2: 3: 4: 5:
| if Edit2.Text<>'' then add(',positionx = px'); if Edit3.Text<>'' then add(',positiony = py'); add(' WHERE id ='+id1); |
Überleg mal, du willst "if Edit2.Text <> '' then add(',positionx = px');" an deine SQL-Befehlsfolge übergeben, ich glaube nicht das das geht, bin mir dessen aber nicht sicher, da ich jedwelche IF-Klauseln immer ausserhalb deklariere.
Lass IF doch einfach raus, denn wenn die Edit-Felder, und somit auch dein PX & PY, leer sind, wird ja auch nichts in die Datenbank geschrieben möcht ich meinen!
Außerdem hast du die Variablen PX und PY INNERHALB deines Add-Kommandos geschrieben, versuch mal folgendes, achte dabei auf das ' und das + VOR (!) den beiden Variablen!
Quelltext 1: 2: 3:
| add(',positionx = ' + px); add(',positiony = ' + py'); add(' WHERE id ='+id1); |
Allerdings bin ich mir hier, ehrlich gesagt  , nicht so sicher, ob man Integer-Variablen nicht auch innerhalb der ' belassen darf.... einfach probieren .....
4. Zu der DBGrid-Sache. Wähle einmal dieses Grid aus und drücke F11. So kommst du in den Objeect-Inspektor, den du sicherlich auch schon zuhaufe genutzt hast. Hier gibts eine Zeile Options. Darauf Doppelklick, und du findest wiederum eine Zeile: dgEditing! Setzt den Wert dahinter auf False! Fertig, und schon kann niemand die Werte im Grid ansich ändern!
Mein gesunder Menschenverstand sagt mir jedenfalls, das deine Fehlermeldung sich mit meinem Punkt 2 deckt, überdenke deine Verfahrensweise nochmal. Überleg auch ob die Feld-Typen PositionX und PositionY auch als Zahlen bzw. Integer in der Datenbanken stehen! Dazu kannst du ja den Database-Desktop benutzen (Menü Tools!).
mfg
kiwicht[/b]
|
|
FaTaLGuiLLoTiNe
      
Beiträge: 200
Erhaltene Danke: 5
Windows 7, Windows 8.1
Delphi XE
|
Verfasst: Mi 29.01.03 18:37
Also ich finde die letzte Antwort etwas komisch. In dem SQL Statement steht doch hinterher keine IF - Abfrage, er macht genau was ihm vorgeschlagen wurden, nämlich mit dem If Edt1.Text usw seinen SQL String zusammen bauen. Der sieht dann ungefähr so aus :
'UPDATE ort SET kurzzeichen = [VARIABLE],positionx = px,positiony = py WHERE id ='+id1'
Jedenfalls wenn alle Edits gefüllt sind, das is schon richtig.
>> px := StrToInt(Edit2.Text);
>> py := StrToInt(Edit3.Text);
Hier ist schon eher der Fehler ... ist eines von den Edits vielleicht leer?
Delphi macht dann nämlich nicht 0 daraus sondern zeigt die genannte Fehlermeldung.
_________________ << FaTaLGuiLLoTiNe >>
Rhinoceroses don't play games!
|
|
FaTaLGuiLLoTiNe
      
Beiträge: 200
Erhaltene Danke: 5
Windows 7, Windows 8.1
Delphi XE
|
Verfasst: Mi 29.01.03 18:40
Sorry : Diesen Beitrag (nicht den letzten) würde ich gerne löschen. Geht das irgendwie?
_________________ << FaTaLGuiLLoTiNe >>
Rhinoceroses don't play games!
|
|
kiwicht
      
Beiträge: 1021
Win 7, MacOS
Delphi x, VBA, PHP, ...
|
Verfasst: Mi 29.01.03 19:05
hm.. ich war immer der auffassung, das dann auch die IF-Klausel mit an den SQL-Text angehängt wird, habs allerdings nie selber ausprobiert... 
|
|
MikeP 
Hält's aus hier
Beiträge: 15
|
Verfasst: Do 30.01.03 01:55
Ok! Danke es funzt so ziemlich alles bei meinem (unserem  ) Programm!
Das mit dem If haut hin! Ich hab jedoch was ganz, ganz häßliches gemacht! Ich hab den Wert in der DB auf Text gesetzt!  Ist wirklich nicht schön! Aber ich erspare mir sehr viele Abfragen bzgl. der Korrektheit! Außerdem zeige ich die meisten Daten ja mit DB-Komponenten an und da habe ich auch immer string!
Ich habe ja zwei Tabellen die in eine Tabelle zusammengefasst werden!
1) Produkt (ID,Bezeichnung,Preis)
2) Lagerort (ID,Bezeichnung,Beschreibung,x,y)
3) Produkt_Lagerort (ID,Produkt_ID,Lagerort_ID)
Ich möchte jetzt alle Produkte, welche einem Lagerort zugewiesen wurden in einem DBGrid anzeigen!
Demnach muss ich aber die Werte aus zwei Tabellen in einem Grid anzeigen!
Inhalt des DBGrids soll wie folgt aussehen!
Produkt - Produkt_ID - Lagerort_Bezeichnung - Lagerort_beschreibung
Die SQL-Anweisung müsste wie folgt aussehen:
Quelltext 1:
| Select * From p.Produkt,l.Lagerort,pl.Produkt_Lagerort Where pl.Produkt_ID=p.Produkt_ID AND pl.Lagerort_ID=l.Lagerort_ID |
Wie kann ich dem DBGrid jetzt sagen, welche Werte er anzeigen soll?
Wiedermal ne Anfängerfrage aber ihr wie ihr euch denken könnt EXTREM wichtig! 
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Do 30.01.03 02:07
JOIN ist das Zauberwort.
 Bitte im select einbauen.
Gruß
Hansa
|
|
MikeP 
Hält's aus hier
Beiträge: 15
|
Verfasst: Do 30.01.03 12:01
Wenn ich Variablen vor die Tabellennamen setzte ist das ja ein JOIN soweit ich weiß oder!?!?!
Das Problem liegt weniger beim SQL als beim DBGrid!
|
|
FaTaLGuiLLoTiNe
      
Beiträge: 200
Erhaltene Danke: 5
Windows 7, Windows 8.1
Delphi XE
|
Verfasst: Do 30.01.03 13:15
Du sagst es dem Grid indem du nach SELECT schreibst, welche Felder du angezeigt haben möchtest ;^))
Also z.B. SELECT p.Produkt, l.Lagerort FROM ...
Ich arbeite zwar nie mit den DBx - Komponenten, aber soweit ich weiss zeigt das Teil automatisch die komplette Ergebnismenge an ... die musst Du dann halt dementsprechend einschränken.
|
|
|