Numerar expediente de longitud variable

Necesito que al seleccionar un código de grupo de un cuadro combinado automáticamente me deje en un cuadro de texto el siguiente número de expediente. Igualmente, al seleccionar de un cuadro combinado un expediente deje en un campo de texto el siguiente trámite de este expediente.

El expediente tiene la siguiente estructura 3/2022-1/GS, es decir el siguiente debe ser 4/2022-1/GS

En donde:

3 Consecutivo de expediente, desde 1 hasta n, por ejemplo 1234/2022-1/GS

2022 año del expediente

1 Consecutivo de tramites del expediente, 1 hasta n, por ejemplo

El tramite 1234/2022-1/GS se obtiene al crear el expediente

GS Código del catalogo de grupo, también de longitud variables.

Por ejemplo,

Con base en esta información necesito adicionar un nuevo expediente y adicionar trámites, pero no sé como hacer para numerar automáticamente cuando se adicione un expediente de acuerdo con el año y el código de grupo, igualmente numerar los tramites con base en el número de expediente, año y código de grupo.

3 Respuestas

Respuesta
2

Vaya Martha que pregunta y sistema de numerar los expedientes o trámites. Personalmente lo haría en 2 tablas, una principal para registrar los expedientes y otra para los tramites, de todas maneras, preparé el ejemplo con base en una tabla

Le he preparado el siguiente ejemplo:

Tabla suministrada en la pregunta

Estructura de la tabla TBL_INGRESO

Id_in – Autonumerico

no_expediente – Texto Corto

FORMULARIO 

Evento después de actualizar el cuadro combinado “Año”

Tiene como propósito asignar el origen de datos para el cuadro combinado, observe que utilizo la función extrae() para poder obtener la información del campo no_expediente de acuerdo con el separador "/" y la posición, obtengo el año y el código del campo texto para agrupar.

Private Sub cboanio_AfterUpdate()
  Dim strSQl As String
  strSQl = "SELECT First(TBL_INGRESO.no_expediente) AS Expediente" & vbCrLf
  strSQl = strSQl & "        FROM TBL_INGRESO" & vbCrLf
  strSQl = strSQl & "       WHERE Left(extrae([no_expediente],2,""/""),4)=" & Me.cboanio & vbCrLf
  strSQl = strSQl & "    GROUP BY extrae([no_expediente],3,""/"")" & vbCrLf
  strSQl = strSQl & "    ORDER BY extrae([no_expediente],3,""/"");"
  Me.cboExpedientes.RowSource = strSQl
End Sub

Evento después de actualizar el cuadro combinado “Grupo”

El origen del cuadro combando es una lista de valores, en este caso, "CC";"CD";"CS";"GS";"OSC";"P";"PM";"SE". Tiene como fin asignar al campo ctlExpediente el resultado de la función sgte_exp() con base en el año y el código elegido.

Private Sub cboGrupo_AfterUpdate()
  Me.ctlExpediente = sgte_exp(Me.cboanio, Me.cboGrupo)
End Sub

Evento después de actualizar del cuadro combinado “Expediente”

El origen de datos de este cuadro combinado es asignado después de actualizar el cuadro combinado cboanio. Al seleccionar un expediente de la lista asigna al control “Siguiente Trámite” el texto devuelto por la función sgte_tramite()

Private Sub cboExpedientes_AfterUpdate()
  Me.ctlTramite = sgte_tramite(Me.cboExpedientes)
End Sub

CÓDIGO DE LAS FUNCIONES

Copie este código en un módulo

Función extrae()Función sgte_exp

Public Function extrae(pvstring As Variant, pipart As Integer, Optional psDeli As String = ",")
 'Functión para extraer parte de una cadena
 'Parámetros:
 '           pvstring=Cadena de texto a minipular
 '           pipart=Parte de cadena a extraer de acuerdo con el separador,
 '                  por ejemplo,1 primera parte, 2 segunda parte
 '           psdeli=Separador, opcional por defecto coma (,) pero puede ser otro como guion(-)
 'Elaborada por: Eduardo Pérez Fernández
 'Fecha: 06/09/2021
'Ejemplos de llamada:
'? Extrae("Eduardo, Pérez", 1,",") ------>> retorna Pérez elimina el espacio que hay antes de Pérez
'? Extrae(", Pérez", 2,",") ------>> retorna Pérez elimina el espacio que hay antes de Pérez
'? Extrae("Eduardo-Pérez", 2,"-") ------>> retorna Pérez. Observe que cambie el separador de cadena por -
'? Extrae("Eduardo, Pérez", 2) ------>> retorna Pérez. No inclui el separador toma el separador por defecto,
'? Extrae("Eduardo, Pérez, Fernández", 3) ----->> retorna el segundo apellido Fernández
 On Error Resume Next
  extrae = Null
  If Mid(pvstring, 1, 1) = psDeli Then
    pvstring = "nd" & pvstring
  End If
 If IsNull(pvstring) Then Exit Function
 extrae = Trim(Split(pvstring, psDeli)(pipart - 1))
End Function

Función sgte_exp()

Public Function sgte_exp(dfecha As Integer, dgrupo As String) As String
  Dim rs As Recordset
  Dim strSQl As String
  'Requiere de la función extrae
  strSQl = "SELECT nz(Max(extrae([no_expediente],1,""/""))) + 1 AS ex" & vbCrLf
  strSQl = strSQl & "        FROM tbl_ingreso" & vbCrLf
  strSQl = strSQl & "       WHERE Left(extrae([no_expediente],2,""/""),4)=" & dfecha & vbCrLf
  strSQl = strSQl & "         AND extrae([no_expediente],3,""/"")='" & dgrupo & "'" & ";"
  Set rs = CurrentDb.OpenRecordset(strSQl)
  sgte_exp = rs.Fields("ex") & "/" & dfecha & "-1/" & dgrupo
  rs.Close
  Set rs = Nothing
End Function

Función sgte_tramite

Public Function sgte_tramite(mexpediente As String) As String
    Dim rs As Recordset
    Dim strSQl As String
    Dim strGrupo As String
    Dim lnAux0 As Long
    Dim strAux1 As String
    Dim strAux2 As String
    Dim lnAnno As Integer
    'Requiere de la funcion extrae()
    If DCount("*", "TBL_INGRESO", "no_expediente='" & mexpediente & "'") = 0 Then
       MsgBox "Error .. no existe el expediente", vbInformation, "Error..."
       mexpediente = ""
       Exit Function
    End If
   strGrupo = extrae(mexpediente, 3, "/")
   lnAux0 = Val(extrae(mexpediente, 1, "/"))
   strAux1 = Left(extrae(mexpediente, 2, "/"), 4)
   strSQl = "SELECT extrae([no_expediente],1,""/"") AS ex" & vbCrLf
   strSQl = strSQl & "           , nz(Max(Right(extrae([no_expediente],2,""/"")," & vbCrLf
   strSQl = strSQl & "   Len(extrae([no_expediente],2,""/""))-InStr(1,extrae([no_expediente],2,""/""),""-"")))) AS elultimo" & vbCrLf
   strSQl = strSQl & "        FROM tbl_ingreso" & vbCrLf
   strSQl = strSQl & "       WHERE Left(extrae([no_expediente],2,""/""),4)=" & strAux1 & vbCrLf
   strSQl = strSQl & "         AND extrae([no_expediente],3,""/"")='" & strGrupo & "'" & vbCrLf
   strSQl = strSQl & " AND extrae([no_expediente],1,""/"")=" & lnAux0 & vbCrLf
   strSQl = strSQl & "    GROUP BY extrae([no_expediente],1,""/"");"
  Set rs = CurrentDb.OpenRecordset(strSQl)
  sgte_tramite = extrae(mexpediente, 1, "-") & "-" & rs.Fields("elultimo") + 1 & "/" & strGrupo
  rs.Close
  Set rs = Nothing
End Function

Puede haber más formas pero esta me ha servido. Si quiere el ejemplo lo puede solicitar a [email protected] favor en el asunto anotar la consulta

¡Gracias! Eduardo admiro sus conocimientos, usted si es un experto me ha sacado de un lío, no pensé que fuera tan difícil obtener la forma de numerar los expedientes y más aún hacerlo consecutivamente con los trámites de cada uno. ! ¡Que funciones! Ya le envíe a su correo la petición del ejemplo y desde ahora le doy mis agradecimientos.

Martha cuidado con la respuesta que le dan es tan "simple" que la estructura no cumple con lo preguntado. Numerar el expediente es lo de menos, el problema es que para cada expediente pueden existir muchos tramites y si mira el error, está en que si cambia de expediente también se incrementa en 1 unidad el trámite.

¿Por qué?

1. El formato es 1/2022-1/CD y le proponen 1/2022-1-CD

2. ¿Cómo se obtiene en ese código los siguientes tramites, es decir, 1/2022-2/CD. 1/2022-3/CD, 1/2022-3/CD etc.

Lógicamente se debe considerar el cambio de año

Respuesta

Martha, convendría saber la estructura de las tablas y si la numeración debe reiniciarse al cambiar el año, así que voy a suponer que tengo una tabla Codigos y un formulario basado en dicha tabla. Si elijo un código

Me deja NumExpediente como

O sea, el primer expediente del 2022 y además el primero de CD

Sigo rellenado y

O sea, el segundo expediente del año y además el segundo de CD. Si cambio

O sea, el tercer expediente del año y el primero de MRT

Y el código es tan simple como

Private Sub Codigo_AfterUpdate()
NumExpediente = Nz(DCount("*", "codigos")) + 1 & "/" & Year(Date) & "-" & Nz(DCount("*", "codigos", "codigo='" & Me.Codigo & "'")) + 1 & "-" & Codigo
End Sub

¡Gracias! Julián, pero su respuesta no soluciona la numeración, ante todo la tabla no tiene el campo CÓDIGO solo el campo no_expediente, por esto la dificultad de numerar. La solución es la del gran experto Eduardo. Tampoco veo la solución para numerar tramites en lo que usted tiene una confusión. La tabla es prácticamente similar a la de la pregunta, pero no tiene los campos código ni año, este se debe considerar al iniciar año, algo que si está en la función del experto Eduardo.

Muchas gracias.

Entonces ¿Cómo sabe el sistema que código, CD, TP, etc. vas a usar, si no lo has seleccionado antes?.

Por otro lado, te dije que no habías indicado si el contador se debía reiniciar cada año.

Tu misma

El código se toma como lo explica el experto Eduardo "El origen del cuadro combinado es una lista de valores, en este caso, "CC";"CD";"CS";"GS";"OSC";"P";"PM";"SE" es aquí donde las funciones de Eduardo son supremamente potentes.

Agradezco su colaboración, pero la pregunta la doy por finalizada. Y con respeto si tiene dudas al código del experto Eduardo espero que él amablemente le aclare.

Respuesta
-1

Has presentado ejemplos muy esteticos, pero en la practica no los veras asi porque el orden sera alfanumerico y despues del 1 vendra el 11 y despues el 111 y cuando finalice con los unosa vendran los 2 y asi ... como es un texto (para lograr un orden ¿formal? Se deberia utilizar un numero de digitos y rellenar con ceros los huecos, algo como:

0001/2022-001/CD
0001/2022-002/CD
0001/2022-001/ADF
0991/2022-091/CD

Para generar el primero de cada nuevo expediente habría que indicárselo (para tomar el mayor e incrementarlo), en otro caso se tendría que conocer (para utilizarlo como condición en cálculo del resto de datos)

El año no es un problema se extrae de la fecha actual y(como formará parte de la condición) el cambio de año seria automático.

El incremental en el mismo expediente (el tercer dato), se tendrá que conocer el expediente (fácil si se parte de uno conocido al que se añade uno más) y aclarar si este incremental (al cambiar de año siendo el mismo expediente y el mismo código de grupo, se reinicia o se continua)

Queda el código de grupo que se desconoce si el grupo es constante desde el inicio del expediente o si en el trascurso del tiempo puede (un expediente) tener diferentes códigos de grupo y si cada código de grupo (aun en el mismo expediente) es una serie independiente.

Estos detalles son importantes para evitar males mayores en la creación de los registros.

Facilitaría mucho la tarea (para el usuario) que se desglosase el código y (por ejemplo):

Al crear un nuevo registro en un expediente existente, en un combo independiente se seleccionase el grupo del expediente actual, si no se le cambia lo asumiría para crear el nuevo y si se modifica, el nuevo expediente tomaría el número del actual, el año actual y si es el mismo grupo el siguiente correlativo, si se cambia de grupo, se numeraria de acuerdo a las reglas de numeración antes definidas.

¡Gracias! Enrique, pero ya está la solución gracias al experto Eduardo, las funciones se adaptan sin problema a la codificación como muestra la tabla.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas