# Assistant

## How to Create the Third Dialog Form

| ### What to do:
| In this example you will learn how these dialogue forms have been created and how they are used to build this specific assistant. The general abbreviation for this assistant is USR, the main LogiView procedures are stored in the logic model EP_ASS. This assistant uses a set of three dialogue forms to prompt for specific data. With this information, the assistant creates: a new DataView user assigns the user to one or more groups and creates an entry in the person and resource table All functions are performed in a database transaction. This ensures the consistency of the database.
| The third dialogue form of the given assistant is used to ask for additional information about the user and to finish the assistant. The set of buttons is automatically positioned in the lower right corner. Since there is no succeeding dialogue form, the Next button has automatically been replaced with the button Finish. Additionally it is possible to move to the previous dialogue form or to abort the assistant. Listing of LogiView procedure EDB_ASS/USR_PRSOpn:
`Line` |  | `Statement`
`10` |  | `RES = # xform_get_ass_wdg (EP_ASS_TOP)`
`20` | `C` | `-- Set person name to account name as default value`
`30` |  | `widget_get_buf(EP_ASS_TOP,"EP_USR_NAM",EP_USR_NAM)`
`40` |  | `widget_get_buf(EP_ASS_TOP,"EP_PRS_USER",EP_PRS_USER)`
`50` |  | `if (EP_PRS_USER == "")`
`60` |  |  | `EP_PRS_USER = strcat(strpart(EP_USR_NAM,1,1), strlower(strpart(EP_USR_NAM,2,20)))`
`70` |  |  | `widget_set_buf(EP_ASS_TOP,"EP_PRS_USER", EP_PRS_USER)`
`80` |  | `endif`
`90` |  | `if (language() == "GER")`
`100` |  |  | `EP_STRING = "Bitte geben Sie die persönlichen Daten des Benutzers ein. Mit diesen wird ein Eintrag in der Personen-Tabelle vorgenommen."`
`110` |  | `else`
`120` |  |  | `EP_STRING = "Please enter the personal data of the user. These data will be used to create an entry in the person table."`
`130` |  | `endif`
`140` |  | `RES = @ xform_call_dlg (strcat("EDB-ASS-USR-PRS /TEXT=", EP_STRING))`
### Business Application Logic of the third Dialogue Form The biggest part of the business application logic is defined for the final dialogue form, as this is the case with most assistants. Here the LogiView procedure EP_ASS/USR_Finish is defined as the post mask userexit of the dialogue form. It is a typical feature of an assistant to execute either all steps or none at all. For this reason, all database operations are enclosed in a database transaction (line 20 and 410). If any of the database operation fails, the end of the LogiView procedure is not reached and so the database transaction will automatically be aborted by LogiView. Similar to the LogiView procedures before, a reference on the assistant top widget is determined (line 30). With this widget identifier all values that have been entered are retrieved (all widget_get_buf statements). The first operation then is to create a DataView user. The sub procedure 'EP_ASS_TOOLBOX/CreateUser' is called for this purpose (line 80). The significant identifier of the selected groups can be retrieved from the widget buffer too, using the name of the target widget as a key (line 100). This comma separated list of group identifier is split into its components and for each group a corresponding user-group assignment is created by calling the sub procedure EP_ASS_TOOLBOX/AssignUserToGroup (line 140). Using the personal data, a new entry in the person table is created by the sub procedure EP_ASS_TOOLBOX/CreatePerson (line 320) and an entry in the resource table is created by the sub procedure EP_ASS_TOOLBOX/CreateResource (line 390). Listing of LogiView procedure EDB_ASS/USR_Finish:
`Line` |  | `Statement`
`10` | `C` | `-- Perform all database commands within a transaction`
`20` |  | `start_transaction()`
`30` |  | `RES = # xform_get_ass_wdg (EP_ASS_TOP)`
`40` | `C` | `-- Read user values that have been entered and create a user`
`50` |  | `widget_get_buf(EP_ASS_TOP,"EP_USR_NAM",EP_USR_NAM)`
`60` |  | `widget_get_buf(EP_ASS_TOP,"EP_USR_MNG",EP_USR_MNG)`
`70` |  | `widget_get_buf(EP_ASS_TOP,"EP_USR_UIC",EP_USR_UIC)`
`80` |  | `EP_ASS_TOOLBOX/CreateUser(EP_USR_NAM,EP_USR_UIC,EP_USR_MNG)`
`90` | `C` | `-- Split string with group names and create group assignments`
`100` |  | `widget_get_buf(EP_ASS_TOP,"EDB-ASS-GRP-NAM-SLIT",EP_STRING)`
`110` |  | `EP_COUNT = split(EP_STRING,EP_GRP_NAM_ARR[1])`
`120` |  | `while (EP_INDEX <= EP_COUNT)`
`130` |  |  | `if (EP_INDEX == 1)`
`140` |  |  |  | `EP_ASS_TOOLBOX/AssignUserToGroup(EP_USR_NAM,EP_GRP_NAM_ARR[EP_INDEX],"d",TRUE)`
`150` |  |  | `else`
`160` |  |  |  | `EP_ASS_TOOLBOX/AssignUserToGroup(EP_USR_NAM,EP_GRP_NAM_ARR[EP_INDEX],"d",FALSE)`
`170` |  |  | `endif`
`180` |  |  | `EP_INDEX = EP_INDEX+1`
`190` |  | `done`
`200` | `C` | `-- Read person values that have been entered and create person`
`210` |  | `widget_get_buf(EP_ASS_TOP,"EP_PRS_PREFIX",EP_PRS_PREFIX)`
`220` |  | `widget_get_buf(EP_ASS_TOP,"EP_PRS_TITLE",EP_PRS_TITLE)`
`230` |  | `widget_get_buf(EP_ASS_TOP,"EP_PRS_USER",EP_PRS_USER)`
`240` |  | `widget_get_buf(EP_ASS_TOP,"EP_PRS_TEL",EP_PRS_TEL)`
`250` |  | `widget_get_buf(EP_ASS_TOP,"EP_PRS_FAX",EP_PRS_FAX)`
`260` |  | `widget_get_buf(EP_ASS_TOP,"EP_PRS_e-mail",EP_PRS_e-mail)`
`270` |  | `widget_get_buf(EP_ASS_TOP,"EP_PRS_STREET",EP_PRS_STREET)`
`280` |  | `widget_get_buf(EP_ASS_TOP,"EP_PRS_COUNTRY",EP_PRS_COUNTRY)`
`290` |  | `widget_get_buf(EP_ASS_TOP,"EP_PRS_CITY",EP_PRS_CITY)`
`300` |  | `widget_get_buf(EP_ASS_TOP,"EP_PRS_ZIP",EP_PRS_ZIP)`
`310` |  | `widget_get_buf(EP_ASS_TOP,"EP_PRS_FIRST",EP_PRS_FIRST)`
`320` |  | `EP_ASS_TOOLBOX/CreatePerson (EP_PRS_PREFIX,EP_PRS_TITLE,EP_PRS_USER, EP_PRS_FIRST,EP_PRS_TEL,EP_PRS_e-mail,EP_PRS_FAX,"","", EP_PRS_STREET,EP_PRS_COUNTRY,EP_PRS_ZIP,EP_PRS_CITY,EP_USR_UIC)`
`330` | `C` | `-- Determine description text and create person`
`340` |  | `if (EP_PRS_FIRST == "")`
`350` |  |  | `EP_STRING = EP_PRS_USER`
`360` |  | `else`
370 |  |  | `EP_STRING = strprint("%s, %s",EP_PRS_USER,EP_PRS_FIRST)`
`380` |  | `endif`
`390` |  | `EP_ASS_TOOLBOX/CreateResource(EP_USR_NAM,"USER",EP_STRING)`
`400` | `C` | `-- Commit transaction if no error occurred`
`410` |  | `end_transaction()`