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