** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Campo Calculado en tabla
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoCampo Calculado en tabla

 Responder Responder
Autor
Mensaje
maserrano Ver desplegable
Colaborador
Colaborador


Unido: 02/Abril/2014
Localización: España
Estado: Sin conexión
Puntos: 683
Enlace directo a este mensaje Tema: Campo Calculado en tabla
    Enviado: 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.
Arriba
maserrano Ver desplegable
Colaborador
Colaborador


Unido: 02/Abril/2014
Localización: España
Estado: Sin conexión
Puntos: 683
Enlace directo a este mensaje Enviado: 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.

Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1510
Enlace directo a este mensaje Enviado: 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)
Arriba
maserrano Ver desplegable
Colaborador
Colaborador


Unido: 02/Abril/2014
Localización: España
Estado: Sin conexión
Puntos: 683
Enlace directo a este mensaje Enviado: 14/Noviembre/2019 a las 09:31
Porqué las columnas calculadas no pueden usarse en relaciones del sistema?
Arriba
JuanW Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 12/Mayo/2005
Localización: España
Estado: en línea
Puntos: 259
Enlace directo a este mensaje Enviado: 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.
Arriba
maserrano Ver desplegable
Colaborador
Colaborador


Unido: 02/Abril/2014
Localización: España
Estado: Sin conexión
Puntos: 683
Enlace directo a este mensaje Enviado: 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.
Arriba
lalo1956 Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 08/Marzo/2005
Localización: Mexico
Estado: Sin conexión
Puntos: 994
Enlace directo a este mensaje Enviado: 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!** AYUDA A MANTENER EL FORO **
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1510
Enlace directo a este mensaje Enviado: 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.

Editado por pitxiku - 14/Noviembre/2019 a las 19:06
Arriba
maserrano Ver desplegable
Colaborador
Colaborador


Unido: 02/Abril/2014
Localización: España
Estado: Sin conexión
Puntos: 683
Enlace directo a este mensaje Enviado: 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 !!
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1510
Enlace directo a este mensaje Enviado: 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.

Arriba
maserrano Ver desplegable
Colaborador
Colaborador


Unido: 02/Abril/2014
Localización: España
Estado: Sin conexión
Puntos: 683
Enlace directo a este mensaje Enviado: 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


Editado por maserrano - 15/Noviembre/2019 a las 23:35
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1510
Enlace directo a este mensaje Enviado: 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.

Arriba
maserrano Ver desplegable
Colaborador
Colaborador


Unido: 02/Abril/2014
Localización: España
Estado: Sin conexión
Puntos: 683
Enlace directo a este mensaje Enviado: 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.



Editado por maserrano - 17/Noviembre/2019 a las 00:39
Arriba
maserrano Ver desplegable
Colaborador
Colaborador


Unido: 02/Abril/2014
Localización: España
Estado: Sin conexión
Puntos: 683
Enlace directo a este mensaje Enviado: 18/Noviembre/2019 a las 21:03
Perdón. Supongo que el hilo se puede cerrar por lo menos por mi parte.
Gracias.
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable