Eurokicker
-


Hinweise


Antwort
 
LinkBack Themen-Optionen Thema durchsuchen Thema bewerten
Alt 24.11.2003, 08:36   #1
TP-Specialist
 
Registriert seit: Aug 2002
Ort: Nähe Wien
prefix ist auf einem guten Weg
Lightbulb

aufbau einer hierarchie mit beinahe "unmöglicher" struktur


so, nachdem mir das regexp-prozedere mal halbwegs klar ist (wurde hier besprochen) nun eine detaillierte erklärung zu der sache, ich komm da leider nicht ganz klar damit:

ich hab die aufgabe, eine hierarchie für versicherungs-vermittler aufzubauen.

die tabelle sieht dazu wie folgt aus:

- orgnr, varchar(7) -> die "organisationsnummer" ist gemischt aus buchstaben und ziffern, z.b. NG00001 - also siebenstellig

- ld, varchar(7) -> "landesdirektion", aufbau analog zu orgnr, jedoch ist die sache so, dass z.b. bei orgnr "NG..." die ld mit einem "N" beginnt, danach was auch immer (meistens ziffern)

- vmnr, int(7) -> vermittlernummer, rein numerisch. diese ist eindeutig (als id verwendbar)

- name, varchar(100) -> vermittlername

- eintritt, date -> datum des eintritts des vermittlers

- austritt, date -> wie oben

- vmart, varchar(3) -> vermittlerart, also z.b. mak (=makler) usw.

- id, double -> die id (logo)

ok, es gibt jetzt 5 hierarchiestufen und 3 wege:

1. weg: orga (die eigene orga der versicherung, also alle mitarbeiter)

2. bank: vertriebsweg über die banken

3. makler: klar

bei den wegen "orga" und "bank" gibt es eben die 5 stufen (die makler lassen wir mal weg, die sind eigens gegliedert) - als einzig mögliches feld lässt sich hiezu die orgnr verwenden.

die orgnr für die erste stufe sieht wie folgt aus:

es gibt 2 buchstaben am anfang, danach genau 5 nullen, also z.b.

NG00000 -> das wäre die 1. und oberste hierarchiestufe

die 2. stufe für diesen vermittler hat am beginn die beiden buchstaben (hier NG), danach einen (!!!) weiteren buchstaben, danach ziffern (nicht nur nullen), z.b.:

NGA0001 -> das wäre die 2. stufe unter "NG00000"

die 3. stufe hat z.b.

NGAM001 -> also die ersten 3 buchstaben der 2. stufe, danach noch einen (!!!) buchstaben, danach dieselbe endung (hier "1") wie die 2. stufe

ok, dann die 4. -> NGAMF01

dann die 5. -> NGAMFZ01

jetzt sind 2 wege vorstellbar, wie man das aufbauen kann:

1. von oben nach unten, also alle auslesen, die genau 2 buchstaben vorne haben und dann nach unten hin die dazugehörigen gliedern

2. von unten nach oben, also all jene auslesen, welche hinten genau 2 ziffern haben, und dann anhand der letzten ziffer (z.b. "1") und der buchstabenfolge nach oben hin gliedern

und genau da hab ich entweder eine denkblockade und krieg das nicht hin, oder ich kann es ganz einfach nicht

ich hoffe, ich hab das problem mal ordentlich verdeutlicht, und viell. kann mir wirklich wer helfen )) das wäre super!
prefix ist offline   Mit Zitat antworten


Alt 24.11.2003, 08:41   #2
TP-Specialist
 
Registriert seit: Aug 2002
Ort: Nähe Wien
prefix ist auf einem guten Weg
ach, vergessen: hier mal meine ersten versuche:

PHP-Code:
    // 1. stufe ausgeben
    
$abfrage mysql_query("SELECT DISTINCT orgnr,name FROM fdaw_vmdaten 
WHERE orgnr LIKE '%00000' AND orgnr NOT LIKE '%000000' ORDER BY name ASC"
);
    while(
$ausgabe mysql_fetch_object($abfrage)) {
        
$orgnrli2 substr($ausgabe->orgnr,0,2);
        echo 
"<hr>$ausgabe->orgnr|$ausgabe->name<br><hr>";
        
// 2. stufe ausgeben
            
            
$abfrage2 mysql_query("SELECT DISTINCT orgnr, name FROM fdaw_vmdaten 
WHERE (LEFT(orgnr,2) = '$orgnrli2') AND (orgnr NOT LIKE '$ausgabe->orgnr') 
            AND (orgnr REGEXP \"^.{2}[A-Z]\" = 1) ORDER BY orgnr ASC"
);
            while (
$ausgabe2 mysql_fetch_object($abfrage2)) {
                
$orgnrli3 substr($ausgabe2->orgnr,0,3);
                echo 
"&nbsp;&nbsp;&nbsp;$ausgabe2->orgnr|$ausgabe2->name<br>";
            
                
// 3. stufe ausgeben
                /*
                $abfrage3 = mysql_query("SELECT DISTINCT orgnr, name FROM fdaw_vmdaten WHERE (LEFT(orgnr,3) = '$orgnrli3') 
                AND (orgnr NOT LIKE '$ausgabe2->orgnr') AND (orgnr REGEXP \"^.{3}[A-Z]\" = 1) ORDER BY orgnr ASC");
                while ($ausgabe3 = mysql_fetch_object($abfrage3)) {
                    echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ausgabe3->orgnr|$ausgabe3->name<br>";
                    
                }*/
                // ende 3. stufe
        
}
        
        
// ende 2. stufe
    
}
    
// ende 1. stufe
    
    
    
echo "<hr>"
damit gelingt es mir mal mit der methode "von oben nach unten" zumindest die 1. und 2. stufe dazu auszugeben - allerdings denke ich, dass ich hier von unten nach oben arbeiten sollte - hmmm

denn hier stoße ich bei der 3. stufe an die grenze, so sieht es zumindest zzt. aus
prefix ist offline   Mit Zitat antworten
Alt 24.11.2003, 08:45   #3
TP-Moderator
 
Benutzerbild von Stuck Mojo
 
Registriert seit: Feb 2001
Ort: Helmstedt/Wolfsburg
Stuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKE
Code:
UPDATE deinetabelle SET stufe = 1 WHERE orgnr REGEXP "^[a-z]{2}[0-9]" = 1;
UPDATE deinetabelle SET stufe = 2 WHERE orgnr REGEXP "^[a-z]{3}[0-9]" = 1;
UPDATE deinetabelle SET stufe = 3 WHERE orgnr REGEXP "^[a-z]{4}[0-9]" = 1;
UPDATE deinetabelle SET stufe = 4 WHERE orgnr REGEXP "^[a-z]{5}[0-9]" = 1;
UPDATE deinetabelle SET stufe = 5 WHERE orgnr REGEXP "^[a-z]{6}[0-9]" = 1;
...wenn ich mich nicht irre...

Gruss
Jan

PS: VORHER BACKUP MACHEN!!!
Stuck Mojo ist offline   Mit Zitat antworten
Alt 24.11.2003, 09:08   #4
TP-Specialist
 
Registriert seit: Aug 2002
Ort: Nähe Wien
prefix ist auf einem guten Weg
mein gott, du öffnest mir wirklich die augen ))

es geht schon was weiter, eine frage noch:

wie kann ich einen wert trimmen, den ich von einem csv-file importiere? ich übernehme wie folgt:

PHP-Code:
// neue sätze von csv-file übernehmen
$uebernahme "LOAD DATA LOCAL
INFILE '/home/intranet/transfer/vmhierarch.csv'
INTO TABLE fdaw_vmdaten
FIELDS
TERMINATED BY ';'
OPTIONALLY ENCLOSED BY '\n'"
;

$action mysql_query($uebernahme); 
jetzt werden allerdings auch leerzeichen mitübernommen (wenn welche vorhanden sind) - krieg ich die schon beim import weg oder muss ich die zuerst aus der db auslesen -> trimmen -> updaten?
prefix ist offline   Mit Zitat antworten
Alt 24.11.2003, 09:15   #5
TP-Specialist
 
Registriert seit: Aug 2002
Ort: Nähe Wien
prefix ist auf einem guten Weg
folgendes sql-statement funktioniert nicht wie gewünscht:

PHP-Code:
$update mysql_query("UPDATE fdaw_vmdaten SET vmart = RTRIM(vmart)"); 
bin auf der suche im manual
prefix ist offline   Mit Zitat antworten
Alt 24.11.2003, 09:20   #6
TP-Moderator
 
Benutzerbild von Stuck Mojo
 
Registriert seit: Feb 2001
Ort: Helmstedt/Wolfsburg
Stuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKE
sollte eigentlich... also das funzt:
Code:
UPDATE prefix SET lala = trim( lala )
Stuck Mojo ist offline   Mit Zitat antworten
Alt 24.11.2003, 09:30   #7
TP-Specialist
 
Registriert seit: Aug 2002
Ort: Nähe Wien
prefix ist auf einem guten Weg
komischerweise funktioniert das nicht - zumindest sieht es so aus, ich hole die daten mit folgendem code rein:

PHP-Code:
// alte sätze löschen
$action mysql_query("DELETE FROM fdaw_vmdaten");
echo 
"Alte Datensätze gelöscht!<br><br>";

// neue sätze von csv-file übernehmen
$uebernahme "LOAD DATA LOCAL
INFILE '/home/intranet/transfer/vmhierarch.csv'
INTO TABLE fdaw_vmdaten
FIELDS
TERMINATED BY ';'
OPTIONALLY ENCLOSED BY '\n'"
;



$action mysql_query($uebernahme);

$update mysql_query("UPDATE fdaw_vmdaten SET vmart = TRIM(vmart)");

echo 
"Übernahme erfolgreich!<br>"
danach lese ich sie mit folgendem aus:

PHP-Code:
$abfrage mysql_query("SELECT DISTINCT vmart FROM fdaw_vmdaten ORDER BY vmart ASC");
while (
$ausgabe mysql_fetch_object($abfrage)) {
    echo 
"$ausgabe->vmart<br>";

das ergebnis ist (siehe screenshot) so, dass er mir trotzdem noch doppelte werte ausgibt, die ein leerzeichen hinten haben
Angehängte Grafiken
Dateityp: gif stufen.gif (1,8 KB, 14x aufgerufen)
prefix ist offline   Mit Zitat antworten
Alt 24.11.2003, 09:33   #8
TP-Moderator
 
Benutzerbild von Stuck Mojo
 
Registriert seit: Feb 2001
Ort: Helmstedt/Wolfsburg
Stuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKE
mmmhh... ich hab MySQL 4.x drauf... und da funktioniert es definitiv. Ansonsten halt zu Fuss in einer Schleife.
Stuck Mojo ist offline   Mit Zitat antworten
Alt 24.11.2003, 09:35   #9
TP-Specialist
 
Registriert seit: Aug 2002
Ort: Nähe Wien
prefix ist auf einem guten Weg
na, dann zieh ich mir mal feldschuhe schwer an und mach das zu fuss *hehe* - meld mich wieder (du entkommst mir nicht *hehe*)
prefix ist offline   Mit Zitat antworten
Alt 24.11.2003, 10:08   #10
TP-Specialist
 
Registriert seit: Aug 2002
Ort: Nähe Wien
prefix ist auf einem guten Weg
so, das "zu fuß trimmen" hab ich mal geschafft

PHP-Code:
$abfrage mysql_query("SELECT id, vmart FROM fdaw_vmdaten ORDER BY id ASC");
while (
$ausgabe mysql_fetch_object($abfrage)) {
    
$vmart trim($ausgabe->vmart);
    
$id $ausgabe->id;
    
$update mysql_query("UPDATE fdaw_vmdaten SET vmart = '$vmart' WHERE id = '$id'");
}
echo 
"Trimmen der Vermittlerart erfolgreich!<br>"
jetzt versuche ich mal den aufbau schritt für schritt hinzukriegen
prefix ist offline   Mit Zitat antworten
Alt 24.11.2003, 13:02   #11
TP-Specialist
 
Registriert seit: Aug 2002
Ort: Nähe Wien
prefix ist auf einem guten Weg
es geht gut voran, wieder mal eine regexp frage:

wie kann ich feststellen, ob ein string wie folgt aufgebaut ist:

N0D0000

also: buchstabe - null - buchstabe - 4 nullen?

danke!

nachtrag: hab mich jetzt wirklich mal einfach an die regexp gewagt (webmichl's workshop) und schon mal folgendes geschafft:

PHP-Code:
$string "N0D0000";
$pattern "/(^[A-Z])/"// erstes zeichen ein buchstabe
echo preg_match($pattern,$string,$match); 
liefert mir 1, da das erste zeichen ein buchstabe ist.

leider komm ich jetzt nicht weiter - wie stelle ich fest, dass das 2. eine null sein muss, danach wieder ein buchstabe?

Geändert von prefix (24.11.2003 um 13:13 Uhr).
prefix ist offline   Mit Zitat antworten
Alt 24.11.2003, 13:16   #12
TP-Specialist
 
Registriert seit: Aug 2002
Ort: Nähe Wien
prefix ist auf einem guten Weg
so, das scheint zu klappen:

PHP-Code:
$string "N0D0000";
$pattern "/(^[A-Z]0[A-Z]0000)/"// erstes zeichen ein buchstabe
echo preg_match($pattern,$string,$match); 
bin ich jetzt schon ein regexp-gott??

nachtrag: nein, das bin ich anscheinend nicht

folgende 2 update-statements:

PHP-Code:
$stufe1 "(vmart LIKE 'OD' AND orgnr REGEXP \"/(^[A-Z]0[A-Z]0000)/\" = 0) OR (vmart LIKE 'BB' AND orgnr LIKE '%00000' AND orgnr NOT LIKE '%000000')";
$stufe2 "(vmart LIKE 'BB' OR vmart LIKE 'FI') AND (orgnr NOT LIKE '%00000') OR ((orgnr REGEXP \"/(^[A-Z]0[A-Z]0000)/\" = 1) AND vmart = 'OD')";
.....
$update1 mysql_query("UPDATE fdaw_vmdaten SET stufe = 1 WHERE $stufe1");
$update2 mysql_query("UPDATE fdaw_vmdaten SET stufe = 2 WHERE $stufe2"); 
also, er soll die stufe "1" reinschreiben, wenn es so aussieht: NG00000, aber nicht, wenn es so aussieht: N0D0000!
beide müssen die bezeichnen "OD" haben...

er schreibt aber trotzdem die 1er rein

Geändert von prefix (24.11.2003 um 13:25 Uhr).
prefix ist offline   Mit Zitat antworten
Alt 24.11.2003, 13:59   #13
TP-Specialist
 
Registriert seit: Aug 2002
Ort: Nähe Wien
prefix ist auf einem guten Weg
ich hab es gelöst, man darf bei der mysql-regexp keine backslashes vor die prüfung stellen (/)
prefix ist offline   Mit Zitat antworten
Alt 24.11.2003, 15:08   #14
TP-Specialist
 
Registriert seit: Aug 2002
Ort: Nähe Wien
prefix ist auf einem guten Weg
so, 90% hab ich mal - es fehlen nur noch die ausnahmen.

lösung wie unten, muss ich aber noch optimieren (die queries), da die performance am mysql-server heftig im negativen sinne ist

PHP-Code:
// ausgabe stufe 1

$abfrage1 mysql_query("SELECT DISTINCT orgnr, name, stufe, vertriebsweg, vmart FROM fdaw_vmdaten WHERE (stufe = '1') AND 
(orgnr LIKE '%00000' AND orgnr NOT LIKE '%000000') ORDER BY name ASC"
);
while (
$ausgabe1 mysql_fetch_object($abfrage1)) {
    
$orgnrstart substr($ausgabe1->orgnr,0,1); // für 2. ebene
    
$orgnrli1 substr($ausgabe1->orgnr,0,2); // ersten 2 stellen stufe 1
    
echo "<hr><b>$ausgabe1->orgnr | $ausgabe1->name | Hierarchiestufe: $ausgabe1->stufe | Vertriebsweg: $ausgabe1->vertriebsweg | $ausgabe1->vmart</b><br><br>";
    
    
// ausgabe 2. stufe
    
    # hier bestehen nur datensätze zu bank!
    
    
$abfrage2 mysql_query("SELECT DISTINCT orgnr, name, stufe, vertriebsweg, vmart FROM fdaw_vmdaten WHERE 
    ((stufe = '2') AND (orgnr LIKE '$orgnrli1%')) ORDER BY name ASC"
);
    while (
$ausgabe2 mysql_fetch_object($abfrage2)) {
        
$orgnrli2 substr($ausgabe2->orgnr,0,3);
        echo 
"&nbsp;&nbsp;&nbsp;$ausgabe2->orgnr | $ausgabe2->name | Hierarchiestufe: $ausgabe2->stufe | Vertriebsweg: $ausgabe2->vertriebsweg | $ausgabe2->vmart<br>";
        
        
// ausgabe 3. stufe
        
$abfrage3 mysql_query("SELECT DISTINCT orgnr, name, stufe, vertriebsweg, vmart FROM fdaw_vmdaten WHERE 
        ((stufe = '3') AND (orgnr LIKE '$orgnrli2%')) ORDER BY name ASC"
);
        while (
$ausgabe3 mysql_fetch_object($abfrage3)) {
            
$orgnrli3 substr($ausgabe3->orgnr,0,4);
            echo 
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            $ausgabe3->orgnr | $ausgabe3->name | Hierarchiestufe: $ausgabe3->stufe | Vertriebsweg: $ausgabe3->vertriebsweg | $ausgabe3->vmart<br>"
;
            
            
// ausgabe 4. stufe
            
$abfrage4 mysql_query("SELECT DISTINCT orgnr, name, stufe, vertriebsweg, vmart FROM fdaw_vmdaten WHERE 
            ((stufe = '4') AND (orgnr LIKE '$orgnrli3%')) ORDER BY name ASC"
);
            while (
$ausgabe4 mysql_fetch_object($abfrage4)) {
                
$orgnrli4 substr($ausgabe4->orgnr,0,5);
                echo 
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                $ausgabe4->orgnr | $ausgabe4->name | Hierarchiestufe: $ausgabe4->stufe | Vertriebsweg: $ausgabe4->vertriebsweg | $ausgabe4->vmart<br>"
;
            
            
                
// ausgabe 5. stufe
                
$abfrage5 mysql_query("SELECT DISTINCT orgnr, name, stufe, vertriebsweg, vmart FROM fdaw_vmdaten WHERE 
                ((stufe = '5') AND (orgnr LIKE '$orgnrli4%')) ORDER BY name ASC"
);
                while (
$ausgabe5 mysql_fetch_object($abfrage5)) {
                    echo 
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                    $ausgabe5->orgnr | $ausgabe5->name | Hierarchiestufe: $ausgabe5->stufe | Vertriebsweg: $ausgabe5->vertriebsweg | $ausgabe5->vmart<br>"
;
                }
                
// ende 5. stufe
            
}
            
// ende 4. stufe
        
}
        
// ende 3. stufe
    
}
    
// ende 2. stufe
}
// ende stufe 1 
prefix ist offline   Mit Zitat antworten
Antwort

  Aktuelles Thema
  TP Hilfe Forum > Web-Editoren & Coding > Traum-Dynamik
aufbau einer hierarchie mit beinahe "unmöglicher" struktur aufbau einer hierarchie mit beinahe "unmöglicher" struktur
« apache+php=probleme | unset() und Referenzen »

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu