Está en la página 1de 35

visual FoxPio 9.

u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 1


Ln esLe dlseno de capas se puede observar claramenLe que no ex|ste una re|ac|n d|recta
entre |a capa |nterfaz y |a capa de datos, para que dlcha relacln exlsLa Llene que LranslLar a
Lraves de una capa de neaoclos v seauldamenLe de una capa conexln, esLa ulLlma se
comunlca medlanLe los S (SLored rocedures) a la daLa.
L[emplos de cdlao que van en dlferenLes capas
La capa lnLerfaz esL basada en clases vlsuales de vl, la de neaoclos en clase no vlsuales de
vl v para esLa capa de Llpo cusLom", la de conexln Lamblen uLlllzar una clase no vlsual vl
de Llpo sesslon" v la de daLa ser un SqlServer que puede ser 2000 o 2003. Cabe resalLar que
cualqulera de las capas puede ser reemplazada por el Llpo que uds. crean convenlenLe.
ara el e[emplo Lenemos un ob[eLo de neaoclo llamado mlob[eLo" el cual Llene los slaulenLes
meLodos: selecclona, lnserLa, edlLa, borra, revlsa v las propledades _allas, campo1, campo2,
campo3. Con lo cual Lendrlamos:

lnLerface
Ln nuesLro formularlo Lenemos un meLodo refrescagr|d(), con un cdlao slmllar:
1hlsform.ardaLa1.recordsource=""
1hlsform.mlob[eLo.seleccclona()
1hlsform.ardaLa1.recordsource=Lhlsform.mlob[eLo._allas

visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 2

neaoclo
LsLe ob[eLo Llene el meLodo se|ecc|ona, cuvo cdlao serla:
Cone.execsp(Ml_SLored_rocedure","? param1,?param2,
?param3", "mlcursor")
1hls._allas="mlcursor"
Conexln
LsLe ob[eLo Llene un meLodo execsp, su cdlao Lendrla que ser:
=sqlexec(ncon,"execuLe sLored procedure+parmeLros","_cursor")
uaLa
LsLa capa consLar de dos parLes (S, 1ablas):
o 5
CreaLe sLored procedure Ml_SLored_rocedure
param1 as lnL
param2 as lnL
param3 as lnL
As
SelecL campo1, campo2, campo3, campo4 from mlLabla where
campox=param1 and campov=param2 and campoz=param3
o 1ab|a
La Labla se llama m|tab|a, con sus campos: campo1, campo2, campo3, campo4,
campox, campov, campoz




visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina S


CREANDU LA CAPA DE DATUS

DI5LC DL 1A8LA5

Crearemos la slaulenLe base de daLos mlbasededaLos". ? las Lablas sern las slaulenLes:
visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 4


LN1CkNC 5CL 5LkVLk 2005

LsLe ser el enLorno de Lraba[o de nuesLra capa de daLos:
DLIINILNDC INDICL IDLN1IDAD
visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina S


Las venLa[as de uLlllzar esLe Llpo de campo como rlmarv kev", Llene muchas venLa[as LanLo
de llbrarnos de pensar, icomo haao ml proarama de correlaLlvos?, v adems avuda al
performance de la base de daLos LanLo al momenLo de arabar como al momenLo de hacer las
relaclones v busquedas va que el lndlce rlmarv kev" Lamblen es un lndlce Llpo clusLer.
Ln el araflco se ve como se ve la creacln de la Labla v la deflnlcln del campo ldenLldad v el
lncremenLo en esLe caso de 1 en 1 v empleza en 1 el correlaLlvo.
Ln lo personal poner un numero pequeno como en esLe caso a los cllenLes, faclllLa el uso para
los usuarlos, es ms prcLlco recordar numeros pequenos que codlflcaclones con
pseudocodlaos o procedlmlenLos comple[os.

Alaunos comandos de uLllldad al mane[ar esLe Llpo de campos:
DBCC CHECKIDENT
(
'table_name'
[ , {
NORESEED | { RESEED [ , new_reseed_value ] }
}
]
)
[ WITH NO_INFOMSGS ]

Ejemplo:
DBCC CHECKIDENT ('cliente', RESEED, 0).
visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 6

Resetear el campo identidad a 0.

INSERT INTO clientes
values
('Juan Perez','mi direccion', '88377666')

SELECT @@IDENTITY
ulcho SelecL" devolver el numero de ldenLldad aslanado.

DLIINILNDC INDICL5 DL 805CULDA

Solo crear esLos lndlces a campos de busqueda mas frecuenLes, no abusar de la deflnlcln de
campos lndlces va que al flnal hace lenLo la arabacln v la busqueda. ara nuesLro e[emplo
solo esLamos creando el lndlce al nombre del cllenLe porque suponemos que ser el campo
por el cual reallzaremos la busqueda slempre v cuando no sabemos el cdlao.
Aqul un e[emplo para hacerlo vla senLencla:

CREATE NONCLUSTERED INDEX [IX_cliente] ON [dbo].[cliente]
([nomcli] ASC)
WITH
(PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF,
ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
ON
visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 7

[PRIMARY]


DEFINIENDO INDICES UNICOS

La uLllldad de esLe lndlce es la de conLrolar dupllcldad de daLos para nuesLro e[emplo ser el
numero de facLura, va que es un daLo que no Lendrla que repeLlrse, va se sabe que un lndlce
de Llpo k va por defecLo es de Llpo unlque".
Aqul el e[emplo vla senLencla:
CREATE UNIQUE NONCLUSTERED INDEX [IX_cabe_factura] ON
[dbo].[cabe_factura]
([nro_fact] ASC)
WITH
(PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB =
OFF,
IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF,
ALLOW_ROW_LOCKS = ON
, ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]


visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 8


DLIINILNDC INDICL UNICC CCMUL51C

Asl como se puede deflnlr lndlce unlco a un solo campo Lamblen se puede hacer de la mlsma
forma con mas campos, en el e[emplo se resLrlnae la dupllcldad de producLos por facLura.
? aqul el e[emplo de hacerlo vlas senLencla.
CREATE UNIQUE NONCLUSTERED INDEX [IX_deta_factura] ON
[dbo].[deta_factura]
([id_fact] ASC,[procod] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB
= OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
CAMC CALCULADC
visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 9


Pav campos que nos avudan mucho, como son los campos calculados, la ldea es no arabar
dlrecLamenLe daLos que son calculados, en el e[emplo el campo LoLal" es un clculo de
CanLldad*preclo" v de la forma que esL deflnldo no ocupa espaclo en dlsco, va que la
propledad perslsLenLe esL como no".
kLLACICNL5
visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 1u



1enlendo va nuesLras Lablas creadas Lenemos que relaclonarlas, ior que relaclonarlas?, hav
muchas venLa[as de relaclonar nuesLras Lablas una de ellas es manLener una lnLearldad
referenclal.
Las relaclones en nuesLra base de daLos es como slaue:
visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 11

CllenLe.codcll" con cabe_facLura.codcll"
cabe_facLura.ld_facL" con deLa_facLura.ld_facL"
producLo.procod" con deLa_facLura.procod"
DLIINILNDC kCCLDIMILN1C5 ALMACLNADC5.
Lo ldeal es Lener Lodas nuesLras lnLeracclones con las Lablas a Lraves de sLored procedures"
Aqul un e[emplo para la lnLeraccln con la Labla cllenLe.

CREATE PROCEDURE MIAPLI_Cliente_Select
as
select codcli,nomcli,dircli,telcli from cliente
GO
GRANT EXECUTE ON MIAPLI_Cliente_SELECT TO [usuarios_execute]
GO

CREATE PROCEDURE MIAPLI_Cliente_Inserta
@codcli int output,
@nomcli varchar(50),
@dircli varchar(80),
@telcli char(10)
AS
insert into cliente (nomcli,dircli,telcli) VALUES
(@nomcli,@dircli,@telcli)
set @codcli=(SELECT @@IDENTITY)
GO
GRANT EXECUTE ON MIAPLI_Cliente_Inserta TO [usuarios_execute]
GO

CREATE PROCEDURE MIAPLI_Cliente_Edita
@codcli int,
@nomcli varchar(50),
@dircli varchar(80),
@telcli char(10)
AS
update cliente set nomcli=@nomcli,dircli=@dircli,telcli=@telcli where
codcli=@codcli
GO
GRANT EXECUTE ON MIAPLI_Cliente_Edita TO [usuarios_execute]
GO

CREATE PROCEDURE MIAPLI_Cliente_Borra
@codcli int
AS
delete from cliente where codcli=@codcli
GO
GRANT EXECUTE ON MIAPLI_Cliente_Borra TO [usuarios_execute]
GO


visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 12

Sl deseamos hacer un dlferenLe selecL o oLra lnLeraccln con nuesLra Labla Lendrla que ser a
Lraves de oLro sLored procedures los procedures de e[emplo son basLanLe baslcos pero
suflclenLes para las lnLeracclones baslcas que se Llene sobre una Labla. A laual modo se Lendrla
que hacer con las demas Lablas (producLo,cabe_facLura,deLa_facLura).
visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 1S

CREANDU LA CAPA CUNEXI0N
La clase conexln Llene la slaulenLe composlcln:

CLA5L 8A5L

visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 14

Ahl noLamos que la clase base esL basado en una clase sesslon" v se ve la creacln del
meLodo lnlL()", que Llene a dems las propledades proLealdas como servldor, usuarlo, pwd,
eLc. ? el meLodo lnlL()" reclbe parmeLros v le aslana a las propledades menclonadas.
CLA5L CCNLkICN

Ls una clase basada en la clase 8ase" en cual cuenLa solo con Lres meLodos, el prlmero el
meLodo conecLa" hace uso de las propledades de la clase base como drlver, usuarlo, pwd,
eLc. La prlnclpal funcln del meLodo es crear la conexln con la base de daLos v reservar dlcho
numero de conexln. Adema noLamos que cuando el usuarlo no es sa" o admlnlsLrador"
e[ecuLa un rol , esLe rol es aquel que Llene accesos a los sLored procedures porque los
usuarlos no Llenen acceso dlrecLamenLe a los sLored procedures", menos a las Lablas, sl no a
Lraves de esLe rol usuarlos_execuLe", que es un rol de apllcacln.
Ll meLodo aeLncon" lo unlco que hace es devolver el numero de conexln a la base de daLos.
? el meLodo desconecLa clerra la conexln a la base de daLos.
CLA5L LkLCU
visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 1S


LsLa clase basada en la clase conexln es la que al fln permlLe hacer la lnLeraccln con la base
de daLos a Lraves de esLe meLodo LxecS" pasan Lodos los sLored procedures" lnvocados de
nuesLra capa de neaoclos. ConLrola el Llpo de sLored procedure" sl devuelve o no un cursor v
adems con el parmeLro"_Llpo", se podrla deLermlnar el Llpo de orlaen de base de daLos, en
lo personal solo he Lenldo dos orlaenes uno el SCLSL8vL8 v 8ase de daLos naLlva de vl. Lo
unlco que dlferencla es la manera de e[ecuLar el sLored procedures" en el SCLSL8vL8 es el
LxLCu1L" v en el vl es el uC"
Cualquler error ocurrldo arabara en la propledad mensa[e" .
CkLANDC LL C8IL1C CCNL
?a Lenlendo nuesLra clase creada la preaunLa de Lodas maneras es: iva como lo uso? , aqul
vlene el e[emplo:
m.SERVIDOR=MISERVIDOR
visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 16

m.USUARIO=JPEREZ
m.PWD=MIPWD
m.Driver=SQL SERVER
m.Db=MIBASEDEDATOS
m.adi=APP=MI SOFTWARE PERSONAL;LANGUAGE=Espaol

SET PROCEDURE TO base.prg,conex.prg,EXECU.PRG
cone=CREATEOBJECT("EXECU",m.SERVIDOR,m.USUARIO,m.PWD,m.Driver,m.Db,m.a
di)
SET DATASESSION TO CONE.DataSessionId
SET DELETED on

visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 17

CREANDU LA CAPA NECUCIUS
ara esLa capa esLov uLlllzando las clases no vlsuales de vl que son los de Llpo CusLom", que
pueden ser reemplazados por el que ms se adecuen por e[emplo Llpo cursoradapLer".
La ldea es Lener alaunos meLodos bslcos de lnLeraccln con nuesLros sLored procedures"
pero a Lraves de nuesLra capa de conexln.
ara el e[emplo crearemos el ob[eLo cllenLe que es laque lnLeracLua con la Laba de cllenLes.

1enemos como propledades los campos de la Labla, v los meLodos (selecL, lnserLa, edlLa, borra,
vallda, eLc.)
Aqul la proaramacln que Lendrla los meLodos
visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 18


Ln el araflco se noLa claramenLe la lnLeraccln del ob[eLo conexln.
La ldea es cuando se lnvoque esLe meLodo es la de devolver el cursor de la base de daLos. Sl no
se le envla como parmeLro el nombre del cursor opLara por poner un nombre Lemporal, en lo
personal la me[or forma. Cualquler lnLeraccln con el cursor devuelLo lo haao a Lraves de la
propledad _allas" va que es la que Lendrla el nombre del cursor aslanado.



visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 19

Con esLe meLodo se hace la lnsercln de daLos, adems noLaremos que la varlable m.codcll"
Llene un adelanLe, es porque la varlable en el sLored procedures" codcll" es de Llpo
ouLpuL", despues de e[ecuLar esLe procedlmlenLo dlcha varlable Lendr el correlaLlvo
aslanado por nuesLro campo ldenLlLv".
Adems anLes de e[ecuLar el sLored prodecures" pasa por un fllLro que es el meLodo vallda,
esLe meLodo como su nombre lo dlce valldara la lnformacln como en el e[emplo vallda que el
nomcll" no esLe vacla.


ue laual manera compleLaremos el meLodo edlLa" v borra" con sus SLored rocedures"
respecLlvos.
visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 2u


CREANDU LA CAPA INTERFAZ
LN1CkNC VI

kLAkANDC CCN1kCLL5 Lk5CNALI2ADA5
La ldea es coplar Lodos los conLroles de vl v ponerlos en una clase propla, en esLe caso a esa
blblloLeca lo nombre como bslco, a esLos conLroles le ponemos nombres mas senclllos, como
por e[emplo a los LexLbox" solo lo llamo LxL", a los label","lbl", eLc. Adems de
personallzalo a nuesLro ausLo en cuanLo a aspecLo. ara coplar dlchos conLroles es sumamenLe
senclllo, lo que hacemos es crea una nueva blblloLeca de clases v nombrar los conLroles va
exlsLenLes por uno proplo. Ln el araflco se ve la creacln de nuesLro conLrol personallzado lbl"
basado en label" v almacenado en la blblloLeca de clases baslco"
visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 21






visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 22

v sl es poslble que pueda Lener clerLa lnLeraccln como por e[emplo:
Al conLrol LexLbox" vamos a camblarlo de color cuando esLa selecclonado

Ll cdlao para Lener esLe efecLo es el slaulenLe: La proaramacln esL en el losLfocus" v el
aoLfocus"

LsLa dems declr que de ahora en adelanLe solo usaremos nuesLros conLroles para Lodo Llpo
de lnLerfaz, desde un form, LexLbox, arld, labels, eLc.
IACILIDADL5 AkA LL U5C DL CCN1kCLL5 Lk5CNALI2ADC5
visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 2S

Pav una herramlenLa que Lrae vl que se llama Loolbox" el cual faclllLa el mane[o de nuesLros
conLroles creados.
Aqul un e[emplo de su creacln, anexar nuesLros conLroles personallzados a dlcho Loolbox" v
a flnal la creacln de un formularlo basado en nuesLra clase form" personallzada.

Cllc
Aqul
visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 24



Cllc derecho v add class Llbrarv"
visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 2S


CkLANDC CLA5L MAN1LNIMILN1C DL 1A8LA5
Crearemos una clase base basada en Cmd" de nuesLra clase 8ase" con funclones comunes,
como aareaar, edlLa, ellmlnar, sallr. ? oLra de AcepLar v Cancelar
visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 26


Creamos los meLodos (anade, edlLa, borra, eLc.) en la clase padre en esLe caso el conLalner",
? a los boLones aslanamos esos el cdlao para lnvocarlos.
? la clase Ck_Cancel" de la slaulenLe forma:
visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 27


CkLACICN CLA5L DL ICkMULAkIC DL M11C.


visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 28

CkLACICN DL LA IN1LkIA2 AkA LL C8IL1C CLILN1L
Lmpezamos con el cdlao:
CREATE FORM cliente as frmdata2 FROM tools.

Lo nico que tenemos que hacer en nuestro formulario es enlazar
nuestros objetos interfaz con nuestro objeto negocio, en este caso
enlazarlos por medio del controlsource del Textbox, en cada uno de
estros controles enlazar con la propiedades del objeto negocio, en el
ejemplo es el (txt1 con cliente.codcli), etc.
Uan vez hecho eso ya podremos probar nuestro formulario, sin
olvidarnos que deben ser ejecutados desde nuestro programa principal,
ya que ese programa hace la conexin a la base de datos ademas que
carga nuestra configuracin de usuario.
visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina 29


Para el ejemplo de formulario se puso por defecto que se va a agregar
un cliente por eso que aparecen desactivados los botones de nuestra
barra de mantenimiento y aparece activada el grabar o cancelar,
Al hacer cualquiera de estas dos acciones activaran los botones de la
barra de mantenimiento y desactivaran el grabar y cancelar.

La edicin tiene un efecto similar al agregar pero el codcli ya esta
con dato el cual no puede ser editado por ser el Primary Key.
visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina Su


Al momento de eliminar la clase ya tiene esta preguntada asignada. As
que va a salir en todas nuestra pantallas de la misma manera.


Nuestra bsqueda tambin esta integrada en la clase y toma el nombre
de todas las columnas del grid.
visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina S1


Estas pantallas tambin son Resizables para la comodidad del
usuario.
visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina S2


Adems que soportan ser cargadas mas de una vez y sin problema alguno
ya que utilizan cursores con nombres aleatorios.
visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina SS


Para hacer la siguiente pantalla se nos hace muy sencillo, la tabla
cliente guardamos con el nombre de producto, cambiamos nuestro objeto
negocio de cliente por producto.
visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina S4


Y en nuestros mtodos reemplazamos para nuestro caso la palabra
cliente por producto y asignamos nuestro controlsource de los objetos
interfaz a nuestro nuevo objeto negocio.

visual FoxPio 9.u y SqlSeivei 2uuS

Niguel Antnez Camones Pgina SS


Y ya podemos probar nuestra nueva pantalla con la misma funcionalidad
de la primera

También podría gustarte