O.T.: ¿Alguno tendrá esta función en MySQL?

135 views
Skip to first unread message

Alejandro Garcia G.

unread,
May 16, 2019, 5:30:20 PM5/16/19
to Comunidad de Visual Foxpro en Español
Saludos

Para no a largar mucho el título les explico acá, estoy necesitando para MySQL la función que de el dígito de verificación de los documentos de identididad para Colombia (N.I.T. o C.C.).

Yo lo tengo en VFP y lo utilizo allá, pero requiero tenerlo en  una función para poder utilizarlo directamente en la base de datos MySQL ¿se puede, alguien lo tiene?.

Gracias.

ZeRoberto

unread,
May 16, 2019, 5:33:17 PM5/16/19
to publicesvfoxpro
Muestra el codigo talvez alguien lo pueda convertir

Saludos

Ze




--
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/b33e1ffa-eb55-4ebb-aa1c-cb3731d31884%40googlegroups.com.

Alejandro Garcia G.

unread,
May 16, 2019, 5:44:22 PM5/16/19
to Comunidad de Visual Foxpro en Español
Gracias por la respuesta. He trabajado con el código que hay en la Comunidad de Visual FoxPro:

-- Calcular Digito de Verificacion de NIT (Colombia) --

ZeRoberto

unread,
May 16, 2019, 6:15:36 PM5/16/19
to publicesvfoxpro
Haber prueba

CREATE DEFINER=`root`@`%` FUNCTION `Validar_Nit`(`tcNit` varchar(15)) RETURNS int(11)
BEGIN
    DECLARE lcDato, lcChar VARCHAR(15) DEFAULT '';
    DECLARE lnItem, lnSuma, lnDigito, lnRetorno INT DEFAULT 0;
    SET lcDato := RIGHT(SPACE(15) + TRIM(tcNit), 15);
    my_loop:
    LOOP
    SET lnItem := lnItem + 1;
    SET lcChar := SUBSTR(lcDato FROM lnItem FOR 1);
    SET lnSuma := lnSuma + lcChar * ELT(lnItem, 71, 67, 59, 53, 47, 43, 41, 37, 29, 23, 19, 17, 13, 7, 3);
    IF lnItem = 10 THEN
       LEAVE my_loop;
    END IF;
    END LOOP my_loop;
    SET lnSuma = MOD(lnSuma, 11);
    IF lnSuma=0 OR lnSuma=1 THEN
       SET lnRetorno := lnSuma;
     ELSE
       SET lnRetorno := 11 - lnSuma;
    END IF;
  RETURN lnRetorno;
END

Saludos

Ze



--
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.

ZeRoberto

unread,
May 16, 2019, 6:17:49 PM5/16/19
to publicesvfoxpro
Perdon me equivoque aqui, debe ser 15 y no 10

    IF lnItem = 15 THEN
       LEAVE my_loop;
    END IF;


Saludos

Ze



Message has been deleted

Alejandro Garcia G.

unread,
May 16, 2019, 6:30:43 PM5/16/19
to Comunidad de Visual Foxpro en Español
zeRoberto, gracias por la colaboración.

Ya hice unas pruebas pero no me esta devolviendo los digitos correctos, en la rutina de VFP por ejemplo para este número 900146684 me da como digito de verificación 1 pero acá me da 8.

He probado con otros números y es igual me da un valor incorrecto.Estoy tratando de leerlo y comparalo para ver si hay algo invertido o así.

Sin embargo, muy amable por la colaboración

ZeRoberto

unread,
May 16, 2019, 6:45:32 PM5/16/19
to publicesvfoxpro
Ya esta me falto el CONCAT()
--
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.

ZeRoberto

unread,
May 16, 2019, 6:47:08 PM5/16/19
to publicesvfoxpro
Perdon copie mal nuevamente reemplaza esto

BEGIN
    DECLARE lcDato, lcChar VARCHAR(15) DEFAULT '';
    DECLARE lcBuffer VARCHAR (1000) DEFAULT '';
    DECLARE lnItem, lnSuma, lnDigito, lnRetorno INT DEFAULT 0;
    SET lcDato := RIGHT(CONCAT(SPACE(15), TRIM(tcNit)), 15);
    doFor:
    LOOP
       SET lnItem := lnItem + 1;
       SET lcChar := SUBSTR(lcDato FROM lnItem FOR 1);
       SET lcBuffer := CONCAT_WS(' ',lcBuffer, lcChar);
       SET lnSuma := lnSuma + (lcChar * ELT(lnItem, 71, 67, 59, 53, 47, 43, 41, 37, 29, 23, 19, 17, 13, 7, 3));
       IF lnItem = 15 THEN
          LEAVE doFor;
       END IF;
    END LOOP doFor;
    SET lnSuma = MOD(lnSuma, 11);
    IF lnSuma = 0 OR lnSuma = 1 THEN
       SET lnRetorno := lnSuma;
     ELSE
       SET lnRetorno := 11 - lnSuma;
    END IF;
  RETURN lnRetorno;
END

Saludos

Ze



ZeRoberto

unread,
May 16, 2019, 6:58:40 PM5/16/19
to publicesvfoxpro
Me olvide, tienes que borrar las partes de la variable lcBuffer lo use solo para testear

Saludos

Ze


Alejandro Garcia G.

unread,
May 16, 2019, 7:02:31 PM5/16/19
to Comunidad de Visual Foxpro en Español
Amigo, un gran abrazo, gracias por colaborarme, me has dejado muchas inquietudes para estudiar (en cuanto a funciones para utilizar en MySQL).

Ya me dan los valores que deben ser, voy a estudiar bien el código para ver a donde puedo aplicar algunos ciclos e instrucciones.

Gracias.


Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publice...@googlegroups.com.

ZeRoberto

unread,
May 17, 2019, 2:54:03 AM5/17/19
to publicesvfoxpro
Mas corto aun, usando el bucle REPEAT

BEGIN
    DECLARE lcDato, lcChar VARCHAR(15) DEFAULT '';
    DECLARE lnItem, lnSuma, lnRetorno INT DEFAULT 0;
    SET lcDato := RIGHT(CONCAT(SPACE(15), TRIM(tcNit)), 15);
    REPEAT
       SET lnItem := lnItem + 1;
       SET lcChar := SUBSTR(lcDato FROM lnItem FOR 1);
       SET lnSuma := lnSuma + (lcChar * ELT(lnItem, 71, 67, 59, 53, 47, 43, 41, 37, 29, 23, 19, 17, 13, 7, 3));
     UNTIL lnItem = 15
    END REPEAT;
    SET lnSuma := MOD(lnSuma, 11);
    IF lnSuma = 0 OR lnSuma = 1 THEN
       SET lnRetorno := lnSuma;
     ELSE
       SET lnRetorno := 11 - lnSuma;
    END IF;
  RETURN lnRetorno;
END

Saludos

Ze



Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/1fecba6f-c898-4953-af10-86eacf60faa9%40googlegroups.com.

Alejandro Garcia G.

unread,
May 17, 2019, 12:16:38 PM5/17/19
to Comunidad de Visual Foxpro en Español
Gracias por la colaboración.

Ambos me trabajan bien, en MySQL, pero en donde hay María, da un error de Truncated incorrect DOUBLE value: ' ', ¿cómo puedo hacer para ver qué me causa el error?.

Yo trabajo con Navicat, la úlitma versión, ¿hay manera de hacer un seguimiento al código en este programa?

Alejandro Garcia G.

unread,
May 17, 2019, 12:38:20 PM5/17/19
to Comunidad de Visual Foxpro en Español
La versión de MariaDB que me da el mensaje de error es: 10.3.13-MariaDB

Hice un debug paso a paso con una aplicación que encontre para tal fin y no me da error, conectado a la misma base de datos, no comprendo.

De todas maneras mil gracias por este valioso aporte para mi, y lo aplicare en donde tenga MySQL instalado.

ZeRoberto

unread,
May 17, 2019, 1:40:19 PM5/17/19
to publicesvfoxpro
Hola Alejandro no te puedo ayudar con el error pues no tengo MariaDB, tal vez alguien del foro te pueda ayudar

Saludos

Ze



--
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.

Alejandro Garcia G.

unread,
May 17, 2019, 3:23:32 PM5/17/19
to Comunidad de Visual Foxpro en Español
Hombre gracias tu ayuda ha sido mucha.

La duda me surge ahora por que cuando hago un paso a paso  del código a la misma base de datos no da el error.

Sigo buscando pero la he implementado en donde sí puedo utilizarla.

Salugos y gracias.
Reply all
Reply to author
Forward
0 new messages