Access - nombre de campo y "&"

   
Vista:

nombre de campo y "&"

Publicado por Salvador (9 intervenciones) el 29/09/2017 17:29:22
Muy buenas, a ver si me podéis echar una mano, por favor: esta instrucción runsql contiene un nombre de campo en el comando SET que quiero se componga del nombre de la tabla ffjo [Muestras CI]. y el nombre del campo NP, que lo asigno a través de la variable NP. Lo que quiero conseguir es componer el nombre del campo siguiente: [Muestras CI].Calcio

1
2
3
4
5
6
7
8
Dim NP As String
NP = "Calcio"
 
DoCmd.RunSQL "UPDATE parametros INNER JOIN ([Muestras CI] INNER JOIN " _
& "((muestras_ensayos INNER JOIN ensayos ON muestras_ensayos.id_ensayo = ensayos.uid) " _
& "INNER JOIN muestras ON muestras_ensayos.id_muestra = muestras.uid) ON " _
& "[Muestras CI].CodMuestra = muestras.cod_muestra) ON parametros.uid = ensayos.id_parametro " _
& "SET [Muestras CI].NP= Yes WHERE (((ensayos.id_metodo)=42) AND ((parametros.parametro)='calcio'))"

Pero no encuentro la sintaxis adecuada para insertar la variable NP dentro de la instrucción SET. Comillas, comillas simples, &, etc. no he encontrado el modo de hacer que Access trague.

Muchas gracias por adelantado,
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

nombre de campo y "&"

Publicado por Anonimo (942 intervenciones) el 30/09/2017 01:28:52
Pues el primer 'problema' es que si el campo 'NP' es Booleano (si/no en cristiano o guiri) es numérico y como numero se le ha de tratar.

Yes no existe como tal valor (es un formato 'estético') el valor real es cero (0) para en no (y sus versiones) y por defecto menos uno (-1) como valor para el si y sus versiones (aunque admite cualquier valor en el rango de los 'Long').

Access no tiene que 'tragar' nada (si se hace algo incorrecto: antes o después romperá), lo único que hay que hacer es entenderlo (y para ello la ayuda que incorpora es su mejor valor).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

nombre de campo y "&"

Publicado por Salvador (9 intervenciones) el 30/09/2017 10:07:29
Muchas gracias por responder.

Entiendo por lo que explicas que debería sustituir el valor YES en la instrucción SQL por un -1. Sin embargo, tengo muchas otras instrucciones SQL que funcionan perfectamente con valores YES o NO en sus expresiones. De hecho, esta instrucción la he copiado de la vista SQL en el generador de consultas de access, y posteriormente, la copio en el código VBA. Si inserto [Muestras CI].[Calcio] funciona a la perfección.

Yo creo que la clave está en formular adecuadamente el nombre del campo de algún modo parecido a esto: [Muestras CI]. '"&[NP]&"'.....pero he probado muchas opciones y no he sido capaz de lograrlo.

Lo de que access trague era sólo una forma de expresar que he intentado muchas opciones y no he conseguido nada. Y claro que he consultado la ayuda de access, y he buscado por internet abundantemente antes de preguntar en un foro, pero lo que he encontrado no me ha resultado y por eso por fin me he decidido a pedir ayuda...:))

Gracias otra vez, y un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

nombre de campo y "&"

Publicado por Anonimo (942 intervenciones) el 30/09/2017 13:22:54
Insisto en mi punto de vista y el hecho de que acepte 'Yes' en versiones inglesas o en VBA o la alternativa de 'Sí' en las de castellano (y fuera de VBA) es porque puede analizarla (representa a una variable) y sustituirla en tiempo de ejecución.

Si se le pone asi:
... Np = " & yes & "....... <== deberá funcionar
... Np = yes " & ....... <== no funcionara porque no la puede evaluar y sustituir

Y si se la encierra entre comillas simples
.... Np ='" & Yes & "' ..... Lo evaluara asi ==> .... Np ='-1' ....

Y tendremos un TEXTO no un valor numérico

La teoría (ayuda de Access) además de leerla hay que entenderla (requiere tiempo e interés)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

nombre de campo y "&"

Publicado por Salvador (9 intervenciones) el 30/09/2017 14:00:48
He probado tu indicación:

1
2
3
4
5
6
7
8
Dim NP As String
NP = "Calcio"
 
DoCmd.RunSQL "UPDATE parametros INNER JOIN ([Muestras CI] INNER JOIN " _
& "((muestras_ensayos INNER JOIN ensayos ON muestras_ensayos.id_ensayo = ensayos.uid) " _
& "INNER JOIN muestras ON muestras_ensayos.id_muestra = muestras.uid) ON " _
& "[Muestras CI].CodMuestra = muestras.cod_muestra) ON parametros.uid = ensayos.id_parametro " _
& "SET [Muestras CI].NP= " & yes & " WHERE (((ensayos.id_metodo)=42) AND ((parametros.parametro)='calcio'))"

El resultado es syntax error (sin ninguna información más). Si lo encierro entre comillas simples, también me da syntax error.

Sin embargo, con:

1
2
3
4
5
DoCmd.RunSQL "UPDATE parametros INNER JOIN ([Muestras CI] INNER JOIN " _
& "((muestras_ensayos INNER JOIN ensayos ON muestras_ensayos.id_ensayo = ensayos.uid) " _
& "INNER JOIN muestras ON muestras_ensayos.id_muestra = muestras.uid) ON " _
& "[Muestras CI].CodMuestra = muestras.cod_muestra) ON parametros.uid = ensayos.id_parametro " _
& "SET [Muestras CI].[Calcio]= yes WHERE (((ensayos.id_metodo)=42) AND ((parametros.parametro)='calcio'))"

Se ejecuta correctamente la consulta.

Quizás sea que no estoy poniendo suficiente tiempo ni interés, o que sea naturalmente torpe para la programación en VBA. Seguro que otros lo han hecho y lo harán mucho mejor que yo. Te agradezco sinceramente tu gratuito tiempo, pero creo que sugerirle a alguien que pregunta en un foro que no pone suficiente tiempo o interés, está de más, máxime cuando todo lo que sabes del que está al otro lado del mensaje, y de su camino hasta llegar a preguntar, es cero. O yo he interpretado mal tus palabras y me he pasado de frenada. Si es así, te pido disculpas, y estaremos ante otro caso más de limitaciones de la comunicación escrita entre humanos. Solo te pediría que si me respondes, mejor ahórrate cualquier comentario semejante, que seguro acertarás.

Aun así, no quiero dejar de agradecerte el tiempo que has empleado en intentar ayudarme.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

nombre de campo y "&"

Publicado por Anonimo (942 intervenciones) el 30/09/2017 16:56:26
De que tipo es este campo:
[Muestras CI].NP
Y de que tipo es este otro
[Muestras CI].[Calcio]

Por otra parte no tengo claro que representa 'yes' en este trozo de código ¿tal vez a un cuadro de texto? (se debería escribir 'Me.yes')
y si se utiliza como una variable podría surgir un problema con las 'palabras reservadas'.
SET [Muestras CI].NP= " & yes

Dependiendo del tipo de campo se le podrá asignar el valor que pueda contener de forma adecuada para que Access lo acepte como valido.

Al respecto del otro tema, lo dejare en el tintero ya que el análisis 'del otro' se basa en lo que transcribe (no en lo que tiene dentro de su cabeza).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

nombre de campo y "&"

Publicado por Salvador (9 intervenciones) el 30/09/2017 21:19:50
Ok, ambos campos son el mismo: un campo boolean. NP es una variable tipo string que defino antes, y a la cual le quiero dar diferentes valores (Calcio, Magnesio, Sodio, Potasio...). Quiero componer el nombre del campo a partir de la tabla en la que se encuentra (Muestras CI) y el nombre del campo, que será la variable string NP. La tabla muestras CI contiene varios campos boolean denominados Calcio, Magnesio, Sodio, Potasio, etc.

La instrucción SQL lo que hace es actualizar el valor del campo en cuestión (el definido por [Muestras CI].NP) al valor sí (-1 o true) si se cumplen ciertas condiciones de la combinación.

Espero haberme explicado mejor.

Muchas gracias de nuevo,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

nombre de campo y "&"

Publicado por Anonimo (942 intervenciones) el 01/10/2017 00:28:46
He llegado al punto en que no le encuentro sentido a esto tal como se esta planteando

Por partes:

Esa estructura de tabla tiene definido un campo 'calcio' otro 'magnesio', otro .... o esos son valores que pueden estar (una vez unos, otra vez otros) en el mismo campo.... (deseo diferenciar si hablamos de campos o de valores en un mismo campo de diferentes registros)

Si como sospecho son posibles valores (que se tomaran como referencia de otro sitio) si el 'dato' es el texto (calcio, magnesio ...) se le tendrá que pasar como cualquier texto (entre comillas) y siendo texto ¿Dónde interviene el booleano y ese 'yes' que se menciona? ....

Y si lo que se desea (si la SQL responde correctamente y filtra por el campo y de lo que se trata es de modificar valores (ya estaríamos hablado del campo Booleano) el dato que se le debe de asignar es numérico un cero para no y un -1 (u otro valor que no sea cero y este en el rango de los 'Long').

Tomando solo la parte que nos interesa (o me lo parece) debería quedar así:
...
& "SET [Muestras CI].NP= -1 WHERE (((ensayos.id_metodo)=42) AND ((parametros.parametro)='calcio'))"

Si se desease utilizar variables (sea porque se asigna un si/no a voluntad y el referente es modificable) quedaría algo asi:
En MiTestigo (booleano) el si o no (-1, 0)
En MiVariable (string) Calcio, Potasio ....
......
& "SET [Muestras CI].NP= " & MiTestigo & " WHERE (((ensayos.id_metodo)=42) AND ((parametros.parametro)='" & MIVariable & "'))"

Y si se trata de utilizar un campo diferente de la tabla habría que aclarar el entorno para poder indicar una sintaxis adecuada (normalmente se la trataría como String).

En vías de facilitar el uso de varias tablas (como es el caso presente con esas iterdependencias), indicar que solo se exige el nombre de la tabla (el 'apellido') si el nombre del campo esta en mas de una tabla de las que intervienen (el generador de consultas siempre utiliza la combinación tabla + campo, es porque así es mas fácil de generar: todas con la misma regla de construcción)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

nombre de campo y "&"

Publicado por Salvador (9 intervenciones) el 01/10/2017 12:11:13
Ok, te voy respondiendo:

"Esa estructura de tabla tiene definido un campo 'calcio' otro 'magnesio', otro .... o esos son valores que pueden estar (una vez unos, otra vez otros) en el mismo campo.... (deseo diferenciar si hablamos de campos o de valores en un mismo campo de diferentes registros)": Son campos de tipo sí/no dentro de la tabla [Muestras CI]

La tabla [Muestras CI] tiene varios campos de tipo sí/no: Calcio, Magnesio, Sodio...Lo que pretendo es una consulta que actualice estos campos (que fije su valor en sí/no) según ciertos criterios que figuran en la consulta. Como esta consulta debe ejecutarse para cada campo cada vez, lo que intento lograr es fijar el nombre del campo en una variable string (NP), y que se efectúe la consulta cada vez por cada valor diferente que tome esta variable. Esto no está todavía programado en la instrucción, he empezado por definir la variable NP con un valor fijo y que la sentencia SQL tome ese valor para el nombre del campo. Cuando lo consiga, ya automatizaré la asignación de la variable mediante un loop que tome los valores de otra tabla, o de algún otro modo.

Muchas gracias,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

nombre de campo y "&"

Publicado por Anonimo (942 intervenciones) el 01/10/2017 15:56:48
En base a esta ultima aclaración, la sintaxis que propongo es:

-- [original] --
.....

"SET [Muestras CI].NP= " & yes & " WHERE (((ensayos.id_metodo)=42) AND ((parametros.parametro)='calcio'))"

La propuesta
.- NP = variable tipo string con el nombre del campo
.- ZZZ = variable booleana con el valor a aplicar

.... su aplicación practica .....
"SET [Muestras CI].[" & NP & " = " & ZZZ & " WHERE (((ensayos.id_metodo)=42) AND ((parametros.parametro)='calcio'))"

Si el valor a asignar es siempre el mismo (pongamos que verdadero)

.... su aplicación practica .....
"SET [Muestras CI].[" & NP & " = -1 WHERE (((ensayos.id_metodo)=42) AND ((parametros.parametro)='calcio'))"


Solo a titulo de curiosidad ¿el diseño original esta basado en Excel?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

nombre de campo y "&"

Publicado por Salvador (9 intervenciones) el 01/10/2017 16:37:35
Lo siento, con SET [Muestras CI].[" & NP & "] = -1 da error de sintaxis también. Imagino que le faltaba el corchete de cierre, he probado con él y sin él de todos modos.

La consulta la he creado en access con el generador de consultas. En la vista SQL, he copiado el texto y lo he trasladado a VBA, en el evento al hacer clic de un botón de un formulario.

Manejo access 2003, por compatibilidad con otras bases de datos antiguas también programadas en 2003.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

nombre de campo y "&"

Publicado por Anonimo (942 intervenciones) el 01/10/2017 17:23:00
Una combinación de tres tablas (para crear un entorno similar al que se esta utilizando), una función para ejecutarla (crear un formulario para una consulta de ejecución me parece innecesario), a continuación la función:
1
2
3
Public Function CambiaElem(Elemento As String, valor As Long)
DoCmd.RunSQL "UPDATE Tbl_Familias RIGHT JOIN (Tbl_Secciones RIGHT JOIN Almacen ON Tbl_Secciones.ID_Seccion = Almacen.ID_Seccion) ON Tbl_Familias.ID_Familia = Tbl_Secciones.ID_Familia SET Almacen.[" & Elemento & "] = " & valor & " WHERE (((Tbl_Secciones.ID_Seccion)=50))"
End Function

Utilizando la ventana de inmediato, el campo 'usuales' es de tipo booleano:
1
?CambiaElem ("usuales", -1)

Se ha puesto un punto de interrupción para visualizar la SQL resultante con este resultado:
1
2
?"UPDATE Tbl_Familias RIGHT JOIN (Tbl_Secciones RIGHT JOIN Almacen ON Tbl_Secciones.ID_Seccion = Almacen.ID_Seccion) ON Tbl_Familias.ID_Familia = Tbl_Secciones.ID_Familia SET Almacen.[" & Elemento & "] = " & valor & " WHERE (((Tbl_Secciones.ID_Seccion)=50))"
UPDATE Tbl_Familias RIGHT JOIN (Tbl_Secciones RIGHT JOIN Almacen ON Tbl_Secciones.ID_Seccion = Almacen.ID_Seccion) ON Tbl_Familias.ID_Familia = Tbl_Secciones.ID_Familia SET Almacen.[usuales] = -1 WHERE (((Tbl_Secciones.ID_Seccion)=50))

La consulta se ejecuta y modifica (con los datos del ejemplo) los tres registros a los que afecta el filtro.


Nota: Access 2003 necesito mas de un parche (y un doble parche para el ultimo parche) para corregirle algún que otro vicio.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Revisar política de publicidad