Autor Beitrag
r3p47
Hält's aus hier
Beiträge: 6

Windows XP, Ubuntu
Delphi 3&7
BeitragVerfasst: Mi 20.12.06 16:53 
ausblenden volle Höhe 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:
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;

  //ArtNr ermitteln
  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
  //Hier musste noch eine Bedingung hin, dass er nicht in ALLEN Rechnungen nach dem Artikel sucht,
  //sondern nur in der Angezeigten, und, dass man die Anzahl ändern kann.
    if  (FieldByName('artnr').AsString=ArtNrStr) and (FieldByName('renr').AsString=renr_edit.text) then
    begin
      if anz_spinedit.Text<>artnrstr  then
      begin
      //Anzahl ändern funktioniert nicht???->Fehler? ->in MyAdmin funktioniert es
    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;


ausblenden 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
  //Nummern bestimmen
  renrstr:=renr_edit.text;

  with artikelcombobox do artnrstr:=copy(text,1,pos(':',text)-1);

  //SQL-Befehl zusammenbauen

  //Wo ist hier der falsche Syntax???

   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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: Mi 20.12.06 17:18 
warum Klammern um die Where-Clause?

ausblenden 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



BeitragVerfasst: Do 21.12.06 00:51 
@ZeitGeist87: klammern sollten aber keine rolle spielen.

@r3p47: in welcher zeile liegt denn das probelem?
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Do 21.12.06 07:52 
Zitat:
@ZeitGeist87: klammern sollten aber keine rolle spielen.
U.U. schon.
Dass
ausblenden Delphi-Quelltext
1:
2:
 sql.clear;
    sql.add(merk);

würde ich zu
ausblenden Delphi-Quelltext
1:
    sql.Text := merk;					

verkürzen.
Versuchs mal mit Parametern
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 380


D3 Prof, D4 Prof
BeitragVerfasst: 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:
ausblenden 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

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

WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
BeitragVerfasst: Do 21.12.06 18:01 
r3p47 hat folgendes geschrieben:

ausblenden Delphi-Quelltext
1:
2:
  //Wo ist hier der falsche Syntax???
   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:
ausblenden 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 user profile iconmkinzler das ja schon angedeutet hat.

user profile iconoldmax 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...


user profile iconoldmax 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...

user profile iconoldmax hat folgendes geschrieben:
...Auch nehme ich statt execSQL lieber Query.Open mit anschließender Frage nach Recordcount...

Hallo??? :roll: Es sollte dir schon klar sein, wo der Unterschied zwischen den beiden ist???

user profile iconoldmax 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 380


D3 Prof, D4 Prof
BeitragVerfasst: 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...

ausblenden 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// eindeutiger Index !!
  Query['erstens']:=irgendwas;
  ....
  UpdateSQL.Apply(UkInsert);
end;


zum Löschen einfach

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

WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
BeitragVerfasst: Fr 22.12.06 11:24 
user profile iconoldmax hat folgendes geschrieben:
...
Zu den Hochkommata, ich hab mich nicht verzählt, ...

Ähm, ich meinte diese Zeile hier:
ausblenden Quelltext
1:
MySQL    :='Select * from '+Tabellenname';					
Sorry für den missverständlichen Hinweis..

user profile iconoldmax hat folgendes geschrieben:

...2 x'=". also ''' entspricht "' bzw. '"

Falsch geraten bzw falsch gelernt! Sieh dir doch mal diese beiden unterschiedlichen Statements an:
ausblenden 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 ' = "

user profile iconoldmax 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 380


D3 Prof, D4 Prof
BeitragVerfasst: Fr 22.12.06 14:24 
Erwischt... :oops: 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....