19. Januar 2010 11:52
Hallo,
ich stehe gerade etwas auf dem Schlauch und hoffe ihr könnt mir weiterhelfen.
In unserer Navisionversion 3.01b unterbinden wir mit folgendem kleinen Code in der CU1 Doppelanmeldungen von Usern.
Nun wollte ich den den gleichen Code in der Version 2009 verwenden. Doch es funktioniert nicht und ich kann leider keine Ursache finden.
Lasse ich bei SETRANGE die USERID weg, bricht jede weitere Session (unabhängig vom User) ab.
Hat von euch jemand eine Idee?
Vielen dank!
//Session autom. abbrechen +
Session.RESET;
Session.SETRANGE("User ID",USERID);
IF Session.COUNT > 1 THEN BEGIN
Window.OPEN(Text032);
SLEEP(8000);
Window.CLOSE;
CREATE(WSH);
WSH.SendKeys('%{F4}');
END;
//Session abbrechen -
Inzwischen weiß ich das Navision in der 2009 den Count auf die Session nicht im Zugriff hat oder falsch berechnet. Über MESSAGE('Anzahl Session %1',Session.COUNT) erhalte ich in der 3.01b die jeweils richtig Anzahl, in der 2009 immer nur 0. Wo liegt da nur der Unterschied
Zuletzt geändert von DanBay am 20. Januar 2010 12:35, insgesamt 1-mal geändert.
19. Januar 2010 12:51
Eine konkrete Idee leider nicht.
Aber du könntest mal etwas versuchen:
Filtere zusätzlich auf "My Session" FALSE und mach aus dem COUNT ein IF FINDFIRST
19. Januar 2010 13:00
Danke, doch leider funktioniert es nicht. MY SESSION ist auch bei mehrfach Anmeldungen immer nur 1x in der entsprechenden Anwendung aktiv.
Ein kleiner Trost, die Anzahl der Session wir richtig ausgegeben.
Gruß Danbay
19. Januar 2010 13:17
Darum die Kombination.
My Session muss auf FALSE gefiltert werden.
Das ergebniss zeigt dann alle Sessions mit meinem User, ausser der Session meinen aktuellen Clients.
Wenn es da welche gibt, muss ich mich ja gerade ein zweites mal angemeldet haben.
Und der Findfirst sorgt dafür das du keinen COUNT mehr brauchst.
19. Januar 2010 13:30
Nun habe ich dich verstanden und du hast vom Ansatz her recht.
Doch leider funktioniert es nicht.
19. Januar 2010 15:45
OK, ich habs mal nachgebaut und den Fehler gefunden.
In der Session steht der User inkl Domäne.
In USERID wird die aber abgeschnitten.
Das heisst das du diese am einfachsten wieder anhängst.
Z.B.:
Session.SETRANGE("User ID",'DOMÄNE\'+USERID);
19. Januar 2010 16:01
Danke für deine Unterstützung!
Wo siehst du die Domäne?
Wenn ich in die Sessiontabelle schaue, finde ich keine Domäne.
Beides (3.01b / 2009) sind lokale Datenbanken, rein als Testumgebung.
Und in der 3.01b funktioniert es prima und in der 2009 leider nicht.
19. Januar 2010 16:04
Ah, dann sind es bei dir andere Bedingungen.
Ich hatte einen Windowslogin und eine SQL-Datenbank.
Nutzt du Datenbanklogins?
19. Januar 2010 16:08
ja, Datenbankanmeldungen.
19. Januar 2010 16:18
Das kann ich jetzt leider schlecht nachstellen auf Native.
Aber eigentlich sollte es funktionieren.
Es sei den du hat gar keine Nutzer in der Datenbank angelegt, dann gibt es auch keine USERID.
Aber auch dann würdest du beim 2. Login rausfliegen.
19. Januar 2010 16:42
Doch, es sind verschiedene User angelegt. (analog der 3.01b)
Naja, ich werde mal weiter "spielen" und hoffentlich zu einer Lösung kommen.
20. Januar 2010 12:35
Danke Danjo, du hast mich auf den richtigen Weg gebracht.
Mit "Session.SETFILTER("User ID",'*'+USERID);" funktioniert es.
20. Januar 2010 12:53
Das hört man gerne :)
Super das es noch geklappt hat.
Noch ein Randvermerk: Falls das ganze mal auf einen SQL-Server wechselt, solltest du noch noch Anwendung/Datenbank abfiltern.
22. Januar 2010 08:31
Hallo zusammen,
das ist ja genau étwas, was ich seit Jahren suche ! Nur leider flutscht das bei mir nicht. Könnt ihr mir helfen, was ich da noch reinsetzen muss ?
Ich hab das bisher soweit in die CU1 unter "CompanyOpen" übernommen:
//@33 dp01 Session autom. abbrechen -
Session.RESET;
Session.SETFILTER("User ID",'*'+USERID);
IF Session.COUNT > 1 THEN Error(Text019);
//@33 dp01 Session abbrechen +
wobei Text019 der Hinweis ist, dass der User bereits angemeldet ist. Das mit
CREATE(WSH);
WSH.SendKeys('%{F4}');
hab ich nicht verstanden.
Der Hinweis erscheint auch nach der Anmeldung, aber danach geht's ungestraft weiter. Wie kann ich Navision dazu bringen, den Login-Vorgang abzubrechen ? Wir arbeiten mit der Native DB V4.00 SP2 mit TU auf NAV2009 und Datenbank-Login
22. Januar 2010 09:07
Hallo Dieter,
wir haben das ganze nun auch auf einer 2009 Native-Datenbank laufen und es funktioniert super:
Es gibt 2 Möglichkeiten, 1. der User kann selbst entscheiden ob er sich doppelt anmelden möchte oder 2. die Anmeldung wird autom. abgebrochen.
Folgend mal der Code aus CU1 im Trigger LgInStart:
Folgende Variablen werden noch benötigt:
Name DataType Subtype Length
WSH Automation 'Windows Script Host Object Model'.WshShell
Session Record Session
Window Dialog
//Session autom. abbrechen +
Session.RESET;
Session.SETFILTER("User ID",'*'+USERID);
IF Session.COUNT >1 THEN BEGIN
Window.OPEN(Text032);
SLEEP(7000);
Window.CLOSE;
CREATE(WSH);
WSH.SendKeys('%{F4}');
END;
//Session autom. abbrechen -
}
//Userfrage Session abbrechen +
Session.RESET;
Session.SETFILTER("User ID",'*'+USERID);
IF Session.COUNT > 1 THEN BEGIN
IF NOT CONFIRM(Text033, FALSE, USERID) THEN BEGIN
Window.OPEN(Text032);
SLEEP(5000);
Window.CLOSE;
CREATE(WSH);
WSH.SendKeys('%{F4}');
END;
END;
//Userfrage Session abbrechen -
Gruß DanBay
22. Januar 2010 09:23
Dieter hat geschrieben:CREATE(WSH);
WSH.SendKeys('%{F4}');
Dieser Code bewirkt, dass virtuell Tasten der Tastatur "gedrückt" werden. Hier handelt es sich um Alt + F4. Ich finde das ganze persönlich unsicher, es kann auch versehentlich ein anderes Fenster geschlossen werden. Deswegen gehen wir die Sache ein bisschen anders an. Wir überprüfen die Anzahl der Sessions (in der Tabelle 91 User Setup konfigurieren wir pro User die maximale Anzahl an Sessions). Wenn nun die Anzahl überschritten wird, ruft Navision über WSH ein VB-Script auf welches den zuletzt gestarteten Navision-Prozess tötet und eine Meldung in einer Messagebox an die User ausgibt. Damit ist gewährleistet, dass Navision sich beendet und kein anderes Programm.
22. Januar 2010 12:36
ich liebe dieses Forum !!!
@DanBay: ich kann leider für WSH als DataType kein "Automation" auswählen, ist bei mir nicht drin. Hab ich was verpeilt ?
@Sebastian: die Variante klingt auch nicht schlecht. Könntest mir das noch ein bisschen näher bringen, wo ich was reinschreibe ?
Vielen Dank schonmal,
Dieter
22. Januar 2010 13:50
Hallo Dieter,
den Datatype AUTOMATION gibt es in unserer 3.01 als auch in der 2009.
Kann dir leider nicht sagen warum du ihn nicht siehst.
Gruß Danbay
22. Januar 2010 14:16
In Codeunit 1 in der Funktion LoginStart
- Code:
Session.RESET;
Session.SETRANGE("Application Name",SysEinr."Name der Applikation");
Session.SETFILTER("User ID",'*' + USERID);
IF Session.COUNT > BenutzerEinr."Anzahl Anmeldungen pro Server" THEN BEGIN
Datei := Pfad + SysEinr."Dateinname Anmeldebeschränkung";
AllgFunk.RunCommand(ENVIRON('Comspec')+' /c Wscript "' + Datei + '" ' +
FORMAT(BenutzerEinr."Anzahl Anmeldungen pro Server") + ' ' + USERID,0,FALSE);
AllgFunk.RunCommand:
- Code:
IF ISCLEAR(WSH_Shell) THEN
CREATE(WSH_Shell);
RetValue := WSH_Shell.Run(Command, WindowStyle, WaitOnReturn);
EXIT(RetValue);
Parameter:
Var Name DataType Subtype Length
Nein Command Text 1024
Nein WindowStyle Variant
Nein WaitOnReturn Variant
Variablen:
Name DataType Subtype Length
WSH_Shell Automation 'Windows Script Host Object Model'.WshShell
Im VB-Script:
- Code:
' Parameter-Objekt erstellen
Set WSHArgs = Wscript.Arguments
' Variablen fuellen
pc = "localhost"
programm = "'finsql.exe'"
PID = ""
' Prozess-ID herausfinden fuer den zuletzt gestarteten Prozess
Set wmi = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& pc & "\root\cimv2")
Set col = wmi.ExecQuery _
("Select * from Win32_Process Where Name = " & programm )
For Each obj in col
PID = obj.ProcessID
Next
' Prozess killen, wenn PID gefuellt
If PID <> "" then
Set wmi = GetObject("winmgmts:\\." & _
"\root\cimv2:Win32_Process.Handle='" & PID & "'")
killed = wmi.Terminate()
if killed <> 0 then
msgbox "Navision konnte nicht beendet werden!",vbCritical,"Navision-Anmeldung"
end if
end if
' Messagebox, je nach Anzahl der uebergebenen Parameter
If WSHArgs.Count > 1 Then
Sessions = WSHArgs.item(0)
User = WSHArgs.item(1)
msgbox "Maximale Anzahl Navision-Anmeldungen (" & Sessions & ") fuer Benutzer " & User _
& " erreicht!" & vbCrLf & "Keine weiteren Navision-Anmeldungen moeglich!",vbExclamation,"Navision-Anmeldung"
else
msgbox "Sie haben die Anzahl Ihrer maximalen Anmeldungen ueberschritten!",_
vbExclamation,"Navision-Anmeldung"
end if
' Objekt zuruecksetzen
Set WSHArgs = Nothing
Der Datentyp Automation ist glaube ich lizenztechnisch begrenzt.
22. Januar 2010 17:10
Vielen Dank erstmal,
leider musste ich lernen, dass ich für den DataType "Automation" das Granule C/OCX benötige, was in unserer Lizenz nicht integriert ist.
Wofür kauf ich dann eine Designerlizenz ?
Mal sehen, ob mein Chef die € 600,-- dafür ausgibt.
Ich wünsch ein schönes Wochenende
Dieter
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.