baseportal
Suche: 
 Forum   Start 

Erweiterte Datenbank-Funktionalität

ab Version 3 
Verstecken Inhalt

Sortierung mit deutschen Umlauten

Neue Sortierung bei Feldern "Text (de)"

baseportal kann ab Version 3 nach den deutschen Regeln sortieren, d.h. Umlaute werden wie die entsprechenden Grundbuchstaben behandelt: ä wie a, ö wie o etc. - Schäden wie Schaden und damit vor Schadensfall. Bei sonst gleichlautendem Begriff stehen sie hinter dem zugehörigen Grundbuchstaben: Schaden also vor Schäden und fuhren vor führen. Das "scharfe s" ß sortiert baseportal nach der ISO-Norm 5007-1 hinter ss ein, Masse steht also vor Maße. Der Duden sortiert dies -unlogischerweise- anders herum; bei den anderen Umlauten steht der Umlaut schliesslich auch hinter dem Grundbuchstaben.

Dazu muss die Sortierung des gewünschten Feldes auf "Text (de)" gestellt werden und die Datenbank danach reorganisiert werden.


Umwandlung Gross/Kleinschrift

Auch bei Umwandlungen in Groß-/Kleinschrift mit uc bzw. lc werden Umlaute nun berücksichtigt:

<perl>
out uc("Mäßigung");
</perl>

Gibt MÄSSIGUNG aus. Bei der Umwandlung von Gross- in Kleinbuchstaben gibt es keine Ersetzung für das ß, die Rückwandlung mit

<perl>
out lc("MÄSSIGUNG");
</perl>

ergibt mässigung.


Eigene Texte sortieren

Möchte man eigene Texte (Arrays) nach deutschen Umlauten sortieren, so gibt es dafür die Funktion sort_de:

<perl>
@x=sort_de("hans", "hähä", "haha", "Hänschen", "Haar", "hänftling", "Hägar", "HAHA");
out "@x";
</perl>

Führt zu folgender Ausgabe:

Haar Hägar HAHA haha hähä hänftling hans Hänschen

Wie man sieht werden Grossbuchstaben dabei ignoriert. Möchte man dies nicht, so muss man das "de" in der Funktion GROSS schreiben:

<perl>
@x=sort_DE("hans", "hähä", "haha", "Hänschen", "Haar", "hänftling", "Hägar", "HAHA");
out "@x";
</perl>

Führt zu folgender Ausgabe:

HAHA Haar Hägar Hänschen haha hähä hänftling hans


Vergleiche mit Umlauten

Um zwei Wörter mit Umlauten zu vergleichen gibt es die Funktion cmp_de. Diese liefert -1 zurück wenn das 1. Wort vor dem 2. Wort steht, 1 wenn das 2. Wort vor dem 1. Wort steht und 0 wenn beide identisch sind:

<perl>
out cmp_de "Kalb", "kälber";
out cmp_de "Wörter", "wort";
</perl>

Ergibt -1 und 1. Auch hier werden mit einem grossen "DE" Grossbuchstaben beachtet:

<perl>
out cmp_DE "Kalb", "kälber";
out cmp_DE "Wörter", "wort";
</perl>

Ergibt 1 und 1.

Damit sind auch alle anderen Textvergleiche wie lt, le etc. möglich:

Die Abfrage auf Gleichheit funktioniert mit oder ohne Umlaute immer mit eq.


Kurzformen beim Lesen und Beschreiben von Datenbanken

get "datenbank";

Holt den kompletten Inhalt der Datenbank (Die Abfrage lautet: Id==*).

put "datenbank";

Schreibt den Standard-Hash %_put in die Datenbank.


Ergebnisse können mit $ergebnis{Feld}[Zeile] gelesen werden

Nach einem get steht das Ergebnis in einem Hash mit dem gleichen Namen wie die Datenbank zur Verfügung:

get "meinedb";

for(my $i=0; $i<$_amount; $i++)
{
    out $meinedb{Feldname}[$i]," ";
}

Gibt man einen Ergebnisnamen an, so wird dieser als Hashname verwendet:

get "Name~=a", "meinedb", "ergebnis1";
get "Name~=b", "meinedb", "ergebnis2";

for(my $i=0; $i<$ergebnis1{_amount}; $i++)
{
    out $ergebnis1{Feldname}[$i]," ";
}

for(my $i=0; $i<$ergebnis2{_amount}; $i++)
{
    out $ergebnis2{Feldname}[$i]," ";
}

Zur (Test-)Ausgabe des Ergebnis-Hashs eignet sich der Befehl dump:

get "meinedb";
out dump %meinedb;


Ausgabefilter in eigenem Code aktivieren

Innerhalb eigenen Codes werden Einträge die aus einer Datenbank gelesen wurden, nicht durch den Ausgabefilter gewandelt, liegen also immer "roh" vor, so wie sie in der Datenbank stehen. So enthält z.B. ein Datumsfeld den Wert im internen Format, der erst mit datum in ein "schönes" Ausgabeformat gewandelt werden muss. Beim <do action=all.. oder <loop>..</loop> wird dies automatisch erledigt, so wie es in der Felddefinition angegeben wurde.

Möchte man dies auch bei get-Befehlen erreichen, muss man ein Plus + nach dem Datenbank-Namen angeben:

get "Datum>jetzt", "datenbank", "+";
out $Datum;

Gibt $Datum im Ausgabeformat der Felddefinition aus, z.B. 2.September.2006

Das interne Format liegt zusätzlich im Hash %_raw vor, in diesem Fall also in $_raw{Datum}.

Auch bei Verwendung des + kann ein Ergebnishash verwendet werden, was aber zusätzlich zu einem leicht anderen Verhalten führt:


Feldvariablen nicht belegen

Um den Ausgabefilter zu aktivieren, muss man das + direkt vor den Ergebnishash schreiben:

get "Name==hans", "datenbank", "+erg";
out $erg{Datum}[0];

Dies führt dazu, dass nicht mehr automatisch Variablen mit Feldnamen gesetzt werden ($Datum ist also leer). Das Abfrageergebnis liegt nur im Hash erg vor - durch den Ausgabefilter gewandelt. Die "Rohdaten" sind ebenfalls vorhanden und stehen in $erg{_raw}{Feldname}[Zeile], in diesem Beispiel also in $erg{_raw}Datum[0].

Der Vorteil hierbei ist, dass so unerwünschtes Überschreiben von Variablen vermieden wird.

Möchte man keine Feldvariablen setzen, ohne den Ausgabefilter zu aktivieren, benötigt man ein Minus -:

get "Name==hans", "datenbank", "-";
out $datenbank{Datum}[0];

Das Ergebnis steht dann im Datenbank-Hash. Natürlich funktioniert dies auch in Verbindung mit einem Ergebnis-Hash:

get "Name==hans", "datenbank", "-erg";
out $erg{Datum}[0];

Gibt das interne Format von Datum aus.

Um das Ergebnis später doch in Feldvariablen abzurufen, benutzt man einfach get_next:

get_next "erg";
out $Datum;


Alle Abfragemöglichkeiten in einer Übersicht:


Id bei neuem Datensatz immer um 1 erhöht

Ab der Version 3 bekommt jeder neue Datensatz eine neue Id, auch dann, wenn zuvor der Datensatz mit der höchsten Id gelöscht worden ist.


Suche nach Datensätzen mit leeren Feldern

Mit dem _ kann nun nach leeren Feldern gesucht werden:

<perl>
get "Vorname==_", "Personen";
while(get_next("Personen"))
{
    out "$Name<br>";    # gibt alle Namen mit leerem Vornamen aus
}
</perl>


Maskieren von Spezialabfragen

Die Spezialwerte *, #, ?, _ bei Datenbank-Abfragen können nun maskiert werden:

get "Feld==\\?";

Holt alle Einträge bei denen Feld tatsächlich das Zeichen ? enthält. Die Abfrage ohne Maskierung:

get "Feld==?";

würde einen zufälligen Eintrag holen.


Sortierung oder Bereich vor get [...]

Dem speziellen get-Aufruf mit [...] kann nun auch eine Sortierung oder ein Bereich übergeben werden, indem die Werte mit den Variablen $_get_range und $_get_sort vorher gesetzt werden:

$_get_range="10,20"; $_get_sort="-";
get ["Name", "==!", $name], "db";

Holt die Einträge 10 bis 30 mit dem Feld Name die genau $name enthalten, in umgekehrter Reihenfolge sortiert. $name kann auch Leerzeichen enthalten.

Alte Version vom 22.9.2007, 20:20

c und wiederherstellen - + 
© baseportal GmbH. Alle Rechte vorbehalten.


powered in 0.03s by baseportal.de
Erstellen Sie Ihre eigene Web-Datenbank - kostenlos!