PRIVATE idProducto AS Integer
'Identificador de la seccion a la que pertenece el producto
PRIVATE seccion AS Integer
PRIVATE nombre AS String
PRIVATE precio AS Float
'Estas variables tienen que ver con la conexion a la BD
PRIVATE mRs AS Result
PRIVATE mBase AS Connection
PUBLIC SUB _new(ip AS Integer, is as Integer,nom as String, p as Float)
idProducto=ip
seccion=is
nombre=nom
p=precio
END
PUBLIC SUB getIdProducto() AS Integer
RETURN idProducto
END
PUBLIC SUB getSeccion() AS Integer
RETURN seccion
END
PUBLIC SUB getNombre() AS String
RETURN nombre
END
PUBLIC SUB getIdProducto() AS Float
RETURN precio
END
PUBLIC SUB Abrir(Bd AS Connection)
mBase = Bd
mRs = mBase.Exec("Select * FROM Producto")
END SUB
PUBLIC SUB BuscarPorId()
mRs = mBase.Exec("Select * FROM Producto where idProducto=&1", idProducto)
Leer()
END SUB
PUBLIC SUB buscarPorNombre()
mRs = mBase.Exec("Select * FROM Producto where nombre=&1", nombre)
Leer()
END
PUBLIC SUB grabar()
TRY mBase.Exec("Insert into Producto(seccion,nombre,precio) values(&1,&2,&3)", seccion, nombre, precio)
IF ERROR THEN
Message.Error(Error.Text)
ELSE
Message.Info("Operacion de insercion exitosa")
END IF
END SUB
PRIVATE SUB Leer()
IF mRs.Available THEN
idProducto = mRs["idProducto"]
seccion = mRs["seccion"]
nombre = mRs["nombre"]
precio = mRs["precio"]
END IF
END SUB
PUBLIC FUNCTION getProductos() AS Result
RETURN mBase.Exec("Select * FROM Producto order by nombre")
END FUNCTION
PUBLIC FUNCTION buscarPorSeccion() AS Result
RETURN mBase.Exec("Select * FROM Producto where seccion=&1", seccion)
END FUNCTION
Lo que quisiera saber es si es correcto trabajar el tema de la base de datos en la misma clase, osea búsqueda, inserción, modificación y eliminación de datos, o si es necesario trabajarla en otra clase relacionada unicamente con la conexión y en esta dejamos solo las propiedades y los metodos propios de la misma, ahora yo he creido conveniente crear una variable mBase de tipo Connection para abrir la conexion a la BD, cuyos parametros los especifico a la hora de crear el objeto en la interfaz grafica, tambien tengo una variable llamada mRs de tipo Result para manejar los valores obtenidos de la BD. El tema es que he manejo los parametros de Conexion a la base de datos en un modulo llamado Conexion que es de la siguiente forma:
PUBLIC miConex AS Connection
PUBLIC FUNCTION ConectarBase() AS Boolean
miConex = NEW Connection
TRY miConex.Close
miConex.Type = "mysql" 'Tipo de la base de datos
miConex.Host = Variables.CFG_BD_HOST
miConex.Login = Variables.CFG_BD_USUARIO
miConex.Password = Variables.CFG_BD_PASS
IF Variables.CFG_BD_NEW THEN
miConex.Open()
IF NOT miConex.Databases.Exist(Variables.CFG_BD_NAME) THEN
miConex.Databases.Add(Variables.CFG_BD_NAME)
miConex.Name = Variables.CFG_BD_NAME
ENDIF
miConex.Close()
END IF
miConex.Name = Variables.CFG_BD_NAME
miConex.Open()
RETURN TRUE
CATCH
Message.Error(Error.Text)
RETURN FALSE
END
PUBLIC SUB CerrarConexion()
IF miConex = NULL THEN RETURN 'Si no hay conexion se sale inmediatamente de la funcion
miConex.Close() 'Cerrar la conexion
miConex = NULL 'Hacer nulo el objeto de conexion
END
PUBLIC SUB RellenaCombo(lRs AS Result, lCampo AS String, Objeto AS ComboBox)
DIM i AS Integer
DIM Total AS Integer
Objeto.Clear()
IF lRs.Available THEN
lRs.MoveFirst
Total = lRs.Count
FOR i = 0 TO Total - 1
Objeto.Add(CStr(lRs[lCampo]))
lRs.MoveNext
NEXT
END IF
lRs = NULL
IF Objeto.Count > 0 THEN Objeto.Index = 0
END SUB
PUBLIC SUB RellenarGridView(dbLista AS GridView, lRs AS result, lTotalColumna AS Integer, lAnchoA AS Variant, lTituloA AS Variant, lCampos AS Variant)
DIM i, j AS Integer
DIM fil AS Integer
DIM col AS Integer
dbLista.rows.count = 0
IF NOT IsNull(lRs) THEN
IF lRs.Available AND lRs.Count <> 0 THEN
dbLista.columns.count = lTotalColumna
dbLista.rows.count = lRs.count
FOR i = 0 TO lTotalColumna - 1
dbLista.Columns[i].Width = lAnchoA[i]
dbLista.Columns[i].Text = lTituloA[i]
NEXT
DO WHILE lRs.Available
FOR col = 0 TO lTotalColumna - 1
dbLista[fil, col].Text = lRs[lCampos[col]]
NEXT
fil = fil + 1
lRs.MoveNext()
LOOP
END IF
END IF
END SUB
PUBLIC SUB RellenaListBox(lRs AS Result, lCampo AS String, Objeto AS ListBox)
Objeto.Clear
FOR EACH lRs
Objeto.Add(Trim(lRs[lCampo]))
NEXT
IF Objeto.Count > 0 THEN
Objeto[0].Selected = TRUE
END IF
END SUB
PUBLIC FUNCTION ConectarBase() AS Boolean
miConex = NEW Connection
TRY miConex.Close
miConex.Type = "mysql" 'Tipo de la base de datos
miConex.Host = Variables.CFG_BD_HOST
miConex.Login = Variables.CFG_BD_USUARIO
miConex.Password = Variables.CFG_BD_PASS
IF Variables.CFG_BD_NEW THEN
miConex.Open()
IF NOT miConex.Databases.Exist(Variables.CFG_BD_NAME) THEN
miConex.Databases.Add(Variables.CFG_BD_NAME)
miConex.Name = Variables.CFG_BD_NAME
ENDIF
miConex.Close()
END IF
miConex.Name = Variables.CFG_BD_NAME
miConex.Open()
RETURN TRUE
CATCH
Message.Error(Error.Text)
RETURN FALSE
END
PUBLIC SUB CerrarConexion()
IF miConex = NULL THEN RETURN 'Si no hay conexion se sale inmediatamente de la funcion
miConex.Close() 'Cerrar la conexion
miConex = NULL 'Hacer nulo el objeto de conexion
END
PUBLIC SUB RellenaCombo(lRs AS Result, lCampo AS String, Objeto AS ComboBox)
DIM i AS Integer
DIM Total AS Integer
Objeto.Clear()
IF lRs.Available THEN
lRs.MoveFirst
Total = lRs.Count
FOR i = 0 TO Total - 1
Objeto.Add(CStr(lRs[lCampo]))
lRs.MoveNext
NEXT
END IF
lRs = NULL
IF Objeto.Count > 0 THEN Objeto.Index = 0
END SUB
PUBLIC SUB RellenarGridView(dbLista AS GridView, lRs AS result, lTotalColumna AS Integer, lAnchoA AS Variant, lTituloA AS Variant, lCampos AS Variant)
DIM i, j AS Integer
DIM fil AS Integer
DIM col AS Integer
dbLista.rows.count = 0
IF NOT IsNull(lRs) THEN
IF lRs.Available AND lRs.Count <> 0 THEN
dbLista.columns.count = lTotalColumna
dbLista.rows.count = lRs.count
FOR i = 0 TO lTotalColumna - 1
dbLista.Columns[i].Width = lAnchoA[i]
dbLista.Columns[i].Text = lTituloA[i]
NEXT
DO WHILE lRs.Available
FOR col = 0 TO lTotalColumna - 1
dbLista[fil, col].Text = lRs[lCampos[col]]
NEXT
fil = fil + 1
lRs.MoveNext()
LOOP
END IF
END IF
END SUB
PUBLIC SUB RellenaListBox(lRs AS Result, lCampo AS String, Objeto AS ListBox)
Objeto.Clear
FOR EACH lRs
Objeto.Add(Trim(lRs[lCampo]))
NEXT
IF Objeto.Count > 0 THEN
Objeto[0].Selected = TRUE
END IF
END SUB
En la interfaz gráfica luego de crear el objeto de tipo CProducto, uso la variable producto y manejo la conexion de la siguiente forma:
producto.Abrir(Conexion.miConex)
Mi duda como ya lo dije anteriormente es por el tema de manejar correctamente la POO y la persistencia de datos, quisiera que me den mas luces sobre esto.
Saludos y gracias de antemano.