Instrucción SQL en ACCESS errónea

Y no se como darle solución.
Tengo una base de datos en access. En ella tengo las siguientes tablas:
- Personas con sus datos personales
- Cursos con los datos del curso
A través de un formulario elijo a la persona, el curso que quiere realizar
y con un botón que tiene instrucciones en vba y sql la persona con sus datos y los datos
del curso elegido se agregan a una tabla vacía como un registro nuevo.
La instrucción que uso para agregar las personas es:
DoCmd.RunSQL "INSERT INTO CAJA(TipoEntrada,Cliente,Concepto,Fecha,ModoPago,Descuento,Importe,TipoPagoV,TipoHabitacionV,Modulos,Domicilio,Poblacion,CodigoPostal,Provincia,Tlf1,Tlf2,EMail,FechaInicio,Aula,Profesor,MaximoPax,DiasGrupo,HorarioGrupo,PrecioGrupoOriginal,DuracionGrupo,Notas,NI)VALUES('Matricula','" & Cliente.Column(1) & " " & "," & " " & Cliente.Column(2) & "','" & Concepto & "','" & Fecha & "','" & ModoPago & "','" & Descuento & "','" & TxtBox & "','" & TPV.Column(1) & "','" & THV.Column(1) & "','" & Modulos.Column(1) & "','" & Cliente.Column(4) & "','" & Cliente.Column(5) & "','" & Cliente.Column(6) & "','" & Cliente.Column(7) & "','" & Cliente.Column(8) & "','" & Cliente.Column(9) & "','" & Cliente.Column(10) & "','" & Concepto.Column(3) & "','" & Concepto.Column(4) & "','" & Concepto.Column(5) & "','" & Concepto.Column(6) & "','" & Concepto.Column(7) & "','" & Concepto.Column(8) & "','" & Concepto.Column(9) & "','" & Concepto.Column(10) & "','" & N & "','" & NI & "')"
Lógicamente la instrucción es larga pero TODO FUNCIONA PERFECTAMENTE excepto en una situación Y NO SE COMO RESOLVERLO
Cuando en mi tabla de personas tengo dos personas con los mismos apellidos (hermanos), al elegir un curso y agregarlas a la tabla vacía se agrega LA PRIMERA DE LAS DOS en la tabla de personas
y NO la que he elegido en el formulario.
No quiero rehacer la base de datos con relaciones, simplemente quiero saber cómo puedo modificar la instrucción en SQL
que he hecho para que se agregue la que elijo y NO la primera que hay en la tabla de personas en este caso.
Respuesta
1
Para esto te puedo contestar con lo siguiente: imagina que trabajaras en hacienda...¿Cómo diferenciarías a un Carlos García García de los 2500 "es un suponer" que existen en toda España?
Pues con un DNI o NIE o pasaporte... etc. En el caso de no pedir ese dato, te lo tienes que inventar. Para ello puedes crear un nº automático, o un identificador de réplica, o cualquier otro código inequívoco de la persona o registro.
Para todo esto debes crear el campo necesario e incluirlo en todas las consultas o sql para identificar el registro correspondiente.
Si no te he aclarado bastante con esto dímelo y lo enfocaremos desde otro punto de vista.

8 respuestas más de otros expertos

Respuesta
2
El problema no lo tienes en la SQL. Los valores que tomas son de los formularios.
El tema debe estar en la selección, por algún motivo cuando buscas quizás lo hagas por apellidos y te devuelve el primero, lo pone en el formulario y de hay lo coges.
Comprueba con una traza que valores está cogiendo del formulario y localiza el registro por código no por apellidos ( si es que lo estás haciendo así) y a ver si hay suerte.
Respuesta
1
La verdad que de sql no se nada :P yo trabajo por exploración de registros. Igualmente me suena a que el problema esta en donde elegís al alumno, seguramente un combobox. Probá agrgando una columna autonumérica en la tabla de alumnos y en el combobox ponela como columna principal oculta. Creo que eso lo va a solucionar.
Respuesta
1
Lamento decirte que precisamente ese es el problema el diseño
Cuando agarras martinez y no su documento de identidad, ya el programa no sabe diferenciar uno o lo otro
y menos en sql
en la tabla caja coloca solo apuntadores a personas y cursos, que ademas de simplificar las cosas y mantener los datos coherentes, solucionaría el problema (fíjate lo que pasaría en caja si modificas un nombre de personas que ya esta ahí, en caja, está no se modificaría)
Respuesta
1
¿No pusite una llave maestra como código? En vez de buscar solo por nombre solo se uasaia este datos como referencia al momento de hacer la consulta o update se trabaja con código
Respuesta
1
Mejor envíame tu BD y lo reviso más rápido. [email protected]
Respuesta
1
En cuanto a la instrucción SQL que me has apuntado, la verdad, está perfecta, no tiene porqué darte fallos (la instrucción SQL EN SI me refiero...)...
... Ahora, en cuanto al problema que me cuentas, puedo decirte que NO TIENE QUE VER con la instrucción que me has detallado:
En la instrucción, aparecen comandos como Cliente. Column(1), Cliente. Column(2), Concepto. Column(1)...
Yo ahí (y desde mi laaaaaaaaaarga experiencia trabajando y ..."trasteando"... con bases de datos en Access, haciendo yo mis programas y truquillos con los formularios y el código VBA... por la presencia de dichos comandos en la instrucción SQL, puedo entender que, en el formulario desde el que aplicas la instrucción para insertar el registro, existen, o bien tablas, o bien listas o bien ..."desplegables"..., mediante los que seleccionas al cliente (Cliente.column(1)...), el concepto (Concepto.column(1)...), el TPV (TPV. Column(1)...) etc...
Pues bien. Supongo, también, que para cada uno de esos controles (tablas, "desplegable"s...) utilizarás consultas ("SELECT Id, Apellidos, Nombre, DNI... FROM Clientes ..."...). Y tal vez, pase que en la consulta correspondiente al control Cliente es donde se encuentre el fallo en cuestión. Me explico:
Es posible que, p.ej. en la consulta que hayas utilizado para el control clientes, hayas puesto algo como
"SELECT Id, Apellidos, Nombre, ... FROM Clientes ... ORDER BY Apellidos"
La solución, en este caso sería poner: "... ORDER BY Apellidos, Nombre"
No obstante, una solución más ..."limpia"... sería que en la tabla clientes hubiese un campo clave (llamado Id, p.ej...), que fuese irrepetible, y que p.ej. fuese "autonumérico"... Y que al hacer la consulta, cada cliente lo referenciases por ese Id (y no, por sus apellidos...)
Pero bueno... No se si te servirá,
Aquí te mando saludos,
Emmmmmpuack!
Respuesta
1
Lamento comunicarte que aunque no quieras rehacer la base de datos con relaciones, lo vas a tener que hacer, porque la única manera de diferenciar dos registro "nominalmente idénticos" es a través de un ID, una clave primaria, un identificador.
Ponle a la tabla persona su clave, y en la de cursos no dupliques innecesariamente los datos de las persona, solo incluye el ID de la persona relacionada.
Respuesta
1
Para resolver el problema lo que tienes que hjacer y debes es maneja un ID de persona en vez de utilizar el descriptivo cliente. El hacer eto es super sencillo solo alterando la tabla personas con un ID luego al seleccionar a la persona en vez de insertar el cliente insertarías el ID. Si necesitarías más info sobre esa persona harías un query sobre personas y listo. Te digo este cambio porque las cosas deben hacerse de la mejor manera y siguiendo estándares ya etudiados y validados.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas