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
 

Leer las respuestas

#1 dbojorges
06/01/2005 - 17:18 | Informe spam
José G. Samper wrote:

Hola como estas, revisa

Programando tres capas en Visual Foxpro
http://www.mug.org.ar/FoxProGufa/ArticFox/210.aspx
By Les Pinter


Saludos





Hola José G. Samper, es un honor para mi que me contestes, leí tu
publicación sobre n-capas y VFP está excelente, este, el de Les Pinter
también está muy bueno, pero tengo varios problemas en cualquiera de los
dos.

Uds. sólo hacen lectura de Datos, no escritura y pues ahí es donde me
pierto ya que no sé que es permitido y que no. Por ejemplo, me decía que
los messagebox (usando dll) no son soportados, por otro lado, me
recomendaban que la aplicación fuera de 4 capas y no de 3.

También que trabajara con recordset en lugar de cursores, por ejemplo, yo
tengo algo que hice, pero me dijeron que iba más o menos bien, pero con
ciertos, detalles.

como el paso de parámetros con vfp, lo resolví pasando un arreglo que
contiene, uno la estructura de la tabla (generado con fields() y otro
conteniendo los datos (generado con scatter to)), me gustaría de su sabia
opinión al respecto.

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.

Muchas Gracias y a como dije al principio es un honor que ud. conteste a
unpost mío.

Dios Te Bendiga
Saludos,

-
Daniel (con 1 estrella DCE)
Nicaragua

www.lecturasbiblicas.ni.kz

Preguntas similares