lunes, mayo 14, 2012

Validación del NIT

Este es otro código que he conseguido y lo paso para los usos que les convengan.
Es el código para VB para la validación del Número de Identificación Tributaria NIT de Guatemala.

 
Public Function ValidaNit(ByVal NIT As String) As Boolean
    Dim POS As Integer

    Dim Correlativo As String

    Dim DigitoVerificador As String

    Dim Factor As Integer

    Dim Suma As Integer = 0

    Dim Valor As Integer = 0

    Dim X As Integer

    Dim xMOD11 As Double = 0

    Dim S As String = Nothing


    ValidaNit = False


    Try
        POS = NIT.IndexOf("-")
        If POS = 0 Then Exit Function
        Correlativo = NIT.Substring(0, POS)

        DigitoVerificador = NIT.Substring(POS + 1)
        Factor = Correlativo.Length + 1

        For X = 0 To (NIT.IndexOf("-") - 1)
            Valor = Convert.ToInt32(NIT.Substring(X, 1))

            Suma += (Valor * Factor)

            Factor -= 1
        Next


        xMOD11 = (11 - (Suma Mod 11)) Mod 11

        S = Convert.ToString(xMOD11)


        If (xMOD11 = 10 And DigitoVerificador = "K") Or (S = DigitoVerificador) Then
         ValidaNit = True

        End If


    Catch ex As Exception

        MessageBox.Show(ex.Message, "Validando NIT", MessageBoxButtons.OK, _
                        MessageBoxIcon.Exclamation)
    End Try
End Function

 Esta función funciona con VB Net y cambiandole un par de cositas tambien con vb 6 y VBA.

Devuelve un falso cuando el NIT no sea correcto

miércoles, noviembre 04, 2009

Permitir solo entrada de numeros en campo

Este sub se guarda en un modulo y se llama en el evento KeyPress del Textbox y sirve para permitir unicamente la entrada de numeros, se llama desde el texbox asi:

Numeros (Me, e, True)

El Parametro booleano del sub, sirve para permitir o no la entrada del punto decimal.

Codigo

Public Sub Numero (ByVal Sender As Object, _
Byval e As System.Windows.Forms.KeyPressEventArgs, _
Optional ByVal Dec as Boolean = True)

Dim K as Short = Asc(e.KeyChar)

Select Case K
Case 8, 13, 27
K = K
Case 48 To 57
K = K
Case 46
If Dec = True Then
K = K
Else
K = 0
End If
Case Else
K = 0
End Select

e.KeyChar = Chr(K)
If K = 0 Then e.Handled = True
End Sub


Funcion DateSerial SQL

Otro codigo conseguido de Internet.

CREATE function [dbo].[DateSerial] (@Año smallint, @Mes smallint, @Dia smallint)
returns smalldatetime
as begin

Declare @sAn varchar(4)
declare @sMe varchar(2)
Declare @sDi varchar(2)
declare @Res smalldatetime

Set @san=cast(@año as varchar(4))
set @sme=right('0'+cast(@mes as varchar(2)),2)

if @dia=0
begin
set @res=@san+@sme+'01'
set @res=datediff(day,1,@res)
end
else
begin
set @sdi=right('0'+cast(@dia as varchar(2)),2)
set @res=@san+@sme+@sdi
end

return @res
end

Funcion Proper Case SQL

Funcion para formatear una cadena de texto a propercase.

ALTER function [dbo].[ProperCase](@Text as varchar(8000))
returns varchar(8000)
as
begin
declare @Reset bit;
declare @Ret varchar(8000);
declare @i int;
declare @c char(1);

select @Reset = 1, @i=1, @Ret = '';
while (@i <= len(@Text))
select @c= substring(@Text,@i,1),
@Ret = @Ret + case when @Reset=1 then UPPER(@c) else LOWER(@c) end,
@Reset = case when @c like '[a-zA-Z]' then 0 else 1 end,
@i = @i +1
return @Ret
end

Numeros a Letras en SQL

Este código lo obtuve de Internet, asi que Creditos al autor.

CREATE function [dbo].[fn_NumeroLetras] (@Numero decimal(20,2), @Moneda varchar(100))
returns varchar(500)

as
BEGIN
--SET NOCOUNT ON
DECLARE @lnEntero INT,
@lcRetorno VARCHAR(512),
@lnTerna INT,
@lcMiles VARCHAR(512),
@lcCadena VARCHAR(512),
@lnUnidades INT,
@lnDecenas INT,
@lnCentenas INT,
@lnFraccion INT,
@Resultado varchar(500)

Set @Resultado=''
SELECT @lnEntero = CAST(@Numero AS INT),
@lnFraccion = (@Numero - @lnEntero) * 100,
@lcRetorno = '',
@lnTerna = 1
WHILE @lnEntero > 0
BEGIN /* WHILE */
-- Recorro columna por columna
SELECT @lcCadena = ''
SELECT @lnUnidades = @lnEntero % 10
SELECT @lnEntero = CAST(@lnEntero/10 AS INT)
SELECT @lnDecenas = @lnEntero % 10
SELECT @lnEntero = CAST(@lnEntero/10 AS INT)
SELECT @lnCentenas = @lnEntero % 10
SELECT @lnEntero = CAST(@lnEntero/10 AS INT)

-- Analizo las unidades
SELECT @lcCadena =
CASE /* UNIDADES */
WHEN @lnUnidades = 1 AND @lnTerna = 1 THEN 'UNO ' + @lcCadena
WHEN @lnUnidades = 1 AND @lnTerna <> 1 THEN 'UN ' + @lcCadena
WHEN @lnUnidades = 2 THEN 'DOS ' + @lcCadena
WHEN @lnUnidades = 3 THEN 'TRES ' + @lcCadena
WHEN @lnUnidades = 4 THEN 'CUATRO ' + @lcCadena
WHEN @lnUnidades = 5 THEN 'CINCO ' + @lcCadena
WHEN @lnUnidades = 6 THEN 'SEIS ' + @lcCadena
WHEN @lnUnidades = 7 THEN 'SIETE ' + @lcCadena
WHEN @lnUnidades = 8 THEN 'OCHO ' + @lcCadena
WHEN @lnUnidades = 9 THEN 'NUEVE ' + @lcCadena
ELSE @lcCadena
END /* UNIDADES */
-- Analizo las decenas
SELECT @lcCadena =
CASE /* DECENAS */
WHEN @lnDecenas = 1 THEN
CASE @lnUnidades
WHEN 0 THEN 'DIEZ '
WHEN 1 THEN 'ONCE '
WHEN 2 THEN 'DOCE '
WHEN 3 THEN 'TRECE '
WHEN 4 THEN 'CATORCE '
WHEN 5 THEN 'QUINCE '
ELSE 'DIECI' + @lcCadena
END
WHEN @lnDecenas = 2 AND @lnUnidades = 0 THEN 'VEINTE ' + @lcCadena
WHEN @lnDecenas = 2 AND @lnUnidades <> 0 THEN 'VEINTI' + @lcCadena
WHEN @lnDecenas = 3 AND @lnUnidades = 0 THEN 'TREINTA ' + @lcCadena
WHEN @lnDecenas = 3 AND @lnUnidades <> 0 THEN 'TREINTA Y ' + @lcCadena
WHEN @lnDecenas = 4 AND @lnUnidades = 0 THEN 'CUARENTA ' + @lcCadena
WHEN @lnDecenas = 4 AND @lnUnidades <> 0 THEN 'CUARENTA Y ' + @lcCadena
WHEN @lnDecenas = 5 AND @lnUnidades = 0 THEN 'CINCUENTA ' + @lcCadena
WHEN @lnDecenas = 5 AND @lnUnidades <> 0 THEN 'CINCUENTA Y ' + @lcCadena
WHEN @lnDecenas = 6 AND @lnUnidades = 0 THEN 'SESENTA ' + @lcCadena
WHEN @lnDecenas = 6 AND @lnUnidades <> 0 THEN 'SESENTA Y ' + @lcCadena
WHEN @lnDecenas = 7 AND @lnUnidades = 0 THEN 'SETENTA ' + @lcCadena
WHEN @lnDecenas = 7 AND @lnUnidades <> 0 THEN 'SETENTA Y ' + @lcCadena
WHEN @lnDecenas = 8 AND @lnUnidades = 0 THEN 'OCHENTA ' + @lcCadena
WHEN @lnDecenas = 8 AND @lnUnidades <> 0 THEN 'OCHENTA Y ' + @lcCadena
WHEN @lnDecenas = 9 AND @lnUnidades = 0 THEN 'NOVENTA ' + @lcCadena
WHEN @lnDecenas = 9 AND @lnUnidades <> 0 THEN 'NOVENTA Y ' + @lcCadena
ELSE @lcCadena
END /* DECENAS */
-- Analizo las centenas
SELECT @lcCadena =
CASE /* CENTENAS */
WHEN @lnCentenas = 1 AND @lnUnidades = 0 AND @lnDecenas = 0 THEN 'CIEN ' + @lcCadena
WHEN @lnCentenas = 1 AND NOT(@lnUnidades = 0 AND @lnDecenas = 0) THEN 'CIENTO ' + @lcCadena
WHEN @lnCentenas = 2 THEN 'DOSCIENTOS ' + @lcCadena
WHEN @lnCentenas = 3 THEN 'TRESCIENTOS ' + @lcCadena
WHEN @lnCentenas = 4 THEN 'CUATROCIENTOS ' + @lcCadena
WHEN @lnCentenas = 5 THEN 'QUINIENTOS ' + @lcCadena
WHEN @lnCentenas = 6 THEN 'SEISCIENTOS ' + @lcCadena
WHEN @lnCentenas = 7 THEN 'SETECIENTOS ' + @lcCadena
WHEN @lnCentenas = 8 THEN 'OCHOCIENTOS ' + @lcCadena
WHEN @lnCentenas = 9 THEN 'NOVECIENTOS ' + @lcCadena
ELSE @lcCadena
END /* CENTENAS */
-- Analizo los millares
SELECT @lcCadena =
CASE /* TERNA */
WHEN @lnTerna = 1 THEN @lcCadena
WHEN @lnTerna = 2 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) THEN @lcCadena + ' MIL '
WHEN @lnTerna = 3 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) AND
@lnUnidades = 1 AND @lnDecenas = 0 AND @lnCentenas = 0 THEN @lcCadena + ' MILLON '
WHEN @lnTerna = 3 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) AND
NOT (@lnUnidades = 1 AND @lnDecenas = 0 AND @lnCentenas = 0) THEN @lcCadena + ' MILLONES '
WHEN @lnTerna = 4 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) THEN @lcCadena + ' MIL MILLONES '
ELSE ''
END /* MILLARES */
-- Armo el retorno columna a columna
SELECT @lcRetorno = @lcCadena + @lcRetorno
SELECT @lnTerna = @lnTerna + 1
END /* WHILE */
IF @lnTerna = 1
SELECT @lcRetorno = 'CERO'

set @resultado= '***' + upper(RTRIM(@lcRetorno) + ' ' + RTRIM(@Moneda) +' CON ' +
CASE WHEN LEN(LTRIM(STR(@lnFraccion,2))) = 1 THEN '0'+LTRIM(STR(@lnFraccion,2))
ELSE LTRIM(STR(@lnFraccion,2)) END) + '/100***'
/*PARA EJECUTAR LA FUNCION: dbo.fn_NumeroLetras 1000, 'MONEDA'*/
return @Resultado
END