Ayuda, Crear Clase Manipule Una Tabla En Mysql


Objetivo: Ayuda, Crear Clase Manipule Una Tabla En Mysql
HOla, necesito que alguien me ayude con lo siguiente.
Supongamos que tenemos una Base de Datos llamada Escuela y una Tabla llamada estudiante, esa tabla tiene los siguientes campos ID as integer(autonúmerico), Nombre as string y Apellidos as String.
Necesito crear una clase con los mismos atributos que la tablas y con los metodos de addicionar, eliminar, modificar.
La idea es que cdo llame a un formulario para agregar, eliminar o modificar un estudiante, en ese momento cree una instancia de la clase estudiante y sea a traves de sus metodos que pueda realizar las transacciones con las tablas(esto es programación por capas).
Estoy tratando de hacerlo pero al final siepre me sale NUll objeto

Perfil MP  
Objetivo: Re: Ayuda, Crear Clase Manipule Una Tabla En Mysql
Buenas!

Si nos pasas el código sería más fácil poder ayudarte, pero a manera general, cuando obtienes una respuesta del tipo "NULL OBJECT" es porque cuando instancias una clase te olvidas de poner el "NEW".

dim estudiante1 as NEW estudiante
(por ejemplo)

O bien puede ser que ejecutes una consulta y luego cierres la conexión a la base de datos y entonces el objeto result queda null (no se si esto les ha pasado a todos, pero a mí por lo menos sí).

Comparte por aquí el código en cuestión y será más fácil ayudarte.

Saludos!

Perfil MP  
Objetivo: Re: Ayuda, Crear Clase Manipule Una Tabla En Mysql
Bueno, realmente seria mejor escribiendo el código.
Tengo un Módulo que se llama MGlobal, para la parte de la conexión

PUBLIC db AS NEW Connection
PUBLIC rs AS Result
PUBLIC rs1 AS Result
PUBLIC btnok AS String
PUBLIC btnno AS String
''''''''''''''''''''''''''''''''''
''sub to connect to mysql server''
''''''''''''''''''''''''''''''''''
PUBLIC FUNCTION conn(host AS String, lgn AS String, pass AS String) AS Boolean
db.close
db.Type = "mysql"
db.Host = host
db.Login = lgn
db.Password = pass
db.Name = "utiles"
db.Open
RETURN TRUE
CATCH
Message.error(Error.text)
RETURN FALSE
END


UN form que se llama FConn con tres TextBox(una para poner el Servidor, el otro el usuario y el otro el password), con bóton Aceptar y Cancelar.

PUBLIC SUB Form_Open()
ME.center
END
PUBLIC SUB gbtn_Click()
SELECT CASE LAST.tag
CASE 1 'Boton connect
WITH Mglobal
.btnok = "&Yes"
.btnno = "&No"
'chequea si el login es correcto
IF .conn(textbox1.text, textbox2.text, textbox3.text) = TRUE THEN
'use the database
.db.Close
.db.Open
END IF
ME.close
Fmain.show
END WITH

CASE 2 'Boton cancel
ME.close
END SELECT

CATCH
Message.Error(Error.Text)
END


Ahora vamos a ver si esta bien la clase Estudiante, que debe tener lo mismo atributo que la tabla estudiante(Id tipo autonumerico, Nombre de tipo texto y apellidos tipo texto)
La clase estudiante.

PRIVATE _Id AS Integer
PRIVATE _Nombre AS String
PRIVATE _Apellidos AS String
PRIVATE ObjValido AS Reglas
PRIVATE Obj AS TEstudiante
PRIVATE Col AS NEW Collection
PRIVATE _Conexion AS Connection
PRIVATE _Criterio AS String
PRIVATE Cmd AS Result
PRIVATE oEstudiante AS TEstudiante
'-----------------------------------
PROPERTY id AS Integer
PROPERTY Nombre AS String
PROPERTY Apellidos AS String
PROPERTY Conexion AS Connection
PROPERTY Criterio AS String
'------------------------------------
'------------------------------------
'Metodos de lectura y escrituras
'-------------------------------------
'para id
FUNCTION id_read() AS Integer

RETURN id
END

SUB id_write(Valor AS Integer)

id = Valor
END
'------------------------------------
'para Nombre
FUNCTION Nombre_read() AS String

RETURN _Nombre
END

SUB Nombre_write(Valor AS String)

_Nombre = Valor
END
'----------------------------------------
'para Apellidos
FUNCTION Apellidos_read() AS String

RETURN _Apellidos
END

SUB Apellidos_write(Valor AS String)

_Apellidos = Valor
END
'--------------------------------------------
'Metodos de escritura y lectura
'--------------------------------------------
FUNCTION Conexion_read() AS Connection

RETURN _Conexion
END

SUB Conexion_write(Dato AS Connection)

_Conexion = Dato
END

FUNCTION Criterio_read() AS String

RETURN _Criterio
END

SUB Criterio_write(Dato AS String)

_Criterio = Dato
END
'--------------------------------------------------------
'Métodos Agregar, Eliminar, Seleccionar y Contar Elementos
' Add: agrega un nuevo objeto a la colección
' Remove: borra un objeto de la colección
' Item: Para acceder a un objeto de la colección
' Count: para saber cuantos objetos hay en la colección
'--------------------------------------------------------
PUBLIC SUB Add(Obj AS TEstudiante, id AS Integer)

Col.Add(Obj, id)
END

PUBLIC SUB Remove(ID AS Integer)

Col.Remove(ID)
END

PUBLIC FUNCTION CountCol() AS Integer

RETURN Col.Count
END

PUBLIC FUNCTION Item(Index AS Integer) AS TEstudiante

RETURN Col[index]
END
'-------------------------------------------------------------------------------
'Métodos que brindan la persistencia de los datos, a través de la base de datos
' Cargar: lee uno o mas clientes desde la base de datos
' CargarUno: lee un cliente desde la base de datos
' AgregarUno: Incorpora un nuevo cliente a la base de datos
' BorrarUno: Borra un cliente de la base de datos
' GuardarUno: Graba un cliente que ha sido editado
' ProximoNCuenta: Nos ofrece el proximo número de cuenta disponible.
'---------------------------------------------------
'Guardar
'----------------------------------------------------
PRIVATE SUB Guarda()
Cmd!id = oEstudiante.id
Cmd!Nombre = oEstudiante.Nombre
oEstudiante.Change = FALSE
oEstudiante.EnDisco = TRUE
END
'---------------------------------------------------------------
'Cargar
'----------------------------------------------------------------
PRIVATE SUB Carga()
oEstudiante.id = Cmd!id
oEstudiante.Nombre = Cmd!Nombre
IF NOT IsNull(Cmd!id) THEN oEstudiante.id = Cmd!id
IF NOT IsNull(Cmd!Nombre) THEN oEstudiante.Nombre = Cmd!Nombre
IF NOT IsNull(Cmd!Apellidos) THEN oEstudiante.Apellidos = Cmd!Apellidos
oEstudiante.Change = FALSE
oEstudiante.EnDisco = TRUE
END
'---------------------------------------------------------------------
'Los Métodos de accesos a la base de datos
'----------------------------------------------------------------------
PUBLIC SUB Cargar()
DIM D AS Integer
'este es un método que ejecuta
'una sentencia SQL, la que es pasada a la clase por la
'propiedad Criterio
IF _criterio THEN
'verifico que mvarcriterio no este vacía, muy útil en la
'etapa de desarrollo,después puede ser quitada
_conexion.Open
Cmd = _conexion.Exec(_criterio)
FOR d = 0 TO Cmd.Count
oEstudiante = NEW TEstudiante
carga
col.Add(oEstudiante, CStr(oEstudiante.id))
Cmd.MoveNext
NEXT
_conexion.Close
ENDIF
CATCH
'se produjo un error en la lectura
END

PUBLIC SUB CargarUno(id AS Integer)

_conexion.Open
Cmd = _conexion.Exec("Select * from TEstudiante where id = " & CStr(id))
IF Cmd.Count = 1 THEN
'La Unidad de Medida existe ya esta cargada
oEstudiante = NEW TEstudiante
carga
col.Add(oEstudiante, CStr(oEstudiante.id))
ELSE
'La Unidad de Medida no existe
ENDIF
_conexion.Close
END

PUBLIC SUB AgregarUno(Index AS Integer)

'cargo en oEstudiante el Estudiante que quiero dar de alta
'y verifico con el IF que este bien
oEstudiante = col[index]
IF NOT IsNull(oEstudiante) THEN
_conexion.Open
Cmd = _conexion.Create("TEstudiante")
Guarda
Cmd.Update
_conexion.Close
ENDIF
END

PUBLIC SUB BorrarUno(id AS Integer)

oEstudiante = col[CStr(id)]
IF NOT IsNull(oEstudiante) THEN
_conexion.Open
Cmd = _conexion.Exec("Delete from TEstudiante where id = " & oEstudiante.id & ";")
_conexion.Close
END IF
END

PUBLIC SUB GuardarUno(id AS Integer)
DIM cad AS String

oEstudiante = col[CStr(id)]
IF NOT IsNull(oEstudiante) THEN
_conexion.Open
Cmd = _conexion.Edit("TEstudiante", "id=" & CStr(id))
IF Cmd.Available THEN
guarda
Cmd.Update()
ENDIF
_conexion.Close
ENDIF
END

PUBLIC FUNCTION ProximoNEstudiante() AS Integer
DIM NC AS Integer

'este método devuelve el proximo n de UM disponible
_conexion.Open
Cmd = _conexion.Exec("Select max(id) as id from TEstudiante;")
nc = Cmd!id
nc = nc + 1
_conexion.Close
RETURN NC
END


Ahora, lo que quiero es ver si realmente esta bien escrita la clase Estudiante, me estuve fijando para ella por un código que encontre en una página en internet. Te cuento que el problema es que estoy más familiarizado con C# que con Basic.
Y luego entonces si la clase esta bien, como seria agregar por ejemplo un estudiante mediante un formulario.

Perfil MP  
Objetivo: Re: Ayuda, Crear Clase Manipule Una Tabla En Mysql
Pues a simple vista el código luce bien, y parece que has pensado bien los objetos y demás... pero no veo que tengas una duda concreta para que la comunidad pueda resolverte...

Con respecto a lo último, de agregar un estudiante por formulario, pues deberás tener campos de texto que te permitan ingresar los datos del estudiante que necesites guardar y luego algo de código en la base que ejecute la sentencia de inserción de datos. En el libro de gambas que está publicado en el foro hay ejemplo... y si no en el foro mismo hay un montón...

Se más preciso... saludos.

Perfil MP  
Objetivo: Re: Ayuda, Crear Clase Manipule Una Tabla En Mysql
Un comentario sobre el código:
¿por que cierras la conexiones "_conexion.Close", en algunos métodos (cargarUno, cargar, GuardarUno) ?

No seria mejor tener un metodo para cerrar la conexion, ya que vas a estar guardando y cargando datos, y abriendo y cerrando la conexion cada vez que lo haces...


Ademas, hay algo que me choca, veo que usas dentro de la definicion de clase Estudiante, clases como Testudiante, Oestudiante que son objetos. ¿no seria mejor crear una clase "simple" de estudiante y otra clase que opere con las clases estudiante, que sera la que tenga los métodos de añadir, buscar, guardar...???

Saludos

última edición por jsbsan el Viernes, 21 Octobre 2011, 23:00; editado 4 veces
Objetivo: Re: Ayuda, Crear Clase Manipule Una Tabla En Mysql
Ya me funciono.
Tengo una Clase Pero el ejemplo lo voy a poner a partir de una Tabla de Trabajadores que tiene los campos ID autonúmerico, CI tipo string, nombre as string, apellidos as string.
El CI(Númedo del carne de identidad) tiene 11 lugares, en Cuba la conformación de este número nos da los datos del día, mes aÑo de nacimiento y el sexo.
por ejemplo el siguiente número de CI : 65020902569
650209 Nacio el 9 de febreo del 1965
y el penultimo número en este caso 6 si es par(incluye el 0) es de sexo masculino e impar femenino.
Entonces cree una clase padre que se llama CPersona y una hija que se llama TbTrabajador

La clase CPersona
'gambas module file
PRIVATE vid AS Integer
PRIVATE vCI AS String
PRIVATE vNombre AS String
PRIVATE vApellidos AS String
'-------------------------------------
PROPERTY id AS Integer
PROPERTY CI AS String
PROPERTY Nombre AS String
PROPERTY Apellidos AS String
'-------------------------------------
'------------------------------------
'Metodos de lectura y escrituras
'de los atributos de la clase
'-------------------------------------
FUNCTION id_read() AS Integer

RETURN vid
END

SUB id_write(Valor AS Integer)

vid = Valor
END '------------------------------------
'para CI
FUNCTION CI_read() AS String

RETURN vCI
END

SUB CI_write(Valor AS String)

vCI = Valor
END
'----------------------------------------
'------------------------------------
'para Nombre
FUNCTION Nombre_read() AS String

RETURN vNombre
END

SUB Nombre_write(Valor AS String)

vNombre = Valor
END
'----------------------------------------
'para Apellidos
FUNCTION Apellidos_read() AS String

RETURN vApellidos
END

SUB Apellidos_write(Valor AS String)

vApellidos = Valor
END
'--------------------------------------
'Para crear un objeto de esta clase
'---------------------------------------
PUBLIC SUB Nuevo()
id_write(0)
CI_write("")
Nombre_write("")
Apellidos_write("")
END SUB
'-------------------------------------------------
'Devuelvela fecha de nacimiento
'-------------------------------------------------
PUBLIC FUNCTION fNacimiento(mCI AS String) AS String
DIM dia AS String
DIM mes AS String
DIM anno AS String
DIM fecha AS String
DIM a AS String
a = Left(mCI)
mes = Mid(mCI, 3, 2)
dia = Mid(mCI, 5, 2)
IF a = 0 THEN
anno = "20" & (Left(mCI, 2))
ELSE
anno = "19" & Left(mCI, 2)
END IF
fecha = dia & "/" & mes & "/" & anno
RETURN fecha
END
'----------------------------------------------------
'Devuelve la edad
'----------------------------------------------------
PUBLIC FUNCTION edad(mfecha AS String) AS String
DIM FN AS Date
DIM fedad AS Integer
DIM hoy AS Date
DIM dia AS String
DIM mes AS String
DIM anno AS String
DIM fecha AS String
DIM a AS String
a = Right(mfecha, 4)
mes = Mid(mfecha, 4, 2)
dia = Left(mfecha, 2)
hoy = Now
fecha = mes & "/" & dia & "/" & a
FN = CDate(fecha)
fedad = (hoy - FN) / 365
RETURN fedad
END
'------------------------------------------------------
'Devuelve el sexo
'------------------------------------------------------
PUBLIC FUNCTION sexo(miCI AS String) AS String
DIM M AS String
DIM F AS String
DIM x AS Integer
M = "Masculino"
F = "Femenino"
x = CInteger(Mid(miCI, 10, 1)) MOD 2
IF x = 0 THEN
RETURN M
ELSE
RETURN F
END IF
END
'-----------------------------------------------------------

La clase TbTrabajador
'gambas class file
INHERITS CPersona
PRIVATE mRs AS Result
PRIVATE mBase AS Connection
'-------------------------------------------------
'Metodos de operaciones sobre la Base de Datos
'------------------------------------------------
'para conectarnos a la Tabla tbtrabajador
'--------------------------------------
PUBLIC SUB Abrir(Bd AS Connection)
mBase = Bd
mRs = mBase.Exec("SELECT * from tbtrabajador")
END SUB
'------------------------------------------------
'Nos muestra Todos los registros de la Tabla
'ordenado por el campo Nombre
'-----------------------------------------------
PUBLIC FUNCTION SelVistbtrabajador() AS Result
RETURN mBase.Exec("SELECT * from tbtrabajador ORDER BY Nombre")
END FUNCTION
'-------------------------------------------------
'Nos mueve al ultimo introducido en la tabla
'-------------------------------------------------
PUBLIC FUNCTION UltimoTrabajador() AS Integer
DIM lRs AS Result
lRs = mBase.Exec("SELECT * FROM tbtrabajador order by ID")
IF NOT lRs.Available THEN
RETURN 0
ELSE
lRs.MoveFirst
RETURN lRs["ID"]
END IF
END FUNCTION
'-------------------------------------------------------------------------------------
'Para buscar
'--------------------------------------------------------------------------------------
PUBLIC FUNCTION SelBuscaPalabra(mCadena AS String, OPTIONAL mCampo AS String = "Descripcion") AS Result
RETURN mBase.Exec("SELECT * FROM tbtrabajador WHERE " & mCampo & "<>'' AND " & mCampo & " Like '%" & mCadena & "%' ORDER BY " & mCampo & " ASC")
END FUNCTION
'-----------------------------------------------------------------------------------------
'Nos dice la cantidad de Trabajadores que existe en la tabla trabajador
'-----------------------------------------------------------
PUBLIC FUNCTION NumeroRegistros() AS Integer
DIM lRs AS Result
lRs = mBase.Exec("SELECT * from tbtrabajador")
RETURN lRs.Count
END FUNCTION
'----------------------------------------------------------------------------------------
'NOs posiciona en la primer registro de la Tabla
'-----------------------------------------------------
PUBLIC SUB Primero()
IF mRs.Available THEN
mRs.MoveFirst
Leer
END IF
END
'------------------------------------------------------------------------------------------
'nos mueve al siguiente registro de la tabla
'----------------------------------------------
PUBLIC SUB Siguiente()
IF mRs.Available THEN
mRs.MoveNext
Leer
END IF
END
'-----------------------------------------------------------------------------------
'Nos mueve al registro anterior de la tabla
'---------------------------------------------
PUBLIC SUB Anterior()
IF mRs.Available THEN
mRs.MovePrevious
Leer
END IF
END
'------------------------------------------------------------------------------------
'nos mueve al ultimo registro de la tabla
'-----------------------------------------------------------------------------------
PUBLIC SUB Ultimo()
IF mRs.Available THEN
mRs.MoveLast
Leer
END IF
END
'------------------------------------------------------------------------------------
'Nos muestra el registro donde estamos posicionado
'----------------------------------------------------
PUBLIC FUNCTION Actual(Dato AS Variant, OPTIONAL Cadena AS Boolean = FALSE) AS Boolean
DIM Criterio AS String

IF (IsInteger(Dato)) THEN
Criterio = "ID = " & Dato
IF Cadena = TRUE THEN
Criterio = "Nombre='" & Dato & "'"
END IF
ELSE
Criterio = "Nombre='" & Dato & "'"
END IF
mRs = mBase.Exec("SELECT * FROM tbtrabajador WHERE " & Criterio)
IF mRs.Count > 0 THEN
Leer
RETURN TRUE
ELSE
RETURN FALSE
END IF
END FUNCTION
'---------------------------------------------------------------------------------
'Adiciona ó actualiza un registro
'--------------------------------------------------------------------------------

PUBLIC FUNCTION Grabar(mNuevo AS Boolean) AS String
DIM SQLString AS String
DIM lResultado AS String
IF mNuevo THEN
SQLString = "INSERT INTO tbtrabajador ( "
SQLString = SQLString & "CI, "
SQLString = SQLString & "Nombre, "
SQLString = SQLString & "Apellidos "
SQLString = SQLString & ") VALUES ('"
SQLString = SQLString & SUPER.CI & "','"
SQLString = SQLString & SUPER.Nombre & "','"
SQLString = SQLString & SUPER.Apellidos & "')"
lResultado = Cadenas.MSG_REGGRAB
ELSE
SQLString = "UPDATE tbtrabajador SET "
SQLString = SQLString & "CI='" & SUPER.CI & "',"
SQLString = SQLString & "Nombre='" & SUPER.Nombre & "',"
SQLString = SQLString & "Apellidos='" & SUPER.Apellidos & "'"
SQLString = SQLString & " WHERE ID=" & SUPER.id
lResultado = Cadenas.MSG_REGACT
END IF
mBase.Exec(SQLString)
RETURN lResultado
END FUNCTION
'-------------------------------------------------------------------------------------------
'Elimina un registro
'-------------------------------------------------------------
PUBLIC SUB Borrar(lID AS Integer)
mBase.Exec("DELETE FROM tbtrabajador WHERE ID=" & lID)
END SUB
PRIVATE SUB Leer()
IF mRs.Available THEN
SUPER.id = mRs["ID"]
SUPER.CI = mRs["CI"]
SUPER.Nombre = mRs["Nombre"]
SUPER.Apellidos = mRs["Apellidos"]
END IF
END SUB
'----------------------------------------------------------------------------------------

Perfil MP  
Objetivo: Re: Ayuda, Crear Clase Manipule Una Tabla En Mysql
joseagch:

Felicidades, te ha quedado muy bien, y ademas son clase muy útiles para implementarlas en nuestras aplicaciones.

Gracias por el aporte.

Saludos

última edición por jsbsan el Miercoles, 26 Octobre 2011, 00:19; editado 1 vez

Página 1 de 1


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.2688s (PHP: 56% SQL: 44%)
Consultas SQL: 25 - Debug off - GZIP Activado