Access - valor del registro anterior

 
Vista:
sin imagen de perfil
Val: 266
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

valor del registro anterior

Publicado por Pablo (328 intervenciones) el 13/03/2023 18:20:36
Hola a todos:
Una tabla tiene varios campos: codigo, tienda, fecha y y 8 campo más. Tengo un formulario basado en esta tabla, el campo codigo se asigna automaticamente, tienda y fecha los pregunto, me gustaría que me los preguntara una sola vez, si es un registro nuevo tienda y fecha son igual al anterior, probé con después de actualizar hacer tabstop=false y sí, consigo lo que quiero pero como hago para que esos dos campos cojan el valor del registro anterior?
Espero haberme explicado, gracias anticipadas
Pablo
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

valor del registro anterior

Publicado por Anonimo (3316 intervenciones) el 14/03/2023 02:47:33
Supongo que lo que se desea es recordar al anterior en cada sesión y si sobre la marcha se cambia un dato (de los 'memorizados' a recordar) que asuma como anterior al nuevo.

La solución es sencilla.

En el evento 'después de actualizar':

1
2
3
Me.[Tenda].DefaultValue = Chr(34) & Me.[Tienda] & Chr(34)
 
'el resto de las campos a recordar copiarán la misma estructura

El primero es la semilla, el resto (y mientras no se necesite cambiar) la tomará por defecto y si se modifica: se inicia el ciclo de una nueva semilla.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 266
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

valor del registro anterior

Publicado por Pablo (328 intervenciones) el 14/03/2023 13:41:22
Hola Anónimo
En el evento después de actualizar del campo en cuestión, igualar el defaultvalue a lo que tiene el campo ese momento.
tienda es un campo numérico, no hace falta el chr(34), no?, si es de texto sí
Gracias
Pablo
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

valor del registro anterior

Publicado por Anonimo (3316 intervenciones) el 14/03/2023 14:01:39
Inténtalo con números y con textos y sales de la duda.

Lo que no he verificado (se me acaba de ocurrir) es si aceptaría la propiedad Text como dato (pero cuando respondas ya habré conocido la respuesta).
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 Eduardo

valor del registro anterior

Publicado por Eduardo (317 intervenciones) el 14/03/2023 14:40:40
Pablo le dejo algo más complejo y profesional con una función, la ventaja es que le sirve para todos los formularios. Consiste en una función que se le pasan como parámetros el nombre del formulario un mensaje y los campos que NO se deben repetir. Observe esta imagen.

form_fact_00

Al hacer clic en el botón Adicionar se repite el registro anterior excepto los campos que están encerrados en el marco rojo, esto es, "Impuestos" y "Envío".

Copie este código en un módulo.

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
Public Function RepiteUltimo(frm As Form, strErrMsg As String, ParamArray avarExceptionList()) As Long
On Error GoTo Err_Handler
    'Propósito: transferir los mismos campos a un nuevo registro, según el último registro del formulario.
    'Argumentos: frm = el formulario para copiar los valores.
    ' strErrMsg = cadena para agregar mensajes de error.
    ' avarExceptionList = lista de nombres de control NO para copiar valores.
    'Return: Conteo de controles que tenían un valor asignado.
    'Uso: en el evento BeforeInsert de un formulario, excluyendo los controles de Apellido y Ciudad:
    '               Call RepiteUltimo(Me, strMsg, "Apellido", Ciudad")
    Dim rs As DAO.Recordset         'Clon del formulario.
    Dim ctl As Control              'Cada control del formulario.
    Dim strForm As String           'Nombre del formulario (para el controlador de errores).
    Dim strControl As String        'Cada control en el bucle
    Dim strActiveControl As String  'Nombre del control activo. No asigne esto ya que el usuario lo está escribiendo.
    Dim strControlSource As String  'Propiedad ControlSource.
    Dim lngI As Long                'Contador del bucle
    Dim lngLBound As Long           'Límite inferior de la matriz de la lista de excepciones.
    Dim lngUBound As Long           'Límite superior de la matriz de la lista de excepciones.
    Dim bCancel As Boolean          'Bandera para cancelar esta operación.
    Dim bSkip As Boolean            'Marcar para omitir un control.
    Dim lngKt As Long               'Recuento de controles asignados.
 
    'Initialize.
    strForm = frm.Name
    strActiveControl = frm.ActiveControl.Name
    lngLBound = LBound(avarExceptionList)
    lngUBound = UBound(avarExceptionList)
 
    'No debe asignar valores a los controles del formulario si no se encuentra en un nuevo registro.
    If Not frm.NewRecord Then
        bCancel = True
        strErrMsg = strErrMsg & "No se pueden transferir valores. Formulario '" & strForm & "' no es un nuevo registro." & vbCrLf
    End If
    'Busque el registro para copiar, verificando que haya uno.
    If Not bCancel Then
        Set rs = frm.RecordsetClone
        If rs.RecordCount <= 0& Then
            bCancel = True
            strErrMsg = strErrMsg & "No se pueden transferir valores. Formulario '" & strForm & "' no tiene registros." & vbCrLf
        End If
    End If
 
    If Not bCancel Then
        'El último registro del formulario es el que se va a copiar.
        rs.MoveLast
        'Hace un bucle con los controles.
        For Each ctl In frm.Controls
            bSkip = False
            strControl = ctl.Name
            'Ignore el control activo, aquellos sin ControlSource y aquellos en la lista de excepciones.
            If (strControl <> strActiveControl) And HasProperty(ctl, "ControlSource") Then
                For lngI = lngLBound To lngUBound
                    If avarExceptionList(lngI) = strControl Then
                        bSkip = True
                        Exit For
                    End If
                Next
                If Not bSkip Then
                    'Examine a qué está destinado este control. No haga caso de no enlazado o enlazado a una expresión.
                    strControlSource = ctl.ControlSource
                    If (strControlSource <> vbNullString) And Not (strControlSource Like "=*") Then
                        'Ignore los campos calculados (sin SourceTable), los campos de numeración automática y los valores nulos.
                        With rs(strControlSource)
                            If (.SourceTable <> vbNullString) And ((.Attributes And dbAutoIncrField) = 0&) _
                                And Not (IsCalcTableField(rs(strControlSource)) Or IsNull(.Value)) Then
                                If ctl.Value = .Value Then
                                    'hacer nada. (Omitir esto puede causar el error 3331).
                                Else
                                    ctl.Value = .Value
                                    lngKt = lngKt + 1&
                                End If
                            End If
                        End With
                    End If
                End If
            End If
        Next
    End If
 
    RepiteUltimo = lngKt
 
Exit_Handler:
    Set rs = Nothing
    Exit Function
 
Err_Handler:
    strErrMsg = strErrMsg & Err.Description & vbCrLf
    Resume Exit_Handler
End Function
 
Private Function IsCalcTableField(fld As DAO.Field) As Boolean
    'Propósito: Devuelve True si fld es un campo calculado (solo Access 2010 y versiones posteriores).
On Error GoTo ExitHandler
    Dim strExpr As String
 
    strExpr = fld.Properties("Expression")
    If strExpr <> vbNullString Then
        IsCalcTableField = True
    End If
 
ExitHandler:
End Function
 
Public Function HasProperty(obj As Object, strPropName As String) As Boolean
    'Propósito: Devuelve verdadero si el objeto tiene la propiedad.
    Dim varDummy As Variant
 
    On Error Resume Next
    varDummy = obj.Properties(strPropName)
    HasProperty = (Err.Number = 0)
End Function

Código del botón Adicionar

1
2
3
4
5
6
7
8
Private Sub btnAdiconar_Click()
 Dim strMsg As String
 DoCmd.GoToRecord , , acNewRec
 Call RepiteUltimo(Me, strMsg, "Impuestos", "Envío")
 If strMsg <> vbNullString Then
  MsgBox strMsg, vbInformation
 End If
End Sub

Observe como llamo la función en Call RepiteUltimo. Me es en nombre del formulario actual, como no agrego un mensaje dejo strMsg, en este caso toma los mensajes de la función por último, los campos que no se deben repetir del registro anterior, en este ejemplo impuesto y envío.

Si no entiende algo o quiere el ejemplo puede solicitarlo a [email protected]
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
sin imagen de perfil
Val: 266
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

valor del registro anterior

Publicado por Pablo (328 intervenciones) el 14/03/2023 16:58:24
En la ayuda sobre defaultvalue dice:
Especifica un valor que aparece automáticamente en el campo cuando se crea un nuevo registro
Yo tengo:
Private Sub fecha_muestra_AfterUpdate() 'tabstop=false
'Me.fecha_muestra.TabStop = False
Me.fecha_muestra.DefaultValue = Me.fecha_muestra
End Sub

Tecleo datos de un registro, después del último paso a uno nuevo y en fecha pinta lo que le da la gana. Puede ser un problema de formato
Pablo
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
sin imagen de perfil
Val: 266
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

valor del registro anterior

Publicado por Pablo (328 intervenciones) el 14/03/2023 19:23:17
Sigo pensando en un problema de formato
En desdpues de actualizar de fecha_muestra tengo:
Private Sub fecha_muestra_AfterUpdate()
Me.fecha_muestra.DefaultValue = Format(Me.fecha_muestra, "mm/dd/yyyy")
Me.desde_muestra.DefaultValue = Format(Me.fecha_muestra, "dd/mm/yyyy")
Me.hasta_muestra.DefaultValue = Format(Me.fecha_muestra, "dd/mm/yyyy")
Me.desde_muestra = Me.fecha_muestra
Me.hasta_muestra = Me.fecha_muestra
End Sub
Hacía los default value =me.fecha_muestra y me pintaba 30/12/1899, con estos format sigue pintando 30/12/1899
Alguna sugerencia
Gracias
Pablo
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
sin imagen de perfil
Val: 266
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

valor del registro anterior

Publicado por Pablo (328 intervenciones) el 14/03/2023 19:50:24
Efectivamente, como sospechaba era un problema de formato, lo arreglé con
Private Sub fecha_muestra_AfterUpdate()
Me.fecha_muestra.DefaultValue = "#" & Format(Me.fecha_muestra, "mm/dd/yyyy") & "#"
Me.desde_muestra.DefaultValue = "#" & Format(Me.fecha_muestra, "mm/dd/yyyy") & "#"
Me.hasta_muestra.DefaultValue = "#" & Format(Me.fecha_muestra, "dd/mm/yyyy") & "#"
Me.desde_muestra = Me.fecha_muestra
Me.hasta_muestra = Me.fecha_muestra
End Sub
Un saludo
Pablo
Acabé haciendo lo de borrar todo y empezar de 0. Así conseguí terminarlo
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 Eduardo

valor del registro anterior

Publicado por Eduardo (317 intervenciones) el 14/03/2023 20:57:20
Pablo si adapta la función que le suministré no tendrá complicaciones en otros casos.
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

valor del registro anterior

Publicado por Anonimo (3316 intervenciones) el 14/03/2023 19:39:28
Access espera en esa propiedad un dato que va a emular a lo que se habría tecleado para introducirlo.

¿Has verificado si funciona el método que propuse?... si después deseas verificar cualquier otro método: adelante, de los experimentos siempre se aprende algo.

Por el nombre del campo (fecha) ese extraño resultado no es mas que lo que entiende Access: una operación matemática.
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