| |
|
|
- Page 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, per mich, unlösbaren Problem.
Zum Aufbau meines Programmi: 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,Password,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 per das Logfile
db ("AppendBlank")
db ("put","AN","SUPER-T")' hinterlässt einen Logileeintrag per 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 potuto... Ich glaube ich schnall irgendwas beim Ablauf der Schleife nicht :O
Grüessli
Danny |
|
|
| |
|
|
|
« Dieser Beitrag wurde als Lösung gekennzeichnet. » |
|
- Page 2 - |
|
Thomas Freier | Mit der pcu ging's. Sollte jetzt aber auch mit X2 possibile 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
|
|
|
| |
|
|
|
|
| |
|
- Page 1 - |
|
| Sorry, ich weiß scheinbar garnicht genau welche Leiste Du meinst.
Vlt. mal einen Screenshot zeigen, einfach an Beitrag anhängen. |
|
|
| |
|
|
|
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 circa If- Anweisungen aus und eingeblendet. Nach dem Motto, Wenn Recht SoundSo vorhanden -> zeige "Funktionen.Master" usw...
Greetz,
Danny |
|
|
| |
|
|
|
Thomas Freier | Also per jede Gruppe ein eigenes Menü? Das potuto auf einem Dialog sein und dann das Zutreffende einblenden. Oder siehe [...] Einfach die Fonte einmal durchstöbern. |
|
|
| |
|
|
|
H.Brill | Nah siehste, jetzt weißt du auch, was mit Datenbank-Normalisierung gemeint ist. Wenn es ein normales Menü ist, potuto man doch ein komplettes Menü Mostra 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 ▲ |
|
|
|
| |
|
- Page 2 - |
|
|
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 ▲ |
|
|
|
|
holmol93 | Hallo zusammen,
habe mal ein paar Möglichkeiten durchprobiert, aber nichts funktioniert so, wie es soll
Überlegung ist: Eine Person meldet sich an und das Menü passt sich je nach ihren Benutzerrechten an. Das klappt. Was nicht klappt: Es gibt eine Logoutfunktion, welche einen Benutzer neu authentifiziert und die Rechte (auch fürs Menü) neu zuteilt. Wenn ich das Menü danach einfach noch einmal neu erstelle, habe ich gewisse Menüpunkte doppelt, nämlich noch die von der Vorperson. Macht man das ein paar Mal hat man ein 3-Zeiliges Menü...
Ausblenden und wieder einblenden bringt nichts, da alles ein Menü ist, in dem gewisse "AppendMenu" Punkte mit If-Then-Else ausgeblendet sind. Die bleiben beim Wiedereinblenden im gleichen Status... Also in dem, von der Person, die sich als erstes angemeldet hat.
Wenn ich das Menü mit Destroymenu(%HWnd) zerstöre, verschwindet es zwar, aber ich kann es danach nicht noch einmal neu laden (ist bei mir eine Prozedur.). Fehlermeldung: "Fehler beim erstellen des Menüs."
What can I do?
Das ist das einzige Problem, was ich von Anfang an nicht lösen konnte... Jetzt hat mein Programm soweit alle Funktionen und ich habe das bis zum Schluss aufgeschoben und brings einfach nicht zum laufen... es muss doch da irgend einen Weg geben, das bestehende Menü entweder noch einmal neu zu laden ohne doppelte und dreifache Menüpunkte oder es zu löschen und noch einmal ganz neu zu "definieren"...
Ich weiss, mein Problem ist ein Luxusproblem xD Klar può ich die Menüpunkt einfach "ausgrauen", aber es gibt gewisse Sachen, da möchte ich einfach nicht, dass jemand, der kein Recht hat sie zu sehn, sie sieht Und was bringt es dem Schüler, wenn er auch noch die Menüpunkte der Lehrer sieht xD |
|
|
| |
|
|
|
| Schau mal, Dir potuto die dlgmenu helfen: [...] -
zwar schon alt aber Code ist bei. |
|
|
| |
|
|
|
Thomas Freier | Mit der pcu ging's. Sollte jetzt aber auch mit X2 possibile 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
|
|
|
| |
|
|
|
holmol93 | hey IF&Thomas
Merci per Eure Antworten. Werde es daheim grad mal ausprobieren
Also ich habe ja XProfan X2 aber damit ist (soweit ich es feststellen konnte) nichts Vergleichbares possibile... Habe rumprobiert und etwas ist garantiert immer schief gegangen...
Ich berichte morgen mal drüber, ob es geklappt hat
Greetz,
Danny |
|
|
| |
|
|
|
Thomas Freier |
Also ich habe ja XProfan X2 aber damit ist (soweit ich es feststellen konnte) nichts Vergleichbares possibile.
Doch. Wechselmenüs unter 29.1.3 - CreateMenu, AppendMenu, SetMenu und DestroyMenu |
|
|
| |
|
|
|
E.T. |
... Es gibt eine Logoutfunktion, welche einen Benutzer neu authentifiziert und die Rechte (auch fürs Menü) neu zuteilt. ...
Also Logout heist m.E., das der akt. Benutzer abgemeldet und niemand mehr angemeldet ist. Also Benutzer abmelden, das Menü komplett zestören und dann im Programm ein Standard - Menü mit einer Login - Funktion setzen.
So wie du das beschreibst, ist es eher ein "Benutzer wechseln". Ich denke, da geraten die Menü's durcheinander. Würde ich eher den Benutzer komplett abmelden vom Programm, Standard-Menü setzen und ggf. bei einem klick auf z.B. einen Button "Benutzer wechseln" gleich wieder eine Auswahl per reg. Benutzer anbieten.
Und dann das Menü je nach Rechten wieder "zusammenbauen" und Mostra... |
|
|
| XProfan X2Grüß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... | 11.05.2013 ▲ |
|
|
|
|
holmol93 | Hallo miteinander!
Habe mein Menü auf die Alternative Möglichkeit mit der Unit angepasst... Funktioniert! Ich kann das Menü jederzeit zerstören und neu aufbauen, ohne Fehlermeldung! Genial.
@Mario,
Jap, genau so verstehe ich Logout eigentlich auch Ich hab mich anfangs an unserem Datenbanksystem im Geschäft orientiert, auf dem man sich nur mit einem Password authentifiziert. Sobald man auf "Logout" geht, kommt sofort ein Logindialog, zum schnellen Benutzerwechsel. Habe es jetzt allerdings so angepasst, wie du vorgeschlagen hast: 2 Menüs. Eins mit allen Funktionen und Funktionen werden nach Rechten angezeigt und ausgeblendet und eines, was nach einem Logout angezeigt wird und wo man nur die Optionen "Beenden" und "Anmelden" hat.
Funzt problemlos ;) Damit ist jetzt auch endlich die Funktion "Als Benutzer ausgeben" possibile geworden ;)
Gruess aus Bern und noch einen schönen Sonntagnachmittag! |
|
|
| |
|
|