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.