Deutsch
Forum

DBase Datenbanken - ähnliche Datensätze in einer Schleife aus verschiedenen Datenbanken l&

 
- Seite 1 -



holmol93
Hallo miteinander

Hier ist mir ja schon erstklassig bei meiner ersten Frage geholfen worden und auch wenn ich langsam aber sicher immer mehr hinter das ganze Thema steige, stehe ich doch mal wieder vor einem, für mich, unlösbaren Problem.

Zum Aufbau meines Programmes:
Es ist ein Programm um eine Schule zu verwalten. Für mich ein Projekt um ein paar Dinge dazuzulernen.
Lehrer und Schüler haben eigene Benutzerkonten, Funktionen und Rollen (zB. "Klassenlehrer";"Schulleiter","Klassensprecher") können verteilt werden und es gibt eine Rechteverwaltung, in welcher man den Benutzern auf ihren Accounts gewisse Lese und Schreibrechte beschränken kann.

Es gibt im Hintergrund verschiedene Datenbanken. Eine mit Benutzerdaten (Adresse,Alter,Rolle,Passwort,Name,Benutzername), eine mit den zugeteilten Rechten. Dazu hat jede Person ein eigenes Datenbankfile, was von der Software automatisch erstellt wird. Bei Lehrern enthält es die Klassen, die ihm zugeteilt wurden nach dem Schema "KLASSE","SCHÜLERNAME","FACH", bei den Schülern ihre Noten und Absenzen, nach dem Schema "LEHRER","FACH","NOTE", bzw: "ABSENZ"....

Jetzt soll es eine Funktion geben um Benutzerdaten zu ändern und Benutzer zu löschen.
Wenn ich einen Benutzer lösche, muss ich seinen Eintrag aus der Benutzerdatenbank, aus der Rechtedatenbank und sein eigenes DB File entfernen. Das klappt problemlos.

Jetzt wird den Lehrern aber in der Notenübersicht immer noch eine "Leiche" mit dem gelöschten Schülernamen angezeigt, da dieser ja im jeweiligen DB File des Lehrers mitverlinkt ist.

Diesen muss ich also herauslöschen.

Ich habe mir folgendes überlegt:
Das Programm liest in der Schülerdatenbank die Namen der Lehrer aus, die ihm Noten oder Absenzen eingetragen haben -> Fachlehrer.
Dann öffnet es das jeweilige DB File mit dem Lehrernamen und löscht alle Einträge in welcher der Name des Schülers vorkommt. Das muss mehrmals in Schleife passieren, da es ja mehrere Lehrer sind und ein Lehrer zT auch 2 Fächer unterrichten kann.

In meiner Schleife löscht es aber immer nur den Namen des Schülers aus der Datenbank des ersten Lehrers, der ihm eine Note gegeben hat und ich bin echt ratlos... Der Code (nicht lauffähig) sieht so aus:
db ("open",#1,dbuserdata$)' öffnet die Benutzerdatenbank
db ("use",#1)
db ("seek","USERNAME",personausw$,2)' sucht den Namen des Schülers
db ("delete")' löscht ihn
db ("pack")
db ("close",#1)
db ("open",#2,dbrechte$)' öffnet die Rechtedatenbank
db ("use",#2)
db ("seek","USERNAME",personausw$,2)' sucht den Schüler
db ("delete")' löscht seinen Eintrag
db ("pack")
db ("close",#2)
db ("open",#3,dbpendenzen$)' öffnet die Datenbank für das Logfile
db ("AppendBlank")
db ("put","AN","SUPER-T")' hinterlässt einen Logileeintrag für das Löschen des Schülers
db ("put","MESSAGE",dt("getdate",6)+" "+trim$(benutzer$)+" // löscht Schüler "+trim$(personausw$))
db ("putrec",0)
db ("pack")
db ("close",#3)
db ("open",#4,"C:\XProfanX2\Datenbanken\"+trim$(personausw$)+".DBF")' öffnet die eigene DB des Schülers
db ("use",#4)

Whilenot %dbEof

    satznr&= &dbreccount' Anzahl Datensätze insgesamt
    db ("use",#4)
    db ("go","Top")

    If Satznr& > 0

        lehrer$=db("get","LEHRER")' Holt sich einen Lehrernamen
        db ("open",#5,"C:\XProfanX2\Datenbanken\"+trim$(lehrer$)+".DBF")' öffnet die DB mit dem Namen des Lehrers
        db ("use",#5)

        whilenot %dbEof

            satznr2&=db ("seek","SCHUELER",personausw$,2)' sucht den Namen des Schülers

            if satznr2& > 0

                db ("delete")' löscht den Datensatz
                db ("pack")
                db ("close",#5)

            Endif

            db("go","Next")

        endwhile

    Endif

    db("go","Next")

endwhile

db ("close",#4)

Wär cool, wenn mal jemand drüberschauen könnte... Ich glaube ich schnall irgendwas beim Ablauf der Schleife nicht :O

Grüessli

Danny
 
06.05.2013  
 



« Dieser Beitrag wurde als Lösung gekennzeichnet. »


Thomas
Freier
Mit der pcu ging's. Sollte jetzt aber auch mit X2 möglich sein oder täusche ich mich?
 $H Windows.ph
DECLARE MENU&,MENU2&
 $U DLGMENU.PCU=MENU.
WINDOWSTYLE 4+8
CLS
BUILDMENU2 %hwnd
BUILDMENU %hwnd
var menu%=1

WHILENOT (%KEY=2)

    WAITINPUT

    IF (ABS(%MENUITEM)=104) OR (ABS(%MENUITEM)=204)

        BREAK

    ENDIF

    If (ABS(%MENUITEM)=102)

        ~SetMenu(%hwnd,0)
        ~DrawMenuBar(%hwnd)
        ~SetMenu(%hwnd,menu2&)
        ~DrawMenuBar(%hwnd)

    ElseIf (ABS(%MENUITEM)=202)

        ~SetMenu(%hwnd,0)
        ~DrawMenuBar(%hwnd)
        ~SetMenu(%hwnd,menu&)
        ~DrawMenuBar(%hwnd)

    EndIf

WEND

END

PROC BUILDMENU

    PARAMETERS DLG&
    MENU&=MENU.NEW(DLG&)
    MENU.SETNICEBACKGROUND
    MENU.POPUP "&Datei"
    MENU.APPENDMENU 100,"Neu"
    MENU.APPENDMENU 101,"Öffnen"
    MENU.APPENDMENU 102,"Menü 2"
    MENU.APPENDMENU 104,"Beenden"

endproc

PROC BUILDMENU2

    PARAMETERS DLG&
    MENU2&=MENU.NEW(DLG&)
    MENU.SETNICEBACKGROUND
    MENU.POPUP "&Dokument"
    MENU.APPENDMENU 200,"Speichern"
    MENU.APPENDMENU 201,"Drucken"
    MENU.APPENDMENU 202,"Menü 1"
    MENU.APPENDMENU 204,"Beenden"

endproc


383 kB
Hochgeladen:10.05.2013
Ladeanzahl132
Herunterladen
 
Gruß Thomas
Windows XP SP2, XProfan X2
10.05.2013  
 




Thomas
Freier
Ich versuche es einmal.
Bitte immer nur bei Erfolg löschen. Seek endet beim letzten Datensatz und sollte nichts gefunden werden, warum auch immer, wird der letzte Datensatz in jedem Falle gelöscht.
KompilierenMarkierenSeparieren
db ("open",#1,dbuserdata$)' öffnet die Benutzerdatenbank
db ("use",#1)
db ("seek","USERNAME",personausw$,2)' sucht den Namen des Schülers
db ("delete")' löscht ihn
db ("pack")
db ("close",#1)

Also wie bei:
KompilierenMarkierenSeparieren
satznr2&=db ("seek","SCHUELER",personausw$,2)' sucht den Namen des Schülers

if satznr2& > 0

    db ("delete")' löscht den Datensatz
    db ("pack")

Endif

db ("close",#5)

Das Problem ist sicher in diesem Teil
KompilierenMarkierenSeparieren
lehrer$=db("get","LEHRER")' Holt sich einen Lehrernamen
db ("open",#5,"C:\XProfanX2\Datenbanken\"+trim$(lehrer$)+".DBF")' öffnet die DB mit dem Namen des Lehrers
db ("use",#5)

whilenot %dbEof

    satznr2&=db ("seek","SCHUELER",personausw$,2)' sucht den Namen des Schülers

    if satznr2& > 0

        db ("delete")' löscht den Datensatz
        db ("pack")
        db ("close",#5)

    Endif

    db("go","Next")

endwhile


Es soll wohl n-mal der Schüler beim Lehrer gesucht werden. Es wird aber nach dem 1. Fund die #5=Lehrer.dbf geschlossen. Da macht die While-Schleife keinen Sinn.
Soll aber sicher mehr gefunden werden, dann beim Fund nur db ("delete")' löscht den Datensatz und nach endwhile die als gelöscht markierten Datensätze endgültig löschendb ("pack") und Datenbank schließen.
 
Gruß Thomas
Windows XP SP2, XProfan X2
06.05.2013  
 




H.Brill
Wie ich es so beim Darüberfliegen deines Codes
so sehe, mußt du
KompilierenMarkierenSeparieren
@db("Go", "Top")

vor der Schleife ausführen. Das darf nicht in deine Schleife.
Ich denke mal, daß die Daten immer noch im Speicher stehen.
KompilierenMarkierenSeparieren
Whilenot %dbEof

    satznr&= &dbreccount' Anzahl Datensätze insgesamt
    db ("use",#4)
    db ("go","Top")  --> das muß vor die Schleife !!!!

Ich würde es mal so versuchen :
KompilierenMarkierenSeparieren
Jetzt mit @db("Pack", ) löschen, DB schließen und neu öffnen.
Jetzt müßte die DB aktuell sein. Ich weiß auch nicht, wie sicher %dbEof
in 2 Schleifen arbeitet. Du müßtest aber in jeder DB auch ein sogen.
Schlüsselfeld haben, damit man in den anderen DBs dann auch die
entsprechenden Einträge löschen kann. Da reicht ja schon ein einfaches
num. Feld, das aufsteigend jeden Datensatz numeriert.
Da fehlt aber XProfan ein Join - Befehl dazu. Da wäre halt SQL besser geeignet.
 
Benutze XPROFAN X3 + FREEPROFAN
Wir sind die XProfaner.
Sie werden von uns assimiliert.
Widerstand ist zwecklos!
Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.

Was die Borg können, können wir schon lange.
07.05.2013  
 




H.Brill
Habe oben mal genauer gelesen.
Da wäre das Thema Datenbank-Nomalisierung wichtig.
Sind die DBs dir vorgegeben oder hast du sie neu
erstellt ?
Um Datenredundancen zu umgehen, könnte man überlegen,
die DBs etwas umzugestalten. z.B. Lehrer -> mehrere Schüler
Schüler wäre dann ein Memofeld, in dem als Textzeilen dann
die Schüler untereinander stehen. Mit MoveListToMem oder
MoveListToStr oder Listboxliste direkt kann man sehr schön
die Liste kopieren und auch darin suchen,löschen oder bearbeiten.
Evtl. könnte man auch Strukturen mit Bereichen# nutzen.
Bei der DB der Lehrer (Klasse, Schüler, Fach)
z.B. : Struct Lehrer = Klasse$(5), Fach$(20), Schueler#(400)
Das wären 20 Schüler mit je 20 Zeichen

Vielleicht helfen dir solche Überlegungen etwas weiter.
 
Benutze XPROFAN X3 + FREEPROFAN
Wir sind die XProfaner.
Sie werden von uns assimiliert.
Widerstand ist zwecklos!
Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.

Was die Borg können, können wir schon lange.
07.05.2013  
 




holmol93
Hallo miteinander

Merci erstmal, dass ihr euch dem Thema angenommen habt.

@H.Brill,

dein letzter Beitrag hat mir zu Denken gegeben. Und als ich die 2 Lösungen ausprobiert habe und beide mich nicht ganz zum Ziel geführt haben, ist es mir wie Tomaten von den Augen gefallen:
WIESO musste ich die Schülernamen in der Lehrer DB ablegen, wenn doch die Schülernamen, samt ihrer zugeordneten Klasse schon im DB File mit den Benutzerdaten liegen oO
Es ergibt viel mehr Sinn, in der Lehrer DB einfach "FACH" und "KLASSE" abzulegen und sich die Schülernamen der Klasse parallel aus dem Benutzer DB File zu holen... Beim Löschen eines Benutzers aus dem BenutzerDB File verschwindet er also auch aus den Ansichten der Lehrer voila... Und einen Vorteil bringts noch: Wenn man die Schülerdaten editiert und dem Schüler eine neue Klasse zuweist, muss das nur im Benutzer DB File passieren und er landet automatisch bei seinen "neuen" Fachlehrern. Sonst hätte man ebenfalls noch Änderungen in den Lehrerfiles vornehmen müssen...

Ist jetzt angepasst und läuft prima... Frage mich nur, wieso ich da nicht von vornherein drauf gekommen bin...

Bin halt noch Anfänger auf dem Gebiet und vorallem in Bezug auf Datenbanken

Im Grunde fand ich Rechteverwaltungen spannend, da unser System im Geschäft auf Access Aufsetzt und eine sehr genaue Rechteverwaltung hat, und wollte so etwas auch einmal programmieren xD und so ist eigentlich die Idee der Schulverwaltung entstanden, in der man die Rechte ebenfalls flexibel zuteilen kann

Merci viel viel Mal für Eure Hilfe

... Und wenn ich noch eine Frage stellen dürfte, ohne ein neues Thema eröffnen zu müssen... Wie lautet der Befehl um die Menüleiste zu "zerstören", damit man sie danach neu aufrufen kann?

Greeetz,

Danny
 
08.05.2013  
 



Hi!

Meinst Du vielleicht windowstyle 16 ?
 
08.05.2013  
 




holmol93
Hallöchen zu so später Stunde

Nicht ganz Durch die Rechteverwaltung stehen gewisse Menüs und Menüpunkte nur Personen zur Verfügung, die dieses Recht haben.
Ist auch kein Problem, wenn man das Programm jedes Mal neustartet, wenn sich ein anderer Benutzer anmeldet.
Ich möchte aber eine Login/Logout Funktion einbauen... Und jedes Mal wenn ich einfach eine neue Passwortabfrage mache und das Programm die Rechte zuteilt und die Menüleiste lädt wird diese dann doppelt angezeigt oder enthält Menüpunkte vom Vorbenutzer, die der neue nicht haben sollte

Für Fenster gibts ja DestroyWindow, gibt es etwas ähnliches auch für die Leiste oben, damit man sie löschen und neu aufbauen kann ohne dass Menüpunkte doppelt erscheinen?

Greetz,
Danny
 
08.05.2013  
 



Sorry, ich weiß scheinbar garnicht genau welche Leiste Du meinst.

Vlt. mal einen Screenshot zeigen, einfach an Beitrag anhängen.
 
08.05.2013  
 




holmol93


Heyho

Stimmt, hätt ich grad von Anfang an mitschicken können *g*

Ich glaube auch nicht, das es viele gibt, die diese Möglichkeit suchen

Aber wie du siehst, unterscheidet sich je nach dem, welche Rechte der Benutzer hat, das Menü oben.
Wenn ich die meinen Logoutvorgang so einbaue, dass ich einfach das Menü neu aufbauen lasse, sind zum Teil danach Menüpunkte doppelt. Oder ein Lehrer, der sich einloggt, nach dem der Schulleiter eingeloggt war, hat plötzlich neben seinem Menü auch noch Zugriff aufs Master oO

Deshalb möcht ich die Leiste "löschen" und neu initialisieren lassen

Die Menüpunkte werden über If- Anweisungen aus und eingeblendet. Nach dem Motto, Wenn Recht SoundSo vorhanden -> zeige "Funktionen.Master" usw...

Greetz,

Danny

175 kB
Kurzbeschreibung: Screenshot der Menüleisten
Hochgeladen:08.05.2013
Ladeanzahl1146
Herunterladen
 
08.05.2013  
 




Thomas
Freier
Also für jede Gruppe ein eigenes Menü? Das könnte auf einem Dialog sein und dann das Zutreffende einblenden. Oder siehe [...] 
Einfach die Quelltexte einmal durchstöbern.
 
Gruß Thomas
Windows XP SP2, XProfan X2
08.05.2013  
 




H.Brill
Nah siehste, jetzt weißt du auch, was mit Datenbank-Normalisierung
gemeint ist.
Wenn es ein normales Menü ist, könnte man doch ein komplettes
Menü anzeigen und je nach Rechten, mit EnableMenu die einzelnen
Auswahlpunkte deaktivieren bzw. aktivieren.

So, nun muß ich zur Arbeit.
 
Benutze XPROFAN X3 + FREEPROFAN
Wir sind die XProfaner.
Sie werden von uns assimiliert.
Widerstand ist zwecklos!
Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.

Was die Borg können, können wir schon lange.
08.05.2013  
 




E.T.
... oder halt ein externes Menü nutzen...
... und dann UseExtMenu...

da kann man schön zwischen den Menüs hin- und her wechseln
 
Grüße aus Sachsen... Mario
WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte...
08.05.2013  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

21.933 Betrachtungen

Unbenanntvor 0 min.
Manfred Barei08.10.2023
Member 007717917.10.2018
RudiB.27.08.2018
Ernst01.06.2016
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie