Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hallo Community,

ich habe folgendes Problem: Ich habe mir einen Code zusammen geschrieben, der am Schluss eine Abfrage bilden soll - in der man Kunden abfragen kann. Mein bisheriger Code sieht bisher so aus:

<?php

// Logindaten für die Datenbank
$host = ...
$dbuser = ...
$dbpassword = ...

// Datenbank Login
$login = ibase_connect($host, $dbuser, $dbpassword);
// Fehlermeldung
if($login==false)
{
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>

<script language="javascript" type="text/javascript">
//<![CDATA[
alert("Die Datenbank konnte nicht geöffnet werden.");
//]]>
</script><?php
echo ibase_errmsg();
die;
}


// Einbindung der HTML Datei (zur Wiederholung der Eingabe)
include('abfrage.html');
$text = $_POST['eingabe'];


// Abfrage der query
switch($text)
{
// Keine Eingabe
case FALSE:
?>
<script language="javascript" type="text/javascript">
//<![CDATA[
alert('Bitte machen Sie eine Eingabe!');
//]]>
</script><?php
echo ibase_errmsg();
die;

// Eingabe: Komma -> Alles anzeigen
case ',':
$query = "SELECT
pa.pa_name,
pa.pa_vorname,
pa.pa_titel,
(substring(100+extract(DAY FROM pa.pa_geb_datum)from 2 for 2)||
'.'|| substring(100+extract(MONTH FROM pa.pa_geb_datum)from 2 for 2)||
'.'|| extract(YEAR FROM pa.pa_geb_datum)),
vs.vs_kas_bezeichnung,
vs.vs_versich_art,
vs.vs_mart mitsta,
pa.pa_behandler,
pa.pa_pat_nr,
vs_ab_datum
FROM
patient pa,
versichertenstatus vs
WHERE
pa.pa_pat_nr = vs.vs_pat_nr
ORDER BY
pa_name ASC,
pa_vorname ASC
;";

break;

// Eingabe = Zahl
case is_numeric($text):
$query = "SELECT
pa_name,
pa_vorname,
pa_titel,
substring(100+extract(DAY FROM pa_geb_datum)from 2 for 2)||
'.'|| substring(100+extract(MONTH FROM pa_geb_datum)from 2 for 2)||
'.'|| extract(YEAR FROM pa_geb_datum),
vs_kas_bezeichnung,
vs_versich_art,
vs_mart,
pa_behandler,
pa_pat_nr,
vs_ab_datum
FROM
patient,
versichertenstatus
WHERE
pa_pat_nr=vs_pat_nr
AND LOWER(PA_PAT_NR) LIKE '".$text."%'
AND vs_ab_datum IN (SELECT MAX(vs_ab_datum)
FROM versichertenstatus
GROUP BY vs_pat_nr)
ORDER BY
pa_name,
pa_vorname,
vs_ab_datum DESC;";
break;

case (strpos($text, ',')<1):
$splitted_name = explode(',', $text);

$vorname = trim($splitted_name[1]);

$query = "SELECT
pa_name,
pa_vorname,
pa_titel,
substring(100+extract(DAY FROM pa_geb_datum)from 2 for 2)||
'.'|| substring(100+extract(MONTH FROM pa_geb_datum)from 2 for 2)||
'.'|| extract(YEAR FROM pa_geb_datum),
vs_kas_bezeichnung,
vs_versich_art,
vs_mart,
pa_behandler,
pa_pat_nr,
vs_ab_datum
FROM
patient,
versichertenstatus
WHERE
pa_pat_nr=vs_pat_nr
AND LOWER(PA_VORNAME) LIKE '".strtolower($vorname)."%'
AND vs_ab_datum IN (SELECT MAX(vs_ab_datum)
FROM versichertenstatus
GROUP BY vs_pat_nr)
ORDER BY
pa_name,
pa_vorname,
vs_ab_datum DESC;";

// Suche nach Vor- und Nachnamen über Eingabe: Komma
case (strpos($text, ',')>0):
$splitted_name = explode(',', $text);

$name = trim($splitted_name[0]);
$vorname = trim($splitted_name[1]);

$query = "SELECT
pa_name,
pa_vorname,
pa_titel,
substring(100+extract(DAY FROM pa_geb_datum)from 2 for 2)||
'.'|| substring(100+extract(MONTH FROM pa_geb_datum)from 2 for 2)||
'.'|| extract(YEAR FROM pa_geb_datum),
vs_kas_bezeichnung,
vs_versich_art,
vs_mart,
pa_behandler,
pa_pat_nr,
vs_ab_datum
FROM
patient,
versichertenstatus
WHERE
pa_pat_nr=vs_pat_nr
AND LOWER(PA_NAME) LIKE '".strtolower($name)."%'
AND LOWER(PA_VORNAME) LIKE '".strtolower($vorname)."%'
AND vs_ab_datum IN (SELECT MAX(vs_ab_datum)
FROM versichertenstatus
GROUP BY vs_pat_nr)
ORDER BY
pa_name,
pa_vorname,
vs_ab_datum DESC;";
break;

// Suche nach Vor- und Nachnamen über Eingabe: Leerzeichen
case (strpos($text, ' ')>0):
$splitted_name = explode(' ', $text);

$name = trim($splitted_name[0]);
$vorname = trim($splitted_name[1]);

$query = "SELECT
pa_name,
pa_vorname,
pa_titel,
substring(100+extract(DAY FROM pa_geb_datum)from 2 for 2)||
'.'|| substring(100+extract(MONTH FROM pa_geb_datum)from 2 for 2)||
'.'|| extract(YEAR FROM pa_geb_datum),
vs_kas_bezeichnung,
vs_versich_art,
vs_mart,
pa_behandler,
pa_pat_nr,
vs_ab_datum
FROM
patient,
versichertenstatus
WHERE
pa_pat_nr=vs_pat_nr
AND LOWER(PA_NAME) LIKE '".strtolower($name)."%'
AND LOWER(PA_VORNAME) LIKE '".strtolower($vorname)."%'
AND vs_ab_datum IN (SELECT MAX(vs_ab_datum)
FROM versichertenstatus
GROUP BY vs_pat_nr)
ORDER BY
pa_name,
pa_vorname,
vs_ab_datum DESC;";
break;

// Suche nach Vor- und Nachnamen über Eingabe: Kommas anschließenden Leerzeichen
case (strpos($text, ', ')>0):
$splitted_name = explode(', ', $text);

$name = trim($splitted_name[0]);
$vorname = trim($splitted_name[1]);

$query = "SELECT
pa_name,
pa_vorname,
pa_titel,
substring(100+extract(DAY FROM pa_geb_datum)from 2 for 2)||
'.'|| substring(100+extract(MONTH FROM pa_geb_datum)from 2 for 2)||
'.'|| extract(YEAR FROM pa_geb_datum),
vs_kas_bezeichnung,
vs_versich_art,
vs_mart,
pa_behandler,
pa_pat_nr,
vs_ab_datum
FROM
patient,
versichertenstatus
WHERE
pa_pat_nr=vs_pat_nr
AND LOWER(PA_NAME) LIKE '".strtolower($name)."%'
AND LOWER(PA_VORNAME) LIKE '".strtolower($vorname)."%'
AND vs_ab_datum IN (SELECT MAX(vs_ab_datum)
FROM versichertenstatus
GROUP BY vs_pat_nr)
ORDER BY
pa_name,
pa_vorname,
vs_ab_datum DESC;";
break;

// Suche nach Vor- und Nachnamen über Eingabe: Leerzeichen anschließend Komma
case (strpos($text, ' ,')>0):
$splitted_name = explode(' ,', $text);

$name = trim($splitted_name[0]);
$vorname = trim($splitted_name[1]);

$query = "SELECT
pa_name,
pa_vorname,
pa_titel,
substring(100+extract(DAY FROM pa_geb_datum)from 2 for 2)||
'.'|| substring(100+extract(MONTH FROM pa_geb_datum)from 2 for 2)||
'.'|| extract(YEAR FROM pa_geb_datum),
vs_kas_bezeichnung,
vs_versich_art,
vs_mart,
pa_behandler,
pa_pat_nr,
vs_ab_datum
FROM
patient,
versichertenstatus
WHERE
pa_pat_nr=vs_pat_nr
AND LOWER(PA_NAME) LIKE '".strtolower($name)."%'
AND LOWER(PA_VORNAME) LIKE '".strtolower($vorname)."%'
AND vs_ab_datum IN (SELECT MAX(vs_ab_datum)
FROM versichertenstatus
GROUP BY vs_pat_nr)
ORDER BY
pa_name,
pa_vorname,
vs_ab_datum DESC;";
break;

// Suche nach Vor- und Nachnamen über Eingabe: Leerzeichen, Komma, Leerzeichen
case (strpos($text, ' , ')>0):
$splitted_name = explode(' , ', $text);

$name = trim($splitted_name[0]);
$vorname = trim($splitted_name[1]);

$query = "SELECT
pa_name,
pa_vorname,
pa_titel,
substring(100+extract(DAY FROM pa_geb_datum)from 2 for 2)||
'.'|| substring(100+extract(MONTH FROM pa_geb_datum)from 2 for 2)||
'.'|| extract(YEAR FROM pa_geb_datum),
vs_kas_bezeichnung,
vs_versich_art,
vs_mart,
pa_behandler,
pa_pat_nr,
vs_ab_datum
FROM
patient,
versichertenstatus
WHERE
pa_pat_nr=vs_pat_nr
AND LOWER(PA_NAME) LIKE '".strtolower($name)."%'
AND LOWER(PA_VORNAME) LIKE '".strtolower($vorname)."%'
AND vs_ab_datum IN (SELECT MAX(vs_ab_datum)
FROM versichertenstatus
GROUP BY vs_pat_nr)
ORDER BY
pa_name,
pa_vorname,
vs_ab_datum DESC;";
break;

// Normale Suche nach Nachnamen
default:
$query = "SELECT
pa_name,
pa_vorname,
pa_titel,
substring(100+extract(DAY FROM pa_geb_datum)from 2 for 2)||
'.'|| substring(100+extract(MONTH FROM pa_geb_datum)from 2 for 2)||
'.'|| extract(YEAR FROM pa_geb_datum),
vs_kas_bezeichnung,
vs_versich_art,
vs_mart,
pa_behandler,
pa_pat_nr,
vs_ab_datum
FROM
patient,
versichertenstatus
WHERE
pa_pat_nr=vs_pat_nr
AND LOWER(PA_PAT_NR) LIKE '".$text."%'
AND vs_ab_datum IN (SELECT MAX(vs_ab_datum)
FROM versichertenstatus
GROUP BY vs_pat_nr)
ORDER BY
vs_ab_datum DESC;";
}

// Login und Verbindung zur Query
$dbabfrage = ibase_query($login, $query);
//Fehlermeldung
if($dbabfrage==false)
{
echo(string)ibase_errmsg();
die;
}

// Datenbank anzeigen
echo '<br />';
echo '<table border="1" align="center" style="background-color: white; min-width: 800px; font-family: Arial;">';
echo '<tr>';
echo '<th>Name, ';
echo 'Vorname';
echo '<span style="white-space:pre"> </span>';
echo 'Titel</th>';
echo '<th>Geb.-Datum</th>';
echo '<th>Kr.-Kass.-Namen</th>';
echo '<th>Priv.</th>';
echo '<th>Mitgl.</th>';
echo '<th>Stam.</th>';
echo '<th>Pat-Nr.</th>';
echo '</tr>';
while($zeile = ibase_fetch_row($dbabfrage))
{
echo '<tr>';

for($j=0; $j<1; $j++)
{
echo '<td>' .(string)$zeile[0]. ', ' .(string)$zeile[1].
'<span style="white-space:pre"> </span>' .(string)$zeile[2]. '</td>';
}

for($j=3; $j<5; $j++)
{
echo '<td>' . (string)$zeile[$j] . '</td>';

if(strlen($zeile[4]) >= '15')
{
$zeile[4]=substr($zeile[4], 0,15);
}
}

if($zeile[5] == '1')
{
echo '<td> </td>';
}
elseif($zeile[5] == '2')
{
echo '<td>P</td>';
}

switch($zeile[6])
{
case '1':
echo '<td>M</td>';
break;

case '3':
echo '<td>F</td>';
break;

case '5':
echo '<td>R</td>';
break;

default:
echo '<td>-</td>';
break;
}

echo '<td>' . (string)$zeile[7] . '</td>';

for($j=8; $j<10; $j++)
{
echo '<td>' . (string)$zeile[$j] . '</td>';
}

echo '</tr>';
}
echo '</table>';


// Beenden und Schließen der Datenbank
ibase_free_result($dbabfrage);
ibase_close($login);


// Abschließender Satz
echo "<br /><br />database request completed";

?>

<title></title>
</head>

<body>
</body>
</html>[/PHP]

Mein Problem ist jetzt, das ich es nicht hin bekomme, das jeder Patient wirklich nur einmal angezeigt wird. Ein Teil meiner Tabelle würde im Moment noch so aussehen:

[code] Tut, Heike 08.02.1966 AOK Coburg M He 666 1998-04-01 00:00:00 Tut, Heike 08.02.1966 AOK Coburg M He 666 1999-10-09 00:00:00 Tut, Heike 08.02.1966 AOK Coburg M He 666 2002-12-25 00:00:00[/code]

Wobei das Datum am Schluss nur als Orientierung dient, das ist das Datum ab wann der jeweilige Eintrag gültig ist (Das [i]vs_ab_datum[/i] in der Datenbanktabelle).

Ich soll es so hinbringen das eben diese eine Person nach der ID-Nummer (der 666 in dem Fall) aussortiert wird und nur EINMAL, nach dem aktuellsten vs_ab_datum, angezeigt wird!

Allerdings weiß ich nicht wie ich das anstellen soll und ich bin echt schon mit meinem Latein am Ende. :confused:

Zur Information, ich benutze kein MySQL sondern eine FireBird Datenbank.

Danke also für eure Hilfe, schon einmal im Vorhinein.

Mit freundlichen Grüßen

PATix

Geschrieben

                            AND vs_ab_datum IN (SELECT MAX(vs_ab_datum)
FROM versichertenstatus
GROUP BY vs_pat_nr) [/PHP]

Hast du mal das Select Statement getestet und geschaut was bei raus kommt?

Geschrieben
Hast du mal das Select Statement getestet und geschaut was bei raus kommt?

Ja, habe ich ich. Er sortiert mir die Ausgaben nach dem vs_ab_datum, zwar das aktuellste Datum zu erst.

Geschrieben

Wäre es nicht übersichtlicher, im CASE-Block nur die WHERE-Bedingung zu modifizieren?

Und müsste in dem SubSelect zum MAX(vs-ab-datum) nicht die WHERE-Bedienung ebenfalls berücksichtigt werden?

Und warum ist dort die Formulierung AND vs-ab-datum IN und nicht = (SELECT MAX(...)...?

Geschrieben
Wäre es nicht übersichtlicher, im CASE-Block nur die WHERE-Bedingung zu modifizieren?

In wie fern meinst du das?

Und müsste in dem SubSelect zum MAX(vs-ab-datum) nicht die WHERE-Bedienung ebenfalls berücksichtigt werden?

Wieso das? Was sollte den dort in die WHERE-Bedienung rein? o.O

Und warum ist dort die Formulierung AND vs-ab-datum IN und nicht = (SELECT MAX(...)...?

Da er mir sonst gar keine Ausgabe macht.

Geschrieben
Da er mir sonst gar keine Ausgabe macht.

Okay, das stimmt nicht ganz, ich habe gerade mal das GROUP BY weggelassen und habe ein = statt dem IN gemacht

und es hat einwandfrei funktioniert. Allerdings gibt er mir jetzt nur noch die Person aus, bei der zu letzt etwas am Eintrag geändert worden ist. (Also sprich, mir wird nur noch eine einzige Person angezeigt.) :-/

Geschrieben

So, ich danke dir sehr, ich habe men Problem endlich gelöst und zwar folgendermassen:

$query = "SELECT
pa_name,
pa_vorname,
pa_titel,
substring(100+extract(DAY FROM pa_geb_datum)from 2 for 2)||
'.'|| substring(100+extract(MONTH FROM pa_geb_datum)from 2 for 2)||
'.'|| extract(YEAR FROM pa_geb_datum),
vs_kas_bezeichnung,
vs_versich_art,
vs_mart,
pa_behandler,
pa_pat_nr,
vs_ab_datum
FROM
patient
LEFT JOIN
versichertenstatus ON patient.pa_pat_nr = versichertenstatus.vs_pat_nr
WHERE
versichertenstatus.vs_ab_datum = (SELECT MAX(vs_ab_datum)
FROM versichertenstatus
WHERE pa_pat_nr = vs_pat_nr
GROUP BY vs_pat_nr)
AND pa_pat_nr = vs_pat_nr
AND LOWER(PA_NAME) LIKE '".$text."%'
ORDER BY
pa_name ASC,
pa_vorname ASC;";[/PHP]

Ich danke dir für deine Hilfe. :D

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...