Programación n-capas en VFP

21/12/2004 - 18:37 por Daniel Bojorge | Informe spam
Hola

Alguien por acá podría darme una mano? Quiero comenzar a desarrollar
sistemas en n-capas con VFP, pero estoy pegado. ¿tendrán algún ejemplo?

¿Qué debo poner en cada capa?
1. Interface
2. Reglas de Negocio
3. Datos
4. Conexión

Espero puedan ayudarme

Dios l@s bendiga

Saludos,

Daniel
Nicaragua

www.lecturasbiblicas.ni.kz

Preguntas similare

Leer las respuestas

#6 Daniel Bojorge Sequeira
08/01/2005 - 18:48 | Informe spam
Mira el ejemplo que hice yo.


*--
Lo que llevo hecho (aclaro, le hice correcciones en la forma de pasar
parámetros) y me gustaría saber ¿cómo hago para trabajar con recordset, me
gusta utilizar Grid (que no soportan recordset, pero se que en vfpcom está
la utilidad para pasar de uno a otro)


*==INICIO CÓDIGO
*--
*Programa : CapaConex.prg
*Fecha : 12/12/2004
*Elaborado por : Ing. Daniel E. Bojorge Sequeira
*Objetivo : Definición de la Clase CapaConex
*Modo Uso : oCapaConex NewObject([CapaConex].[CapaConex.prg])
*Asrgnacion : oCapaConex.RutaBaseDatos [Ruta Base Datos]
* oCapaConex.BaseDatos [Nombre Base Datos ] (Sin extensión)
* oCapaConex.MetodoAceso [DBF]
*Tipo Datos Manejados : DBF,MDB,SQL
*Ultima Actualización : 13/12/2004
*Bitacora de Agregados :
* - 12/12/2004 Inicio
*--
Define CLASS CapaConex as Custom olepublic
MetodoAcceso [] &&Cualquier asignación quedará atrapada por
AccessMethod_assign
BaseDatos [] &&Nombre de la Base de Datos
RutaBaseDatos [] &&Ruta Exacta Base Datos
nConn 0 &&Manejador de la Conexión
ConectString [] &&Cadena de Conexión a BD
*-Assing del Método de Acceso
Procedure MetodoAcceso_Assign
Parameters pMA
pMA upper(pMA)
Do case
Case pMA [DBF]
This.MetodoAcceso [DBF]
Case pMA [MDB]
This.MetodoAcceso [MDB]
Case pMA [SQL]
This.MetodoAcceso [SQL]
Otherwise
Messagebox([Método de Acceso Incorrecto ]+ pMA, 16 , [Error Servidor])
This.MetodoAcceso []
Endcase
If !Empty(This.MetodoAcceso)
This.GetConex
Endif
Endpro

*-Assing del Ruta de Base Datos
Procedure RutaBaseDatos_Assign
Parameter pRBD
pRBD IIF(varType(pRBD) "C",UPPER(Allt(pRBD)),"")
If !Empty(pRBD)
If Right(pRBD,1) # "\"
pRBD pRBD + "\"
Endif
Endif
If !Directory(pRBD)
Messagebox([Ruta Base de Datos Incorrecta], 16 , [Error Capa Datos])
Endif
This.RutaBaseDatos pRBD
Endpro

*-Abre la conexión o la Base de Datos dependiendo del Método de Acceso
Procedure GetConex
If This.MetodoAcceso [DBF]
Messagebox(This.RutaBaseDatos + This.BaseDatos)
If !Empty(This.BaseDatos)
If File(This.RutaBaseDatos + This.BaseDatos + [.DBC])
Open Data (This.RutaBaseDatos + This.BaseDatos)
Else
Messagebox([Base de Datos No Existe], 16 , [Error Base De Datos])
Endif
Endif
This.nConn 1
Return
Endif
Do case
Case This.MetodoAcceso [SQL]
This.ConectString [DRIVER{SQL Server};Server(local);DataBase] +
This.BaseDatos + [;UID;PWD;]
Case This.MetodoAcceso [MDB]
*This.ConectString [DRIVER{Microsoft Access};Server(local);DataBase] +
This.RutaBaseDatos + This.BaseDatos + [.MDB] + [;UID;PWD;]
This.ConectString [ProviderMicrosoft.Jet.OLEDB.4.0;Data Source ] +
This.RutaBaseDatos + This.BaseDatos + [.MDB] + [;Persist Security
InfoTrue;Jet OLEDB:Database Passworddlms]
Otherwise
Messagebox([Se ha intentado hacer una conexión con un Método de Acceso
Incorrecto],16, [])
Return
Endcase
Messagebox(This.ConectString)
If This.nConn > 1
Return
Endif
This.nConn SQLStringConnect(This.ConectString)
If This.nConn < 1
Messagebox([No se pudo conectar a la BD ]+This.BaseDatos + [Con el
Método de Acceso ] + This.MetodoAcceso)
Return
Endif
Endpro
Procedure Conectar
This.RutaBaseDatos "C:\VSINVEN\DATA"
This.BaseDatos "DEBSINV"
This.MetodoAcceso "DBF"
Endproc
Enddef

Luego tenemos la Capa de Datos.prg

*--
*Programa : CapaDatos.prg
*Fecha : 25/12/2004
*Elaborado por : Ing. Daniel E. Bojorge Sequeira
*Objetivo : Definición de la Clase CapaDatos
*Modo Uso : oCapaDatos NewObject([CapaDatos].[CapaDatos.prg])
*Comentarios : Retorna -1 si no ha logrado hacer conexió con la capa de
Conexión
*Ultima Actualización : 25/12/2004
*Bitacora de Agregados :
* - 25/12/2004 Inicio
* - 26/12/2004 Validación y Corrección de GenerCursor
* Creación de método EjecutaSQL
*--
Define CLASS CapaDatos as Custom olepublic

Protected Procedure ValidaConex
Note: Valida si se realizó bien la conexión, de no haberla la crea con
los valores
*predeterminados
If VarType(oCapaConex) # 'O'
MessageBox([No hay ninguna conexión a la BD establecida] + chr(13) + ;
[¿Desea Crear la Conexión con los Datos Predeterminados?] + chr(13) + ;
[ (MétodoAcceso DBF) ], 32 + 4 , [Error Acceso Base Datos (Capa
Datos)]) 6
Public oCapaConex
If !("CAPACONEX.PRG" $ UPPER(SET("PROCEDURE")))
Set procedure to [.\Lib\Capas\CapaConex.prg] additive
Endif
oCapaConex CreateObject([CapaConex])
oCapaConex.Conectar()
Endif
Return oCapaConex.nConn
Endpro

Procedure GeneraCursor
*Genera un Cursor a partir de los parámetros enviados.
*Recibe, Instruccion SQL y el Nombre Cursor a Devolver
Parameters pSQL,pCursor
Local vlSQL,vlEjec
If VarType(pSQL) # 'C' or VarType(pCursor) # 'C'
Messagebox([Parámetros Incorrectos en Función Genera Cursor], 16 ,
[Error Genera Cursor (Capa Datos)])
Return -1
Endif
pSQL AllTrim(UPPER(pSQL))
pCursor AllTrim(UPPER(pCursor))
If This.ValidaConex() < 0
Messagebox ([No se puede generar Cursor] , 16 , [Error Capa Acceso])
Return -1
Endif
pCursor iif ( Empty(pCursor),[Consulta],pCursor)
Do Case
Case oCapaConex.MetodoAcceso [DBF]
vlSQL pSQL + [ into cursor ] + pCursor
&vlSQL
Case oCapaConex.MetodoAcceso [MDB] or oCapaConex.MetodoAcceso [SQL]
vlEjec SQLExec(oCapaConex.nConn,pSQL,pCursor)
Otherwise
Messagebox([No se puede generar Cursor], 16 , [Error Capa Datos])
Return -1
Endcase
Endproc
Procedure EjecutaSQL
*Ejecuta cualquier instrucción SQL, propia para INSERT, UPDATE o DELETE
Parameters pSQL
Local vlSQL,vlEjec
If VarType(pSQL) # 'C'
Messagebox([Parámetros Incorrectos], 16 , [Error Ejecuta SQL (Capa
Datos)])
Return -1
Endif
pSQL AllTrim(UPPER(pSQL))
If This.ValidaConex() < 0
Messagebox ([No se puede Ejecutar SQL] , 16 , [Error Capa Acceso])
Return -1
Endif

Do Case
Case oCapaConex.MetodoAcceso [DBF]
&pSQL
Case oCapaConex.MetodoAcceso [MDB] or oCapaConex.MetodoAcceso [SQL]
vlEjec SQLExec(oCapaConex.nConn,pSQL,pCursor)
Otherwise
Messagebox([No se puede generar Cursor], 16 , [Error Capa Datos])
Return -1
Endcase
Return 1
Endpro
Enddef

y Para finalizar la CapaNegocios.prg, como dije al principio es un
adelanto de lo que he hecho, no he terminado y sé que tiene problemas de
diseño, me gustaría saber si pueden ayudarme con esto, y si los errores no
son tan grandes, pues es mi aporte al grupo

*
*Programa : CapaNegocio.prg
*Fecha : 26/12/2004
*Elaborado por : Ing. Daniel E. Bojorge Sequeira
*Objetivo : Definición de la Clase CapaNegocio
*Modo Uso : oCapaNeg NewObject([CapaNegocio].[CapaNegocio.prg])
*Ultima Actualización : 26/12/2004
*Bitacora de Agregados :
* - 25/12/2004 Inicio
* - 26/12/2004 Validación y Corrección de GenerCursor
* Creación de método EjecutaSQL
* - 27/12/2004 Sección de Impuesto
* Definición de Clases: Inventario
*-
Define CLASS CapaNegocio as Custom olepublic
Codigo []
Descripcion []
Impuesto 15
Procedure Init
If !([CAPADATOS.PRG] $ UPPER(SET([PROCEDURE])))
Set procedure to [.\Lib\Capas\CapaDatos.prg] additive
Endif
Public oCapaDatos
oCapaDatos CreateObject([CapaDatos])
Endproc
Procedure Obtener
*--Ejecuta el método GeneraCursor de la Clase CapaDatos, pide:
* NombreTabla,CampoBusqueda y Código.
* Devuelve cursor curObtener
Parameters pNombreTabla,pCampoBusqueda,pID
Local vlSQL
*-Validar Parametros recibidos
If VarType(pNombreTabla) # 'C' or Empty(pNombreTabla)
Messagebox([Nombre Tabla No especificado],16,[Error Obtener (Capa
Negocios)])
Return -1
Endif
If VarType(pCampoBusqueda) # 'C' or Empty(pCampoBusqueda)
Messagebox([Nombre Campo Búsqueda No especificado],16,[Error Obtener
(Capa Negocios)])
Return -1
Endif
If VarType(pID) # 'C' or Empty(pID)
Messagebox([Nombre ID No especificado],16,[Error Obtener (Capa
Negocios)])
Return -1
Endif
pNombreTabla Allt(Upper(pNombreTabla))
pCampoBusqueda Allt(Upper(pCampoBusqueda))
pID (Allt(Upper(pID)))
vlSQL [SELECT * FROM ] + pNombreTabla + [ where ] + pCampoBusqueda + [
'] + pID + [']
Messagebox(vlSQL)
oCapaDatos.GeneraCursor(vlSQL,"curObtener")
Endproc
Procedure Grabar
*--Ejecuta el método EjecutaSQL de la Clase CapaDatos, pide:
* NombreTabla,Parametro
* Devuelve cursor 1
Parameters pNombreTabla,pCondicion
Local vlSQL
*-Validar Parametros recibidos
If VarType(pNombreTabla) # 'C' or Empty(pNombreTabla)
Messagebox([Nombre Tabla No especificado],16,[Error Obtener (Capa
Negocios)])
Return -1
Endif
If VarType(pCondicion) # 'C' or Empty(pCondicion)
Messagebox([Condición No especificado],16,[Error Obtener (Capa
Negocios)])
Return -1
Endif

pNombreTabla Allt(Upper(pNombreTabla))
pCondicion Allt(Upper(pCondicion))
vlSQL [INSERT INTO ] + pNombreTabla + pCondicion
Messagebox(vlSQL)
Return oCapaDatos.EjecutaSQL(vlSQL)
Endproc

Procedure Borrar
*--Ejecuta el método Ejecuta SQL de la Clase CapaDatos para eliminar un
Elemento, pide:
* NombreTabla,CampoBusqueda y Código.
Parameters pNombreTabla,pCampoBusqueda,pID
Local vlSQL
*-Validar Parametros recibidos
If VarType(pNombreTabla) # 'C' or Empty(pNombreTabla)
Messagebox([Nombre Tabla No especificado],16,[Error Obtener (Capa
Negocios)])
Return -1
Endif
If VarType(pCampoBusqueda) # 'C' or Empty(pCampoBusqueda)
Messagebox([Nombre Campo Búsqueda No especificado],16,[Error Obtener
(Capa Negocios)])
Return -1
Endif
If VarType(pID) # 'C' or Empty(pID)
Messagebox([Nombre ID No especificado],16,[Error Obtener (Capa
Negocios)])
Return -1
Endif
pNombreTabla Allt(Upper(pNombreTabla))
pCampoBusqueda Allt(Upper(pCampoBusqueda))
pID (Allt(Upper(pID)))
vlSQL [DELETE FROM ] + pNombreTabla + [ where ] + pCampoBusqueda + [ ']
+ pID + [']
oCapaDatos.EjecuteSQL(vlSQL,"curObtener")
Endproc
****Sección de Impuesto
Procedure SetImpuesto
*--Fija el Porcentaje de Impuesto, por defecto es 15%
Parameter pImp
*--Validar Valor
*Comprobar Tipo
If VarType(pImp) <> [N]
Messagebox([Impuesto No es Numérico], 16 , [Error Capa Negocio])
This.Impuesto 15
Return -1
Endif
If !BetWeen(pImp,0,100)
Messagebox([Inválido Intervalo de Impuesto], 16 , [Error Capa Negocio])
This.Impuesto 15
Return -1
Endif
This.Impuesto pImp
Return 1
Endpro
Procedure GetImpuesto
*-Devuelve el valor almacenado de Impuesto
Return This.Impuesto
Endpro
Enddef

Define Class Inventario as CapaNegocio OlePublic
cReferencia []
cLinea []
cGrupo []
cNoPrv []
nPrecPrv 0.00
nPrecio 0.00
nPrecioUS 0.00
nCtoUnit 0.00
nCtoUnitUS 0.00
Procedure Get
*--Llamar Inventario
Parameters pID
This.Obtener([CIMae],[cCodigo],pID)
Select curObtener
Go top
If !EoF()
With This
.Codigo cCodigo
.Descripcion cDescrip
.cReferencia cRef
.cLinea cLinea
.cGrupo cGrupo
.cNoPrv cNoPrv
.nPrecPrv nPrecPrv
.nPrecio nPrecio
.nPrecioUS nPrecioUS
.nCtoUnit nCtoUnit
.nCtoUnitUS nCtoUnitUS
Endwith
Return 1
Else
Return -1
Endif
Endproc
Procedure Set
*--Agrega un Registro de Inventario
Parameters pCod,pDes,pRef,pLin,pGru,pNPrv,pPrPrv,pPre,pPreUS,pCto,pCtoUS
Local vlCondicion
vlCondicion [
(cCodigo,cDescrip,cRef,cLinea,cGrupo,cNoPrv,nPrecPrv,nPrecio,nPrecioUS,nCtoUnit,nCtoUnitUS)
]
vlCondicion vlCondicion + [ VALUES ('] + pCod + [','] + pDes + [','] +
pref + [','] + pLin + [','] + pGru
vlCondicion vlCondicion + [','] + pNPrv + [',] +
Allt(Transform(pPrPrv,'999,999,999.99')) + [,] +
Allt(Transform(pPre,'999,999,999.99'))
vlCondicion vlCondicion + [,] + Allt(Transform(pPreUS,'999,999,999.99'))
+ [,] + Allt(Transform(pCto,'999,9999,999.99'))
vlcondicion vlcondicion + [,] +
Allt(Transform(pCtoUS,'999,999,999.99')) + [)]
This.Grabar([CIMAE],vlCondicion)
Endpro
Enddef




Con todo lo anterior, se puede probar, haciendo una instancia de la clase
Inventario contenido en la Capa de Negocio de la siguiente manera.

oInv NewObject([Inventario],[CapaNegocio.prg])
*Luego Agregar un código
oInv.Set("100","Descripcion","Ref","01","01","001",23.35,1,1,1,1)
*= FIN CÓDIGO


Como verán, utilicé una forma parecida a la que da Les Pinter, recién
descubrí el MSDE que me ayudará mucho a trabajar y probar con Cliente
Servidor.

Espero sus comentarios al respecto.
*--

Entre las correcciones que ya hice está en agregar a como bien dije ya no
pasa parámetro a parámetro sino dos arreglos.

El ejemplo de ejecución sería

Dentro de la interfaz (capa) hago lo siguinte en el botón guardar

(aclaro que el dato está guardado en un cursor)

oInv NewObject([Inventario],[CapaNegocio.prg])

Select curInv
=Fields(campos)

do while !Eof()
*Luego Agregar un código
scatter to valores
oInv.Set(@campos,@valores)
select curInv
skip
enddo

¿Cómo voy?

Muchas gracias, sé que la experiencia me dará mucha depuración, pero
necesito saber si lo que estoy haciendo empíricamente es lo que se llama
n-capas, ya que puedo desviarme en el concepto o definición de n-capas.



Dios Te Bendiga

Saludos,

Daniel (con 1 Estrella DCE)
Nicaragua
<a href="http://www.lecturasbiblicas.ni.kz"
target="_blank">http://www.lecturasbiblicas.ni.kz</a>


PortalFox :: Nada corre como un zorro
http://www.portalfox.com

PortalFox - NNTP Forum Gateway
#7 Esparta Palma
08/01/2005 - 20:19 | Informe spam
Hola Daniel..

Mostrar la cita
Si puedes, evita el uso de VFPCom, ya que la clase CursorAdapter te
servirá para lo que deseas:

Convertir un RecordSet (ADO) a cursor VFP mediante CursorAdapter
http://www.panoramabox.com/GoPub.as...bj"26

He visto tambien que andas metido con los temas de Cliente-Servidor, asi
que aquí van más...

Crear Aplicaciones Cliente-Servidor con Visual FoxPro
http://www.panoramabox.com/GoPub.as...bj"03

¿Utilizar Vistas Remotas o SQL Pass Through (SPT) para
Cliente-Servidor?
http://www.panoramabox.com/GoPub.as...bj"32

Espero te sirva.

-
Espartaco Palma
SysOp www.PortalFox.com
México





Daniel Bojorge Sequeira wrote:
Mostrar la cita
#8 Daniel Bojorge Sequeira
10/01/2005 - 16:37 | Informe spam
Hola Espartaco Palma.

Dios te bendiga.

Excelentes consejos.

Me gustaría saber si lo que llevo hecho está correcto, me refiero a que si
es n-capas. ayer probé cambiarle el método de acceso de dbf a sql y el
sistema funcionó de maravillas (bueno las pruebas de grabar y extraer a la
BD).

No hice ningún cambio más.

:D

Estas páginas que me pasastes están excelentes y muy instructivas.

Las leeré y muchas gracias por tu ayuda.

Dios Te Bendiga desde Nicaragua

Dios Te Bendiga

Saludos,

Daniel (con 1 Estrella DCE)
Nicaragua
<a href="http://www.lecturasbiblicas.ni.kz"
target="_blank">http://www.lecturasbiblicas.ni.kz</a>


PortalFox :: Nada corre como un zorro
http://www.portalfox.com

PortalFox - NNTP Forum Gateway
#9 José G. Samper
11/01/2005 - 04:49 | Informe spam
Hola como estas, me parece que estas inventando la rueda, por que no usas
CursorAdapter y XMLAdapter, de esta forma solo pasas entre capas XML.

Saludos


________________________
José G. Samper C.
MCAD/MCSD/MCDBA
http://www.FoxyNet.Net


"Daniel Bojorge Sequeira" escribió en el mensaje
news:%
Mostrar la cita
#10 Daniel Bojorge Sequeira
11/01/2005 - 22:46 | Informe spam
Hola José Samper.

Pues estoy trantando de hacer algo.

Les cuento que estoy con VFP6.0 y no con el 8, por otra parte, me han
dicho que es mejor utilizar SQL Pass Trought?

¿Podrías indicar, si se puede, un pequeño ejemplo sobre CursorAdapter y
XMLAdapter?



Dios Te Bendiga

Saludos,

Daniel (con 1 Estrella DCE)
Nicaragua
<a href="http://www.lecturasbiblicas.ni.kz"
target="_blank">http://www.lecturasbiblicas.ni.kz</a>

-
PortalFox :: Nada corre como un zorr
http://www.portalfox.co

PortalFox - NNTP Forum Gatewa
Ads by Google
Search Busqueda sugerida