Mejora O Alternativas A Función De Guardar/actualizar Notas


Subject: Mejora O Alternativas A Función De Guardar/actualizar Notas
Hola a todos,

Les presento unas funciones que usé para guardar notas en un proyecto personal que hice para practicar .Exec y su uso con parámetros. Lo hice luego de que me di cuenta que traje de Php unas malas prácticas que en este caso era concatenar a una cadena las variables necesitadas. (Esto por unos problemas en Php que tuve al no hacerlo hace unos años con otro proyecto de estudio).

Originalmente en este proyecto gambas quería hacer uso de las otras funciones de bd, como .Edit, .Update… pero luego que comencé con éstas funciones y las hice funcionar, ya no quería seguir probando alternativas, pero la DUDA de si se podía hacer mejor prevalece.

Sé que la base de datos puede estar hecha de manera diferente, dejando una tabla notas y creando una relación con clave foránea con el alumno, pero la génesis y parte del desarrollo de este proyecto la explico luego de este código. Adjunto también el proyecto por si lo quieren revisar.

El código considera tres notas en un registro relacionado a un alumno, para guardar una (o dos) de todas las notas en un determinado lugar considere la posición que corresponde usando un método binario para saber e indicar cual nota guardar/corregir.

Private Function SQLagregarNotas(iPosBin As Integer) As String
'que nota se insertara a alumno segun valor binario posicional
'001 = 1, Nota1 - 010 = 2, Nota2 - 100 = 4, Nota3; 111 = 7, Todas; 011 = 3, Nota1 y Nota2; 101 = 5, Nota3 y Nota1; 110 = 6, Nota3 y Nota2

Dim query As String = ""
Dim queryUnaNota As String = "INSERT INTO notas (notax, relalumnos) VALUES (&1, &2)"
Dim queryDosNotas As String = "INSERT INTO notas (notay, notaz, relalumnos) VALUES (&1, &2, &3)"
Dim queryTresNotas As String = "INSERT INTO notas (nota1, nota2, nota3, relalumnos) VALUES (&1, &2, &3, &4)"


Select Case iPosBin
Case 1, 2, 4
query = IIf(iPosBin = 1, Replace$(queryUnaNota, "x", "1"), (IIf(iPosBin = 2, Replace$(queryUnaNota, "x", "2"), (IIf(iPosBin = 4, Replace$(queryUnaNota, "x", "3"), "Nada")))))
Case 3, 5, 6
If iPosBin = 3 Then
query = Replace$(queryDosNotas, "y", "1")
query = Replace$(query, "z", "2")
Else If iPosBin = 5 Then
query = Replace$(queryDosNotas, "y", "1")
query = Replace$(query, "z", "3")
Else If iPosBin = 6 Then
query = Replace$(queryDosNotas, "y", "2")
query = Replace$(query, "z", "3")
Endif
Case 7
query = queryTresNotas
End Select

Return query
End

Public Function agregarNotasaAlumno(iPosBin As Integer, iRelAlm As Integer, arNotas As Integer[]) As Boolean ''en el arreglo poner Todas las notas, incluso ceros donde no haya.
'obtener query
Dim qry As String = SQLagregarNotas(iPosBin)

Select Case iPosBin
'param Insert
Case 1
conexion.cnx.Exec(qry, arNotas[0], iRelAlm)
Case 2
conexion.cnx.Exec(qry, arNotas[1], iRelAlm)
Case 3
conexion.cnx.Exec(qry, arNotas[0], arNotas[1], iRelAlm)
Case 4
conexion.cnx.Exec(qry, arNotas[2], iRelAlm)
Case 5
conexion.cnx.Exec(qry, arNotas[0], arNotas[2], iRelAlm)
Case 6
conexion.cnx.Exec(qry, arNotas[1], arNotas[2], iRelAlm)
Case 7
conexion.cnx.Exec(qry, arNotas[0], arNotas[1], arNotas[2], iRelAlm)
End Select


End

Private Function SQLactualizarNotas(iPosBin As Integer) As String
'valor binario posicional
'001 = 1, Nota1 - 010 = 2, Nota2 - 100 = 4, Nota3; 111 = 7, Todas; 011 = 3, Nota1 y Nota2; 101 = 5, Nota3 y Nota1; 110 = 6, Nota3 y Nota2

Dim query As String = ""
Dim queryUpUnaNota As String = "UPDATE notas SET notax = &1 WHERE idnotas = &2"
Dim queryUpDosNotas As String = "UPDATE notas SET notay = &1, notaz = &2 WHERE idnotas = &3"
Dim queryUpTresNotas As String = "UPDATE notas SET nota1 = &1, nota2 = &2, nota3 = &3 WHERE idnotas = &4"

Select Case iPosBin
Case 1, 2, 4
query = IIf(iPosBin = 1, Replace$(queryUpUnaNota, "x", "1"), (IIf(iPosBin = 2, Replace$(queryUpUnaNota, "x", "2"), (IIf(iPosBin = 4, Replace$(queryUpUnaNota, "x", "3"), "Nada")))))
Case 3, 5, 6
If iPosBin = 3 Then
query = Replace$(queryUpDosNotas, "y", "1")
query = Replace$(query, "z", "2")
Else If iPosBin = 5 Then
query = Replace$(queryUpDosNotas, "y", "1")
query = Replace$(query, "z", "3")
Else If iPosBin = 6 Then
query = Replace$(queryUpDosNotas, "y", "2")
query = Replace$(query, "z", "3")
Endif
Case 7
query = queryUPTresNotas
End Select

Return query

End

Public Function actualizarNotas(iPosBin As Integer, iIdNts As Integer, arNotas As Integer[]) As Boolean ''en el arreglo poner Todas las notas, incluso ceros donde no haya.

Dim qry As String = SQLactualizarNotas(iPosBin)

Select Case iPosBin

Case 1
conexion.cnx.Exec(qry, arNotas[0], iIdNts)
Case 2
conexion.cnx.Exec(qry, arNotas[1], iIdNts)
Case 3
conexion.cnx.Exec(qry, arNotas[0], arNotas[1], iIdNts)
Case 4
conexion.cnx.Exec(qry, arNotas[2], iIdNts)
Case 5
conexion.cnx.Exec(qry, arNotas[0], arNotas[2], iIdNts)
Case 6
conexion.cnx.Exec(qry, arNotas[1], arNotas[2], iIdNts)
Case 7
conexion.cnx.Exec(qry, arNotas[0], arNotas[1], arNotas[2], IidNts)
End Select

End





Eso es todo (si no quieren leer algunos pormenores del desarrollo del proyecto). Criticas o mejoras serán bienvenidas. ( …. hummm a lo mejor la críticas no tanto… jajaja… )

Saludos…

---------------------------
Génesis del proyecto:

Hace unos meses una forera nueva en esto preguntaba como guardar notas y promedio usando los DataControles, en una primera lectura me quedé con la idea de guardar promedios, cosa que no es necesaria en una bd ya que es un valor que se puede calcular al pedir los datos (usando AVG), pero luego la forera añadió una imagen que me dio a pensar que las notas y los alumnos estaban en la misma tabla… solución a eso es algo del estilo:

SELECT (nota1 + nota2 + nota3)/3 as Promedio FROM AlumnosYNotas Where idAlumnos = 1


Donde ese número 3 de la división no me gustaba y pensé en resolverlo con un procedimiento almacenado… y por lo que sé ¡NO existen Procedimientos Almacenados en SQLite!

Bueno, me dije éste proyecto es la excusa para probar los Exec y los parámetros y comencé a picar este código, proceso que se encontró con paseo de las vacaciones de verano, cambio de casa, inicio de clases de mi hijo, dolor de oído (tengo un problema en mi oído derecho)… etc, etc.

Al principio el código lo hice con mucha variable Public más que nada por su uso global en el programa, luego corregí la mayoría (ya que algunos datos ahora se pasan entre Funciones).

Puede que existan ciertas mezclas extrañas en el código y esto se debe a que estuve una semana mirando el código sólo media hora al día y a veces ni lo miraba (estaba leyendo “el Misterio de Salem's Lot” y ya estaba quedando la grande en ese pueblito… jejeh )

La mayor parte de las dudas para hacer el proyecto la resolví con este foro en mensajes antiguos, algunos conceptos los trataba Jsbsan en su blog.

Vistas previas que hice del proyecto antes de trabajarlo usando el complemento de Firefox llamado Pencil. Para el trabajo del archivo SQLite usé otro complemento llamado SQLite Manager.

form_ingreso


form_ing_nota

Por cierto en la BD no quise mezclar alumnos y notas por lo que luego tuve el problema que no podía usar DataControls, cargar la propiedad Field me dio problemas por ello el ingreso de alumnos uso DataControls y en el ingreso de las notas es puro código. En el formulario de las notas no quería mostrar el campo ID, pero usando DataSource y DataControls no pude saltarlo para que no lo pidiera.

Para que el programita quedara más completo puse la opción de guardar un archivo.


Y me vuelvo a despedir si se leyeron todo…

Nos leemos.


NotasBD.tar.gz
Description: Proyecto con conexión a BD SQLite y creación de reporte en texto plano. 
Download
Filename: NotasBD.tar.gz
Filesize: 29.05 KB
Downloaded: 73 Time(s)
NotasBD.tar.gz
Description: Proyecto con conexión a BD SQLite y creación de reporte en texto plano. 
Download
Filename: NotasBD.tar.gz
Filesize: 29.05 KB
Downloaded: 73 Time(s)
NotasBD.tar.gz
Description: Proyecto con conexión a BD SQLite y creación de reporte en texto plano. 
Download
Filename: NotasBD.tar.gz
Filesize: 29.05 KB
Downloaded: 73 Time(s)

Profile PM  
Subject: Re: Mejora O Alternativas A Función De Guardar/actualizar Notas
bajando y probando, gracias por compartir, seguro hay mucho para aprender....

Saludos

Subject: Re: Mejora O Alternativas A Función De Guardar/actualizar Notas
arréglale la ruta de conexión que sea una variable tipo user.home y que verifique si la base de datos no existe y le haga una copia a esa ruta para que puedan usar el ejemplo.

saludos.

Subject: Re: Mejora O Alternativas A Función De Guardar/actualizar Notas
Para ser tu primera aproximación al tema de Sqlite y de manejo de bases en gambas, está muy bien (a pesar de los berenjenales en que te metes para grabar los datos ).

En SQLite se puede establecer integridad relacional, las dos tablas debieran ir relacionadas para ser más puristas, pero como ejemplo vale.

Profile PM  

Page 1 of 1


  
You cannot post new topics
You cannot reply to topics
You cannot edit your posts
You cannot delete your posts
You cannot vote in polls
You cannot attach files
You can download files
You cannot post calendar events

   

This is a "Lo-Fi" version of our main content. To view the full version with more information, formatting and images, please click here.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Generation Time: 0.2178s (PHP: 21% SQL: 79%)
SQL queries: 25 - Debug Off - GZIP Enabled