Progress 4GL:当多个进程使用相同的时间戳时,如何生成不同的日志文件名?

Progress 4GL: How to generate different log file name when multiple processes using the same Timestamp?

我正在使用此代码生成带有时间戳的日志文件,这样每次当过程被一个进程调用时,它都会生成唯一的日志文件名。但问题是,当两个进程同时调用同一个过程时,日志文件就会被覆盖。我不想要这个。我想知道程序何时被多个进程调用,需要生成不同的日志文件名。

DEFINE VARIABLE TimeStamp AS CHARACTER NO-UNDO.
DEFINE VARIABLE cPath AS CHARACTER NO-UNDO.

ASSIGN

TimeStamp =  string(month(today),"99") + string(day(today),"99") +~
                      string(year(today),"9999") + substring(string(time,"hh:mm:ss"),1,2) +~
                      substring(string(time,"hh:mm:ss"),4,2) +~
                      substring(string(time,"hh:mm:ss"),7,2)

    cPath = "cim_" + STRING(TimeStamp) + ".log".



  PROCEDURE generatecimlogfile:
      OUTPUT TO VALUE(cPath).
      MESSAGE "Inside a file".
  END PROCEDURE.

  RUN generatecimlogfile. /*(This procedure called by multiple processes at a time).*/

您可以将时间戳精确到毫秒,而不是精确到秒。 NOW 函数将为您提供精确到毫秒的日期时间。这段代码会return这样一个时间戳:

DEFINE VARIABLE cTimestamp AS CHARACTER NO-UNDO.

RUN createTimestamp (OUTPUT cTimestamp).

MESSAGE cTimestamp VIEW-AS ALERT-BOX INFORMATION.

PROCEDURE createTimestamp :

    DEFINE OUTPUT PARAMETER pcTimeStr AS CHARACTER NO-UNDO.
    DEFINE VARIABLE cNow AS CHARACTER NO-UNDO.
    DEFINE VARIABLE dtDate AS DATE NO-UNDO.
    DEFINE VARIABLE cDate AS CHARACTER NO-UNDO.
    DEFINE VARIABLE cTime AS CHARACTER NO-UNDO.

    cNow = STRING(NOW, "99/99/9999 HH:MM:SS.SSS").
    cDate = ENTRY(1, cNow, " ").
    ASSIGN dtDate = DATE(cDate) NO-ERROR.

    cTime = ENTRY(2, cNow, " ").
    cTime = REPLACE(cTime, ":", "").
    cTime = REPLACE(cTime, ".", "").
    cTime = REPLACE(cTime, ",", "").

    ASSIGN pcTimeStr = STRING(YEAR(dtDate), "9999") + STRING(MONTH(dtDate), "99") + STRING(DAY(dtDate), "99") + cTime NO-ERROR.

    IF pcTimeStr = ? THEN pcTimeStr = "00000000000000000".

END PROCEDURE.

如果这还不够好,您可以通过向时间戳添加 GUID 来保证文件名的唯一性:

DEFINE VARIABLE cTimestamp AS CHARACTER NO-UNDO.
DEFINE VARIABLE cGUID AS CHARACTER NO-UNDO.

cGUID = GUID(GENERATE-UUID).
cTimestamp = "20200802123456789" + cGUID.

MESSAGE cTimestamp VIEW-AS ALERT-BOX INFORMATION.