Hola a tod@s !! Tengo un problema que hasta la fecha no he conseguido resolver. Resulta que encontré una función que te devuelve el tanto en Número de Afiliación como el Código de Cuenta de Cotización. El código es el siguiente:
Código vb:
Ver original''' <summary>
''' Devuelve el dígito de control de un Número de Afiliación como de
''' un Número de Cuenta de Cotización.
''' </summary>
''' <param name="numSegSocial">Número cuyo dígito de control se desea obtener.</param>
''' <param name="esNumEmpresa">Indica si el Número se corresponde con el de una Empresa.</param>
''' <returns></returns>
''' <remarks></remarks>
Public Function GetDCNumSegSocial(ByVal numsegsocial As String, _
ByVal isNumEmpresa As Boolean) As String
' Si hay más de 10 dígitos en el número se devolverá una excepción de
' argumentos no permitidos.
'
If (numSegSocial.Length > 10) OrElse (numSegSocial.Length = 0) Then _
Throw New System.ArgumentException()
' Si algún carácter no es un número, abandono la función.
'
Dim regex As New System.Text.RegularExpressions.Regex("[^0-9]")
If (regex.IsMatch(numSegSocial)) Then _
Throw New System.ArgumentException()
Try
' Obtengo el número correspondiente a la Provincia
'
Dim dcProv As String = numSegSocial.Substring(0, 2)
' Obtengo el resto del número
'
Dim numero As String = numSegSocial.Substring(2, numSegSocial.Length - 2)
Select Case numero.Length
Case 8
If (esNumEmpresa) Then
' Si el número es de una empresa, no puede tener 8 dígitos.
Return String.Empty
Else
' Compruebo si es un NAF nuevo o antiguo.
If (numero.Chars(0) = "0"c) Then
' Es un número de afiliación antiguo. Lo formateo
' a siete dígitos, eliminando el primer cero.
numero = numero.Remove(0, 1)
End If
End If
Case 7
' Puede ser un NAF antiguo o un CCC nuevo o viejo.
If (esNumEmpresa) Then
' Si el primer dígito es un cero, es un CCC antiguo,
' por lo que lo formateo a seis dígitos, eliminando
' el primer cero.
If (numero.Chars(0) = "0"c) Then
numero = numero.Remove(0, 1)
End If
End If
Case 6
' Si se trata del número de una empresa,
' es un CCC antiguo.
If (Not (esNumEmpresa)) Then
' Es un NAF antiguo, por lo que lo debo
' de formatear a 7 dígitos.
numero = numero.PadLeft(7, "0"c)
End If
Case Else
' Todos los demás casos, serán números antiguos
If (esNumEmpresa) Then
' Lo formateo a seis dígitos.
numero = numero.PadLeft(6, "0"c)
Else
' Lo formateo a siete dígitos.
numero = numero.PadLeft(7, "0"c)
End If
End Select
' Completo el número de Seguridad Social
'
Dim naf As Int64 = Convert.ToInt64(dcProv & numero)
' Calculo el Dígito de Control. Tengo que operar con números
' Long, para evitar el error de desbordamiento que se puede
' producir con los nuevos números de Seguridad Social
'
NAf = NAf - (NAf \ 97) * 97
' Devuelvo el Dígito de Control formateado
'
Return String.Format("{0:00}", naf)
Catch
Return String.Empty
End Try
End Function
#
Despúes de copiarlo en un módulo (llamado CalculoNAF), procedo a introducir en el campo (NAF) del formulario, en el evento (AfterUpdate), el siguiente código:
Private Sub NAF_AfterUpdate()
Me.NAF= GetDCNumSegSocial(Me.NAF)
End Sub
El problema es que me devuelve un cuadro de mensaje "Error de compilación. El argumento no es opcional".
La cuestión es que tengo otra función para Nif, y haciendo exactamente lo mismo (cambiando evidentemente los nombres del campo), el resultado es el deseado.
Os agradecería muchísiiimo vuestra ayuda. Sólo me falta éste detalle para poder entregar la Base a mi jefe para poder utilizarla en la empresa.
Un saludo, perdonad mi ignorancia y gracias de antemano.