Autor |
Beitrag |
r3p47
Hält's aus hier
Beiträge: 6
Windows XP, Ubuntu
Delphi 3&7
|
Verfasst: Mi 20.12.06 16:53
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: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94:
| procedure TRechnungsverkaufa09Form.artuebernehmen_buttonClick(Sender: TObject); var ArtNrStr, ArtPreisStr,Merk:string; begin if renr_edit.text='' then begin Fehlermeldung('Keine Rechnung ausgewählt, der dieser Artikel zugeordnet werden koennte'); anz_spinedit.value:=1; artikelcombobox.itemindex:=-1; exit; end; if artikelcombobox.text='' then begin fehlermeldung('Kein Artikel ausgewählt'); exit; end;
with artikelcombobox do artnrstr:=copy(text,1,pos(':',text)-1);
if artikelcombobox.enabled then begin with arbeitmysqlquery do begin Close; SQL.Clear; SQL.Add('SELECT * FROM reeinzelheiten'); Open; First; -------------------------------------------------------------------------------------------- while not EoF do begin if (FieldByName('artnr').AsString=ArtNrStr) and (FieldByName('renr').AsString=renr_edit.text) then begin if anz_spinedit.Text<>artnrstr then begin showmessage('SQL-Befehl funktioniert nicht.');
merk:='UPDATE reeinzelheiten SET ' +'ArtAnz='+IntToStr(anz_spinedit.value) +' WHERE (ReNr='+ReNr_Edit.text+') AND (ArtNr='+ArtNrStr+')'; --------------------------------------------------------------------------------------------------------- with arbeitmysqlquery do begin close; SQL.clear; SQL.add(merk); execsql; end; ; end else fehlermeldung('Dieser Artikel kommt schon in der Rechung vor, bitte dort ändern!'); exit; end; next; end; end;
with arbeitmysqlquery do begin close; SQL.clear; SQL.add('SELECT * FROM artikel WHERE artnr="'+ArtNrStr+'"'); Open; artpreisstr:=fieldbyname('artpreis').AsString; close; sql.clear; sql.add('INSERT INTO einzelhandel.reeinzelheiten (reeinzaenderung, artnr, artanz, artpreis, renr) VALUES(' +'"",' +'"'+ArtNrStr+'",' +'"'+IntToStr(anz_spinedit.Value)+'",' +'"'+ArtPreisStr+'",' +'"'+ReNr_Edit.text+'")'); ExecSQL; end; end else begin merk:='UPDATE reeinzelheiten SET' +' ArtAnz="'+IntToStr(anz_spinedit.value)+'" ' +' WHERE (ReNr="'+ReNr_Edit.text+'") AND (ArtNr="'+ArtNrStr+'")'; with arbeitmysqlquery do begin close; SQL.clear; SQL.add(merk); execsql; end; artikelcombobox.enabled:=true; end; artikelbearbeitung(true); ArtikelzurRechnungenAnzeigen; end; |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| procedure TRechnungsverkaufa09Form.artdel_buttonClick(Sender: TObject); var merk:string; renrstr,artnrstr:string; begin renrstr:=renr_edit.text;
with artikelcombobox do artnrstr:=copy(text,1,pos(':',text)-1);
merk:='DELETE FROM reeinzelheiten WHERE (renr='+renrstr+') AND (artnr='+artnrstr+')';
with arbeitmysqlquery do begin sql.clear; sql.add(merk); execsql; SHOWMESSAGE('SQL-Befehl funktioniert nicht.'); end; end; |
Hi,
hab nicht viel Zeit, sitz grad im Info Unterricht.
Das in ---- geht nicht, dieser SQL Befehl ist aber richtig, denn er funktioniert mit einem normalen SQL-Client.
Nur passiert absolut nichts, wenn mand as über Delphi startet.
Heute abend kommen n paar Infos mehr, sry.
Hab ich da bis jetzt im Delphi Syntax was falsch gemacht???
Die Variablen hab ich alle richtig übernommen aus edit/combobox etc, hab ihc schon überprüft.
mfg
rene
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Mi 20.12.06 17:18
warum Klammern um die Where-Clause?
Delphi-Quelltext 1: 2:
| ... merk:='DELETE FROM reeinzelheiten WHERE renr= ''' +renrstr+ ''' AND artnr='''+artnrstr+'''' '; |
Sollte funktionieren
LG
Stefan
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 21.12.06 00:51
@ZeitGeist87: klammern sollten aber keine rolle spielen.
@r3p47: in welcher zeile liegt denn das probelem?
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Do 21.12.06 07:52
Zitat: | @ZeitGeist87: klammern sollten aber keine rolle spielen. |
U.U. schon.
Dass
Delphi-Quelltext 1: 2:
| sql.clear; sql.add(merk); |
würde ich zu
Delphi-Quelltext
verkürzen.
Versuchs mal mit Parametern
Delphi-Quelltext 1: 2: 3: 4:
| merk:='DELETE FROM reeinzelheiten WHERE renr=:renr AND artnr=:artnr;'; ... sql.ParamByName('renr').Value := renrstr; ... |
Laß dir vielleicht vorher mal Anzeigen welche Werte in den Variablen steht.
_________________ Markus Kinzler.
|
|
oldmax
      
Beiträge: 380
D3 Prof, D4 Prof
|
Verfasst: Do 21.12.06 14:27
Hi
Also, auch ich hab so meine Erfahrung mit SQL- Anweisungen hinter mir. Bis heute habe ich nicht herausgefunden, warum ein Integer-Tabellenwert nicht mit einem String erwischt wird.
Zur Erklärung:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| Var Nummer : String; MySQL : String; ... Nummer:=IntToStr(34);
MySQL :='Select * from '+Tabellenname'; MySQL :=MySQL +' Where (EintragNr='''+Nummer+''')'; MyQuery.SQL.Clear; MyQuery.SQL.Add(MySQL); MyQuery.Open; |
geht nicht, aber
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| Var Nummer : Integer; MySQL : String; ... Nummer:=34; MySQL :='Select * from '+Tabellenname'; MySQL :=MySQL+' Where (EintragNr='''+IntToStr(Nummer)+''')'; MyQuery.SQL.Clear; MyQuery.SQL.Add(MySQL); MyQuery.Open; |
geht.
Bei VB sieht manches etwas anders aus und in Delphi würd ich auch das doppelte Satzzeichen dem normalen Gänsefüßchen vorziehen. Übrigends, Klammern benutze ich immer, mag ja sein, das man sich das sparen kann, aber bisher gibt's keine Meckerei von der Datenbank und wenn man etwas mehr eingrenzen will oder sogar mit 'Or' arbeitet, hilft es ungemein, den Überblick zu behalten. Auch die Struktur mit Clear und Add bevorzuge ich, liegt vielleicht in den alten Delphi-Ständen begründet. Auch nehme ich statt execSQL lieber Query.Open mit anschließender Frage nach Recordcount. Und für die Update-Funktionen ein UpdateSQL-Object. Läßt sich relativ leicht einrichten und ist bei mir immer zuverlässig gelaufen.
_________________ Zier dich nich so, ich krieg dich schon....
|
|
raiguen
      
Beiträge: 374
WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
|
Verfasst: Do 21.12.06 18:01
r3p47 hat folgendes geschrieben: |
Delphi-Quelltext 1: 2:
| merk:='DELETE FROM reeinzelheiten WHERE (renr='+renrstr+') AND (artnr='+artnrstr+')'; |
|
Die Syntax ist in sofern falsch, als dass die Werte von renrstr bzw artnrstr vom SQL als Integer interpretiert werden und somit da schon der Fehler alá 'Keine Übereinstimmung der Typen im Ausdruck' produziert wird weil ein StringFeld mit einem Integerwert verglichen werden soll...
Wenn die Feldnamen renr und artnr in deiner Tabelle vom Typ String sind, dann muss das SQL-Statement wie folgt aufgebaut werden:
Delphi-Quelltext 1: 2:
| ... merk:='DELETE FROM reeinzelheiten WHERE (renr= "' +renrstr+ '") AND (artnr="'+artnrstr+'") '; |
Allerdings ist es sinnvoll - gerade wenn die Query öfters mit unterschiedlichen Rechnungsnummern bzw Artikelnummern ausgeführt werden soll - diese zu parametrisieren, sprich die variabalen Werte als Parameter zu übergeben, wie mkinzler das ja schon angedeutet hat.
oldmax hat folgendes geschrieben: | ...warum ein Integer-Tabellenwert nicht mit einem String erwischt wird.
|
Nun ja, davon mal abgesehen, dass man eigentlich immer versuchen sollte, den Typ des Vergleichwertes dem des Tabellenwertes anzupassen, habe ich bei denen beiden 'Varianten' stets das gleiche Ergbenis, sprich es funzen beide  Übrigens: das Hochkamma vor dem Semikolon in der Zeile 5 bzw 6 ist wohl eher ein Vertipsselfehler  Hätte aber spätestens bei der Vorschau dank der DelphiTags unbedingt aufallen müssen...
oldmax hat folgendes geschrieben: | in Delphi würd ich auch das doppelte Satzzeichen dem normalen Gänsefüßchen vorziehen. |
Das ist nicht eine Frage von Delphi sondern steht eher im Zusammenhang, WELCHE SQL-Syntax verwendet wird, will damit sagen, dass die eine SQL-DB das Gänsefüsschen (" ->Shift 2) für einen String zwingend vorschreibt, die andere SQL-DB dagegen nur das einfache Hochkomma (' -> Shift #) haben möchte
Um das zu umgehen bzw sich eine zeitraubende Sucherei bei entsprechenden Fehlermeldungen zu ersparen, ist die Methode der Parameterübergabe sinnvoll - denn da interessiert es mich nicht nicht, welche 'Eingrenzung' die SQL-DB nun haben möchte...
oldmax hat folgendes geschrieben: | ...Auch nehme ich statt execSQL lieber Query.Open mit anschließender Frage nach Recordcount... |
Hallo???  Es sollte dir schon klar sein, wo der Unterschied zwischen den beiden ist???
oldmax hat folgendes geschrieben: | ...Und für die Update-Funktionen ein UpdateSQL-Object. Läßt sich relativ leicht einrichten und ist bei mir immer zuverlässig gelaufen. |
Wenn man es verstanden hat, dann kann man damit gut umgehen...Allerdings MUSS bei den drei 'Einzel'-Funktionen ja zunächst erstmal ein entsprechendes SQL-Statement geschrieben werden, und von daher muss man sich natürlich mit der richtigen Schreibweise bzw Syntax auskennen  sonst wird das nix...
|
|
oldmax
      
Beiträge: 380
D3 Prof, D4 Prof
|
Verfasst: Fr 22.12.06 06:38
Hi
nun ja, ExecSql liefert keine Ergebnismenge, fast so wie meine Abfrage Query.Open und Query.RecordCount=0...
daher...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| If Query.RecordCount>0 then begin Query.edit; Query['erstens']:=irgendwas; .... UpdateSQL.Apply(UkModify); end else begin Query.Append; Query['Index']:=34; Query['erstens']:=irgendwas; .... UpdateSQL.Apply(UkInsert); end; |
zum Löschen einfach
Delphi-Quelltext 1:
| If Query.RecordCount>0 then UpdateSQL.Apply(UkDelete); |
Zu den Hochkommata, ich hab mich nicht verzählt, aber soweit ich's noch aus alter Schule hab, 2 x'=". also ''' entspricht "' bzw. '"
Demnach hab ich am SQL Syntaxn nichts verändert, mag ja sein, das es für manche zu unübersichtlich wird.
Zu den UpdateSQL-Objekten kann ich nur sagen, diese erzeugen sich ihren Syntax selber. Rechte Maustaste ins UpdateObjekt und SQLEditor aufrufen. Index bestimmen und Tabellenfelder markieren. SQL generieren und fertig. Vorher sollte einer Query das Update Objekt zugewiesen worden sein, dann sind die Felder auch sichtbar. Lediglich für die Zuweisung der Tabellenwerte muß man was tun, aber das ist bei Parameterwerten auch nich anders. Aber es gibt viele Wege nach Rom, und was für manchen einfach und übersichtlich ist...
Wichtig ist letztendlich ein zuverlässiges Ergebnis.
Gruß oldmax
_________________ Zier dich nich so, ich krieg dich schon....
|
|
raiguen
      
Beiträge: 374
WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
|
Verfasst: Fr 22.12.06 11:24
oldmax hat folgendes geschrieben: | ...
Zu den Hochkommata, ich hab mich nicht verzählt, ... |
Ähm, ich meinte diese Zeile hier:
Quelltext 1:
| MySQL :='Select * from '+Tabellenname'; | Sorry für den missverständlichen Hinweis..
oldmax hat folgendes geschrieben: |
...2 x'=". also ''' entspricht "' bzw. '" |
Falsch geraten bzw falsch gelernt! Sieh dir doch mal diese beiden unterschiedlichen Statements an:
Quelltext 1: 2: 3:
| QUERY1.SQL.Text := 'SELECT * FROM bla WHERE feld = ''' + 'irgendwas' + ''''; QUERY2.SQL.Text := 'SELECT * FROM bla WHERE feld = "' + 'irgendwas' + '"'; ShowMessage(Query1.SQL.Text + #13#10 + Query2.SQL.Text); |
Na....? Fällt dir was auf?? Soviel also zur 'Formel' 2x ' = "
oldmax hat folgendes geschrieben: | Zu den UpdateSQL-Objekten kann ich nur sagen, diese erzeugen sich ihren Syntax selber... |
Wäre ja schön, wenn dem so ist..., aber das machst du schon händisch bzw eben wie du beschrieben hast mithilfe des SQL-Editors...
|
|
oldmax
      
Beiträge: 380
D3 Prof, D4 Prof
|
Verfasst: Fr 22.12.06 14:24
Erwischt...  ach man, das is ja auch schon so lange her und hieß glaub ich UCSD-Pascal sowie auch MT+. Aber ist auch möglich, das tatsächlich nur dieses Hochkommata in den Text kam. Ich hab mir da keien Kopf mehr drüber gemacht, weil die SQL Abfragen eben so auch funktionieren. Sowohl bei der BDE als auch bei SQL-Server und MS-Access.
Ok, Frohes Fest
Gruß oldmax
_________________ Zier dich nich so, ich krieg dich schon....
|
|
|