Autor Beitrag
MikeP
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mi 29.01.03 12:03 
Ich habe mit SQL in Delphi noch einige Probleme!

zB
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1021

Win 7, MacOS
Delphi x, VBA, PHP, ...
BeitragVerfasst: 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:

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1021

Win 7, MacOS
Delphi x, VBA, PHP, ...
BeitragVerfasst: 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:

ausblenden 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:

ausblenden Quelltext
1:
MeinGrid.DataSource := DatenbankSource;					


hoffe das war einigermaßen übersichtlich und verständlich... wenn nicht, einfach noch ma nachhaken.. :D

mfg
MikeP Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1021

Win 7, MacOS
Delphi x, VBA, PHP, ...
BeitragVerfasst: 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... :wink:

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!!!)
ausblenden 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! :D

ansonsten... mfg

kiwicht
MikeP Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mi 29.01.03 16:54 
Wo liegt hier der Fehler????

Fehlermeldung: "" ist kein gültiger Integerwert

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1021

Win 7, MacOS
Delphi x, VBA, PHP, ...
BeitragVerfasst: Mi 29.01.03 17:42 
Kein Panik, Sie werden geholfen! :D

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 :P
Und zwar

ausblenden 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!

ausblenden Quelltext
1:
2:
3:
   add(',positionx = ' + px); 
   add(',positiony = ' + py'); 
   add(' WHERE id ='+id1);


Allerdings bin ich mir hier, ehrlich gesagt :oops: , nicht so sicher, ob man Integer-Variablen nicht auch innerhalb der ' belassen darf.... einfach probieren ..... 8)

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 200
Erhaltene Danke: 5

Windows 7, Windows 8.1
Delphi XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 200
Erhaltene Danke: 5

Windows 7, Windows 8.1
Delphi XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1021

Win 7, MacOS
Delphi x, VBA, PHP, ...
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Do 30.01.03 01:55 
Ok! Danke es funzt so ziemlich alles bei meinem (unserem :D ) 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! :oops: 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:
ausblenden 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! :wink:
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Do 30.01.03 02:07 
JOIN ist das Zauberwort.

:P Bitte im select einbauen.

Gruß
Hansa
MikeP Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 200
Erhaltene Danke: 5

Windows 7, Windows 8.1
Delphi XE
BeitragVerfasst: 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.