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

#1 Tomás M.
10/11/2005 - 09:18 | Informe spam
Escribí algo sobre esto no hace mucho, lo puedes ver aquí:

http://www.elguille.info/colabora/N...Capas2.htm

Espero que te sirva.

Tomás M

"rafael" escribió en el mensaje
news:
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




Respuesta Responder a este mensaje
#2 Alfredo Novoa
10/11/2005 - 09:49 | Informe spam
On Wed, 9 Nov 2005 20:58:18 -0500, "rafael"
wrote:

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.



¿Usas un "middleware"?

En caso contrario sería un sistema de dos capas:

SGBD <--> Aplicaciones

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.



Las variables públicas no son muy aconsejables.

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



¡Que complicado!

Esto se puede hacer sin escribir una sola línea de código con los
asistentes de Visual Studio.


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



La lógica de negocio no pertenece a las aplicaciones, debe de
programarse en el SGBD (un middleware también es un SGBD).

Si lo haces así todo te resultará mucho más sencillo.

Hay una confusión muy grande entre capas de sistema y capas de
aplicación. Las aplicaciones son solo una parte de un Sistema de
Información, la que corresponde a la presentación y comunicación con
los usuarios.


Saludos
Alfredo
Respuesta Responder a este mensaje
#3 Miguel Angel Campos
10/11/2005 - 17:25 | Informe spam
Hola Rafael,

el problema que tienes es que creas un objeto conexión dentro de cada
objeto, con lo cual creas una nueva conexión con la base de datos. Las
transacciones se mantienen en las operaciones realizadas sobre el objeto
conexión que creas en el método LógicaPersona, pero al crear otro objeto
conexión dentro de los métodos Grabar los comandos ejecutados dentro de este
método están fuera de la transacción.

Solución: pues tal y como lo tienes montado solo puedes solucionarlo pasado
como parámetro el objeto conexión en el método Grabar, para que sea
utilizado internamte. Puedes detectar si es nothing y crear uno nuevo, en el
caso de que quieras ejecutarlo de forma aislada.
La solución mejor es utilizar COM+, que te permite mantener las
transacciones a lo largo de un determinado ciclo de ejecución. Pero tiene
que determinar si puedes o no utilizarlo.

Un Saludo,

Miguel Angel Campos
MCAD.NET

"rafael" escribió en el mensaje
news:
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




Respuesta Responder a este mensaje
#4 rafael
11/11/2005 - 04:51 | Informe spam
Agradezco las opiniones de todos.
Tomás M.:
Gracias por el articulo.
Alfredo Novoa:
Tu comentario me parecio algo inquientante porque no lo comprendi bien,
porque hasta el momento
siempre he leido sobre capas o componentes de aplicacion , pero no
mencionadas como sistema.
Espero me puedas proporcionar algun link .
Es un buen tema para debatirlo.
Miguel angel Campos
Sobre la opcion de utilizar COM+ (Miguel Angel Campos) espero me puedas
explicar mas o menos
como seria. Tengo nociones de COM+, tendria que registrar el componente
(dll), pero sobre como
manejar las transacciones , requisitos de diseno no se .
ESTOY MUY AGRADECIDO POR LAS RESPUESTA Y SU COLABORACION
Respuesta Responder a este mensaje
#5 Miguel Angel Campos
11/11/2005 - 10:00 | Informe spam
Hola de nuevo,

me he llevado un rato grande buscando un buen artículo sobre VB y COM+, pero
la verdad es que no lo he conseguido, desde hace tiempo todo hace referencia
a VB.NET, así que es dificil encontrat información.

Ademas de buscar en la misma MSDN, de donde te pongo un link a la
documentación de COM+:
http://msdn.microsoft.com/library/d...c9902f.asp

Comentarte un poco por encima los pasos:
- Creas un proyecto DLL ActiveX
- Agregas una referencia a COM+ Services Type Library
- Agregas un módulo de clase, que se corresponderá con tu componente
- Indicas que implementa la interfaz ObjectControl:
Implements ObjectControl
- Puedes implementar los métodos de esta interfaz: ObjectControl_Activate,
ObjectControl_CanBePooled, ObjectControl_Deactivate, etc
- Agregas los método públicos que serán los que expongas, y dentro de estos
método debes utilizar el componente devuelto por el método general
GetObjectContext, que te dará toda la información necesaria para saber si
estas dentro o no de una transacción.
- Debes agregar tu componente a COM+

Te adjunto otro link con una seria de recomendaciones a la hora de programar
componente COM+ en Vb:
http://www.sabbasoft.com/mts_faq_mts.htm

Debes tener en cuenta que la distribuciones de componentes COM+ tiene sus
complicaciones y consideraciones, así que deberías medir bien el alcance de
tu proyecto.

Un Saludo,

Miguel Angel Campos
MCAD.NET

"rafael" escribió en el mensaje
news:
Agradezco las opiniones de todos.
Tomás M.:
Gracias por el articulo.
Alfredo Novoa:
Tu comentario me parecio algo inquientante porque no lo comprendi bien,
porque hasta el momento
siempre he leido sobre capas o componentes de aplicacion , pero no
mencionadas como sistema.
Espero me puedas proporcionar algun link .
Es un buen tema para debatirlo.
Miguel angel Campos
Sobre la opcion de utilizar COM+ (Miguel Angel Campos) espero me puedas
explicar mas o menos
como seria. Tengo nociones de COM+, tendria que registrar el componente
(dll), pero sobre como
manejar las transacciones , requisitos de diseno no se .
ESTOY MUY AGRADECIDO POR LAS RESPUESTA Y SU COLABORACION



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida