Access - Contador automatico

 
Vista:
sin imagen de perfil

Contador automatico

Publicado por Al (9 intervenciones) el 16/12/2021 10:10:45
Hola,
Hago facturas con dos series distintas: TEC y NOC
El numero de la factura lo componen:
- La serie (TEC o NOC)
- Un numero correlativo (1, 2, 3, etc)
- Las dos ultimas cifras del año (19, 20, 21, etc)
Por ejemplo: NOC121 (Serie:NOC + nº correlativo:1 + año:21)
Me gustaría que access me diera el nº correlativo, que cuando le pongo la fecha y la serie el me diga cual es el nº correlativo que corresponde. He intentado de distintas maneras y no lo he conseguido. Creo que la función DCOUNT me puede servir pero no lo consigo. Si alguien me puede ayudar se lo agradecé.
Un saludo y gracias a todos.
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

Contador automatico

Publicado por Anonimo (3319 intervenciones) el 16/12/2021 18:55:26
Localiza información sobre 'falsos autonumericos'.

La función DCount puede generar errores porque contara los registros (con o sin condiciones) y si se borra de una serie cualquiera de ellos con la posible excepción del ultimo, contendrá N-1 y al considerarlo el ultimo le añadirá uno (n-1 +1 = n) con lo que (de permitirlo la aplicación) generara duplicados.

Se acostumbra a utilizar DMax con condiciones (la serie + el año) , se obtendrá el ultimo y a ese dato se le suma uno.
Si se borrase cualquier registro anterior al ultimo, quedara el hueco (pero es 'lo mas natural' cuando se borra un registro cualquiera).

Lo ideal es dar ese numero por perdido, pues si se aprovecha el numero, puede obtener (recuperar) recuerdos despistados que pertenecieron al que se borro.
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

Contador automatico

Publicado por Eduardo (318 intervenciones) el 16/12/2021 20:22:06
Lo puede hacer mediante una función. Observe este ejemplo:

TABLA

correlativo_tabla

FORMULARIOS DE EJEMPLO


correlativo_form_01jpg

Obtengo el número 4157, es decir NOC415721


correlativo_form_02jpg

Observe que tengo en la tabla un TEC42520, pero obtengo el siguiente para el año 2021, es decir TEC21621


correlativo_form_04

En este último indico una fecha para el año 2021, como no hay obtengo el número 1.

CÓDIGO DEL EVENTO DESPUES DE ACTUALZIAR DEL CUADRO COMBINADO

1
2
3
4
5
6
7
Private Sub cboSerie_AfterUpdate()
 
 If IsDate(Me.ctlFecha) Then
   MsgBox "El siguiente correlativo es " & vbCrLf & vbCrLf & correlativo(Me.cboSerie, Me.ctlFecha), vbInformation, "Le informo"
 End If
 
End Sub

Observe que llamo la función correlativo y le paso 2 parámetros.

CÓDIGO DE LA FUNCIÓN correlativo()

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
Public Function correlativo(inttipo As Byte, Optional lfecha As Date) As String
 
 ' Función asigna correlativo
 ' Parámetro:
 '          inttipo=1 .... Serie NOC
 '          inttipo=2 .... Serie TEC
 '          lfecha = Fecha
 ' Ejemplo: correlativo(1,"02/03/2021") .... retorna NOC415721
 '          correlativo(2,"02/03/2021") .... retorna TEC21621
 '          correlativo(2,"02/03/2022") .... retorna TEC122
 ' Elaborada por:
 '          Eduardo Pérez Fernández
 ' Fecha: 16/12/2021
 
 Dim strSerie As String
 Dim strnumera As String
 Dim intPeriodo As Integer
 Dim intLongTexto As Integer
 Dim strUltima As String
 Dim lnUltimo As Long
 
 If CLng(lfecha) = 0 Then  ' Si no paso la fecha toma la fecha del sistema
   lfecha = Date
 End If
 
 If inttipo = 1 Then
   strSerie = "NOC"
 Else
 strSerie = "TEC"
 End If
 
 intPeriodo = Right(lfecha, 2)
 
 'tomo la longitud del texto
 
 strUltima = Nz(DLast("[nro_factura]", "tblfacturas", "Mid([nro_factura],1,3)='" & strSerie & "'" & " AND right([nro_factura],2)=" & intPeriodo), "")
 
 If strUltima = "" Then
   correlativo = strSerie & "1" & intPeriodo
   Exit Function
 End If
 
 'Longitud del texto
 
 intLongTexto = Len(Nz(DLast("[nro_factura]", "tblfacturas", "Mid([nro_factura],1,3)='" & strSerie & "'"), 0))
 
 'Obtengo el número
 
 lnUltimo = Mid(strUltima, 4, intLongTexto - 5)
 
 If Right(strUltima, 2) = intPeriodo Then
  lnUltimo = lnUltimo + 1
 End If
 
 correlativo = strSerie & lnUltimo & intPeriodo
 
 
End Function
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

Contador automatico

Publicado por Anonimo (3319 intervenciones) el 16/12/2021 21:24:07
Método con una única línea:

1
2
3
4
5
6
7
8
9
10
11
Public Function RRutina(Serie As String) As String
' Una tabla denominada FACTURAS con por lo menos un campo al que se denomino FACTURA de tipo texto
' para poder ordenarlas de forma numerica (aunque sea texto) se le da un 'formato de tres caracteres al numeral consecutivo
' pueden ser mas, solo hay que indicarle 'cuantos' en la funcion MID y en el formato.
 
'Se la utlizaria asi: RRutina ("-aqui la serie-")
'ejemplo de aplicacion: xxx = RRutina("TEC")
 
RRutina = Serie & Format(Nz(DMax("Val(Mid(Factura,4,3))", "Facturas", "Left(Factura,3)='" & Serie & "' and Right(Factura,2)='" & Format(Date, "yy") & "'"), 0) + 1, "000") & Format(Date, "yy")
 
End Function


En el histórico del foro hay amplias explicaciones de la forma de construirla (el porque y el como.)
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

Contador automatico

Publicado por Eduardo (318 intervenciones) el 16/12/2021 22:26:26
No es así se da el caso que no hay formato. Como explican solo contempla el formato del número algo como "001" etc y este no es el caso, según la pregunta no EXISTE este formato. Por esto no le presento en una línea.

El la función que propuse se puede ajustar el formato por ejemplo:

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
Public Function correlativo2(inttipo As Byte, Optional lfecha As Date, Optional lndigitos As Integer) As String
 
 ' Función asigna correlativo
 ' Parámetro:
 '          inttipo=1 .... Serie NOC
 '          inttipo=2 .... Serie TOC
 '          lfecha = Fecha
 '          lndigitos= Número de digitos para el consecutivo para dar formato
 ' Ejemplo: correlativo(1,"02/03/2021") .... retorna NOC415721
 '          correlativo(2,"02/03/2021") .... retorna TEC21621
 '          correlativo(2,"02/03/2022") .... retorna TEC122
 '          correlativo(2,"02/03/2021",4) .... retorna TEC021621
 ' Elaborada por:
 '          Eduardo Pérez Fernández
 ' Fecha: 16/12/2021
 
 Dim strSerie As String
 Dim strnumera As String
 Dim intPeriodo As Integer
 Dim intLongTexto As Integer
 Dim strUltima As String
 Dim lnUltimo As Long
 Dim x As Integer
 Dim strtem As String
 
 If CLng(lfecha) = 0 Then  ' Si no paso la fecha toma la fecha del sistema
   lfecha = Date
 End If
 
 If inttipo = 1 Then
   strSerie = "NOC"
 Else
 strSerie = "TEC"
 End If
 
 
  If lndigitos > 0 Then
   For x = 1 To lndigitos
     strtem = strtem & "0"
   Next x
 End If
 
 intPeriodo = Right(lfecha, 2)
 
 'tomo la longitud del texto
 
 strUltima = Nz(DLast("[nro_factura]", "tblfacturas", "Mid([nro_factura],1,3)='" & strSerie & "'" & " AND right([nro_factura],2)=" & intPeriodo), "")
 
 If strUltima = "" Then
   correlativo2 = strSerie & Format(1, strtem) & intPeriodo
   Exit Function
 End If
 
 'Longitud del texto
 
 intLongTexto = Len(Nz(DLast("[nro_factura]", "tblfacturas", "Mid([nro_factura],1,3)='" & strSerie & "'"), 0))
 
 'Obtengo el número
 
 lnUltimo = Mid(strUltima, 4, intLongTexto - 5)
 
 If Right(strUltima, 2) = intPeriodo Then
  lnUltimo = lnUltimo + 1
 End If
 
 
 
 correlativo2 = strSerie & Format(lnUltimo, strtem) & intPeriodo
 
End Function

Con esta función puede dar el formato que quiera al consecutivo, de otra forma tendría que estar cambiando la función.
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

Contador automatico

Publicado por Anonimo (3319 intervenciones) el 17/12/2021 00:16:34
En una cadena de texto que comienza por tres caracteres, finaliza con dos y en el medio por lo menos uno, se desea extraer el numero que representan los que estén 'en el medio'.

1
Mid("un texto que cumpla el formato",3, Len("el mismo texto que cumplió el formato") - 5)

Solo tendrá un problema al ordenar los datos (son un texto) después del uno vendrá el diez y tras el el cien .... cuando se finalicen los que comienzan por uno continuaran los que comiencen por el dos y tras el los que comienzan por tres ... se finaliza el ciclo al llegar al nueve.

(si, se podrá utilizar la fecha + un desorden en los datos de ese día)
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