Rellenar campo con registro anterior

Estoy importando un txt a una tabla de access pero le tengo que hacer unos arreglillos para que me sea útil. El txt sería más o menos así:

Autorizado fecha importe

123 2013/02/18 200,00

2013/01/15 145,32

2013/01/10 342,34

431 2013/01/02 234,23

532 2013/02/12 122,22

En primer lugar necesitaría rellenar el campo autorizado en los registros que están vacíos. Para ello debería tomar el último registro que tiene relleno ese campo.

En segundo lugar, no me deja importar con formato fecha el campo FECHA, porque está en formato americano. La única solución que he encontrado es pasarlo con formato texto, pero claro, esto me generaría problemas a la hora de realizar filtros, al no tener las opciones correspondientes a los campos FECHA.

He estado intentando hacer tanto una cosa como la otra a través de consultas de actualización, pero en el primer caso no sé cómo poner la instrucción para que busque el último campo relleno. Sobre el campo fecha, había pensado en una chapucilla, que sería importar el campo con formato texto, actualizarlo de forma que ponga las 4 primeras cifras al final, las del medio al principio y las últimas en el centro, y después pasarlo a otra tabla en la que ya le pondría el formato FECHA, pero creo que es un jaleo y supongo que debe haber una forma más sencilla.

2 Respuestas

Respuesta
1

Esto solo se podrá lograr a través de código VBA, ya que habrán cosas que no se pueden hacer con simples consultas de access.

Que haría yo. Primero utilizar una tabla de paso con los datos importados en bruto.

Luego a través de un cuadro combinado llamar a esos datos con el fin de recorrerlos a través de un ciclo for. E ir ordenando la cosa. 1 a 1. ir agregando los registros en la tabla definitiva a través de este ciclo for. Esto sería de la siguiente forma.

Para rellenar el campo Vacío.

1. Al recorrer el cuadro combinado con los datos preguntas

Cuenta_Registros=Lista_Importes_autorizados.Listcount

For I=1 to Cuenta_Registros

Lista_Importes_Autorizados=Lista_Importes_Autorizados.itemData(i-1)

AUTORIZADO=Lista_Importes_Autorizados.Column(1)

FECHA_ACTUAL=Lista_Importes_Autorizados.Column(2)

IMPORTE_ACTUAL=Lista_Importes_Atorizados.Column(3)

if (AUTORIZADO)<>Null then

Autorizado_Activo=AUTORIZADO

End if

If Isnull(AUTORIZADO) then

Autorizado_Cuadro_texto=Autorizado_Activo

Else

Autorizado_Cuadro_Texto=AUTORIZADO

End if

Fecha_Cuadro_Texto=CDate(Mid(FECHA_ACTUAL,9,2)&/&Mid(FECHA_ACTUAL,7,2)&/&Mid(FECHA_ACTUAL,1,4))

Importe_Cuadro_Texto=IMPORTE_ACTUAL

Next

Dim stCodName as string

stDocName="Anexa_Importe"

Docmd.Setwarning false

DoCmd.Openquery stDocName, AcNormal, AcEdit

DoCmd.Setwarning true

2. Te informo que todos los campos que los Cuadro_texto, son cuadros de texto reales que debes crean en un formulario y si quieres los ocultas en estado invisible

3. Cada vez que se ejecute se pase un ciclo el ciclo for debes ejecutar una consulta de inserción de datos para ir agregando el resultado de tu código

3. La consulta "Anexa_Importe" que ejecuta en este ultimo paso es la que irá agregando los datos ingresados en el formulario específicamente en los cuadros de textos llenados con cada iteración del ciclo for.

Esta es una solución que podría solucionar tu problema. Ahora queda hacer el formulario para ir ordenando los datos y la consulta para ir anexando los datos a la tabla definitiva.

También deberás hacer una tabla de paso para obviamente cargar esos datos en la nueva tabla definitiva.

Mira si deseas ayuda con esto puedes contactarte a mis correo: [email protected] allí afinaremos detalles y podré ayudarte con más detención.

Respuesta
1

Con este código, se te rellenan los huecos:

Dim rst As Recordset
Dim vAutorizado As String
Set rst = CurrentDb.OpenRecordset("NombreTabla", dbOpenDynaset)
If rst.RecordCount = 0 Then Exit Sub
rst.MoveFirst
vAutorizado = rst("AUTORIZADO")
Do Until rst.EOF
If IsNull(rst("Autorizado").Value) Then
rst.Edit
rst("AUTORIZADO") = vAutorizado
rst.Update
End If
vAutorizado = rst("AUTORIZADO")
rst.MoveNext
Loop
rst.Close
Set rst = Nothing

Evidentemente, tendrás que cambiar lo que está en negrita por el nombre de la tabla a donde importas los datos, y si los nombres del campo AUTORIZADO tampoco es el de tu tabla, pues también.

Si este código se lo añades al otro que te propuse para automatizar la importación, o al que uses, matas dos pájaros de un tiro.

En cuanto a la otra pregunta, la del filtro, efectivamente, al cerrarla ya no te puedo contestar. De momento no conseguí nada. Tengo un par de pruebas pendientes para probar dos cosas que se me ocurrieron. Deja esta pregunta a vierta, y esta tarde-noche, te digo si encontré alguna solución.

Me temo que no encontré ninguna solución directa a tu problema del filtro. Pero, te comento una solución "alternativa" por si te sirve.

Primero tienes que colocar, en el encabezado o pie de formulario un cuadro combinado (yo le llamaré cboFiltro), y en la etiqueta le pones, por ejemplo "Filtrar por". Ahora, sacas sus propiedades, y en la pestaña datos, eliges en "Tipo de origen de la fila" lista de valores, si quieres poner tu los campos por los que se pueden filtrar, o lista de campos, si quieres poder filtrar por todos los campos del formulario. Si eliges la primera opción, en "Origen de la fila" vas metiendo los campos que te interesasn, entre comillas y separados por punto y coma. Si eliges la 2ª opción, escribes: Consulta DATOS

Segundo, creas un cuadro de texto (yo lo llamaré txtFiltro) y le borras la etiqueta.

Tercero, creas un botón (yo lo llamaré cmdFiltrar), y le pones como titulo: Filtrar

Para acabar, le generas este código al botón:

Private Sub cmdFiltrar_Click()
Const tit1 As String = "Filtrar"
Const tit2 As String = "Quitar Filtro"
Dim miFiltro As String
Dim rst As Recordset
If Me.cmdFiltrar.Caption = tit1 Then
If IsNull(Me.cboFiltro) Or Me.cboFiltro = "" Then Exit Sub
If IsNull(Me.txtFiltro) Or Me.txtFiltro = "" Then Exit Sub
Me.cmdFiltrar.Caption = tit2
miFiltro = "[" & Me.cboFiltro & "]='" & Me.txtFiltro & "'"
Me.Filter = miFiltro
Me.FilterOn = True
Set rst = Me.RecordsetClone
If rst.RecordCount = 0 Then
MsgBox "No hay datos para el criterio de búsqueda", vbInformation, "SIN DATOS"
Me.cmdFiltrar.Caption = tit1
Me.FilterOn = False
End If
Else
Me.cmdFiltrar.Caption = tit1
Me.FilterOn = False
End If

End Sub

No queda muy bonito, porque parpadea un poco, pero ...

El MsgBox es opcional, lo puse por si te interesaba avisar.

Muchas gracias por tu interés. La solución que me diste para rellenar los campos va perfecta. Esta la probare mañana, a ver que tal va.

Muchas gracias de nuevo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas