Page 1 of 1

Es posible unir dos pedazos de codigo ?? algo como include

Posted: Thu Apr 17, 2008 10:39 pm
by BenD
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

Posted: Thu Apr 17, 2008 11:38 pm
by ADBLANCO
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 :roll:

Posted: Thu Apr 17, 2008 11:43 pm
by ADBLANCO
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

Posted: Thu Apr 17, 2008 11:45 pm
by ADBLANCO
DE ESA FORMA SI NECESITO ACCESAR AL NOMBRE DE UN CLIENTE LO HAGO ASI:

oCliente:cNombre

Re: Es posible unir dos pedazos de codigo ?? algo como inclu

Posted: Fri Apr 18, 2008 6:31 am
by FiveWiDi
Se puede perfectamente.

# include "mifichero.loquesea"

Saludos
Carlos G.

Posted: Fri Apr 18, 2008 11:21 am
by surGom
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