Autor |
Beitrag |
gd0123456
      
Beiträge: 33
|
Verfasst: Sa 01.02.14 15:49
Hi hab mal eine Frage, suche einen einfacheren weg, wie man die ganzen Elemente für einen Insert zusammenbaut.
Hab ein Formular mit 37 Radiobuttons, 15 Checkboxen und 20 Edit Felder. Es ist ja recht mühsam den insert zusammenzubauen.
Mein derzeitiger Weg ist:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| for i := 1 to 37 do begin if (TRadiobutton(FindComponent('RadioButton' + IntToStr(i))).Checked = True) then feld_radio[i] := '1' else feld_radio[i] := '0'; end;
mysqlquery1.sql := 'insert into xx ( 'berufhoch,wochenzeitung,tageszeitung,buch,' + 'buchwelche,internet,instrument,instrumentjahre,' + 'verheiratet,alleinstehend,standsonst,einzelkind,' + 'erstgeboren,reihenkind,wohnort,einwohner,' + 'beobachten,karnofsky,station,zimmer) values '+ '"' + edit3.Text + '","' + edit4.Text + '","' + edit5.Text + '","' + feld_radio[1] + '","' + feld_radio[2] + '","' + feld_check[1] +; '"' + edit7.Text + '","' + feld_radio[3] + '","' + feld_radio[4] + '","' + feld_radio[5] + '","' + feld_radio[6] + '","' + feld_radio[7] + '","' + feld_radio[8] + '","' + feld_radio[9])'; |
So nur wenn sich jetzt am Formular was ändert, dann passt das Array auch nicht mehr. Hätte jemand eine Idee wie ich das ganze einfacher machen kann. Die Tabelle hat 70 Spalten und es ist sehr mühsam.
|
|
haentschman
      
Beiträge: 285
Erhaltene Danke: 33
DX10 Berlin Professional
|
Verfasst: Sa 01.02.14 16:36
Moin...
Zu deinem Problem habe ich nicht wirklich eine Lösung aber Tipps:
Zitat: | Formular mit 37 Radiobuttons, 15 Checkboxen und 20 Edit Felder |
Zitat: | Die Tabelle hat 70 Spalten |
* Das Design der Oberfläche ist garantiert unübersichtlich und kaum bedienbar. -> In Themenbereiche aufteilen
* Das Datenbankdesign ist grottig. -> Daten in verschiedene Tabellen aufteilen und Normalisieren.
* SQL Injection ist bei deiner Vorgehensweise ein Kinderspiel. -> Parameter verwenden
Informiere dich mal über die einzelnen Punkte... 
|
|
gd0123456 
      
Beiträge: 33
|
Verfasst: Sa 01.02.14 16:45
Naja des Design habe ich mit dem Pagecontrol gemacht, also ist es mehr oder weniger eh in mehreren Teilen aufgeteilt und somit übersichtlich.
Und die Tabelle aufteilen würde mir persönlich jetzt vom Arbeitsaufwand nicht viel ersparen.
Meinst du mit Parameter "sqlquery1.ParamByName('Checkbox' + IntToStr(i)).asString := '0';" ???????? ja bin ich auch gerade am überlegen, aber löst mein Problem trotzdem nicht, sobald sich was verändert am Formular würde es ja wieder nicht funktionieren.
ok andere fragen noch:
man kann ja den insert so schreiben "insert into xx values ('X')" bzw. "insert into xx (Name) values ('X')". aber die erste variante geht ja nur wenn man keinen Primary key Auto_increment hat oder?
|
|
haentschman
      
Beiträge: 285
Erhaltene Danke: 33
DX10 Berlin Professional
|
Verfasst: Sa 01.02.14 16:53
Zitat: | Meinst du mit Parameter "sqlquery1.ParamByName('Checkbox' + IntToStr(i)).asString := '0';" ???????? |
ParamByName war schon korrekt. Hier mal ein Minimalbeispiel:
Delphi-Quelltext 1: 2:
| Query.SQL.Text:= 'select * from Blubb where ID = :P'; Query.ParamByName('P').AsInteger:= 120; |
Hierbei ist der Name des Parameters frei wählbar. Desweiteren hast du bei verschiedenen Datentypen keine Umwandlungsprobleme durch das As.... Vor Allem die Quote Orgien fallen komplett weg. Das macht das Ganze noch lesbarer.
Zitat: | sobald sich was verändert am Formular würde es ja wieder nicht funktionieren |
Ich sagte ja ich habe nur allgemeine Tipps. Was hindert dich daran, wenn sich dein Formular ändert die Query entsprechend anzupassen? Wird die Oberfläche dynamisch erzeugt? Kommen Felder hinzu mußt du eh die DB anfassen? Ich verstehe das Problem nicht...
Zitat: | ok andere fragen noch: |
...grundsätzlich so: insert into xx (Name) values ('X')
|
|
gd0123456 
      
Beiträge: 33
|
Verfasst: Sa 01.02.14 17:02
Naja meinte wenn sich das Formular ändert, sprich es kommt mal eine Checkbox weg oder ein paar radiobuttons weg dann habe ich ja wieder das gleiche Problem.
es ist nicht dynamisch, aber man weiß ja nie auf welche Ideen manche leute kommen ggg. doof, hoffte es gibt einen leichteren weg mal einen insert zu bauen wenn man soviele Elemente hat.
|
|
gd0123456 
      
Beiträge: 33
|
Verfasst: Sa 01.02.14 17:50
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| for i:= 1 to 37 do begin if (FindComponent('Radiobutton' + IntToStr(i)) <> nil) then begin if (TCheckbox(FindComponent('Radiobutton' + IntToStr(i))).Checked = True) then sqlquery1.ParamByName('r' + IntToStr(i)).asString := '1' else sqlquery1.ParamByName('r' + IntToStr(i)).asString := '0'; end; end;
memo1.lines.add('insert into patient (name, vorname,' + 'geb, sehengut, vermindertsehen, brille, welchebrille,' + 'hoerengut, hoerenvermindert, hoergeraet, haendigkeitrechts,' + 'erstgeboren,reihenkind,wohnort,einwohner,' + 'beobachten,karnofsky,station,zimmer) values ("'+ '"' + edit3.Text + '","' + edit4.Text + '","' + edit5.Text + '",:r1,:r2'); |
Hab das jetzt mit den Parameter ausprobiert nur schreibt er dann dass er r1 nicht finden kann. woran liegt?
|
|
haentschman
      
Beiträge: 285
Erhaltene Danke: 33
DX10 Berlin Professional
|
Verfasst: Sa 01.02.14 19:06
Zitat: | Hab das jetzt mit den Parameter ausprobiert nur schreibt er dann dass er r1 nicht finden kann |
Du weist erst die Parameter zu und deine Query hat noch keinen SQL.
Richtig:
1. Query.SQL.Text
2. Parameter
|
|
|