Uniface User Forum

 View Only
  • 1.  Determine trigger/proc entry info

    Posted 05-30-2019 15:24

    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..



  • 2.  RE: Determine trigger/proc entry info
    Best Answer

    PARTNER
    Posted 05-30-2019 16:02

    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




  • 3.  RE: Determine trigger/proc entry info

    Posted 05-30-2019 16:10

    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




  • 4.  RE: Determine trigger/proc entry info

    Posted 06-03-2019 12:14

    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 🙂

    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


  • 5.  RE: Determine trigger/proc entry info

    ROCKETEER
    Posted 06-03-2019 12:21

    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



  • 6.  RE: Determine trigger/proc entry info

    Posted 06-03-2019 12:28

    This is very logical 🙂
    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 🙂

    Ingo



  • 7.  RE: Determine trigger/proc entry info

    ROCKETEER
    Posted 06-03-2019 13:46

    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.



  • 8.  RE: Determine trigger/proc entry info

    Posted 06-04-2019 08:23

    Hi Mike

    #startdefine is nice, but ... 🙂

    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 😔

    Ingo