Autor Beitrag
gd0123456
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



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

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

// Der Insert ist nur ein Teilauszug

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 285
Erhaltene Danke: 33


DX10 Berlin Professional
BeitragVerfasst: Sa 01.02.14 16:36 
Moin... 8)

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... :zwinker:
gd0123456 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 285
Erhaltene Danke: 33


DX10 Berlin Professional
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



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



BeitragVerfasst: Sa 01.02.14 17:50 
ausblenden 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)) <> nilthen
        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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 285
Erhaltene Danke: 33


DX10 Berlin Professional
BeitragVerfasst: 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