Transponer una tabla de Access

Tengo la siguiente tabla, y me gustaría pasar todas las columnas a una única fila. Me explico. En la imagen que adjunto, necesito transformar esta tabla de manera que me quede:

- 1er campo: idnc ->52

- 2º campo: el primer registro de "área_afectada" ->Ingeniería eléctrica

- 3er campo: el primer registro de "horas internas" -> 80

- 4º campo: el primer registro de "coste_hora" -> 25

- 5º campo: el primer registro de "coste_externo" -> NULL

- 6º campo: el primer registro de "observaciones" -> "tiempos de inactiviada..."

- 7º campo: el segundo registro de "área_afectada" -> montaje y PAP

- 8º campo: el segundo registro de "horas_internas" -> 200

- Etc

En esta tabla tengo más registros, y no siempre hay 4 con el mismo "idnc", a veces hay 1 registro, a veces 2, y a veces 3. No creo que tenga más de 4.

Mi idea es conseguir una tabla en la que todos los registros referentes al mismo "idnc", en este caso 52, estén en la misma fila, ya que de esta manera puede referencia todos esos valores desde otras tablas.

Si a alguien se le ocurre otra forma de hacerlo, y más sencilla, también me vale.

Gracias

2 Respuestas

Respuesta
1

Por más que lo leo no entiendo nada de lo que tienes ni de lo que quieres tener. Si puedes poner un ejemplo en una hoja de excel con la tabla como la tienes y con cómo quieres que te quede, quizás me sirva para darte alguna indicación.

Hola,

la idea es convertir la tabla1 en tabla 2. El campo id de la tabla 1 no me hace falta pasarlo a la tabla2. Cuando digo tabla, puede ser una consulta. El tema es que el campo idnc de la tabla1 es mi identificador único para realizar otra consulta, en la que quiero que aparezcan los datos en un único registro, como en la tabla2.

Gracias

Como la explicación es un poco larga, te adjunto un ejemplo, con el código explicado: http://filebig.net/files/2ijvEiTBMW

Como te menciono en él, igual te es más sencillo trabajar con consultas de referencias cruzadas, como la que te incluyo para las horas.

Un saludo


¡Gracias! 

Hola otra vez,

me ha funcionado muy bien tu solución, pero ahora me encuentro con otro problema. En la tabla original, no siempre hay datos para cada idnc. Ejemplo: vienen horas puestas, pero el área está en blanco. O al revés, el área está puesta, pero las horas están en blanco. Ahora mismo, si ejecuto lo que me diste, me da un error en la sintaxis UPDATE, y no continua ejecutando la tabla.

Cómo puedo hacer que en esos casos, en los que no hay información, no ponga nada y siga ejecutando la rutina?

Gracias.

Dos opciones:

1º/ Para que no si no hay horas, te ponga el concepto y deje las horas en blanco, o si no hay concepto te lo deje en blanco y ponga las horas, cambia las líneas del "Do Until rst2.EOF" por las que siguen:

    Do Until rst2.EOF
        'rst2(0) es el primer campo (area), rst(1) el segundo (horas)....
        If Not IsNull(rst2(0)) Then CurrentDb.Execute "UPDATE TTraspuesta SET " & rst2(0).Name & i & "='" & rst2(0) & "' WHERE idnc=" & rst("idnc")
        If Not IsNull(rst2(1)) Then CurrentDb.Execute "UPDATE TTraspuesta SET " & rst2(1).Name & i & "=" & rst2(1) & " WHERE idnc=" & rst("idnc")
        rst2.MoveNext
        i = i + 1
    Loop

2º/ Si quieres que en caso de que si falta uno de los dos (concepto u horas) no te ponga nada, cambia esas lineas por estas otras:

    Do Until rst2.EOF
        'rst2(0) es el primer campo (area), rst(1) el segundo (horas)....
        If Not IsNull(rst2(0)) And Not IsNull(rst2(1)) Then
            CurrentDb.Execute "UPDATE TTraspuesta SET " & rst2(0).Name & i & "='" & rst2(0) & "'," & _
                            rst2(1).Name & i & "=" & rst2(1) & " WHERE idnc=" & rst("idnc")
        End If
        rst2.MoveNext
        i = i + 1
    Loop

A ver si así te vale.

Un saludo


Hola otra vez,

comentarte que me funciona bien, pero ahora me han cambiado el tipo de datos, y no consigo acertar el cómo modificar. En el ejemplo que te envié, las horas eran enteros, es decir, sin decimales, pero ahora aparecen con decimales. Qué tengo que cambiar en el código del evento para que funcione? Es decir, donde antes aparecía 45, ahora es 45'4.

Gracias

En el campo que tiene las horas utiliza la función Replace() para cambiar la coma decimal por un punto, porque imagino que así tal cual te da un error de sintaxis en la SQL.

Hola,

ya lo siento, pero no sé ni dónde ni cómo poner la función Replace(). Te paso el fallo que me da, el código que me dejaste para realizar la operación, y un ejemplo de cuáles son los datos.

Gracias.

Tienes que hacer dos cambios al código original de mi ejemplo (imagino que si no lo cambiaste mucho serán los mismos en el tuyo)

1º/ Al principio, donde creamos la tabla traspuesta, donde pongo:

For i = 1 To numRegistros
miSQL = miSQL & "area" & i & " STRING(25), horas" & i & " INTEGER,"
Next i

tienes que cambiarlo a para que las horas admitan decimales:

For i = 1 To numRegistros
miSQL = miSQL & "area" & i & " STRING(25), horas" & i & " DOUBLE,"
Next i

2º/ Donde haces el traspaso, cambia:

CurrentDb.Execute "UPDATE TTraspuesta SET " & rst2(0).Name & i & "='" & rst2(0) & "'," & _
rst2(1).Name & i & "=" & rst2(1) & " WHERE idnc=" & rst("idnc")

por esto:

CurrentDb.Execute "UPDATE TTraspuesta SET " & rst2(0).Name & i & "='" & rst2(0) & "'," & _
rst2(1).Name & i & "=" & Replace(rst2(1), ",", ".") & " WHERE idnc=" & rst("idnc")

Y consulta la ayuda de la función replace() para que entiendas su uso.

Un saludo


Hola Sveinbjorn,

ya he realizado el cambio que me comentas, y ahora me sale otro fallo, que intuyo que es debido a que comoo no todos los campos tienen decimales (coste hora en muchos campos es 25) devuelve un error cuando no localiza la coma para sustituir.

Qué debo hacer en este caso?

El error no tiene nada que ver con lo que supones: si replace no encuentra una coma, no hace nada.

El problema está en que tienes "actividades" (o lo que sea, no recuerdo lo que son) que no tienen horas. Eso lo solucionas usando Nz() para ponerle 0 horas.

.... Replace(Nz(rst2(1), 0), ",", ".")...

Veo en tu código que usas 3 veces replace(), en principio no es incorrecto (tu sabrás si es necesario), pero solo te haría falta en aquellos campos con valores numéricos o moneda, que puedan contener valores decimales.

Respuesta
1

Vamos a suponer que tienes una tabla Yoquese, donde vas a poner en horizontal los campos. Voy a poner nombre sencillos y luego tu lo adaptas a los tuyos. Supongamos que la tabla tiene los campos Idloquesea, norte1, sur1, este1. Oeste1, norte2, sur2.. y así hasta lo que quieras. Supongamos también, por comodidad, que los cuadro de texto del formulario Otra se llaman Norte, sur, este, oeste. Pon un botón de comando y en sus propiedades-eventos-al hacer clic pon

DoCmd.SetWarnings False
DoCmd.GoToRecord , , acFirst
DoCmd.RunSQL "insert into yoquese(idloquesea)values('" & Me.Idloquesea & "')"
Dim i As Integer
For i = 1 To Form.Recordset.RecordCount
DoCmd.RunSQL "update yoquese set norte" & i & "=forms!otra!norte, sur" & i & "=forms!otra!sur, este" & i & "=forms!otra!este, oeste" & i & ")forms!otra!oeste where idloquesea=forms!otra!idloquesea"
DoCmd.GoToRecord , , acNext
Next

Así, cuando pulses el botón, primero te insertara en la tabla el valor Idloquesea, en tu caso Idnc, después ira recorriendo los registros insertando en los diferentes norte1, sur2, etc los valores de los registros

De todas formas, si ves que te lías y quieres, mándame un mensaje a [email protected] y te mando un ejemplo. Si lo haces, en el asunto del mensaje pon tu alias Gafis, ya que si no sé quien me escribe ni los abro.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas