Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-03-2007
Avatar de vpepen
vpepen vpepen is offline
Miembro
 
Registrado: nov 2003
Ubicación: Higüey
Posts: 104
Poder: 21
vpepen Va por buen camino
Error al actualizar datos.

Hola a tod@s.

Quisiera que me ayudaran por favor a resolver un problemita que me tiene parado con un pequeño proyecto que estoy desarrollando.

Antes que nada utilizo Conexión ADO y para el acceso a los datos utilizo ADOQuery.

El planteamiento es el siguiente:

Tengo dos tablas:
Alumno
Id
Apellido1
Apellido2
Nombres
..
..

Calificaciones
NumeroPeriodoEscolar
IdAlumno
NotaPrimerParcial
NotaSegundoParcial
PromedioParciales
NotaPractica
NotaExamenFinal
CalificacionFinal

..........................

Esas dos tablas las muestro utilizando una consulta SQL en un DBGrid, dicha consulta es la siguiente:

Código SQL [-]
Select Id, Apellido1, Apellido2, Nombres, NumeroPeriodoEscolar, IdAlumno, NotaPrimerParcial, NotasegundoParcial, PromedioParciales, NotaPractica, NotaExamenFinal, CalificacionFinal From Alumno, Calificaciones Where Id = IdAlumno and NumeroPeriodoEscolar = 1 Order By Apellido1, Apellido2, Nombres

Como podemos ver, en la tabla calificaciones se guardan las calificaciones de todos los alumnos en cada periodo. Pongo en la consulta: NumeroPeriodoEscolar = 1 para representar el primer periodo, pero dicho número irá aumentando secuencialmente.

Dónde radica el problema?

Bueno, sucede que al mostrar dicha consulta en un DBGrid, lo hago para que el usuario pueda cambiar datos de la tabla Calificaciones, es decir, que pueda modificar: NotaPrimerParcial, NotaSegundoParcial, NotaPractica y NotaExamenFinal. En el caso de las demás columnas, como las que pertenecen a la tabla Alumno y las que son calculadas (PromedioParciales y CalificacionFinal) les cambio la propiedad ReadOnly = True en el DBGrid.

Al cambiar cualquier valor de la tabla Calificaciones me dispara un error que dice: "Información de Columna Clave insuficiente para realizar el Update o Refresh".

Probé cambiando la propiedad ReadOnly = False de las columnas que apuntan a la tabla Alumno y al modificarla lo hace sin problema y sin error, es decir, sólo se presenta este error al modificar valores en la tabla Calificaciones.

Si la consulta la hago sólo con la tabla Calificaciones me funciona de maravillas, pero entonces el usuario no sabrá que alumno está modificando. Probé usar campos LookUp para mostrar el Apellido1, Apellido2 y Nombre por medio a los campos Id e IdAlumno, pero no podría entonces mostrar el listado ordenado por los campos como se muestra en la consulta especificada.

Espero no haber causado molestias con tanto texto, pero la verdad es que por más que traté de resumir para plantear el problema, me extendí para ser lo suficientemente explícito.

Vpepen.-
****************
Responder Con Cita
  #2  
Antiguo 31-03-2007
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: México D.F
Posts: 3.068
Poder: 23
poliburro Va por buen camino
Pues hasta donde yo se mi amigo, si tu RecordSet es el resultado de una consulta que involucra a más de una tabla, este recordset no podrá ser modificado.


Pero podrias armar un catálogo donde se muestre la info que necesitas y la edición del alumno sea realizada en una ventana adicional.

:P



Suerte
__________________
Conoce mi blog http://www.edgartec.com
Responder Con Cita
  #3  
Antiguo 02-04-2007
Avatar de vpepen
vpepen vpepen is offline
Miembro
 
Registrado: nov 2003
Ubicación: Higüey
Posts: 104
Poder: 21
vpepen Va por buen camino
Cita:
Empezado por poliburro
Pues hasta donde yo se mi amigo, si tu RecordSet es el resultado de una consulta que involucra a más de una tabla, este recordset no podrá ser modificado.
No estoy del todo de acuerdo contigo poliburro, ya que al crear una clave primaria en mi tabla calificaciones el problema quedó resuelto. El problemita es que al no tenter un campo en esa tabla que sirva como clave primaria, tuve que crear uno, que aunque no le doy ningún uso, simplemente lo hice para resolver el problema. Dicho campo es del tipo autonumérico. Sé que no es la forma más elegante de resolver el problema, pero la verdad es que se me acabaron las opciones . Si alguien tiene una mejor solución, se lo agradeceré...

vpepen.-
**************
Responder Con Cita
  #4  
Antiguo 02-04-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Yo cambiaría el esquema completamente, usaría 2 Grids (uno para alumnos y otro para calificaciones), ambos con HideSelection a False.

Se formaría una relación Maestro-detalle entre ambos grids, de forma que al seleccionar un alumno, se mostrarían solo las calificaciones de ese alumno y del periodo elegido.

Consulta Alumnos (Maestro)
Código SQL [-]
 select * from alumnos order by ...

Consulta de Calificaciones (Detalle)
Código SQL [-]
select * 
from calificaciones 
where IdAlumno = :Alumno 
  and NumeroPeriodoEscolar = :Periodo
Cuando se hace clic en el Grid de Alumnos:
Código Delphi [-]
qryDetalle.Close; 
qryDetalle.parameters.Parambyname('Alumno').Value :=   qryMaestro.Fieldbyname('Id').Value;
qryDetalle.parameters.Parambyname('periodo').Value := SpinEdit1.Value; // para que el usuario elija el Periodo.
qryDetalle.Open;

IdAlumno debería ser clave ajena (foránea, foreign key) de la tabla Alumno. Además debe tener un índice secundario por ese campo para agilizar las búsquedas.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 02-04-2007 a las 17:08:30.
Responder Con Cita
  #5  
Antiguo 02-04-2007
Avatar de vpepen
vpepen vpepen is offline
Miembro
 
Registrado: nov 2003
Ubicación: Higüey
Posts: 104
Poder: 21
vpepen Va por buen camino
Cita:
Empezado por Lepe
Yo cambiaría el esquema completamente, usaría 2 Grids (uno para alumnos y otro para calificaciones), ambos con HideSelection a False.

Se formaría una relación Maestro-detalle entre ambos grids, de forma que al seleccionar un alumno, se mostrarían solo las calificaciones de ese alumno y del periodo elegido.
Lepe, lo que planteas es factible, pero en el caso mío, es necesario que el usuario simplemente digite calificaciones (Esto por rapidez) y no que tenga que dar un clic al alumno en el grid y luego ir al grid de las calificaciones para digitar su calificación correspondiente. Al crear un master/detail, me imagino que en un grid estarán todos los alumnos (Grid1) y en el otro (Grid2) estarán las calificaciones, pero del alumno apuntado en el Grid1, no de todos.

Vpepen.-
************
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Actualizar datos de una base de datos en un reporte Marymania Impresión 4 27-11-2006 19:47:32
Error en Actualizar Base de datos SQL en Red freddiaz07 Conexión con bases de datos 2 25-09-2006 22:57:10
Error al actualizar sanz Conexión con bases de datos 3 12-04-2006 17:57:41
Actualizar Datos trex2000 Firebird e Interbase 1 26-09-2003 23:21:49


La franja horaria es GMT +2. Ahora son las 20:00:33.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi