Access - Como Juntar dos Tablas mediante consulta

 
Vista:
Imágen de perfil de Jorge

Como Juntar dos Tablas mediante consulta

Publicado por Jorge (7 intervenciones) el 15/11/2017 16:36:16
Hola a todos.

Vereis os cuento el caso.

Tengo 5 ficheros de excel que he importado en tablas en access.
hasta aqui todo correcto.

La tabla principal tiene una columna REFERENCIA que es comun en todas las tablas.
cada tabla tiene unos campos que he de adjuntar en una tabla global.

hasta aqui todo bien.

pero resulta que 2 tablas tienen la columna REFERENCIA el mismo codigo con diferentes lineas.

de este modo.


REFERENCIA COMPOSICION
10010 20 GRAMOS DE PARACETAMOL
10010 30 GRAMOS DE CODEINA
10010 20 GRAMOS DE PROTENINA


y aqui esta el problema.
no se como generar una tabla que haga lo siguiente:

REFERENCIA COMPOSICION
10010 20 GRAMOS DE PARACETAMOL, 30 GRAMOS DE CODEINA, 20 GRAMOS DE PROTENINA.

es decir que deje una sola referencia y si tiene 3 o mas lineas que el resultado sea una sola linea separada por una , o . da igual.

alguno sabe como poder hacer esto.
Gracias.
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

Como Juntar dos Tablas mediante consulta

Publicado por Anonimo (3396 intervenciones) el 15/11/2017 20:06:35
Se suele utilizar una función que encadene (en este caso las composiciones) que tengan la misma referencia

Si se utiliza en una consulta, se le 'pasaría' como referente la referencia
Si se desease aplicarlo a toda una tabla, lo optimo seria que la función recorriese el origen de datos y generase el nuevo campo (o registro en otra tabla) o se adaptase a la necesidad de ese entorno.

En cualquiera de los dos casos mencionados requeriría utilizar código y un poco de dominio de VBA para adaptarse a la necesidad.
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
Imágen de perfil de Jorge

Como Juntar dos Tablas mediante consulta

Publicado por Jorge (7 intervenciones) el 15/11/2017 22:03:49
Hola.
gracias por tu respuesta.
la verdad es que es un poco indiferente si se puede hacer en consulta, o bien que genere otra tabla.

El problema es que no se como confeccionar el codigo para que haga ese proceso.

si fueras tan amable de hacerme el diseño del codigo te estaria agradecido.
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

Como Juntar dos Tablas mediante consulta

Publicado por Anonimo (3396 intervenciones) el 16/11/2017 01:08:19
Desconociendo tu manejo de Access (y los datos reales de esa aplicación) solo puedo darte una estructura base

en este ejemplo se planteo el reconvertir toda una tabla, aunando el mismo campo de diferentes registros que tiene un referencia común.


.- Se dimensiona un recordset
.- Se el asigna como origen de datos una consulta que tenga por lo menos los campos 'referencia' y 'composicion' ordenados por referencia
.- Se dimensionan dos variables
..- una para obtener la cadena de texto final (el_resultado)
..- otra para llevar el control de la referencia actual (el_contador)

.- se carga el_contador con la primera referencia

.- Se inicia un bucle (vale cualquiera, un DO ... Loop por ejemplo)
.- se compara la referencia actual con el_contador
.- Si es la misma
...- se añade a el_resultado el valor de 'composicion' yel separador que se desee (comas, puntos guiones ...)

.- Si no es la misma (será porque comienza una referencia nueva)
..- se genera un nuevo registro con el_contador y el_resultado
..- se renueva a el_contador con el valor de 'referencia'
..- se le asigna a 'el resultado' el valor de 'composicion' (y asi ya sobrescribe el antiguo contenido)
.... fin de la comparación

.- si quedan mas registros se avanza al siguiente y se da una vuelta mas al bucle
.- si no quedan mas se genera un ultimo registro con el_contador y el_resultado
.- se cierra el recordset y se libera el espacio ocupado
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
Imágen de perfil de Jorge

Como Juntar dos Tablas mediante consulta

Publicado por Jorge (7 intervenciones) el 17/11/2017 21:04:22
Hola de nuevo.
mas o menos te entiendo pero un poco.

dime que datos necesitas para confeccionar la funcion y te los doy si no te importa, es que tampoco me aclaro mucho con lo que me dices arriba.

yo creí que sabia mas de access pero ahora me doy cuenta que me falta muuuuucho por aprender.

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

Como Juntar dos Tablas mediante consulta

Publicado por Anonimo (3396 intervenciones) el 17/11/2017 21:36:09
Exactamente que necesitas:

.- Generar esos datos para un historico (no se van a modificar los resultados)
Cuando se genere el historico ¿de que datos podriamos valernos para diferenciar lo 'viejo' y lo 'nuevo'? (fechas, IDs ... otra característica)

.- Generar esos datos de forma dinamica (esto es: se le indica de que registro y el devuelve esos datos actualizados), para ver 'conjuntos' se utilizaria una consulta

Y como comentario adicional, lo publicado en el post anterior no 'es Access' es un simil a un diagrama de flujo que es valido para cualquier entorno de bases de datos

En funcion de lo que se necesite, se solicitaria los datos auxiliares.
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
Imágen de perfil de Jorge

Como Juntar dos Tablas mediante consulta

Publicado por Jorge (7 intervenciones) el 18/11/2017 12:41:04
Hola de nuevo.
mira lo que yo tengo y necesito es lo siguiente:
te lo voy subien en imagenes.

Tengo una tabla PRODUCTOS2
que contiene varios ingredientes de un mismo codigo.

Screenshot_63

y necesito generar otra tabla con un solo cogido y concatenar o juntar los ingredientes de tal forma:

que quedara:

codigo-------------------Ingredientes
100 ---------------------- Extracto fluido de cola de caballo (equisetum arvense, tallos y hojas) - Fructosa - Otros ingredientes: agua, dióxido de silicio, regulador de la acidez (ácido cítrico), saborizante (aroma de limón), conservante (sorbato potásico)


Los ingredientes, bien separados por , o por - me es indiferente.

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

Como Juntar dos Tablas mediante consulta

Publicado por Anonimo (3396 intervenciones) el 19/11/2017 00:39:14
En un modulo publico, o en un formulario o (quitando las referencias a la funcion) como codigo en el evento click de un boton, el siguiente codigo (que he intentado comentar para qiue puedas ajustarlo a tu necesidad) cumple con lo solicitado.

He considerado que sera una tabla temporal y la he reutilizado, si su cometido fuera otro (historico ... ) habria que crear condicionates en el origen de datos del recordset

Esta basada (con mejor o peror exito) en la imagen publicada de la que se deduce que 'ingredientes', 'especificaciones' y 'especificaci' son campos de texto, el resto numericos

el codigo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Public Function Convierte()
Dim T_Tabla As DAO.Recordset, Texto_Fin As String, T_Control As Long
'se presupone la existencia de una tabla  (T_Destino) que es copia fiel (sin datos) de la tabla ingredientes
'los campos de tipo autonumerico se convertiran a tipo Long (en la copia) para conservar ese numero, no afecta al dato ni su utilidad
'.....
' limpiamos la tabla (se presupone que su vida y funcionalidad es temporal)
CurrentDb.Execute "Delete * From T_Destino"
'asignamos origen al recorset
Set T_Tabla = CurrentDb.OpenRecordset("Select * From Ingredientes Order By ID", , dbReadOnly)
'lo aplicamos por defecto
With T_Tabla
'si hay registros, 'agitamos' el recordset, si no los hay salimos
If .RecordCount <> 0 Then .MoveLast: .MoveFirst Else Exit Function
'inicializamos el testigo
T_Control = !Codigo
'comenzamos un bucle que recorrera todos los registros
Do Until .EOF
'verificamos si el caodigo es el mismo que el memorizado
If !Codigo = T_Control Then
    'lo es, verificamos si la cadena de texto tiene contenido
    'si lo tiene le añadimos el separador
    If Texto_Fin <> "" Then Texto_Fin = Texto_Fin & ", "
    'concatenamos el valor
    Texto_Fin = Texto_Fin & !Ingredientes
    Else
    'es un nuevo codigo, lo memorizamos
    T_Control = !Codigo
    ' y retrocedemos al registro anterior para tomar sus datos
    .MovePrevious
    'copiamos los valores a la nueva tabla pero modificando el campo ingredientes
    CurrentDb.Execute "Insert into T_Destino (ID, Codigo, Linea, Ingredientes, mgCapsula, especficaciones, Porcentaje, Gramos, Calorias, Especificaci) Values (" & !id & ", " & !Codigo & ", " & !Linea & ", '" & Texto_Fin & "', " & !mgCapsula & ", '" & !especficaciones & "', " & !Porcentaje & ", " & !Gramos & ", " & !Calorias & ", '" & !Especificaci & "')"
    'limpiamos la variable de texto para preparala para el siguiente registro
    Texto_Fin = ""
    End If
'nos desplazamos al siguiente registro
.MoveNext
Loop
'en este punto no hay mas registros, asi que retrocedemos uno (vamos al ultimo) para copiar sus valores
.MovePrevious
' y lo insertamos tambien
CurrentDb.Execute "Insert into T_Destino (ID, Codigo, Linea, Ingredientes, mgCapsula, especficaciones, Porcentaje, Gramos, Calorias, Especificaci) Values (" & !id & ", " & !Codigo & ", " & !Linea & ", '" & Texto_Fin & "', " & !mgCapsula & ", '" & !especficaciones & "', " & !Porcentaje & ", " & !Gramos & ", " & !Calorias & ", '" & !Especificaci & "')"'cerramos la tabla
.Close
'eliminamos la asignacion por defecto
End With
End Function

Como hay que aunar todos los campos (para comprimir en uno los ingredientes), por comodidad he utilizado el ultimo de cada conjunto como referente (lo cual pudiera producir perdida de datos) pero eso dependera del uso que se desee hacer de esa informacion (y que se desconoce, lo que impide evaluar el caso)

es una funcion, asi que para 'ejecutarla' (si se esta en su ambito) simplemente se la llama, algo asi:
Convierte()
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