Como buscar si existe registro en otra tabla y traer el valor de otra columna

De su apoyo. Tengo la Tabla A con el campo [Folio] y [Estatus], tengo la Tabla B con el campo [Folio] y [Estatus].

Lo que busco es actualizar la Tabla B, que me busque en la Tabla A el [Folio] y que me ponga el [Estatus].

¿Seria algo con DLookup o no?.

Respuesta
2

Te digo lo que haría. Convertir el control Folio en un combinado y en sus propiedades-Datos-origen de la fila poner

Select Folio from tablaA group by folio

Y en el evento Después de actualizar del combinado( estamos hablando en un formulario basado en la tabla B), crear un procedimiento de evento y entre Private Sub y End Sub poner

estatus=Dlookup("estatus","tablaA","folio='" & me.folio & "'"

Estoy suponiendo que Folio es texto. Si fuera numérico sería

.........."Folio=" & me.folio & ""

También puedes poner el combinado folio con origen de la filacomo

Select folio, estatus from TablaA, y poner en sus propiedades-Formato-Número de columnas 2

Y en ancho de las columnas, 4;0( así ocultas la columna Estatus), y poner en el evento después de actualizar

Estatus="" & me.folio.column(1) & ""

Gracias!.

Lo que pasa es que ya no voy a utilizer más la Tabla A, ahora estaré utilizando la Tabla B, lo único que quiero es buscar todos los folios de la table B (registros nuevos) en la table vieja para traer el estatus del registro Viejo.

Esto solo lo haré una vez, solo para actualizar mi nueva Tabla.

Tabla A

Tabla B

Tabla B despues de hacer la busqueda y actualizacion

Como te comento solo lo haré una vez.

Mira esto es lo que llevo, no se si es la major manera

Gracias

Hacer se puede hacer, pero si me permites un consejo. El lenguaje SQL es infinitamente menos versátil que el VB. Por otro lado, las consultas sólo "funcionan" cuando las tablas tienen datos y para eso hay que "llenarlas". Pienso que es preferible hacer las cosas cuando precisamente se están alimentando las tablas. Si tengo la tabla TablaA

Donde le he dejado un par de ellos abiertos para que veas como van cogiendo valor. Y tengo el formulario basado en la tabla B, donde he sustituido el cuadro de texto Folio en un combinado en cuyo origen de la fila le he puesto

SELECT Folio FROM TablaA GROUP BY Folio;

De forma, que si elijo uno

Me va poniendo el valor de Estatus de la tabla A

El código del evento Después de actualizar del combinado Folio es

Private Sub Folio_AfterUpdate()
Estatus = DLookup("estatus", "tablaa", "folio=" & Me.Folio & "")
End Sub

Muchas Gracias.

Entiendo y ya realice la prueba para ver como funciona tu procedimiento y funciona sin problemas.

Te platico mi situación:

Tenia un formulario con su tabla (Tabla A) en el que creaba mis registros por medio del formulario y ponía cuanto me tardaba en abrir y cerrar mi proceso.

Ahora me mandan un archivo de excel con todos estros registros los cuales importo a una tabla (Tabla B) (no se duplican) y por medio de un formulario indico solo inicio y fin de mi proceso.

El problema que tengo es que al momento de importar mis registros tengo registros viejos, pero no tienen fecha de inicio ni de fin, lo que quiero es traerme esos datos de la tabla vieja a la tabla nueva y dejarlos guardados ahí por siempre, para eliminar mi (Tabla A).

Entonces no necesitas nada de lo anterior. Basta con poner en cualquier evento( por ejemplo, en el evento al hacer clic de un formulario cualquiera)

docmd.runsql"insert into tablaB select Folio,Estatus select * from TablaA"

O de otra forma. Con la tabla A crea una consulta de datos anexados a la tablaB. Para ello, con el asistente crea un consulta con la tablaA y en la parte gris de la derecha haz clic con el botón derecho del ratón y selecciona

Luego en la ventana que te aparezca seleccionas TablaB y luego ejecutas.

Julián gracias,

Mil disculpas, no logro entenderte y me desespero porque creo es algo muy sencillo lo que me tratas de explicar, pero es que no tengo cabeza.

Le doy vueltas, a ver si ahora tengo una Tabla B - la cual es mi tabla nueva con el campo ClaveCompDelivery (Tipo Long Text).

Y tengo una Tabla C en la cual tengo una clave única (tipo LongText) llamada ClaveCompDelivery.

Lo que necesito es si la ClaveCompDelivery de la Tabla B esta en la Tbla C, traer a la Tabla B, el campo Estatus de la Tabla C.

Lo de la consulta de anexar, entiendo que me va a traer todo el registro, lo único que quiero es actualizar el campo Estatus, ya que tengo más columnas.

Una disculpa nuevamente y espero ppuedas ayudarme.

Vamos a ver si lo he entendido. Tengo la tablaC que tiene ese campo texto largo

No iba a rellenar 500 dígitos

Y tengo la tabla B donde sólo coincidirían 2

Creo una consulta de actualización como

Cuando la ejecuto, la tablaB me queda como

No se como expresarme jejej por fin pero he visto la luz, muchas gracias!

Todo hace sentido ahora y me queda claro y lo entiendo.

Muchas Gracias y disculpa tantas preguntas pero es que estaba frustrado !

Hola Julián.

¿Disculpa te pregunte en este post pero esta muy relacionada la pregunta o prefieres haga otra pegunta?

Siguiendo con la solución con la que me apoyaste, como la podrías hacer en código pero para actualizar el campo [Estatus] de la [Tabla B] siempre y cuando el campo [Estatus] de la [Tabla B] sea diferente al campo [Estatus] de la [Tabla C]?. Creo la instrucción debería de ser, busca la clavecompdelivery de la tabla b en la tabla c y actualiza el campo estatus de la tabla b siempre y cuando sea diferente al campo estatus de la tabla c.

Mira como ejemplo, los únicos registros que se tendrían que actualizar serian 1,2 (ya que en la tabla c estaba Cerrado) y 4

debería de quedar así la tabla B al final de correr el código

Muchas Gracias.

Lo que importa es ¿Desde dónde vas a hacerlo?. Por ejemplo, si tengo la tabla B

y la tablaC

Vamos a suponer que en un formulario cualquiera, le pongo un botón

Cuando lo pulso me deja la tablaB como

En este caso, el código del evento Al hacer clic del botón es

Private Sub Comando0_Click()
DoCmd.SetWarnings False
DoCmd.runbsql "UPDATE TablaB, TablaC SET TablaB.Estatus = [tablac].[estatus] WHERE TablaB.ClaveComp=tablac.clavecomp"
End Sub

Pero vamos a suponer que lo quieres hacer desde el mismo formulario donde vas poniendo datos en la TablaC

Cuando pulso el botón hace exactamente lo mismo, pero en este caso le digo que vaya recorriendo los registros y que vaya actualizando la tablaB, no sería necesario hacerlo así, pero queda bonito ver como va recorriendo los registros.

Private Sub Comando5_Click()
DoCmd.SetWarnings False
Dim I As Integer
DoCmd.GoToRecord , , acFirst
For I = 1 To Me.Recordset.RecordCount
DoCmd.RunSQL "update tablab set estatus='" & Me.Estatus & "' where clavecomp='" & Me.ClaveComp & "'"
DoCmd.GoToRecord , , acNext
Next
End Sub

Muchas Gracias ya entiendi el código.

Seria desde un botón en mi formulario, veo que actualizas literal toda la columna estatus de la tabla b, con el valor de la columna estatus de la tabla c.

Como podríamos actualizar solo los registros que el valor de la columna estatus de la tabla b sea diferente al valor de la columna estatus de la tabla c.

Pienso en algo como primero una consulta y después con el resultado actualizar:

Actualiza [TablaB]![Estatus] con [TablaC]![Estatus] cuando [TablaB]![Estatus] sea diferente a [TablaC]![Estatus] y el campo [TablaB]![ClaveCompDelivery] = [TablaC]1[ClaveCompDelivery]

No se cual seria el operador o la sintaxys correcta.

Te pregunto porque tengo 20 mil registros en mi tabla b y voy aumetando de 500 diarios (ejemplo).

Todo esto viene ya que Importo desde un archivo de excel a mi tabla C, después elimino duplicados, y por ultimo agreo a mi tabla B los registros restantes y ahora me gustaría actualizar el estatus solo de los registros que cambia este campo.

Para que sólo te actualice los distintos o "vacíos" ponlo como

Private Sub Comando0_Click()
DoCmd.SetWarnings False
DoCmd.RunSQL "UPDATE TablaB LEFT JOIN TablaC ON TablaB.ClaveComp = TablaC.ClaveComp SET TablaB.Estatus = tablac.estatus" _
& " WHERE TablaB.Estatus<>tablac.estatus OR TablaB.Estatus Is Null Or TablaB.Estatus="""""
End Sub

A partir del Or es para "cubrir" la posibilidad de que el campo Estatus de la tablaB esté vacío(null) o que hubiera tenido algún valor y lo hubieras borrado("""")

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas