home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / CLIPPER / MISC / DMSERROR.ZIP / DMSERROR.PRG < prev    next >
Encoding:
Text File  |  1988-09-18  |  17.2 KB  |  570 lines

  1. *--- Header ---------------------------------------------------------------
  2. *    Program . DMSERROR.PRG
  3. *    Version . 1.00
  4. *    Date .... September 15, 1988
  5. *    Author .. Bob Laszko, Data Management Systems
  6. *    Desc .... Runtime error system to replace Nantucket's ERRORSYS.PRG
  7. *    Notice .. Copyright 1988, Data Management Systems. All Rights Reserved
  8. *--------------------------------------------------------------------------
  9. *
  10. *--- Ops Notes ------------------------------------------------------------
  11. *
  12. *    Functions included:
  13. *         EXPR_ERROR()   expression error
  14. *         UNDEF_ERROR()  undefined error
  15. *         MISC_ERROR()   miscellaneous error
  16. *         OPEN_ERROR()   open errors
  17. *         DB_ERROR()     database error
  18. *         PRINT_ERROR()  printer error
  19. *         ETOC()         returns a character expression for any type of input 
  20. *                         (numeric, date, character, or logical) expression
  21. *
  22. *    The following external routines are also required:
  23. *         DMSOOPS.PRG    standard "dialog" box error reporting routine,
  24. *                         also written by Data Management Systems
  25. *         EXXTEND.OBJ    C routines that return the status of some SET
  26. *                         commands. Written by J. Scott Emerich.
  27. *         PRT_SCRN.OBJ   CALLable print screen routine by Ray Love
  28. *
  29. *    Parameters passed by Clipper to error functions:
  30. *         NAME      C    Procedure name in which error occured
  31. *         LINE      N    Line number (in NAME) at which error occured
  32. *         INFO      C    Type of error encountered
  33. *         MODEL     C    Fragment of source code that caused error
  34. *         _1        Any  Value supplied to the failed operation
  35. *         _2        Any  Value supplied to the failed operation
  36. *         _3        Any  Value supplied to the failed operation
  37. *
  38. *
  39. *    Private memvars used by DMSERROR, requiring functions in EXXTEND.OBJ
  40. *         CURR_CON  L    GETCONSOLE()
  41. *                        .T. = CONSOLE is SET ON
  42. *                        .F. = CONSOLE is SET OFF
  43. *         CURR_DEV  L    GETDEVICE_()
  44. *                        .T. = DEVICE = PRINT
  45. *                        .F. = DEVICE = SCREEN
  46. *         CURR_PRN  L    GETPRINT()
  47. *                        .T. = PRINT is SET ON
  48. *                        .F. = PRINT is SET OFF
  49. *
  50. *    Memvars used by DMSOOPS, set in DMSERROR
  51. *         TITLE          C    Title to display on top line of box
  52. *         INSTRUCTION    C    Instructions to display on bottom line of box
  53. *         OOPS_MSG[]     C    Message lines to display in box
  54. *         OOPS_RESP[]    C    Valid responses to instruction line prompts
  55. *         OOPS_ACTION    C    Validated response returned from DMSOOPS
  56. *         OOPS_SCRN      C    Screen saved before DMSOOPS is called
  57. *         REST_SCRN      L    Flag to have DMSOOPS restore screen before returning
  58. *--------------------------------------------------------------------------
  59. *
  60. *--- Updates --------------------------------------------------------------
  61. *
  62. *--------------------------------------------------------------------------
  63.  
  64. *--------------------------------------------------------------------------
  65. *    EXPR_ERROR(NAME, LINE, INFO, MODEL, _1, _2, _3)
  66. *--------------------------------------------------------------------------
  67.  
  68. FUNCTION EXPR_ERROR
  69.  
  70. PRIVATE NAME, LINE, INFO, MODEL, _1, _2, _3
  71. PARAMETERS NAME, LINE, INFO, MODEL, _1, _2, _3    && Passed by Clipper
  72.  
  73. * Divide by zero error
  74. IF M->INFO = "zero divide"
  75.      IF "%" $ M->model        && error from modulus operation (%)
  76.           RETURN M->_1        && return the dividend
  77.      ELSE
  78.           RETURN 0            && return 0
  79.      ENDIF
  80. ENDIF
  81.  
  82. * Make sure output is to screen
  83. SET DEVICE TO SCREEN
  84. SET PRINT OFF
  85. SET CONSOLE ON
  86.  
  87. * Setup DMSOOPS parameters & memvars
  88. TITLE = "Runtime Error - Expression"
  89. REST_SCRN = .F.
  90. INSTRUCTION = "Print Screen For Programmer  (Y/N)"
  91. OOPS_SCRN = SPACE(1)
  92. OOPS_ACTION = SPACE(1)
  93.  
  94. DECLARE OOPS_RESP[2]
  95. OOPS_RESP[1] = "Y"
  96. OOPS_RESP[2] = "N"
  97.  
  98. DECLARE OOPS_MSG[14]
  99. OOPS_MSG[1] = "An error has occured while running this program."
  100. OOPS_MSG[2] = "Following is information that the programmer will"
  101. OOPS_MSG[3] = "require to correct this problem:"
  102. OOPS_MSG[4] = " "
  103. OOPS_MSG[5] = "     Procedure  = " + name
  104. OOPS_MSG[6] = "     Line #     = " + LTRIM(STR(line))
  105. OOPS_MSG[7] = "     Error Type = " + info
  106. OOPS_MSG[8] = "     Expression = " + model
  107. OOPS_MSG[9] = "         _1 (" + TYPE("_1") + ") = " + IF(TYPE("_1") <> "U", ETOC(_1), SPACE(1))
  108. OOPS_MSG[10] = "         _2 (" + TYPE("_2") + ") = " + IF(TYPE("_2") <> "U", ETOC(_2), SPACE(1))
  109. OOPS_MSG[11] = "         _3 (" + TYPE("_3") + ") = " + IF(TYPE("_3") <> "U", ETOC(_3), SPACE(1))
  110. OOPS_MSG[12] = " "
  111. OOPS_MSG[13] = "This program cannot continue, though a printout of"
  112. OOPS_MSG[14] = "this screen should be saved for the programmer."
  113.  
  114. DO DMSOOPS
  115.  
  116. RELEASE TITLE, REST_SCRN, INSTRUCTION, OOPS_MSG, OOPS_RESP
  117.  
  118. * Print screen if desired
  119. IF OOPS_ACTION = "Y"
  120.      CALL PRT_SCRN                         && print DMSOOPS screen
  121.      RESTORE SCREEN FROM OOPS_SCRN
  122.      CALL PRT_SCRN                         && print screen of app @ point of error
  123.      EJECT
  124. ENDIF
  125.  
  126. RELEASE OOPS_SCRN, OOPS_ACTION
  127.  
  128. QUIT
  129.  
  130. RETURN(.T.)
  131.  
  132. * EOF EXPR_ERROR()
  133.  
  134.  
  135.  
  136.  
  137. *--------------------------------------------------------------------------
  138. *    UNDEF_ERROR(NAME, LINE, INFO, MODEL, _1)
  139. *--------------------------------------------------------------------------
  140.  
  141. FUNCTION UNDEF_ERROR
  142.  
  143. PRIVATE NAME, LINE, INFO, MODEL, _1
  144. PARAMETERS NAME, LINE, INFO, MODEL, _1       && Passed by Clipper
  145.  
  146. * Make sure output is to screen
  147. SET DEVICE TO SCREEN
  148. SET PRINT OFF
  149. SET CONSOLE ON
  150.  
  151. * Setup DMSOOPS parameters & memvars
  152. TITLE = "Runtime Error - Undefined"
  153. REST_SCRN = .F.
  154. INSTRUCTION = "Print Screen For Programmer  (Y/N)"
  155. OOPS_SCRN = SPACE(1)
  156. OOPS_ACTION = SPACE(1)
  157.  
  158. DECLARE OOPS_RESP[2]
  159. OOPS_RESP[1] = "Y"
  160. OOPS_RESP[2] = "N"
  161.  
  162. DECLARE OOPS_MSG[12]
  163. OOPS_MSG[1] = "An error has occured while running this program."
  164. OOPS_MSG[2] = "Following is information that the programmer will"
  165. OOPS_MSG[3] = "require to correct this problem:"
  166. OOPS_MSG[4] = " "
  167. OOPS_MSG[5] = "     Procedure  = " + name
  168. OOPS_MSG[6] = "     Line #     = " + LTRIM(STR(line))
  169. OOPS_MSG[7] = "     Error Type = " + info
  170. OOPS_MSG[8] = "     Expression = " + model
  171. OOPS_MSG[9] = "         _1 (" + TYPE("_1") + ") = " + IF(TYPE("_1") <> "U", ETOC(_1), SPACE(1))
  172. OOPS_MSG[10] = " "
  173. OOPS_MSG[11] = "This program cannot continue, though a printout of"
  174. OOPS_MSG[12] = "this screen should be saved for the programmer."
  175.  
  176. DO DMSOOPS
  177.  
  178. RELEASE TITLE, REST_SCRN, INSTRUCTION, OOPS_MSG, OOPS_RESP
  179.  
  180. * Print screen if desired
  181. IF OOPS_ACTION = "Y"
  182.      CALL PRT_SCRN                         && print DMSOOPS screen
  183.      RESTORE SCREEN FROM OOPS_SCRN
  184.      CALL PRT_SCRN                         && print screen of app @ point of error
  185.      EJECT
  186. ENDIF
  187.  
  188. RELEASE OOPS_SCRN, OOPS_ACTION
  189.  
  190. QUIT
  191.  
  192. RETURN(.T.)
  193.  
  194. * EOF UNDEF_ERROR()
  195.  
  196.  
  197.  
  198.  
  199. *--------------------------------------------------------------------------
  200. *    MISC_ERROR(NAME, LINE, INFO, MODEL)
  201. *--------------------------------------------------------------------------
  202.  
  203. FUNCTION MISC_ERROR
  204.  
  205. PRIVATE NAME, LINE, INFO, MODEL
  206. PARAMETERS NAME, LINE, INFO, MODEL      && Passed by Clipper
  207.  
  208. * Make sure output is to screen
  209. SET DEVICE TO SCREEN
  210. SET PRINT OFF
  211. SET CONSOLE ON
  212.  
  213. IF INFO = "type mismatch"
  214.      INFO = INFO + " in field REPLACE"
  215. ENDIF
  216.  
  217. * Setup DMSOOPS parameters & memvars
  218. TITLE = "Runtime Error - Miscellaneous"
  219. REST_SCRN = .F.
  220. INSTRUCTION = "Print Screen For Programmer  (Y/N)"
  221. OOPS_SCRN = SPACE(1)
  222. OOPS_ACTION = SPACE(1)
  223.  
  224. DECLARE OOPS_RESP[2]
  225. OOPS_RESP[1] = "Y"
  226. OOPS_RESP[2] = "N"
  227.  
  228. DECLARE OOPS_MSG[10]
  229. OOPS_MSG[1] = "An error has occured while running this program."
  230. OOPS_MSG[2] = "Following is information that the programmer will"
  231. OOPS_MSG[3] = "require to correct this problem:"
  232. OOPS_MSG[4] = " "
  233. OOPS_MSG[5] = "     Procedure  = " + name
  234. OOPS_MSG[6] = "     Line #     = " + LTRIM(STR(line))
  235. OOPS_MSG[7] = "     Error Type = " + info
  236. OOPS_MSG[8] = " "
  237. OOPS_MSG[9] = "This program cannot continue, though a printout of"
  238. OOPS_MSG[10] = "this screen should be saved for the programmer."
  239.  
  240. DO DMSOOPS
  241.  
  242. RELEASE TITLE, REST_SCRN, INSTRUCTION, OOPS_MSG, OOPS_RESP
  243.  
  244. * Print screen if desired
  245. IF OOPS_ACTION = "Y"
  246.      CALL PRT_SCRN                         && print DMSOOPS screen
  247.      RESTORE SCREEN FROM OOPS_SCRN
  248.      CALL PRT_SCRN                         && print screen of app @ point of error
  249.      EJECT
  250. ENDIF
  251.  
  252. RELEASE OOPS_SCRN, OOPS_ACTION
  253.  
  254. QUIT
  255.  
  256. RETURN(.T.)
  257.  
  258. * EOF MISC_ERROR()
  259.  
  260.  
  261.  
  262.  
  263. *--------------------------------------------------------------------------
  264. *    OPEN_ERROR(NAME, LINE, INFO, MODEL, _1)
  265. *--------------------------------------------------------------------------
  266.  
  267. FUNCTION OPEN_ERROR
  268.  
  269. PRIVATE NAME, LINE, INFO, MODEL, _1 
  270. PARAMETERS NAME, LINE, INFO, MODEL, _1            && Passed by Clipper
  271. PRIVATE CURR_DEV, CURR_PRN, CURR_CON     && private to this function
  272.  
  273. * Allow local handling of network error
  274. IF NETERR() .AND. MODEL == "USE"
  275.      RETURN(.F.)
  276. END
  277.  
  278. * Open errors could be recovered, save current output devices
  279. CURR_DEV = GETDEVICE_()
  280. CURR_PRN = GETPRINT()
  281. CURR_CON = GETCONSOLE()
  282.  
  283. * Make sure output is to screen
  284. SET DEVICE TO SCREEN
  285. SET PRINT OFF
  286. SET CONSOLE ON
  287.  
  288. * Run DMSOOPS first time, try to recover
  289.  
  290. * Setup DMSOOPS parameters & memvars
  291. TITLE = "Runtime Error"
  292. INSTRUCTION = "R = Retry   P = Print Screen and Quit   Q = Quit"
  293. OOPS_ACTION = SPACE(1)
  294.  
  295. DECLARE OOPS_RESP[3]
  296. OOPS_RESP[1] = "R"
  297. OOPS_RESP[2] = "P"
  298. OOPS_RESP[3] = "Q"
  299.  
  300. DECLARE OOPS_MSG[14]
  301. OOPS_MSG[1] = "An Open Error has occured. Some causes of this are:"
  302. OOPS_MSG[2] = ""
  303. OOPS_MSG[3] = "     A disk drive door is open"
  304. OOPS_MSG[4] = "     A diskette is not in place"
  305. OOPS_MSG[5] = "     A serial printer is not responding"
  306. OOPS_MSG[6] = ""
  307. OOPS_MSG[7] = "If it helps, the computer is trying to:"
  308. OOPS_MSG[8] = ""
  309. OOPS_MSG[9] = "    " + model + " " + IF(TYPE("_1") <> "U", ETOC(_1), SPACE(1))
  310. OOPS_MSG[10] = ""
  311. OOPS_MSG[11] = "If the problem can be corrected, please do so and"
  312. OOPS_MSG[12] = "press R (Retry). Otherwise this program cannot"
  313. OOPS_MSG[13] = "continue, though a printout of this screen should be"
  314. OOPS_MSG[14] = "saved for the programmer."
  315.  
  316. DO DMSOOPS
  317.  
  318. RELEASE TITLE, INSTRUCTION, OOPS_MSG, OOPS_RESP
  319.  
  320. DO CASE
  321.      CASE OOPS_ACTION = "R"             && retry (recover)
  322.  
  323.           * Reset output devices first
  324.           IF CURR_DEV
  325.                SET DEVICE TO PRINT
  326.           ENDIF
  327.           IF CURR_PRN
  328.                SET PRINT ON
  329.           ENDIF
  330.           IF .NOT. CURR_CON
  331.                SET CONSOLE OFF
  332.           ENDIF
  333.  
  334.           RETURN(.T.)                   && .T. = retry operation that triggered error
  335.  
  336.      CASE OOPS_ACTION = "Q"             && quit
  337.           QUIT
  338.  
  339. ENDCASE
  340.  
  341. * Show actual error message, print screens - OOPS_ACTION = "P"
  342.  
  343. * Setup DMSOOPS parameters & memvars
  344. TITLE = "Runtime Error - Open"
  345. REST_SCRN = .F.
  346. INSTRUCTION = "Runtime Error - Open"
  347. OOPS_SCRN = SPACE(1)
  348. OOPS_ACTION = SPACE(1)
  349.  
  350. DECLARE OOPS_MSG[12]
  351. OOPS_MSG[1] = "An error has occured while running this program."
  352. OOPS_MSG[2] = "Following is information that the programmer will"
  353. OOPS_MSG[3] = "require to correct this problem:"
  354. OOPS_MSG[4] = " "
  355. OOPS_MSG[5] = "     Procedure  = " + name
  356. OOPS_MSG[6] = "     Line #     = " + LTRIM(STR(line))
  357. OOPS_MSG[7] = "     Error Type = " + info
  358. OOPS_MSG[8] = "     Expression = " + model
  359. OOPS_MSG[9] = "         _1 (" + TYPE("_1") + ") = " + IF(TYPE("_1") <> "U", ETOC(_1), SPACE(1))
  360. OOPS_MSG[10] = " "
  361. OOPS_MSG[11] = "This program cannot continue, though a printout of"
  362. OOPS_MSG[12] = "this screen should be saved for the programmer."
  363.  
  364. KEYBOARD CHR(13)         && simulate key press in OOPS
  365. DO DMSOOPS
  366.  
  367. RELEASE TITLE, REST_SCRN, INSTRUCTION, OOPS_MSG, OOPS_RESP
  368.  
  369. CALL PRT_SCRN                              && print DMSOOPS screen
  370. RESTORE SCREEN FROM OOPS_SCRN
  371. CALL PRT_SCRN                              && print screen of app @ point of error
  372. EJECT
  373.  
  374. RELEASE OOPS_SCRN, OOPS_ACTION
  375.  
  376. QUIT
  377.  
  378. RETURN(.T.)
  379.  
  380. * EOF OPEN_ERROR()
  381.  
  382.  
  383.  
  384.  
  385. *--------------------------------------------------------------------------
  386. *    DB_ERROR(NAME, LINE, INFO)
  387. *--------------------------------------------------------------------------
  388.  
  389. FUNCTION DB_ERROR
  390.  
  391. PRIVATE NAME, LINE, INFO
  392. PARAMETERS NAME, LINE, INFO        && Passed by Clipper
  393.  
  394. * Make sure output is to screen
  395. SET DEVICE TO SCREEN
  396. SET PRINT OFF
  397. SET CONSOLE ON
  398.  
  399. * Setup DMSOOPS parameters & memvars
  400. TITLE = "Runtime Error - Database"
  401. REST_SCRN = .F.
  402. INSTRUCTION = "Print Screen For Programmer  (Y/N)"
  403. OOPS_SCRN = SPACE(1)
  404. OOPS_ACTION = SPACE(1)
  405.  
  406. DECLARE OOPS_RESP[2]
  407. OOPS_RESP[1] = "Y"
  408. OOPS_RESP[2] = "N"
  409.  
  410. DECLARE OOPS_MSG[10]
  411. OOPS_MSG[1] = "An error has occured while running this program."
  412. OOPS_MSG[2] = "Following is information that the programmer will"
  413. OOPS_MSG[3] = "require to correct this problem:"
  414. OOPS_MSG[4] = " "
  415. OOPS_MSG[5] = "     Procedure  = " + name
  416. OOPS_MSG[6] = "     Line #     = " + LTRIM(STR(line))
  417. OOPS_MSG[7] = "     Error Type = " + info
  418. OOPS_MSG[8] = " "
  419. OOPS_MSG[9] = "This program cannot continue, though a printout of"
  420. OOPS_MSG[10] = "this screen should be saved for the programmer."
  421.  
  422. DO DMSOOPS
  423.  
  424. RELEASE TITLE, REST_SCRN, INSTRUCTION, OOPS_MSG, OOPS_RESP
  425.  
  426. * Print screen if desired
  427. IF OOPS_ACTION = "Y"
  428.      CALL PRT_SCRN                         && print DMSOOPS screen
  429.      RESTORE SCREEN FROM OOPS_SCRN
  430.      CALL PRT_SCRN                         && print screen of app @ point of error
  431.      EJECT
  432. ENDIF
  433.  
  434. RELEASE OOPS_SCRN, OOPS_ACTION
  435.  
  436. QUIT
  437.  
  438. RETURN(.T.)
  439.  
  440. * EOF DB_ERROR()
  441.  
  442.  
  443.  
  444.  
  445. *--------------------------------------------------------------------------
  446. *    PRINT_ERROR(NAME, LINE)
  447. *--------------------------------------------------------------------------
  448.  
  449. FUNCTION PRINT_ERROR
  450.  
  451. PRIVATE NAME, LINE 
  452. PARAMETERS NAME, LINE                             && Passed by Clipper
  453. PRIVATE CURR_DEV, CURR_PRN, CURR_CON     && private to this function
  454.  
  455. * Save current output devices
  456. CURR_DEV = GETDEVICE_()
  457. CURR_PRN = GETPRINT()
  458. CURR_CON = GETCONSOLE()
  459.  
  460. * Make sure output is to screen
  461. SET DEVICE TO SCREEN
  462. SET PRINT OFF
  463. SET CONSOLE ON
  464.  
  465. * Setup DMSOOPS parameters & memvars
  466. TITLE = "Printer Error"
  467. INSTRUCTION = "Retry Printout (Y/N)"
  468. OOPS_ACTION = SPACE(1)
  469.  
  470. DECLARE OOPS_RESP[2]
  471. OOPS_RESP[1] = "Y"
  472. OOPS_RESP[2] = "N"
  473.  
  474. DECLARE OOPS_MSG[11]
  475. OOPS_MSG[1] = "The printer does not respond. Any of the following"
  476. OOPS_MSG[2] = "may be causing this problem:"
  477. OOPS_MSG[3] = " "
  478. OOPS_MSG[4] = "     The power is off"
  479. OOPS_MSG[5] = "     It is out of paper"
  480. OOPS_MSG[6] = "     The Online or Select light is not on"
  481. OOPS_MSG[7] = "     The cable is disconnected at the printer"
  482. OOPS_MSG[8] = "      or the computer"
  483. OOPS_MSG[9] = " "
  484. OOPS_MSG[10] = "If you can correct the problem, do so. Otherwise"
  485. OOPS_MSG[11] = "the printout will be aborted."
  486.  
  487. DO DMSOOPS
  488.  
  489. RELEASE TITLE, INSTRUCTION, OOPS_MSG, OOPS_RESP
  490.  
  491. IF OOPS_ACTION = "Y"          && retry
  492.  
  493.      * Restore output devices first
  494.      IF CURR_DEV
  495.           SET DEVICE TO PRINT
  496.      ENDIF
  497.      IF CURR_PRN
  498.           SET PRINT ON
  499.      ENDIF
  500.      IF .NOT. CURR_CON
  501.           SET CONSOLE OFF
  502.      ENDIF
  503.  
  504.      RETURN(.T.)         && .T. = retry failed print operation
  505. ELSE
  506.  
  507.      BREAK               && aborts printout if printing operation is bracketed
  508.                          &&  by BEGIN SEQUENCE...END SEQUENCE. Could replace
  509.                          &&  this line with RETURN(.F.) to skip failed print
  510.                          &&  operation and continue rest of program.
  511. ENDIF
  512.  
  513. RETURN(.F.)
  514.  
  515. * EOF PRINT_ERROR()
  516.  
  517.  
  518.  
  519.  
  520. *--------------------------------------------------------------------------
  521. *    ETOC(EXPRESSION)       && any Expression TO Character conversion
  522. *--------------------------------------------------------------------------
  523.  
  524. FUNCTION ETOC
  525.  
  526. PRIVATE EXPRESSION, EXPC
  527. PARAMETERS EXPRESSION
  528. PRIVATE EXPC                  && private to this function
  529.  
  530. DO CASE
  531.      CASE TYPE("EXPRESSION") = "C"           && character
  532.           EXPC = EXPRESSION
  533.  
  534.      CASE TYPE("EXPRESSION") = "D"           && date
  535.           EXPC = DTOC(EXPRESSION)
  536.  
  537.      CASE TYPE("EXPRESSION") = "L"           && logical
  538.           IF EXPRESSION
  539.                EXPC = ".T."
  540.           ELSE
  541.                EXPC = ".F."
  542.           ENDIF
  543.  
  544.      CASE TYPE("EXPRESSION") = "N"           && numeric
  545.           EXPC = LTRIM(STR(EXPRESSION))      && decimal places not important
  546.  
  547.      CASE TYPE("EXPRESSION") = "M"           && memo field
  548.           EXPC = "<Memo field>"
  549.  
  550.      CASE TYPE("EXPRESSION") = "A"           && array
  551.           EXPC = "<array>"
  552.  
  553.      CASE TYPE("EXPRESSION") = "U"           && undefined
  554.           EXPC = "<undefined>"
  555.  
  556.      CASE TYPE("EXPRESSION") = "UE"          && syntax error
  557.           EXPC = "<syntax error>"
  558.  
  559.      CASE TYPE("EXPRESSION") = "UI"          && indeterminate error
  560.           EXPC = "<indeterminate error>"
  561. ENDCASE
  562.  
  563. RETURN(EXPC)
  564.  
  565. * EOF ETOC()
  566.  
  567.  
  568. *--------------------------------------------------------------------------
  569. *    EOF  DMSERROR.PRG
  570. *--------------------------------------------------------------------------