DoCmd. Runsql muy larga.

Os pongo en situación. Deciros que no estoy muy ducho en programación. Soy autodidacta hasta ciertos límites, como ahora. En el diseño de una base tengo un form principal con algunos subform dentro del mismo. En el diseño y funcionalidad de los mismo no tengo problema. Son funcionales y se presentan como quiero. Hay diferentes opciones, desde cuadros de texto, cuadros combinados, botones de opción, verificación, listas, casi de todo. Ninguno de ellos está asociado a ningún origen de datos. En el form principal con un botón he conseguido guardar los datos del form principal a la tabla que quiero. ¿Cómo?
DoCmd.RunSql "INSERT INTO TABLA(CAMPOS) VALUES(LOS DEL FORM PRINCIPAL)"
Lo anterior ha funcionado bien. Es un poco tedioso ya que son muchos campos y valores. Pero lo he logrado.
El problema llega al intentar guardar también los valores de los subformularios. En el form principal tengo unos 25 a 30 valores a guardar y el total de todos los subform es de unos 50. He empezado a escribir la sentencia SQL pero me he asustado con la línea que sale y además no me ha funcionado.
Pregunto:
¿Se pueden obtener la lista de campos de la tabla y usarla como array? ¿O algo parecido?
Igual para los campos del form y subform?
Es correcto meterlo todo en la misma tabla, ¿con los aproximadamente 80 campos?
Si es mejor separar en tablas diferentes, ¿cómo las relacciono para que al guardar las diferentes sentencias sql queden unidos los datos de las diferentes tablas?
Agradezco de antemano vuestra ayuda y a la vez pido perdón por lo mal que me explico.
Gracias de nuevo.
{"lat":37.8810862001216,"lng":-4.75699424743652}

1 Respuesta

Respuesta
1
Si quieres escribir sql "muy largas" lo mejor es concatenar las filas de dicha sql. Por ejemplo:
DoCmd. RunSql "Select campo1, campo2, campo3 " _
& " From tabla1 where " _
& " campo1=25 and campo2='kakaka'"
De esta forma tendrás muchas lineas, pero siempre controlables en la pantalla.
Me cuentas.
Ok, gracias por la rápida respuesta. En la primera sentencia que hice guarde el orden del campo de la tabla y el control que contiene el dato a guardar. Es decir:
El campo 1 de la tabla en la misma posición que el control que contiene el dato a guardar:
docmd.runsql "insert into tabla(campo1,campo2,campo3,....) values(control que contiene el dato para el campo1, control que contiene el dato para el campo2,.....)
¿Entiendo qué esto tiene que ser así verdad? ¿O sólo con que coincidan los nombres es suficiente? En mi caso el nombre del campo y del control no son iguales ya que he dejado el tipo de control+el nombre.
Es que para la sentencia que tengo que hacer ahora son un mogollón de ellos y tengo que ir uno a uno y en orden, es un poco frustrante pero si no hay más remedio.
Y por último, creo, je je como si ya hubiese aprendido, perdón. Vuelvo a la primera sentencia, donde los controles están en el mismo formulario, no fue problema nombrarlos. Ahora me encuentro que los controles están en los subform que están dentro del principal. ¿Cómo los identifico en la sentencia?
Muchas gracias de nuevo.
Antes de seguir con SQL, he querido ir aprendiendo más y he aprovechado tu web. Gracias de nuevo. He visto que también podría hacerlo con un recordset. ¿En este punto que me aconsejas? Hacerlo con SQL o con recordset. Dado que son un montos de campos y controles, veo que con recordset voy línea a línea y no tengo que seguir el orden, aunque no estoy seguro de esto último como te explico en el mensaje anterior.
Gracias y saludos.
En nombre de los campos no tiene nada que ver, es el orden el que manda.
Con un recordset creo que es algo más sencillo de escribir cuando son tantos campos, yo te aconsejaría hacerlo con un recordset.
Para identificar los controles de un subformulario tienes que hacer:
Form! NombreDelSubformulario. Form! NombreDelControl
Es decir, con .Form indicas que te refieres a un subformulario.
Me cuentas.
Estupendo ya empiezo a conseguir resultados, pero en mi inquietud por mejorar he intentado hacer un array con los campos y otro con los controles para ir sustituyendo pero no me va, o me dice que no encuentra el campo en la tabla o que la conversión del dato no funciona. Me explico:
dim campo as variant
dim control as variant
campo = array(campo1,campo2,.....)
control = array(control 1,control 2,....)
ahora he intentado
rs!campo(1) = form!subformulario.form!control(1)
este no va
rs! & campo(1) = form!subformulario.form! & control(1)
Tampoco va
rs!nombre del campo escrito = form!subformulario.form!control escrito
Si va
¿Es posible hacerlo de alguna manera como array?
Saludos.
Sinceramente... no lo sé. Lo que si se es recorrer todos los campos de una tabla con
For each... next
Dim tb as TableDef
Dim fl as field
For each fl in tb.Tabledefs
fl.Name ' Te dá el nombre del campo
Next fl ' pasa al siguiente campo
Creo que así lo podrías conseguir.
Me cuentas.
Hola de nuevo. Bueno he probado con for each ... next y al final no lo he conseguido. Seguiré investigando. Sin embargo con el recordset me va de maravilla he hecho la mayor parte, je, teniendo en cuenta que le dedico el tiempo que me va sobrando. Muestras voy creando voy probando para limar errores y me encuentro el siguiente. Como siempre es por mi falta de conocimiento pero no doy con la tecla.
Me queda claro que para acceder al subfor de un formulario cargado es
rs!campo = form!subform.form!control
Ahora lo que no se, y he probado diferentes opciones, es acceder a los controles de un subform que está dentro del subform del formulario principal. Uf, no se si lo he explicado bien.
Es decir formulario principal---subform1---subform2 dentro del subform1.
Ya estoy a punto de poder grabar los datos de mi formulario¡ Bien¡
Gracias de nuevo.
rs!campo = form!subform.form!NombreDelSubformularioAnidado.Form!control
Es decir vas anidando los subformularios.
Hola de nuevo.
el form principal se llama distribucion. Este tiene un subform que se llama parteturno y éste último tiene 3 más que son bajas, TareasAlmacen y portes.
Me he quedado en el primer control de Tareas de Almacen así:
rs!descripcionaveria = Form!parteturno.Form!TextoAveria 'esta da resultado OK
rs!carrosPPSyMAN = Form!parteturno.Form!TareasAlmacen.Form!VerificaciónCarros
'sin embargo esta me da error: 2465
No encuentra el campo TareasAlmacen que hace referencia la expresión.
He revisado la grafía y creo que no me he equivocado al escribir.
Un Saludo, Gracias.
No se lo que puede ser, mirate este link a ver si te saca de dudas:
http://support.microsoft.com/kb/113352/es
Me cuentas.
Muchas gracias por la ayuda. Tras leer e ir cogiendo conceptos ya me queda más claro ciertas cosas.
He tenido que revisar los formularios y subformularios y el problema estaba aquí.
Al crear el subform yo lo llamé subTareasAlmacen, sin embargo el formulario que diseñé si que tiene el nombre TareasAlmacen. Es por lo que no encontraba el subform TareasAlmacen. Sustituir el código por SubTareasAlmacen y funciona! ¡Gracias!
Ahora puedo continuar mejorando.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas