Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Mejora O Alternativas A Función De Guardar/actualizar Notas
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje 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
Descripción: Proyecto con conexión a BD SQLite y creación de reporte en texto plano. 
Descargar
Nombre del archivo: NotasBD.tar.gz
Tamaño: 29.05 KB
Descargado: 69 veces
NotasBD.tar.gz
Descripción: Proyecto con conexión a BD SQLite y creación de reporte en texto plano. 
Descargar
Nombre del archivo: NotasBD.tar.gz
Tamaño: 29.05 KB
Descargado: 69 veces
NotasBD.tar.gz
Descripción: Proyecto con conexión a BD SQLite y creación de reporte en texto plano. 
Descargar
Nombre del archivo: NotasBD.tar.gz
Tamaño: 29.05 KB
Descargado: 69 veces

 



 
vicr - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Mejora O Alternativas A Función De Guardar/actualizar Notas 
 
bajando y probando, gracias por compartir, seguro hay mucho para aprender....

Saludos
 




===================
Software libre, programación libre, vida libre es la Public function Libertad()as Invendible
Proyectos: VisorRV1960,Taller2015,Tanteador
https://sourceforge.net/u/v3ctor-full/profile/
Blog: http://novatocodegambas.blogspot.com.uy/
 
v3ctor - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.
 




===================
Software libre, programación libre, vida libre es la Public function Libertad()as Invendible
Proyectos: VisorRV1960,Taller2015,Tanteador
https://sourceforge.net/u/v3ctor-full/profile/
Blog: http://novatocodegambas.blogspot.com.uy/
 
v3ctor - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Notas De La Versión En Gambasdoc jsbsan General 0 Domingo, 03 Febrero 2013, 20:31 Ver último mensaje
jsbsan
No hay nuevos mensajes Simple Bloc De Notas jsbsan Aplicaciones/Fragmentos de Código 1 Viernes, 11 Abril 2014, 05:44 Ver último mensaje
leonel
No hay nuevos mensajes Sobre La Mejora Del Navegador De Los Ejemp... jousseph Aplicaciones/Fragmentos de Código 11 Martes, 13 Octobre 2015, 21:21 Ver último mensaje
shordi
No hay nuevos mensajes Notas De Escritorio... Remoto shordi General 6 Miercoles, 03 May 2017, 22:13 Ver último mensaje
tincho
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
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



  

 

cron