Autor Beitrag
N.Delphi
Hält's aus hier
Beiträge: 9


Delphi (Lazarus)
BeitragVerfasst: 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 :-(

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:
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 user profile iconGausi: Delphi-Tags hinzugefügt
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 9


Delphi (Lazarus)
BeitragVerfasst: Do 26.06.08 11:31 
user profile iconBenBE 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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. :)

_________________
We are, we were and will not be.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 9


Delphi (Lazarus)
BeitragVerfasst: 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.

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:
   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;
   //ZQuery_SP.Edit;
       begin
       // v_sql := 'select * from neuro_diff_diag';
          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 user profile iconNarses: Beiträge zusammengefasst---

user profile iconBenBE 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:
ausblenden 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 user profile iconNarses: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 9


Delphi (Lazarus)
BeitragVerfasst: Do 26.06.08 13:44 
user profile iconBenBE 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:

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 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 <> 0then
            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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 26.06.08 14:11 
@Combobox: Einfach unter Items die anzuzeigenden Einträge adden. Also:

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 9


Delphi (Lazarus)
BeitragVerfasst: Do 26.06.08 14:21 
user profile iconBenBE hat folgendes geschrieben:
@Combobox: Einfach unter Items die anzuzeigenden Einträge adden. Also:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 9


Delphi (Lazarus)
BeitragVerfasst: Do 26.06.08 14:34 
user profile iconBenBE 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 9


Delphi (Lazarus)
BeitragVerfasst: Do 26.06.08 14:59 
Habe versucht meine Patientensuche zu optimieren.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 26.06.08 15:14 
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 9


Delphi (Lazarus)
BeitragVerfasst: 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:
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:
procedure Tfo_patsearch.button_pat_searchClick(Sender: TObject);
var intPosition:integer;
strFirstname,strLastname:string;
     begin
      // intPosition := AnsiPos(',',editLastName.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, 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;
            //todo fehlerbereich anfang
         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;

           //todo fehlerbereich ende
         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 Threadstarter
Hält's aus hier
Beiträge: 9


Delphi (Lazarus)
BeitragVerfasst: 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: