Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - GridFeld, ComboBoxen und vieles mehr :-(
N.Delphi - Do 26.06.08 11:27
Titel: GridFeld, ComboBoxen und vieles mehr :-(
Hallo,
bin gerade dabei ein kleines System für die Verwaltung von Laborparametern zu programmieren.
Dafür muss ich ein GridFeld mit den bereits vorhandenen Proben füllen und aus meiner ComboBox unterschiedliche Diagnosen wählen können.
Die Diagnosen sind in meiner Datenbank als eigene Tabelle(diff_diag_id, diff_diag_description) abgespeichert.
Ich schicke mal einen Teil meines Quellcodes mit, leider funktioniert es noch nicht :-(
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:
| procedure TFo_patinfo.personData; var v_sql:String; begin v_enc_id:=l_enc_id.Caption; if not ZQuery_getpid.Active then begin ZQuery_getpid.Connection:= db_interface.ZConnection_main; end; with ZQuery_getpid do begin SQL.Clear; SQL.Add('SELECT pid,name_last,name_first,date_birth,sex,title,name_maiden,civil_status '); SQL.Add('citizenship,name_middle,name_others,religion,addr_str,addr_str_nr,addr_zip,addr_city'); SQL.Add('FROM person '); SQL.Add('WHERE pid ='+pid); Active:=true; end; ZQuery_SP.SQL.Clear; ZQuery_SP.SQL.Add('SELECT s.sampling_point_id FROM neuro_sampling_point s '); ZQuery_SP.SQL.Add('person p WHERE p.pid=s.pid ORDER BY puncture_date_time'); ZQuery_SP.Open; ZQuery_SP.Active:=True;
fo_patinfo.Caption:='PatInfo PID: '+pid+', '+ZQuery_getpid.FieldByName('name_last').AsString+' '+ZQuery_getpid.FieldByName('title').AsString+', '+ZQuery_getpid.FieldByName('name_first').AsString+', (* '+datedisplayChange(ZQuery_getpid.FieldByName('date_birth').AsDateTime)+'), Fall-ID: '+v_enc_id; |
Das ist nur der GridFeld-Abschnitt!
Freu mich über Antworten!
Danke!
Moderiert von
Gausi: Delphi-Tags hinzugefügt
BenBE - Do 26.06.08 11:29
Könntest Du bitte für Quelltexte Delphi-Tags verwenden? TIA.
N.Delphi - Do 26.06.08 11:31
BenBE hat folgendes geschrieben: |
Könntest Du bitte für Quelltexte Delphi-Tags verwenden? TIA. |
Sorry, bin neu hier.
Was muss ich dafür einstellen bzw. umstellen?
Danke
Gausi - Do 26.06.08 11:33
Ich habs mal oben gesetzt. Einfach den Code mit [delphi]...[/delphi] einschließen oder die Buttons unter "Bereiche" benutzen. :)
BenBE - Do 26.06.08 11:38
Hast Du Dir die DBGrid und die DBComboBox schon angeschaut? Damit könntest Du das Befüllen (sofern keine wirkliche Verarbeitung notwendig ist) automatisieren.
Auch könnten für die JOINS interessant sein:
SQL-Anweisung
1:
| SELECT A.*, B.* FROM A JOIN B ON A.nespalte = B.somekey WHERE dein = filter |
N.Delphi - Do 26.06.08 11:48
Ich denke die SQL-Abfrage ist nicht das Problem, sondern eher die Syntax!!!
Programmiere normalerweise nicht in Delphi sondern in Java!
Hier meine Versuche die ComboBox zu füllen:
In meiner Nachschlagetabelle(diff_diag) habe ich die differential_diagnose_id und die differential_diagnose_description.
Mit Hilfe eines Index müsste es möglich sein die Tabelle durchzugehen und bei der procedure FormShow() sollten die ComboBoxen mit den gesamten Inhalt der Nachschlagetablle gefüllt werden, damit ich anschliessend für den Patienten z.b. die Verdachtsdiagnose 'Borreliose' auswählen kann.
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:
| procedure Tfo_patinfo.FormShow(Sender: TObject); fo_pat_change.v_pid:=pid; var strValue: String; var intIndex, i:integer; begin set the dateformat ZQuery_SP.first; i:=1; ShortDateFormat := 'dd.mm.yyyy'; DateSeparator := '.'; if not (ZQuery_SP.Active = TRUE) then ZQuery_SP.Connection := db_interface.ZConnection_main; if not ZQuery_SP.Active = TRUE then while not ZQuery_SP.eof do begin ZQuery_SP.Connection := db_interface.ZConnection_main; ZQuery_SP.SQL.Clear; ZQuery_SP.SQL.Add('select p.name_last, p.name_first, p.date_birth, p.sex, s.sampling_point_id '); ZQuery_SP.SQL.Add('from neuro_sampling_point s JOIN person p ON p.pid=s.pid '); ZQuery_SP.SQL.Add('where s.person_pid="'+pid+'"'); ZQuery_SP.Open; begin Zquery_SP.SQL.Clear; ZQuery_SP.SQL.Add('select * from neuro_diff_diag'); ZQuery_SP.Open; combo_diff_diag.Items.AddObject(ZQuery_SP.FieldByName('diff_diag_descr').AsString,TObject(ZQuery_SP.FieldByName('diff_diag_id').AsInteger)); intIndex=ZQuery_SP.FieldByName('diff_diag_id').AsInteger; combo_diff_diag.AddItem(ZQuery_SP.FieldByName('diff_diag_descr').asString,TObject(intIndex)); ZQuery_SP.next; i:=i+1; end; end; personData; end; |
Entweder stimmt etwas mit meiner Datenbankanbindung nicht oder ich habe Fehler in meiner Syntax?!
Danke für die Hilfe!!!
---
Moderiert von
Narses: Beiträge zusammengefasst---
BenBE hat folgendes geschrieben: |
Hast Du Dir die DBGrid und die DBComboBox schon angeschaut? Damit könntest Du das Befüllen (sofern keine wirkliche Verarbeitung notwendig ist) automatisieren.
Auch könnten für die JOINS interessant sein:
SQL-Anweisung 1:
| SELECT A.*, B.* FROM A JOIN B ON A.nespalte = B.somekey WHERE dein = filter | |
Übrigens die ComboBoxen sind normale TComboBoxen keine DBComboBoxen!!!
Soll aber auf die Art und Weise auch möglich sein und leichter zu implementieren!
---
Moderiert von
Narses: Beiträge zusammengefasst---
Das Problem mit dem GridFeld ist gelöst :D
War doch ein Fehler in der SQL-Anweisung :!:
Fehlen nur noch die ComboBoxen :?
Hat von euch schon mal jemand so eine Art von ComboBox programmiert?
BenBE - Do 26.06.08 13:16
Dafür kannst Du TDBComboBoxes nutzen; die bieten direkt die Möglichkeit an, dass man die mit ner Nachschlage-Tabelle befüllen kann.
N.Delphi - Do 26.06.08 13:44
BenBE hat folgendes geschrieben: |
Dafür kannst Du TDBComboBoxes nutzen; die bieten direkt die Möglichkeit an, dass man die mit ner Nachschlage-Tabelle befüllen kann. |
Ist es auch mit den TComboBoxen möglich? Ich denke ich muss die TComboBoxen benutzen, sonst gibt es Probleme mit meinem Prof :?
Komm gerade mit den ComboBoxen nicht weiter, als versuche ich gerade mein Patientensuch_Fenster zu optimieren!
Hier mein Quellcode:
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 Tfo_patsearch.button_pat_searchClick(Sender: TObject); var intPosition:integer; strFirstname,strLastname:string; begin intPosition := AnsiPos(',',editName.Text); QueryPatSearch.SQL.Clear; QueryPatSearch.SQL.Add('SELECT distinct p.pid, p.name_last, p.name_first, '); QueryPatSearch.SQL.Add('p.date_birth,s.sampling_point_id,'); QueryPatSearch.SQL.Add('s.puncture_date_time,s.diff_diag_id, '); QueryPatSearch.SQL.Add('p.date_birth,s.sampling_point_id,s.puncture_date_time,'); QueryPatSearch.SQL.Add('s.diff_diag_id, s.sampling_point_descr_id'); QueryPatSearch.SQL.Add('FROM person p LEFT JOIN neuro_sampling_point s '); QueryPatSearch.SQL.Add('ON p.pid=s.pid WHERE'); if (intPosition <> 0) then begin strLastname := AnsiLeftStr(editName.Text,intPosition-1); strFirstname := AnsiRightStr(editName.Text,Length(editName.Text) - intPosition); strLastname := Trim(strLastname); strFirstname:= Trim(strFirstname); if (editPID.Text <> '') then QueryPatSearch.SQL.add('pid like "' + editPID.text + '%" and '); QueryPatSearch.SQL.add('upper(name_first) like "' + UpperCase(strFirstname) + '%" and '); QueryPatSearch.SQL.add('upper(name_last) like "' + UpperCase(strLastname) + '%" '); end |
Im Moment gibt es nur die Möglichkeit nach dem Namen des Patienten zu suchen, nun möchte ich aber nach der PatientenID und nach weiteren Dingen suchen.
Hat schon jemand 'ne Idee?! :wink:
BenBE - Do 26.06.08 14:11
@Combobox: Einfach unter Items die anzuzeigenden Einträge adden. Also:
Delphi-Quelltext
1:
| DeineCombobox.Items.add('foo'); |
Zum Suchen:
TTable.Filter oder dynamisch die
WHERE-Clause generieren.
N.Delphi - Do 26.06.08 14:21
BenBE hat folgendes geschrieben: |
@Combobox: Einfach unter Items die anzuzeigenden Einträge adden. Also:
Delphi-Quelltext 1:
| DeineCombobox.Items.add('foo'); |
Zum Suchen: TTable.Filter oder dynamisch die WHERE-Clause generieren. |
So hatte ich es schon!!!
Wurde abgelehnt :!:
Soll eine saubere Programmierung abliefern, also über Nachschlagetabellen :?
Trotzdem danke :lol:
BenBE - Do 26.06.08 14:26
Wenn es sauber sein soll, dann nimm die DBCombobox. Sauberer geht es nicht ...
Alternativ: DeineCombobox.Items.AddObject(Bezeichnung, TObject(ID)); Dort kannst Du dann mit Integer(DeineCombobox.Items.GetObject(Index)) die ID wieder abfragen.
N.Delphi - Do 26.06.08 14:34
BenBE hat folgendes geschrieben: |
Wenn es sauber sein soll, dann nimm die DBCombobox. Sauberer geht es nicht ...
Alternativ: DeineCombobox.Items.AddObject(Bezeichnung, TObject(ID)); Dort kannst Du dann mit Integer(DeineCombobox.Items.GetObject(Index)) die ID wieder abfragen. |
Sorry, aber was genau meinst du mit Bezeichnung?
BenBE - Do 26.06.08 14:44
Wenn Du eine Diagnose 'Brainlos' hast und der Suchschlüssel 42 ist, dann würdest du den Eintrag mit DeineCombobox.Items.AddObject('Brainlos', TObject(42));
N.Delphi - Do 26.06.08 14:59
Habe versucht meine Patientensuche zu optimieren.
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| QueryPatSearch.SQL.Clear; QueryPatSearch.SQL.Add('SELECT distinct p.pid, p.name_last, p.name_first,'); QueryPatSearch.SQL.Add('p.date_birth,s.sampling_point_id, s.puncture_date_time,'); QueryPatSearch.SQL.Add('s.diff_diag_id, s.diagnosis_id, s.sampling_point_descr_id '); QueryPatSearch.SQL.Add('FROM person p LEFT JOIN neuro_sampling_point s ON p.pid=s.pid '); QueryPatSearch.SQL.Add('WHERE s.pid ='+editPID.text +' OR p.name_last='+editName.text+''); |
Sobald ich den OR-Teil weglasse, funktioniert diese Abfrage und ich kann nach PatientenID suchen.
Wenn ich den OR-Teil einfüge, dann funktioniert es nicht mehr.
Mein editName-Feld ist ein zusammengesetztes Feld aus Familienname und Vorname, kann das ein Grund dafür sein?
Ich möchte jedoch auf meinen Button "Patienten suchen" klicken können und dann je nachdem nach PatientenID oder PatientenNamen suchen! :roll:
Für jede Hilfe bin ich dankbar!!!
@BenBE, die Sache mit dem AddObject muss ich noch austesten. Bin aber leider nicht so ganz überzeugt, weil ich meine Datenbank-Tabellen-Einträge ja gar nicht nutze?!
BenBE - Do 26.06.08 15:14
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| QueryPatSearch.SQL.Clear; QueryPatSearch.SQL.Add('SELECT distinct p.pid, p.name_last, p.name_first,'); QueryPatSearch.SQL.Add('p.date_birth,s.sampling_point_id, s.puncture_date_time,'); QueryPatSearch.SQL.Add('s.diff_diag_id, s.diagnosis_id, s.sampling_point_descr_id '); QueryPatSearch.SQL.Add('FROM person p LEFT JOIN neuro_sampling_point s ON p.pid=s.pid '); QueryPatSearch.SQL.Add('WHERE s.pid ='+editPID.text +' OR p.name_last='''+editName.text+''''); |
Ach ja, wo wir schon mal bei saubrer Programmierung sind: Benutze Prepared Statements anstatt UNESCAPED Strings einzufügen.
Sonst passiert Dir das hier:
http://xkcd.com/327/ ... Siehe auch
in der Wiki [
http://de.wikipedia.org/wiki/SQL_Injection]
N.Delphi - Do 26.06.08 22:33
Erstmal danke für die Antworten :D
Nun habe ich aber leider trotzdem 3 Problemchen zu lösen:
1. Suche nach PatientenID oder nach Patientenname nicht möglich.
(Mit der jetztigen Funktion ist es möglich, nach der PatientenID zu suchen, beim Versuch nach dem Namen zu suchen folgende Meldung:
"Project raised exception class 'EZSQLException' with message: SQLError: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to user near 'OR p.name_last='muster'' at line2"
Gebe ich es in den MySQLQueryBrowser kommt keine Fehlermeldung :!:
Das ist der Quelltext dazu:
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:
| procedure Tfo_patsearch.button_pat_searchClick(Sender: TObject); var intPosition:integer; strFirstname,strLastname:string; begin QueryPatSearch.SQL.Clear; QueryPatSearch.SQL.Add('SELECT distinct p.pid, p.name_last, p.name_first, '); QueryPatSearch.SQL.Add('p.date_birth, s.sampling_point_id, '); QueryPatSearch.SQL.Add('s.puncture_date_time,s.diff_diag_id, s.diagnosis_id, '); QueryPatSearch.SQL.Add('s.sampling_point_descr_id'); QueryPatSearch.SQL.Add('FROM person p LEFT JOIN neuro_sampling_point s '); QueryPatSearch.SQL.Add('ON p.pid=s.pid WHERE s.pid ='+editPID.text +' '); QueryPatSearch.SQL.Add('OR p.name_last='''+editLastName.text+'''');
QueryPatSearch.Open; QueryPatSearch.Active:=true; grid_search_pat.DataSource:=DatasourcePatSearch; if QueryPatSearch.RecordCount>19 then begin grid_search_pat.ScrollBars:=ssAutoVertical; end else begin grid_search_pat.ScrollBars:=ssNone; end; grid_search_pat.Columns[0].Width:=60; grid_search_pat.Columns[1].Width:=70; grid_search_pat.Columns[2].Width:=70; grid_search_pat.Columns[3].Width:=70; grid_search_pat.Columns[4].Width:=100; grid_search_pat.Columns[5].Width:=90; grid_search_pat.Columns[6].Width:=95; grid_search_pat.Columns[7].Width:=70; grid_search_pat.Columns[8].Width:=90;
grid_search_pat.SelectedColor:=$00BFA184; spaltennamenAendern; editPID.Text:=''; editLastName.Text:=''; grid_search_pat.Columns[0].Title.Alignment:=tacenter; grid_search_pat.Columns[1].Title.Alignment:=tacenter; grid_search_pat.Columns[2].Title.Alignment:=tacenter; grid_search_pat.Columns[3].Title.Alignment:=tacenter; grid_search_pat.Columns[4].Title.Alignment:=tacenter; grid_search_pat.Columns[5].Title.Alignment:=tacenter; grid_search_pat.Columns[6].Title.Alignment:=tacenter; grid_search_pat.Columns[7].Title.Alignment:=tacenter; grid_search_pat.Columns[8].Title.Alignment:=tacenter; if QueryPatSearch.RecordCount=1 then begin anzahlPat.Caption:=IntToStr(QueryPatSearch.RecordCount)+' Patient'; end else begin anzahlPat.Caption:=IntToStr(QueryPatSearch.RecordCount)+' Patienten'; end; if QueryPatSearch.RecordCount>0 then begin if grid_search_pat.Enabled=False then grid_search_pat.Enabled:=True; grid_search_pat.SetFocus; end; end; |
2. Suche nach ProbenentnahmeID möglich, aber wie füge ich weitere Suchen z.B. nach ProbenentnahmeDatum hinzu? Es soll möglich sein entweder nach der Id oder nach Datum oder nach Diagnose zu suchen?!
3. Die Sache mit den ComboBoxen, wenn ich nun DB-ComboBoxen verwende, hat mir jemand ein funktionierendes Beispiel dafür? Meine DB-Tabelle (neuro_diagnosis) mit Einträgen : diagnosis_id und diagnosis_descr
Vielen Dank
und schönen Abend noch :)
N.Delphi - Fr 27.06.08 10:00
Die Suche nach der PatientenID und nach dem PatientenNamen ist gelöst. Problem waren die fehlenden "" für den String
Die anderen Probleme sind im Moment noch offen :cry:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!