DESARROLLO EN 3 CAPAS

10/11/2005 - 02:58 por rafael | Informe spam
Bueno , perdonen la pregunta reiterada pero no encuentro el post anterior.
Explico mi problema, Trabajo con Visual Basic 6.0 SP 6, y SQL Server 2000
Profesional.
Estoy programado con capas, y ya tengo la capa de acceso a datos y la capa
de entidades
Por ejemplo :
Clase entidadPersona
Private Nombre as string
Private Apellido as string
.
.
Propiedades para cada una de las variables publicas
Let Nombre
Get Nombre.
...

Clase EntidadHabilidad
Private Habilidad as string
Propiedades para cada una de las variables publicas
Let Nombre
Get Nombre.
...

clase datosPersonas
Public function Grabar(nuevaPersona as entidadPersona) as boolean
Dim Coneccion As ADODB.Connection
Dim Comando As ADODB.Command
Codigo para grabar datos de persona en la tabla persona
Comando.Execute
Comando.ActiveConnection = Nothing
Coneccion.Close
Set Comando = Nothing
Set Coneccion = Nothing
Grabar = True
end function


Clase DatosHabilidad
Public function Grabar(nuevaHabilidad as entidadHabilidad) as boolean
Dim Coneccion As ADODB.Connection
Dim Comando As ADODB.Command
Codigo para grabar datos de habilidad
Comando.Execute
Comando.ActiveConnection = Nothing
Coneccion.Close
Set Comando = Nothing
Set Coneccion = Nothing
Grabar = True
end function

Bueno hasta ahi no hay problema
Ahora estaba pensando armar la capa de logica de negocios asi
clase LogicaPersona(nuevaPersona as entidadPersona, nuevaHabilidad as
entidadHabilidad)
Dim Coneccion As ADODB.Connection
Dim Comando As ADODB.Command
dim dPersona as datosPersona
dim dHabilidad as datosHabilidad
codigo para establecer la conexion
Coneccion.BeginTrans
if dPErsona.Grabar(nuevaPersona) then
if dHabilidad.Grabar(nuevaHabilidad) then
Coneccion.ComitTrans
else
Coneccion.RollbackTrans
else
Coneccion.RollbackTrans
end if

Bueno lo hice y funciona. Graba tanto los datos de persona y habilidad.
Pero el problema que no aplica la transaccion. es decir se puede grabar
persona y no necesariamente la habilidad
todo como un bloque
Lo he tenido que implementar ambas clases en un solo procedimiento.
No se porque no funcione el begintrans.
Lo unico que se me puede ocurrir es que en cada funcion de las clases de
acceso a datos
uso una conexion propia.
Agradezo de antemano cualquier ayuda

Preguntas similare

Leer las respuestas

#16 rafael
24/11/2005 - 17:17 | Informe spam
Esto es justo lo que no hay que hacer. Los datos los debe de manejar
el SGBD y no el código de aplicación.

>Public function Grabar(Factura as cFactura, Items as colItems)
>'Codigo bla bla bla
>'cFactura es una bussines entity es decir una clase que representa a la
>entidad Factura de la bd.
>'colItems es una coleccion de objetos Items que son los productos que


deben
>insertarse en la factua.

¿Por que insertas los productos en una colección pudiendo hacerlo
directamente en la base de datos?

>dim datFactura as dFactura ' clase que utilizo para menajr las insertar,
>eliminar o actualizar registros en la tabla factura.
>dim datItem as dItem 'clase que utilizo para insertar, eliminar o


actualizar
>registros en la tabla detalle de factura.
>'Codigo para iniciar la transaccion algo como Conexion.Begintrans
>if datFactura.Grabar(Factura)
> For i=1 to Items.cantidad
> datItem.Grabar(Items.item(x))
>next i
>else
>Conexion.Rollback
>end if
>end function

Aquí supongo que los datos que están en el objeto Factura ya han sido
validados usando código de aplicación, y esto es justo lo que no hay
que hacer. En lugar de ir creando el objeto factura deberías de ir
grabando los datos en la base de datos. Las clases Factura e Items
sobran. Es lo que llevo intentando decir todo el rato.


La clase factura y la coleccion items, la implemento por que sino como
haria el procedimiento almacenado
porque la cantidad de items es variable, 1100 por ejemplo.
Create Procedure InsertarFactura
@Numero Factura Char(11),
@Fecha DateTime
AS
'Codigo para insertar la factura

Create procedure InsertarDetalle
@ProductID char(7),
@Cantidad Integer,
@...
'Codigo para insertar (1) item en el detalle

Como le envio la coleccion de items al procedimiento?,
po eso tenia la clase, que se encargara de ejecutar el procedimiento
InsertarDetalle para todos items
de la coleccion Items.
Respuesta Responder a este mensaje
#17 Alfredo Novoa
25/11/2005 - 18:09 | Informe spam
Hola,

On Thu, 24 Nov 2005 11:17:08 -0500, "rafael"
wrote:

La clase factura y la coleccion items, la implemento por que sino como
haria el procedimiento almacenado
porque la cantidad de items es variable, 1100 por ejemplo.
Create Procedure InsertarFactura
@Numero Factura Char(11),
@Fecha DateTime
AS
'Codigo para insertar la factura

Create procedure InsertarDetalle
@ProductID char(7),
@Cantidad Integer,
@...
'Codigo para insertar (1) item en el detalle

Como le envio la coleccion de items al procedimiento?,



Es que ese procedimiento almacenado también sobra. Para insertar
"Items" en la base de datos la aplicación debería enviar sentencias
SQL (inserts) al SGBD.

Un TableAdapter ya hace eso por ti.

po eso tenia la clase, que se encargara de ejecutar el procedimiento
InsertarDetalle para todos items
de la coleccion Items.



Si tienes un TableAdapter conectado a un DataGrid no necesitas no la
colección de Items ni el procedimiento almacenado.

No debes de tratar de ocultar un interfaz declarativo de alto nivel
(SQL) con una capa de procedimientos almacenados.


Saludos
Alfredo
Respuesta Responder a este mensaje
#18 rafael
25/11/2005 - 19:06 | Informe spam
Es que ese procedimiento almacenado también sobra. Para insertar
"Items" en la base de datos la aplicación debería enviar sentencias
SQL (inserts) al SGBD.

Un TableAdapter ya hace eso por ti.

>po eso tenia la clase, que se encargara de ejecutar el procedimiento
>InsertarDetalle para todos items
>de la coleccion Items.

Si tienes un TableAdapter conectado a un DataGrid no necesitas no la
colección de Items ni el procedimiento almacenado.

No debes de tratar de ocultar un interfaz declarativo de alto nivel
(SQL) con una capa de procedimientos almacenados.



Eso esta bien si usas vb.net pero en visual basic 6 no existen los
tableadapter
por eso era mi problema, en .net hay algunas cosas resueltas.
Y es mas todavia leyendo un articulo en el guille, me parece que mi dilema
con las capas es siempre por su interpretacion porque encontre esto:
http://elguille.info/colabora/NET20...NCapas.htm
1.. Capa de Cliente: conocida como capa de Presentación es la que contiene
las interfaces en las que el usuario interactua con el sistema.
2.. Capa de la Lógica de Negocios: el cual contiene la lógica que
interactua con el origen de datos. Esta capa intermedia contiene la parte de
la aplicación que interactua con los datos, por ejemplo: la creación de una
cadena de conexión al origen de datos.
3.. Capa de acceso a Datos: la cual se relaciona directamente con el
origen de datos
Entonces eso significa que la capa de logica de negocios es nada mas y nada
menos lo que yo estoy considerando mi
capa de acceso a datos , mi dll donde estan los procedimientos para grabar ,
eliminar , etc o me equivoco?
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida