Access, Consultas o VBA - Combinar Campos en una consulta en función de una regla definida en un campo externo

Me gustaría saber cómo puedo editar por VBA una fórmula definida en un campo de una consulta.

Esto me sería útil para definir reglas de nombrado de elementos que combinen varios campos o parte de campos de manera externa sin tener que entrar a la edición de las consultas.

Quiero implementar una librería de reglas de nombrado, de esta manera el usuario normal seleccionaría cuál le aplicaría con un solo click.

Respuesta
2

No me queda muy claro lo que pretendes hacer, pero te voy a explicar una forma en que puedes modificar, desde VBA el diseño de una consulta:

Supongamos que tienes una consulta en tu BD llamada, en un alarde de originalidad, "Consulta1", que selecciona X campos de una tabla "TDatos1".

Dentro de un procedimiento de VBA, puedes hacer los siguiente:

Dim miSQL as String
miSQL="SELECT * FROM TDatos2 ORDER BY Campo1"
CurrentDb.QueryDefs("Consulta1").SQL = miSQL 

Y al ejecutar la consulta verás que en vez de mostrarte los datos iniciales de la tabla TDatos1, ahora muestra los datos de la tabla TDatos2.

Con esto que te explico, intuyo que no tendrás problema en realizar lo que pides y modificar en tu consulta la fórmula de tu campo como y cuando quieras. Y si tienes cualquier problema, me comentas y vemos.

Hola Sveinbjorn,

No es exactamente lo que necesito en esta ocasión.

En otras palabras, lo que necesito es editar únicamente la fórmula de una única expresión en una consulta ya creada sin tener que definir la consulta entera en VBA. 

Por ejemplo, cambiar; "Expr: [Campo1] & [Campo2]"

por; "Expr: [Campo5] & "_" & Siinm(Izquierda([Campo6],3)="ABC";"1";"2")"

muchas gracias por tomarte las molestias en ayudarme,

Un saludo

Modificar un único campo calculado de una consulta es modificar su SQL, luego mi propuesta inicial es perfectamente válida para lo que quieres hacer.

Afinando un poco más, podrías crear un procedimiento al que le pases la expresión de cálculo del campo, y opcionalmente el nombre que quieres para ese campo (por si lo quieres modificar también), y dentro del procedimiento tienes la parte "fija" de la SQL. Algo así:

Public Sub modificaConsulta(laExpresion As String, Optional elNomCampo As String)
Const SQL1 As String="SELECT Campo1, Campo2, " 'Aquí irían el SELECT y los campos que vaya a mostrar la consulta hasta el campo calculado (fíjate que acaba con coma (,) y espacio ( ) antes de las comillas)
Const SQL2 As String=" , Campo X, CampoY FROM Tabla WHERE... Order BY..." 'Aquí iría el resto de la SQL (campos que siguen al calculado, si los hay, el FROM y en su caso el WHERE y ORDER BY que tenga tu SQL). Fíjate que empieza con un espacio ( ) y una coma (,), pero si después del campo calculado a modificar ya va el FROM, quita la coma)
If Nz(elNomCampo,"")="" Then elNomCampo="Expr"
CurrentDb.Querydefs("TuConsulta").SQL=SQL1 & laExpresion & " AS " & elNomCampo & SQL2
End Sub

Un detalle a tener en cuenta es que la expresión del nuevo campo la tienes que hacer como si la hicieras directamente en la SQL del editor de consultas, es decir, has de usar las funciones con los nombres en inglés, la coma como separador, las comillas dobles cambiarlas por comillas simples...

Usando el ejemplo que propones, si la consulta actual fuera (marco en negrita el campo calculado):

SELECT Campo1, Campo2, Campo3, Campo1 & Campo2 AS Expr FROM TuTabla ORDER BY Campo1

El procedimiento que tienes que poner, para este caso es:

Public Sub modificaConsulta(laExpresion As String, Optional elNomCampo As String)
Const SQL1 As String="SELECT Campo1, Campo2, Campo3 " 
Const SQL2 As String=" FROM TuTabla  Order BY Campo1" 
If Nz(elNomCampo,"")="" Then elNomCampo="Expr"
CurrentDb.Querydefs("TuConsulta").SQL=SQL1 & laExpresion & " AS " & elNomCampo & SQL2
End Sub

Cuando quieras cambiar el campo calculado, llamarías al procedimiento así (te dejaría como nombre "Expr")

modificaConsulta("[Campo5] & '_' & IIf(Left([Campo6],3)='ABC','1','2')")

o así, si le quieres dar otro nombre al campo calculado:

modificaConsulta("[Campo5] & '_' & IIf(Left([Campo6],3)='ABC','1','2')", "NuevoCampo")

Obviamente lo puedes hacer desde un formulario, con un cuadro de texto (txtExpresion) donde pongas la expresión nueva (ahí sí podrías usar comillas dobles, pero el separador seguiría siendo la coma y los nombres de las funciones en inglés) y opcionalmente otro cuadro de texto (txtNuevoNom) para el nombre,

Y llamarías al procedimiento así (si no pones el segundo cuadro de texto):

ModificaConsulta(Me.txtExpresion)

O así (si lo pones):

ModificaConsulta(Me.txtExpresion, Nz(Me.txtNuevoNom))

Que artista!! Muchas gracias!

Pensaba que sería algo más directo sin tener que replicar la consulta entera en VBA, pero me vale ;) 

La consulta que tengo ahora casi tiene el límite de campos admitidos y recrearla en VBA son muchas líneas; me crearé una consulta previa sólo con los campos que quiero editar y ésta será la que vaya editando.

Gracias de nuevo!

Saludos

Hola de nuevo Sveinbjorn,

Al hilo de este tema, me gustaría hacer más flexible la rutina... es decir no quiero fijar por código el SQL de una consulta ya que si hago cambios en la consulta me vería obligado a hacerlo también en el código; ... y se me podría pasar.

¿Hay alguna manera de "capturar" en una variable string el código SQL de una consulta existente?

Si lo capturo me buscaría la vida para hacer un Replace() sobre la variable string y cargar el código SQL modificado.

Gracias

Te escribo sin probarlo, pero seguramente funcione:

Si con:

CurrentDb.Querydefs("TuConsulta").SQL="SELECT...."  

Asignas a la consulta TuConsulta la SQL que sigue al signo igual, al revés también debería trabajar, es decir, que podrías intentarlo con:

Dim SQLOriginal As String

SQLOriginal=CurrentDb.Querydefs("TuConsulta").SQL

En teoría, la variable SQLOriginal mostraría la SQL de la consulta

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas