Rellenar más campos en una tabla

Una de las tablas de mi base de datos es productos, y tiene, entre otros, el campo referencia que es clave principal y el campo color. Mediante un formulario y siendo que los dos últimos dígitos de la referencia indican el color, automáticamente rellena el campo color. Ocurre que la siguiente referencia puede ser igual cambiando solo los dígitos del color (y la siguiente y la siguiente y otra salteada...) quiero ampliar la tabla con campos coloropcional1, coloropcional2... Así hasta... Digamos once (digo once porque habrá que pensar en un bucle o algo). He pensado que bien con un botón del formulario o con una consulta de actualización o... No se como (tengo un lio con access que ni te cuento) necesito que lea los primeros dígitos de la referencia (todas las referencias tienen el mismo numero de dígitos)y a cada uno de los registros le rellene el campo coloropcional con los colores que faltan. Es decir poder ver en un registro cual es el color correspondiente a esa referencia y también los demás colores en los que esta disponible. No se si con un recordset, que no se lo que es, pero por lo que he leído puede valer... Ni idea. Ademas en el campo coloropcional1 solo pondrá el color 1, en el coloropcional2 el color2, es decir, el nombre del campo esta relacionado con los dígitos finales de las referencias (ya te lie del todo, verdad), quiero decir que si tengo la referencia 104203 (el color lo incida el 03) y la 104205, en la primera el campo color sera 03 y el campo coloropcional5 sera 05 y en la segunda el campo color sera 05 y el coloropcional3 sera 03, el resto vacíos.
Santa paciencia tienes si has llegado al final, ya ves que tengo claro lo que quiero, pero un cacao importante sobre como hacerlo, pero voy aprendiendo access gracias a vosotros y a los chiquicientos artículos que leo y a la necesidad, que agudiza el ingenio.
Muchisimas gracias por tu atencion, despues tendre que hacer algo parecido con otros dos digitos de la referencia, pero espero saber pensarlo yo sola con la respuesta a esta pregunta.

1 respuesta

Respuesta
1
Encontré el ratillo...
Créate un nuevo módulo y ponle lo siguiente
Option Compare Database
Option Explicit
Sub procesaref(refe$)
CurrentDb.Execute "update refe set color='" & Right(refe, 2) & "' where referencia='" & refe & "'"
CurrentDb.Execute "update refe set color" & Val(Right(refe, 2)) & "='" & Right(refe, 2) & "' where referencia like '" & Left(refe, 4) & "*' and referencia <>'" & refe & "'"
End Sub
Sub referencias()
Dim r
Set r = CurrentDb.OpenRecordset("select referencia from refe where true")
While Not r.EOF
procesaref r(0).Value
r.MoveNext
Wend
End Sub
Comprueba que en Herramientas/Referencias tienes activa la de Microsoft DAO 3.6 Object Library, y si no la pones.
Fíjate en las sqls que lanzo, a ver si en tu base de datos los campos o tablas tienen otro nombre. Yo he usado una tabla refe con un campo referencia, otro color, y varios colorxx donde xx es el número sin ceros delante, como pones en la pregunta.
Comprueba la compilación correcta con depuración/Compilar y guarda.
La rutina que hace el trabajo es referencias. Si quieres ejecutarla directamente, ponte con el cursor (el que parpadea, no el del ratón) dentro de esa rutina y pulsa F5 para ejecutarla. Ya está.
Si quieres que la pueda ejecutar un usuario cualquiera, tendrás que poner algún botón en algún formulario para poder hacerla. Pones el botón, cancelas el asistente, le das con el botón derecho y sacas las propiedades, pestaña eventos, al hacer click. Te pones en el campo, le das a los puntos suspensivos para generar código y en donde te deja, le escribes
Referencias
Guardas todo y a probar.
Por cierto, se me ocurre que si alguna vez borras registros de la tabla, y port tanto deben desaparecer colores, antes de ejecutar la rutina tendrías que borrar los datos ya existentes en esos campos, se puede hacer con algo como
currentdb.execute "update refe set color=null,color1=null,color2=null,...,color345=null"
Pones eso en el evento del botón, antes de llamar a la rutina de las referencias. Así, primero se borran los colores y luego se vuelven a asignar.
No es demasiado complicado pero requiere un ratillo para probarlo, y estoy en medio de un megamarron en el trabajo. Si encuentro un rato te lo miro, pero te aviso que puedo tardar un poco, por si quieres ir poniéndolo en el tablón público...
Muchísimas gracias por avisarme, lo pondré en el publico, pero si tienes ese ratillo... ¿me contestaras? Si tengo respuesta antes de que tu puedas te aviso para que la descartes. ;)
:-DDD
Bueno, va. Si lo que quieres (no me ha quedado del todo claro) es mantener los números en la tabla pero que aparezcan con nombre en el formulario, yo te propondría otra cosa, y es que reemplaces los campos pcolorX por desplegables, con origen del control el campo correspondiente, y origen de datos tu tabla de correlación entre código y nombre del color. Si lo haces bien, el Access te hace la conversión él sólito.
Si no te gusta, no te queda otra que poner en cada uno de los campos de color opcional, dentro del campo, un dlookup como el que has puesto tú, es decir
Campo del ColorX en el formulario:
=dlookup("optName";"nombrecolor";"optcodew=" & nz(pcolorx,"99"))
Fíjate que he puesto un color especial, el 99, representando que no hay dato (es nulo) el color que se esté probando. Deberías incluir una fila en optcodew con código 99 y texto en blanco, o algo así.
Cambiando de tercio. Si la dichosa rutina te sigue dando error pero aparentemente funciona, debe ser porque hay una referencia en particular (al menos) que provoca ese error. Así, la rutina calcula en principio bien todos los registros hasta que llega al erróneo. Entonces da el error, tú finalizas y todo queda OK.
Si es el caso, vuelve a ejecutarla, y cuando te dé el error, deja el ratón encima de donde pone 'refe' en Sub procesaref(refe$) y te saldrá un tooltip (texto en amarillito) con el valor de la referencia que está provocando el error. Seguramente le faltan dígitos, está en blanco o cualquier cosa de esas...
Bueno, espero noticias tuyas muy pronto... :-D
Paciencia, y tiempo al tiempo, que de todo hay que aprender...
Bueno, parece que algo hay mal en la sql que se ejecuta, lo que no consigo ver es qué es lo que está mal. Lo único que se me ocurre es que yo he asumido que todos los campos son de tipo texto. Si esto no es correcto, y a lguno de ellos es numérico, tienes que quitar el apostrofe (comilla simple) de ambos lados de ese campo. Por ejemplo, donde yo decía
CurrentDb.Execute "update products set pcolor='" & Right(products, 2) & "' where pID='" & products & "'"
Si resulta que pcolor es numérico se quedaría
CurrentDb.Execute "update products set pcolor=" & Right(products, 2) & " where pID='" & products & "'"
y si además pid es numérico sería
CurrentDb.Execute "update products set pcolor=" & Right(products, 2) & " where pID=" & products & ""
A ver si hay suerte...
Si no la hay, prueba otra cosa. Esta línea famosa, cuando se pasa al motor de base de datos, tiene un valor (por ejemplo) de
update products set pcolor='03' where pID='1234567803'
Para ver dónde puede estar el error, te vas a la parte de consultas, creas una nueva en vista diseño sin tablas, cambias a vista SQL y pegas eso mismo, u otro ejemplo cualquiera. Vuelves a cambiar a vista diseño. Si cambia sin problemas, la SQL es correcta. Si da un error, habitualmente te marca de modo más preciso en qué punto de la SQL está dicho error. Suele ayudar bastante...
Bueno, me cuentas ;-)
Buenos días asturcon, es la primera vez que veo un modulo y supongo que me he liado, aunque no entiendo donde. Tu tabla refe en mi base se llama products, tu campo referencia se llama pID y tu campo color es pColor, los demás pColor1, pColor2... En la ultima linea de procesaref he cambiado left(refe, 4) por 11, ya que en mis códigos el color ocupa las posiciones 12 y 13.
Bien, puse un botón en el formulario como me indicaste, y al ejecutar (la compilación es correcta) me sale un error '3061' en tiempo de ejecución, pocos parámetros, se esperaba 1, y me señala la segunda linea CurrentDb.Execute de subprocesaref.
He copiado y pegado lo que puse en el modulo (que a su vez estaba copiado y pegado de tu respuesta).
Aunque no consigo traducir todo el código que has escrito para mi (ahora me pongo con ello, así voy, estudiando lo que necesito, a salto de mata, no encuentro más manual que vosotros que ligue access y visual en condiciones, así tengo el lio que tengo) calculo que cuando funcione tendré otra pega (culpa mía a la hora de exponer la pregunta), si no te importa... seguimos ne contacto, ¿vale?
Muchísimas gracias por tu amabilidad y tu ayuda, de verdad
Option Compare Database
Option Explicit
Sub procesaref(products$)
CurrentDb.Execute "update products set pcolor='" & Right(products, 2) & "' where pID='" & products & "'"
CurrentDb.Execute "update products set pcolor" & Val(Right(products, 2)) & "='" & Right(products, 2) & "' where pID like '" & Left(products, 11) & "*' and pID <>'" & products & "'"
End Sub
Sub referencias()
Dim r
Set r = CurrentDb.OpenRecordset("select pID from products where true")
While Not r.EOF
procesaref r(0).Value
r.MoveNext
Wend
End Sub
Eres un cielo asturcon, de verdad. Supongo que te estarán entrando ganas de eliminarme de los posibles preguntones, ya empieza a darme corte :).
Las sql son correctas, lo he comprobado como me has dicho y cambia sin problemas, los campos son textos, por lo que estaban bien los apostrofes, y aunque sale ese error de tiempo de ejecución, aparentemente HACE LO QUE QUIERO!, basta con que le de a finalizar en el mensaje y pase olímpicamente del error. Supongo que eso no sera muy buena idea, pero funcionar funciona.
Ahora (no me odies por favor) viene la parte que plantee mal al principio. En el formulario que tengo, donde meto los datos de la tabla products, el campo pColor es un texto, pero no el texto 04, sino el color blanco. En mi formulario uso una ¿variable? Intermedia llamada codcolor que lee ese 04 al final de la referencia, y le mando según ese 04 a buscar el blanco a otra tabla
Me![pColor] = DLookup("optName", "nombrecolor", "[optCodEw]=" & Me!CODCOLOR)
Bien, al ejecutar lo que tu me has mandado, me rellena todos los campos con los números (textos) perfectamente, imagino que ahora sera lo correcto usar otro botón para que esos números los ponga con las palabras de los colores en los campos pcolor, pcolor1, pcolor2... o añadir otra linea en sub referencias(). De entrada he puesto un botón en el formulario, pero claro, solo me cambia el registro actual. De esa "sub referencias()" no entiendo nada, solo que hace algo mientras ocurre algo (eso se llama hablar con propiedad, si).
imagino que estarás pensando... ¿por qué demonios se mete la gente a hacer lo que no tiene ni idea?. Y tienes razón, pero no se donde aprender.
de nuevo... gracias y disculpas
SIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII :D :D :D funcionaaaaaaaaaaaaa!!!!!
¿Te gusta el marisco? ¿El albariño? ¿Se te puede besar? jajajaja, gracias gracias gracias.
La rutina fallaba porque en una referencia, casualmente la ultima, los dos últimos dígitos no tenían definido el color correspondiente, solucionado.
¿Esto es magia
donde puedo aprender? ¿Algún manual para tontos? Algo que explique comillas, apostrofes, procedimientos, ¿palabros qué hacen milagros? ayss, ¿algo para ir organizando el lio?
Ahora... voy a hacer los mismo con los dos dígitos anteriores al color en la referencia, que indican otra característica y necesito hacer lo mismo. si me sale... lo habré entendido!
Millones de gracias asturcon, en serio, gracias.
Mandame un mensajito y te puntúo y finalizo la pregunta.
Amenazo con volver... salvo que me digas que no, y lo entenderé, jajaaajaja
Bieeeen!
Bueno, en cuanto a manuales y tal poco te puedo contar. Tuve necesidad de aprender Access desde hace tiempo, conociendo previamente otros lenguajes, y en general los libros a los que echaba un vistazo no me aportaban nada, por lo que no trabajé ninguno en profundidad. En principio, cualquiera que dedique algunos capítulos a la programación en Visual Basic debe valer. Si no incluyen eso, es que son tan simples que en poco tiempo te lo puedes aprender tú sola con la ayuda y alguna web como ésta.
Por cierto, no me verás disponible en el tablón por un par de semanas, porque me han adelantado una fecha de entrega de proyecto y lo llevo justo. Sin embargo, a ratos entro en el tablón público a ver que hay. Plantea cualquier cosa ahí, que ya lo veré.
Suerte con lo queda. Tampoco es tan complicado, es tema de tiempo.
Chao...
Y aquí faltan estrellitas, te has tomado conmigo tiempo que no tenias, santa paciencia la tuya, la solución ha sido genial y super rápida... diez estrellitas por lo menos. Muchísimas gracias asturcon, y suerte con tu proyecto

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas