Imprimir página | Cerrar ventana

Campo Calculado en tabla

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=84821
Fecha de impresión: 27/Marzo/2026 a las 02:08


Tema: Campo Calculado en tabla
Publicado por: maserrano
Asunto: Campo Calculado en tabla
Fecha de publicación: 13/Noviembre/2019 a las 14:23
Buenas tardes.
Tengo en una tabla un campo calculado que es una combinación  de otros dos campos de esa misma tabla y con un formato predeterminado.
Mi problema es que ese campo calculado deberá formar parte de una relación de "1a1" con otra tabla y por ser de tipo calculado no me deja hacer la relación.
Supongo que la solución es crear otro campo de texto y que la información del calculado se copie en ese nuevo campo.
También supongo que se debe hacer con un evento de después de actualizar el campo calculado en un formulario de esa tabla.
No sé cómo se hace que el valor de un campo se grabe en otro.
Por favor, me pueden ayudar.
Gracias por adelantado.



Respuestas:
Publicado por: maserrano
Fecha de publicación: 13/Noviembre/2019 a las 18:34
Alguna sugerencia por favor??
Sólo sé hacerlo cuando el campo se copia en otra tabla, no la misma,  con una sentencia así:

DoCmd.RunSQL "INSERT into Tabla2(prueba) select '" & Me.Idregistro & "'"

..., además me sale un mensaje de que voy a agregar un registro que no sé cómo quitar.
Pero copiar el valor de un campo (calculado) en otro campo de texto no sé hacerlo.



Publicado por: pitxiku
Fecha de publicación: 14/Noviembre/2019 a las 00:33
Dependiendo de la necesidad y ámbito (en la ventana relaciones de la base de datos, o sólo para una o alguna consulta en particular), una opción puede ser el usar los 2 campos originales en la relación:

SELECT UnCampo, OtroCampo FROM TABLA1 INNER JOIN TABLA2 ON TABLA1.CAMPO1 = (TABLA2.CAMPO2 + TABLA2.CAMPO3)

Eso sí, este tipo de relaciones no pueden verse en la ventana relaciones o en la ventana diseño de las consultas.

También puedes omitir la relación y usar los criterios para filtrar los resultados:

SELECT UnCampo, OtroCampo FROM TABLA1, TABLA2 WHERE TABLA1.CAMPO1 = (TABLA2.CAMPO2 + TABLA2.CAMPO3)


Publicado por: maserrano
Fecha de publicación: 14/Noviembre/2019 a las 09:31
Porqué las columnas calculadas no pueden usarse en relaciones del sistema?


Publicado por: JuanW
Fecha de publicación: 14/Noviembre/2019 a las 10:35
Puede haber otras explicaciones mejores y más técnicas, pero pienso en por ejemplo un calculo matemático ¿qué pasa si hay algun truncamiento o no en las cifras? Eso no seria exacto del todo como VALER para una relación 1a1.


Publicado por: maserrano
Fecha de publicación: 14/Noviembre/2019 a las 13:31
Bueno, la combinación del campo calculado no responde  a un cálculo matemático sino a una codificación alfanumérica, y esa codificación es la base de otra tabla, y, por ser campo calculado, no me deja relacionarla.

La solución no sé cómo hacerla. Por eso había pensado en que ese campo calculado se "copiara" en otro campo que a su vez sirviera de relación con la otra tabla.
Gracias, de nuevo.


Publicado por: lalo1956
Fecha de publicación: 14/Noviembre/2019 a las 16:25
Buen día, entiendo que a través de una consulta de datos anexados puedes calcular el campo y anexarlo a la tabla que deseas, saludos!

-------------
Quien no vive para servir, no sirve para vivir! http://www.mvp-access.com/foro/foroonline.htm" rel="nofollow -


Publicado por: pitxiku
Fecha de publicación: 14/Noviembre/2019 a las 19:05
Otra posibilidad, si usas formularios para crear los registros, es usar el evento Después de Actualizar de los controles donde están los datos que usas en el campo calculado, o el Antes de Actualizar del formulario, para hacer el cálculo y asignarlo al campo (no calculado), que luego usarás en la relación.


Publicado por: maserrano
Fecha de publicación: 14/Noviembre/2019 a las 23:04
Gracias pitxiku.
De eso se trata, pues uso formularios para los usuarios al ser un sistema pensado en tablas y aplicación (back/end). Lo que ocurre es que no me sale el código VBA a implementar. Una vez tengo el valor en el campo calculado, no se me copia en el campo que utilizaré como referencia en la relación.

He probado con Recordset haciendo DoCmd.RunCommand acCmdSelectRecord y no me sale;
también con DoCmd.RunSQL "INSERT into... y no me sale

... sé que cometo algún fallo o me estoy complicando en exceso... es por lo que pido que me iluminen. Gracias !!


Publicado por: pitxiku
Fecha de publicación: 15/Noviembre/2019 a las 00:00
Si usas formularios, no necesitas consultas SQL. O al menos, no de momento. Y menos una consulta INSERT INTO, que lo que hace es crear un registro nuevo.

Se trata de establecer el valor al campo. Por ejemplo, algo sencillo es una macro. En el evento Antes de Actualizar del formulario, podemos decir que se cree una macro, y que use la acción EstablecerValor:

- https://support.office.com/es-es/article/acci%C3%B3n-de-macro-establecervalor-36dfca71-0d8c-40fc-8b9f-31cfe5f48aab

Nota: Si no ves la acción, activa la opción del Ribbon "Mostrar todas las acciones".

En la macro indica el control calculado, y en dónde hay que indicar el valor, coloca el cálculo que haces, haciendo referencia a los controles del formulario.



Publicado por: maserrano
Fecha de publicación: 15/Noviembre/2019 a las 23:30
Hola.
La verdad, lo enfocaba a una solución VBA, aunque me puede valer. Pero, dándole vueltas he pensado en sacar el campo calculado de las tablas y colocarlo como un campo de formulario sin que ese valor se guarde en las tablas y luego ese valor pasarlo a las tablas. ..., no sé si me explico, pero algo así:

Tengo el valor1 y el valor2 (que formarán el valorResultado) con una máscara, además. "verifica" es un cuadro de texto que realiza la concatenación con la máscara.
Cuando relleno en formulario el valor2 coloco el evento de después de actualizar:

Private Sub valor2_AfterUpdate()

On Error GoTo lbl_err
Dim Rst As Recordset, _
    Marcador As Variant
Set Rst = Me.RecordsetClone

Rst.FindFirst "valorResultado= '" & Me.valorResultado & "'"
If Not Rst.NoMatch Then
   'Me.Undo
   Me.Bookmark = Rst.Bookmark
Else
    Me!valorResultado = Left(Me!verifica, 2) & "B/" & Mid(Me!verifica, 3, 2) & "." & Mid(Me!verifica, 5, 3) & "-" & Right(Me!verifica, 3)
    Me!verifica.Requery
    DoCmd.SetWarnings False
    DoCmd.SetWarnings True
    DoCmd.RunCommand acCmdSelectRecord
End If
Rst.Close
lbl_exit:
Exit Sub

lbl_err:
MsgBox Err.Description & "(" & Err.Number & ")"
Resume lbl_exit

End Sub

Funcionar, funciona, aunque debe ser más simple y no sé cómo.
El resultado es algo así, que es lo que busco:
valor1: 2940056
valor2: 003
ValorResultado: 29B/40.056-003

Salu2


Publicado por: pitxiku
Fecha de publicación: 16/Noviembre/2019 a las 19:14
- Si verifica es el campo calculado, en un principio ya no lo necesitas. Puedes usar los otros campos directamente:

Me!valorResultado = Left(Me!valor1, 2) & "B/" & Mid(Me!valor1, 3, 2) & "." & Mid(Me!valor1, 5, 3) & "-" & Me!valor2


- Al igual que antes, tampoco es necesario el Requery del verifica.

- Como no hay nada entre las 2 líneas SetWarnings, también las puedes omitir.

Pero si el código te funciona bien y hacer lo que necesitas, tampoco es muy necesario el modificarlo.



Publicado por: maserrano
Fecha de publicación: 17/Noviembre/2019 a las 00:33
Sí, si me funciona. He usado tu ejemplo pitxiku mucho más reducido pero no graba nada... no sé...


Uppss. Perdón si que va. Fallo en una letra.
Más elegante.

Muchas Gracias.



Publicado por: maserrano
Fecha de publicación: 18/Noviembre/2019 a las 21:03
Perdón. Supongo que el hilo se puede cerrar por lo menos por mi parte.
Gracias.



Imprimir página | Cerrar ventana