Код: Выделить всё
SET TERM ^ ;
CREATE OR ALTER PROCEDURE SP_CHECK_USER (
USERNAME VARCHAR(30))
RETURNS (
USERID INTEGER,
USERGROUP INTEGER,
USERFNAME VARCHAR(35) CHARACTER SET WIN1251,
WORKID INTEGER,
USERROLE VARCHAR(30))
AS
DECLARE VARIABLE ISACTIV SMALLINT;
DECLARE VARIABLE ISDENIED TIMESTAMP;
DECLARE VARIABLE CURTIM TIMESTAMP = CURRENT_TIMESTAMP;
BEGIN
FOR SELECT MU.USERID, MU.FULLNAME, MU.USRGRP, MU.DENIED, MU.ACTIV, MU.UROLE
FROM MUSERS MU
WHERE MU.LOGINNAME=:USERFNAME
INTO :USERID, :USERFNAME, :USERGROUP, :ISDENIED, :ISACTIV, :USERROLE
DO
BEGIN
IF (USERID IS NULL) THEN EXCEPTION EXC_USER_NOT_FOUND;
IF (ISDENIED IS NOT NULL) THEN EXCEPTION EXC_USER_IS_LOCKED;
IF (ISACTIV=1) THEN EXCEPTION EXC_USER_ALREADY_LOGGED;
UPDATE MUSERS M SET M.ACTIV=1 WHERE M.USERID=:USERID;
WORKID=GEN_ID(GEN_USERWORK_WORKID, 1);
INSERT INTO USERWORK (WORKID, USERID, START, FINISH, AUTOREC)
VALUES (:WORKID, :USERID, :CURTIM, :CURTIM, 1);
END
/* Procedure Text */
/*suspend;*/
END^
SET TERM ; ^
GRANT SELECT,UPDATE ON MUSERS TO PROCEDURE SP_CHECK_USER;
GRANT INSERT ON USERWORK TO PROCEDURE SP_CHECK_USER;
GRANT EXECUTE ON PROCEDURE SP_CHECK_USER TO "PUBLIC";
GRANT EXECUTE ON PROCEDURE SP_CHECK_USER TO SYSDBA;
Всё компилится, работает, но...
Код: Выделить всё
with DM.spCheckUser do
begin
ParamByName('USERNAME').AsString := Uname;
try
ExecProc;
// В GlUI.UserID будет ноль, как и в остальных переменных :(((((
[b]GlUI.UserID := ParamByName('USERID').AsInteger;[/b]
GlUI.UserGroup := ParamByName('USERGROUP').AsInteger;
if GlUI.UserGroup < 2 then
GlUI.UserGrpName := 'Администратор'
else
GlUI.UserGrpName := 'Диспетчер';
GlUI.UserFulName := ParamByName('USERFNAME').AsString;
Role := ParamByName('USERROLE').AsString;
GlUI.WorkID := ParamByName('WORKID').AsInteger;
except
AllowLogin := False;
Exit;
end;//try
end;
