Me explico:
Tengo una funcion que tiene unas instrucciones al comienzo y unas instrucciones al final, que siempre son las mismas.
function xxx
local a1,a2,a3,etc
Lo unico que cambia es un conjunto de instrucciones que iria en el medio.
Mi pregunta es si yo puedo hacer algo como usar una funcion de cabecera, e incluir una parte de codigo como si fuera parte de la misma funcion. (es decir que no me toque volver a declarar variables ni nada por el estilo, sino que todo lo que contenga sea como de la funcion principal)
algo asi como usar un include
function xxx1 //abro mi funcion para empezar a trabajar
local a1,a2,a3
bla bla bla
abro bases de datos
bla bla bla
//aqui quiero incluir un pedazo de codigo que me reconozca todo lo hecho en xxx1 sin tener que enviarle parametros, ni declarar las variables como públicas
include codigo01
aqui cierro mi funcion
bla bla bla
cerrar base de datos
bla bla bla
return(.t.)
inicio de codigo01
//aqui trabajo como si lo estuviera haciendo en xxx1
?a1
bla bla bla
?a2
fin de codigo01
voy a especificar un poco mas con otro ejemplo bien pequeño:
Por ejemplo tengo la funcion f1 que me recibe un parametro que me indica que codigo utilizar y otros dos parametros que son los que deberia utilizar el codigo uincluido
function f1(p1,p2,p3)
local a1,a2,a3
a1:=1
a2:=6
do case
case p1==1
include cod001
case p1==2
include cod002
endcase
return(.T.)
cod001
a3:=p2+p3
fin cod001
cod002
a3:=p3-p2
Aqui normalmente, para trabajar con p3 y p2 me tocaría enviarselos a cod001 y a cod002 tambien como parámetros o hacer una declaracion private o public, que es justamente lo que quiero evitar
Es un ejemplito breve para explicar lo que quiero lograr, pero en la vida real tengo funciones bastante largas y con muchos parámetros. Es por eso que no quiero tener que manipular mas parámetros.
Alguna sugerencia ??
Gracias de antemano
Es posible unir dos pedazos de codigo ?? algo como include
NO HAS INTENTADO ALMACENAR LOS PARAMETROS EN UN ARREGLO Y PASARLO (Y RETORNARLO SI ES NECESARIO) ????
ASI COMO
aDatos:={ "algo",23,45678.89,aVector}
aDatos:=Pepe(aDatos)
.
.
.
.
FUNCTION Pepe(aDatos)
.
.
.
RETURN aDatos
O SI NO, LO PASAS POR REFERENCIA:
POR EJEMPLO:
PEPE(@aDatos)
NO SE SI TE SIRVA LA IDEA
ASI COMO
aDatos:={ "algo",23,45678.89,aVector}
aDatos:=Pepe(aDatos)
.
.
.
.
FUNCTION Pepe(aDatos)
.
.
.
RETURN aDatos
O SI NO, LO PASAS POR REFERENCIA:
POR EJEMPLO:
PEPE(@aDatos)
NO SE SI TE SIRVA LA IDEA
Saludos
Angel, Valencia, Venezuela
xH .997 - FW 7.9 - BCC55 - WorkShop - MySql
Angel, Valencia, Venezuela
xH .997 - FW 7.9 - BCC55 - WorkShop - MySql
YO LO QUE HAGO NORMALMENTE ME CREO UNA CLASE CON LOS DATOS
Y ENTONCES ES MAS FACIL EL PASE DE PARAMETROS
****************************************************************************
CLASS TCLIENTE // Clase para DATA DE CLIENTES
****************************************************************************
DATA cNombre INIT Space(40)
DATA cDenom INIT Space(40)
DATA cApellido INIT space(40)
DATA cCedula INIT space(10)
DATA cCedLetra INIT space(1)
DATA cRifNat INIT space(10)
DATA cRifNatLetra INIT space(1)
DATA cRifLetra INIT space(1)
DATA cRif INIT space(10)
DATA cNit INIT space(10)
DATA nTpoCliente INIT 1
DATA nTpoEstadoCivil INIT 0
DATA nTpoGenero INIT 0
DATA nTpoNacionalidad INIT 0
DATA nTpoActividad INIT 0
DATA nTpoClienteRegistro INIT 0
DATA nIdDtsBanco INIT 0
DATA dFechaRegistro INIT DATE()
DATA dFechaNacimiento INIT cTod(" / / ")
DATA cTelefonoMovil INIT space(50)
DATA cEmail INIT space(30)
DATA cWeb INIT space(45)
DATA cCodigoCuenta INIT space(25)
DATA cStatAct INIT "ACTIVO"
DATA cStatusActivo INIT "1"
METHOD New() CONSTRUCTOR
METHOD NOTNULL()
ENDCLASS
//******************************************************************
//
METHOD New(aData) CLASS TCLIENTE
//*******************************************************************
IF aData<>nil
::nTpoCliente := aData[6]
::cNombre := IIf(::nTpoCliente=1,aData[1],"")
::cDenom := IIf(::nTpoCliente<>1,aData[1],"")
::cApellido := aData[2]
::cCedLetra := Substr(adata[5],1,1)
::cCedula := iif(len(alltrim(aData[5]))>0,Substr(adata[5],3,13),space(10))
::cNit := aData[4]
::cRifLetra := IIF(::nTpoCliente<>1,Substr(adata[3],1,1)," ")
::cRif := IIF(::nTpoCliente<>1,iif(len(alltrim(aData[3]))>0,Substr(adata[3],3,13),space(10)),"")
::cRifNat := IIf(::nTpoCliente=1,iif(len(alltrim(aData[3]))>0,Substr(adata[3],3,13),space(10)),"")
::cRifNatLetra := IIF(::nTpoCliente=1,Substr(adata[3],1,1)," ")
::nTpoEstadoCivil := aData[7]
::nTpoGenero := aData[8]
::nTpoNacionalidad := aData[9]
::nTpoActividad := aData[10]
::nTpoClienteRegistro := aData[11]
::nIdDtsBanco := aData[12]
::dFechaRegistro := aData[13]
::dFechaNacimiento := aData[14]
::cTelefonoMovil := aData[15]
::cEmail := aData[16]
::cWeb := aData[17]
::cCodigoCuenta := aData[18]
::cStatAct := IIF(aData[19],"ACTIVO","INACTIVO")
::cStatusActivo := IIF(aData[19],"1","0")
ELSE
::cCedula := space(10)
ENDIF
RETURN self
//*******************************************************************
//
METHOD NOTNULL() CLASS TCLIENTE
//*******************************************************************
LOCAL lOk:=.t.
IF ::nTpoCliente=1
IF len(alltrim(::cNombre ))= 0 .OR.;
len(alltrim(::cApellido ))= 0 .OR.;
len(alltrim(::cCedLetra ))= 0 .OR.;
len(alltrim(::cCedula ))= 0 .OR.;
::nTpoEstadoCivil = 0 .OR.;
::nTpoGenero = 0 .OR.;
::nTpoActividad = 0
lOk:=.F.
ENDIF
IF ::nTpoEstadoCivil = 1 .OR.;
::nTpoGenero = 1 .OR.;
::nTpoActividad = 1
lOk:=.F.
ENDIF
ELSE
IF len(alltrim(::cDenom ))= 0 .OR.;
len(alltrim(::cRif ))= 0 .OR.;
len(alltrim(::cRifLetra))= 0
lOk:=.F.
ENDIF
ENDIF
RETURN lOk
Y ENTONCES ES MAS FACIL EL PASE DE PARAMETROS
****************************************************************************
CLASS TCLIENTE // Clase para DATA DE CLIENTES
****************************************************************************
DATA cNombre INIT Space(40)
DATA cDenom INIT Space(40)
DATA cApellido INIT space(40)
DATA cCedula INIT space(10)
DATA cCedLetra INIT space(1)
DATA cRifNat INIT space(10)
DATA cRifNatLetra INIT space(1)
DATA cRifLetra INIT space(1)
DATA cRif INIT space(10)
DATA cNit INIT space(10)
DATA nTpoCliente INIT 1
DATA nTpoEstadoCivil INIT 0
DATA nTpoGenero INIT 0
DATA nTpoNacionalidad INIT 0
DATA nTpoActividad INIT 0
DATA nTpoClienteRegistro INIT 0
DATA nIdDtsBanco INIT 0
DATA dFechaRegistro INIT DATE()
DATA dFechaNacimiento INIT cTod(" / / ")
DATA cTelefonoMovil INIT space(50)
DATA cEmail INIT space(30)
DATA cWeb INIT space(45)
DATA cCodigoCuenta INIT space(25)
DATA cStatAct INIT "ACTIVO"
DATA cStatusActivo INIT "1"
METHOD New() CONSTRUCTOR
METHOD NOTNULL()
ENDCLASS
//******************************************************************
//
METHOD New(aData) CLASS TCLIENTE
//*******************************************************************
IF aData<>nil
::nTpoCliente := aData[6]
::cNombre := IIf(::nTpoCliente=1,aData[1],"")
::cDenom := IIf(::nTpoCliente<>1,aData[1],"")
::cApellido := aData[2]
::cCedLetra := Substr(adata[5],1,1)
::cCedula := iif(len(alltrim(aData[5]))>0,Substr(adata[5],3,13),space(10))
::cNit := aData[4]
::cRifLetra := IIF(::nTpoCliente<>1,Substr(adata[3],1,1)," ")
::cRif := IIF(::nTpoCliente<>1,iif(len(alltrim(aData[3]))>0,Substr(adata[3],3,13),space(10)),"")
::cRifNat := IIf(::nTpoCliente=1,iif(len(alltrim(aData[3]))>0,Substr(adata[3],3,13),space(10)),"")
::cRifNatLetra := IIF(::nTpoCliente=1,Substr(adata[3],1,1)," ")
::nTpoEstadoCivil := aData[7]
::nTpoGenero := aData[8]
::nTpoNacionalidad := aData[9]
::nTpoActividad := aData[10]
::nTpoClienteRegistro := aData[11]
::nIdDtsBanco := aData[12]
::dFechaRegistro := aData[13]
::dFechaNacimiento := aData[14]
::cTelefonoMovil := aData[15]
::cEmail := aData[16]
::cWeb := aData[17]
::cCodigoCuenta := aData[18]
::cStatAct := IIF(aData[19],"ACTIVO","INACTIVO")
::cStatusActivo := IIF(aData[19],"1","0")
ELSE
::cCedula := space(10)
ENDIF
RETURN self
//*******************************************************************
//
METHOD NOTNULL() CLASS TCLIENTE
//*******************************************************************
LOCAL lOk:=.t.
IF ::nTpoCliente=1
IF len(alltrim(::cNombre ))= 0 .OR.;
len(alltrim(::cApellido ))= 0 .OR.;
len(alltrim(::cCedLetra ))= 0 .OR.;
len(alltrim(::cCedula ))= 0 .OR.;
::nTpoEstadoCivil = 0 .OR.;
::nTpoGenero = 0 .OR.;
::nTpoActividad = 0
lOk:=.F.
ENDIF
IF ::nTpoEstadoCivil = 1 .OR.;
::nTpoGenero = 1 .OR.;
::nTpoActividad = 1
lOk:=.F.
ENDIF
ELSE
IF len(alltrim(::cDenom ))= 0 .OR.;
len(alltrim(::cRif ))= 0 .OR.;
len(alltrim(::cRifLetra))= 0
lOk:=.F.
ENDIF
ENDIF
RETURN lOk
Saludos
Angel, Valencia, Venezuela
xH .997 - FW 7.9 - BCC55 - WorkShop - MySql
Angel, Valencia, Venezuela
xH .997 - FW 7.9 - BCC55 - WorkShop - MySql
Re: Es posible unir dos pedazos de codigo ?? algo como inclu
Se puede perfectamente.
# include "mifichero.loquesea"
Saludos
Carlos G.
# include "mifichero.loquesea"
Saludos
Carlos G.
Yo utilizo mucho la clase tarray de Hernan Diego Ceccarelli, en _ lo bueno que tiene es que la podés usar como una dbf o bien para almacenar datos ej:
DEFINE STRUCT aVar
STRUCT FIELD "npro" INIT 0
STRUCT FIELD "napea" INIT space(35)
STRUCT FIELD "nRrec" INIT 0
STRUCT FIELD "dfec" INIT date()
STRUCT FIELD "ntotal" INIT 0
STRUCT FIELD "nTotfac" INIT 0
STRUCT FIELD "nTdeu" INIT 0
STRUCT FIELD "nResta" INIT 0
STRUCT FIELD "aFactura" INIT array(0)
STRUCT FIELD "aFpaga" INIT array(0)
///
END STRUCT
declaras aVar como static, local o como desees
lo llamas así aVar:napea := "Luis"
o bien aadd(aVar:aFactura,{"","",ctod(" "),ctod(" "),0,0})
Si lo querés pasar como parámetro con sólo pasar aVar, pasas todo lo que contiene.
Sólo uso CLASS al principo del programa para declarar unas pocas variables públicas.
Espero que te sirva
Luis
DEFINE STRUCT aVar
STRUCT FIELD "npro" INIT 0
STRUCT FIELD "napea" INIT space(35)
STRUCT FIELD "nRrec" INIT 0
STRUCT FIELD "dfec" INIT date()
STRUCT FIELD "ntotal" INIT 0
STRUCT FIELD "nTotfac" INIT 0
STRUCT FIELD "nTdeu" INIT 0
STRUCT FIELD "nResta" INIT 0
STRUCT FIELD "aFactura" INIT array(0)
STRUCT FIELD "aFpaga" INIT array(0)
///
END STRUCT
declaras aVar como static, local o como desees
lo llamas así aVar:napea := "Luis"
o bien aadd(aVar:aFactura,{"","",ctod(" "),ctod(" "),0,0})
Si lo querés pasar como parámetro con sólo pasar aVar, pasas todo lo que contiene.
Sólo uso CLASS al principo del programa para declarar unas pocas variables públicas.
Espero que te sirva
Luis