Up One Level
 
New Message
Reply
History
 
Previous in Thread
Next in Thread
Previous Unread
Next Unread
 
Print
 
About this Form
   
  Message Message Postmark    
 
Mon, 20 Oct 2003 15:43:49
From:
Vincent Tournier
Vincent Tournier
Subject: [4D Agenda] Creating a multi user 4D Agenda 
To:
Plugs FAQ
Plugs FAQ
Creating a multi user 4D Agenda

To demonstrate the use of 4D Agenda in a multi user environment we will build a simple demonstration 4D app. Nothing fancy, just to give you some directions to go.

Let’s start off with the first table for the users

Table name: [USERS]

Field name      Type   Options
UserID         Longint        Indexed/unique
UserName               Alpha[80]
Password               Alpha[80]

And an event table

Table name: [EVENTS]

Field name      Type   Options
EventID        Longint        Indexed/Unique
UserID         Longint        Indexed
StartDate       Date   Indexed
EndDate        Date
StartTime       Time   Indexed
EndTime        Time   Indexed
Description     Text   

Now create in the Database startup routine the following code

C_LONGINT(<>SYS_USERID)
All Records
([USERS])
If
(Records in selection([USERS])=0)
        
USER_CreateSomeUsers
End if
<>SYS_USERID:=USER_Login

Now create the method: “USER_CreateSomeUsers”

CREATE RECORD([USERS])
[
USERS]UserID:=Sequence Number([USERS])
[USERS]UserName:=”Chris”
[USERS]Password:=”Smit”
SAVE RECORD([USERS])
CREATE RECORD
([USERS])
[USERS]UserID:=Sequence Number([USERS])
[USERS]UserName:=”Hans”
[USERS]Password:=”Apple”
SAVE RECORD([USERS])
UNLOAD RECORD([USERS])

Now let’s build some simple login dialog box in the [USERS] table. I leave the design of the dialog box to your own creativity, it should include two text variables, “vs_Name” and “vs_Password” and an ACCEPT-button.

The simple login method,

C_LONGINT($Window)
C_LONINT($0)
$Window:=open window(10;40;310;340;8;””;””)
DIALOG
([USERS];”LoginDialog”)
CLOSE WINDOW
If
(OK=1)
        QUERY
([USERS];[USERS]Name=vsName)
        
$0:=[USERS]UserID
Else
        
$0:=0
End if
As I said before nothing fancy, no error checking or password checking stuff, just to get you started in one of the many possibility’s to create a multi-user agenda.

Now the 4D Agenda dialog box, this one can best be used from the 4D Agenda demo app.

The Form method should look something like this:

C_DATE(vDate)
C_INTEGER(vStart;vEnd)
C_LONGINT(err)

Case of
        : (Form event= On Load )
        vStart:=7
        vEnd:=22
        vDate:=Current date
        err:= AG SET EVENT TABLE NUM (vAgenda ; Table(->[Events]))
        err:= AG SET START DATE FIELD NUM (vAgenda ; Field(->[Events]StartDate))
        err:= AG SET END DATE FIELD NUM (vAgenda ; Field(->[Events]EndDate))
        err:= AG SET START TIME FIELD NUM (vAgenda ; Field(->[Events]StartTime))
        err:= AG SET END TIME FIELD NUM (vAgenda ; Field(->[Events]EndTime))
        err:= AG SET DESCRIPTION FIELD NUM (vAgenda ; Field(->[Events]Description))
        `Set the UserID field
        err:= AG SET USERID FIELD NUM (vAgenda ; Field(->[Events]UserID))
        err:= AG SET EVENTID FIELD NUM (vAgenda ; Field(->[Events]EventID))
        err:= AG SET AGENDA START HOUR (vAgenda ; vStart)
        err:= AG SET AGENDA END HOUR (vAgenda ; vEnd)
        err:= AG AGENDA EVENT HANDLER (vAgenda ; "AG_EventHandler")
        ` Set the current User ID to the ID of the user who has just logged-in
        err:= AG CURRENT USER ID (vAgenda ; <>SYS_USERID)
End case

4D Agenda will keep track of a single Agenda per user this way. To create an easy way to switch to the
Agenda of an other user, create a pop-up menu on the 4D Agenda dialog box with the following
method attached to it:

If (pop_Users # 0)
        vUserID:=arr_UserID{pop_Users}
        err:= AG CURRENT USER ID (vAgenda ; vUserID)
        ` And to prevent any changes to the Agenda
        err:= AG SET EVENT DRAG LOCK (vAgenda ; AG_True)
        err:= AG SET EVENT EDIT LOCK (vAgenda ; AG_True)

Else `Switch back to the current user
        $A:=Find in Array (arr_UserID ; <>SYS_USERID)
        pop_Users:=$A
        err:= AG CURRENT USER ID (vAgenda ; vUserID)
        err:= AG SET EVENT DRAG LOCK (vAgenda ; AG_False)
        err:= AG SET EVENT EDIT LOCK (vAgenda ; AG_False)
End if

err:=AG REDRAW (vAgenda ; AG_Reload)