1
0
-1

Is there a proc function that can determine which trigger/proc entry code is executing from?  I've designed a global message generation routine in which I pass in the Trigger Name and Entry Name (if applicable).  However, if I move the code to a different trigger and/or change the Entry name, I'll have to remember to change that info.


Example:  I have an Entry in Entity_Name Local Proc Modules named GetUserInfo.  In this entry I determine I want to log some information so I pass a list of something like $EntName;"Local Proc Modules";"GetUserInfo" to my global messaging routine.


Ideally, I'd like to pass Uniface-generated information instead (something like $EntName;$Trigger;$EntryName").

Thanx,

..Rob..

    CommentAdd your comment...

    3 answers

    1.  
      1
      0
      -1

      There are compile time constants for at least two of those.

      "<$entname>" will produce the entity name. 

      "<$triggerabbr>" will produce the trigger abbreviation. 

      "<$fieldname>" will produce the field name. 


      Alternatively, you can look at the $proccontext("STACK"), which shows the entire call stack as a list of lists. 

      Depending where you look at this (inside your global routine (Global proc?) then the point which called it is the second or third entry in the list. 

      We have a global proc for logging which basically decodes the entire stack to save the point in the program at which the error occurs, and how it got there. 

      You need to look at the values in there for different points in the program (component triggers/operations/lpms, entity triggers/operations/lpms and field triggers/operations/lpms. 

      The $proccontext has the advantage of being coded once in the error routine, rather than in the call. 


      Iain


      1. Rob Maciok

        Perfect. I wanted to do it all in the messaging routine anyway but didn't know that functionality existed. I'll parse the stack. Thanx!


        Sample output.  I can work with this! (wish Uniface wouldn't UpperCase everything tho):

        TYPE=MOD

        MODID=mESHOWSINGLENOMENTITY

        MODNAM=ESHOWSINGLENOMENTITY

        TRIG=_detail

        TRIGGER=DTLF

        LNR=48

        LIN=SPROCCONTEXT = $ProcContext("STACK")

        OBJTYPE=FRM

        APSNAM=UNI

        CPTNAM=XXXXXXXXXX

        INSNAM=XXXXXXXXXX

        FIELD=XXXXXXXXXX

        ENTITY=XXXXXXXXXX

        MODEL=XXXXXXXXXX


      CommentAdd your comment...
    2.  
      1
      0
      -1

      Hi Rob,

      Be aware the value of <$triggerabbr> is the name of the container which, in version 10, has changed - see <$triggerabbr> for more info.

      Mike

      1. Ingo Stiller

        This is very logical (smile)
        In UnifAce 10 there is only one big "pot" of proccode for each component/entity
        <$triggerabbr> is the name of this container and not the name of a specific TRIGGER, OPERATION, ENTRY, ...
        UnifAce should change "<triggerabbr>" to "<containerabbr>" to clearify thsi (smile)

        Ingo

      2. Mike Taylor

        There were many discussions at the time about what to do with <$triggerabbr> in the context of Uniface 10 code containers. One option was to change the name of the constant; however, as this would cause incompatibilities in existing applications, we decided to keep the name but allow it to be redefined. The new #startdefine and #enddefine precompiler directives were, in part, introduced to limit the scope of this constant.

      3. Ingo Stiller

        Hi Mike

        #startdefine is nice, but ... (smile)

        The question was not, how could I use precompiler constants in a local context but how to get info about the "trigger" in which I'm doing my coding
        e.g on have a global include to check wether the component got focus or loose it, so you put this include in FRGF resp. FRLF
        In this include there is a line like this
         call GP_DO_IT("<triggerabbr>")

        Perfect in UnifAce 9 but in UnifAce 10, this not longer a usefull statement (sad)

        Ingo




      CommentAdd your comment...
    3.  
      1
      0
      -1

      This is a global function wich I did implement to get the caller instance.
      If you want to get the entry just one step up, you have to modify this routine a little bit (smile)

      Ingo


      ENTRY GF_CALLER_INS
        returns string
        params
          string v_PARA:INOUT
        endparams
        variables
          string v_PROCCONTEXT_STACK
          string v_ITEM
          string v_INSTANCE,v_INSTANCE_M
        endvariables
        v_PROCCONTEXT_STACK = $proccontext("STACK")
        v_INSTANCE_M=$instancename()
        FORLIST v_ITEM IN v_PROCCONTEXT_STACK
          v_INSTANCE=$item("INSNAM",v_ITEM)
          IF(v_INSTANCE="" & $item("OBJTYPE",v_ITEM)="APS") v_INSTANCE="*APS"
          IF(v_INSTANCE!="" & v_INSTANCE!=v_INSTANCE_M)
            $status=0
            RETURN(v_INSTANCE)
          ENDIF
        ENDFOR
        $status=-57 ; UACTERR_NO_INSTANCE
        RETURN("")
      END ; GF_CALLER_INS
        CommentAdd your comment...