Jengo,
This is often/usually done by declaring a global string variable in a public module (e.g. Global MyModuleName as String) and placing a line of code in EVERY procedure to which places the procedure name in that variable (e.g. MyModuleName = "ThisProcedure" where "ThisProcedure " is the actual name of the procedure.
In your error trapping functions, you can use the value of "MyModuleName" to say what procedure you are in.
Variations on this theme exist, but this is the most common.
One not-to-unreasonable variation is to have each module 'print' the name to a text file at each entry. This provides a 'running history' of the process, and may be useful in tracing an application. Also, additional information may be sent to the log file, including hte value of arguments on entry. To use this approach, you need to also set a flag to tell the system to log/not log activity, as the log can slow your app down -A LOT- and use up a lot of disc space in a production operation.
MichaelRed
mred@duvallgroup.com
There is never time to do it right but there is always time to do it over