Autor |
Beitrag |
N.Delphi
Hält's aus hier
Beiträge: 9
Delphi (Lazarus)
|
Verfasst: Do 26.06.08 11:27
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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 26.06.08 11:29
Könntest Du bitte für Quelltexte Delphi-Tags verwenden? TIA.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
N.Delphi 
Hält's aus hier
Beiträge: 9
Delphi (Lazarus)
|
Verfasst: 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
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Do 26.06.08 11:33
Ich habs mal oben gesetzt. Einfach den Code mit [delp hi]...[/delphi] einschließen oder die Buttons unter "Bereiche" benutzen. 
_________________ We are, we were and will not be.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 |
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
N.Delphi 
Hält's aus hier
Beiträge: 9
Delphi (Lazarus)
|
Verfasst: 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.
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
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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
N.Delphi 
Hält's aus hier
Beiträge: 9
Delphi (Lazarus)
|
Verfasst: 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?! 
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
N.Delphi 
Hält's aus hier
Beiträge: 9
Delphi (Lazarus)
|
Verfasst: 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 
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
N.Delphi 
Hält's aus hier
Beiträge: 9
Delphi (Lazarus)
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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));
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
N.Delphi 
Hält's aus hier
Beiträge: 9
Delphi (Lazarus)
|
Verfasst: 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!
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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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: xkcd.com/327/ ... Siehe auch in der Wiki
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
N.Delphi 
Hält's aus hier
Beiträge: 9
Delphi (Lazarus)
|
Verfasst: Do 26.06.08 22:33
Erstmal danke für die Antworten
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:
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 
Hält's aus hier
Beiträge: 9
Delphi (Lazarus)
|
Verfasst: 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 
|
|
|