Page 1 of 1

Definir una variable en otro procedimiento o función

PostPosted: Thu Jan 08, 2015 4:00 pm
by jgayoso
Trabajo con linux harbour y five linux y mi consulta es como puedo definir una variable en otro procedimiento.
Se puede hacer?

Adjunto el código que entra en un loop porque no existe en el procedimiento Main la variable mivariable.

function Main()
LOCAL oError := ferrorsys()

?mivarible

Return .T.

#include "error.ch"
#define NTRIM(n)( LTrim(Str(n)) )

Proc ferrorsys(_swE)
Return ( ErrorBlock( {|e| DefError(e,_swE)} ) )

static func DefError(e,l)
Loca i, cMenssageInf, cDefVariable

cMessageInf := ErrorMessage(e)
cMessage := cMessageInf


if 'Error BASE/1003'$cMessageInf

cDefVariable:=substr(cMessageInf,at(':',cMessageInf)+2)
?cDefVariable
store 'Hola' to &cDefVariable
?&cDefVariable
Return (.T.)
endif

return (.f.)

static func ErrorMessage(e)
loca cMessage

// start error message
cMessage := if( e:severity > ES_WARNING, "Error ", "Warning " )

// add subsystem name if available
if ValType(e:subsystem) == "C"
cMessage += e:subsystem()
else; cMessage += "???"; end

// add subsystem's error code if available
if ValType(e:subCode) == "N"
cMessage += ("/" + NTRIM(e:subCode))
else; cMessage += "/???"; end

// add error description if available
if ValType(e:description) == "C"
cMessage += (" " + e:description)
end

// add either filename or operation
if !Empty(e:filename)
cMessage += (": " + e:filename)
elseif !Empty(e:operation)
cMessage += (": " + e:operation)
end

return (cMessage)

Re: Definir una variable en otro procedimiento o función

PostPosted: Thu Jan 08, 2015 5:38 pm
by Antonio Linares
Jorge,

La única solución que se me ocurre es usar una variable pública que haya sido creada previamente en otro procedimiento, pero el usar variables públicas es una práctica muy poco recomendable.

De hecho uno de los grandes avances de Clipper 5 fué el proporcionar variables locales y static para evitar el uso de variables public.

Re: Definir una variable en otro procedimiento o función

PostPosted: Wed Jan 14, 2015 4:39 pm
by jgayoso
Antonio Linares wrote:Jorge,

La única solución que se me ocurre es usar una variable pública que haya sido creada previamente en otro procedimiento, pero el usar variables públicas es una práctica muy poco recomendable.

De hecho uno de los grandes avances de Clipper 5 fué el proporcionar variables locales y static para evitar el uso de variables public.


Antonio, logre solucionarlo agregando a mi errorsys.prg:

#IfDef __SQL__
if 'Error BASE/1003'$cMessageInf
cDefVariable:=substr(cMessageInf,at(':',cMessageInf)+2)
if (vValorVariable:=fField_SQL(cDefVariable))!=NIL
__qqPub( cDefVariable )
store vValorVariable to &cDefVariable.
Return (.T.)
endif
endif
#Endif

Re: Definir una variable en otro procedimiento o función

PostPosted: Wed Jan 14, 2015 4:46 pm
by Antonio Linares
Jorge,

Es una solución nada aconsejable, pero si te sirve...