Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Para expertos en codigo de barras (https://www.clubdelphi.com/foros/showthread.php?t=25660)

JulioGO 29-09-2005 18:27:39

Para expertos en codigo de barras
 
Hola forofos:

Estoy desarrollando una aplicación en Delphi para una biblioteca, y para poder codificar los libros se ha elegido el codigo de barras, el cual necesita de una cadena de digitos los cuales son generados por una función. aqui el codigo de la funcion(en VFP)

Código:

 
* FUNCTION _StrToEan13(tcString,.T.) * CODIGO EAN-13

*------------------------------------------------------

* Convierte un string para ser impreso con

* fuente True Type "PF EAN P36" ó "PF EAN P72"

* PARAMETROS:

*  tcString: Caracter de 12 dígitos (0..9)

*  tlCheckD: .T. Solo genera el dígito de control

*                        .F. Genera dígito y caracteres a imprimir

* USO: _StrToEan13('123456789012')

* RETORNA: Caracter

*------------------------------------------------------

FUNCTION _StrToEan13(tcString,tlCheckD)

  LOCAL lcLat, lcMed, lcRet, lcJuego, ;

        lcIni, lcResto, lcCod, lnI, ;

        lnCheckSum, lnAux, laJuego(10), lnPri

  lcRet = ALLTRIM(tcString)

  IF LEN(lcRet) # 12

        *--- Error en parámetro

        *--- debe tener un largo = 12

        RETURN ''

  ENDIF

  *--- Genero dígito de control

  lnCheckSum = 0

  FOR lnI = 1 TO 12

        IF MOD(lnI,2) = 0

          lnCheckSum = lnCheckSum + VAL(SUBS(lcRet,lnI,1)) * 3

        ELSE

          lnCheckSum = lnCheckSum + VAL(SUBS(lcRet,lnI,1)) * 1

        ENDIF

  ENDFOR

  lnAux = MOD(lnCheckSum,10)

  lcRet = lcRet + ALLTRIM(STR(IIF(lnAux = 0,0,10-lnAux)))

  IF tlCheckD

        *--- Si solo genero dígito de control

        RETURN lcRet

  ENDIF

  *--- Para imprimir con fuente True Type PF_EAN_PXX

  *--- 1er. dígito (lnPri)

  lnPri = VAL(LEFT(lcRet,1))

  *--- Tabla de Juegos de Caracteres

  *--- según 'lnPri' (¡NO CAMBIAR!)

  laJuego(1) = 'AAAAAACCCCCC'  && 0

  laJuego(2) = 'AABABBCCCCCC'  && 1

  laJuego(3) = 'AABBABCCCCCC'  && 2

  laJuego(4) = 'AABBBACCCCCC'  && 3

  laJuego(5) = 'ABAABBCCCCCC'  && 4

  laJuego(6) = 'ABBAABCCCCCC'  && 5

  laJuego(7) = 'ABBBAACCCCCC'  && 6

  laJuego(8) = 'ABABABCCCCCC'  && 7

  laJuego(9) = 'ABABBACCCCCC'  && 8

  laJuego(10) = 'ABBABACCCCCC'  && 9

  *--- Caracter inicial (fuera del código)

  lcIni = CHR(lnPri + 35)

  *--- Caracteres lateral y central

  lcLat = CHR(33)

  lcMed = CHR(45)

  *--- Resto de los caracteres

  lcResto = SUBS(lcRet,2,12)

  FOR lnI = 1 TO 12

        lcJuego = SUBS(laJuego(lnPri + 1),lnI,1)

        DO CASE

          CASE lcJuego = 'A'

                lcResto = STUFF(lcResto,lnI,1,CHR(VAL(SUBS(lcResto,lnI,1)) + 48))

          CASE lcJuego = 'B'

                lcResto = STUFF(lcResto,lnI,1,CHR(VAL(SUBS(lcResto,lnI,1)) + 65))

          CASE lcJuego = 'C'

                lcResto = STUFF(lcResto,lnI,1,CHR(VAL(SUBS(lcResto,lnI,1)) + 97))

        ENDCASE

  ENDFOR

  *--- Armo código

  lcCod = lcIni + lcLat + SUBS(lcResto,1,6) + lcMed + ;

          SUBS(lcResto,7,6) + lcLat

  RETURN lcCod

ENDFUNC

*------------------------------------------------------

* FUNCTION _StrToEan8(tcString,.T.) * CODIGO EAN-8

*------------------------------------------------------

* Convierte un string para ser impreso con

* fuente True Type "PF EAN P36" ó "PF EAN P72"

* PARAMETROS:

*  tcString: Caracter de 7 dígitos (0..9)

*  tlCheckD: .T. Solo genera el dígito de control

*                        .F. Genera dígito y caracteres a imprimir

* USO: _StrToEan8('1234567')

* RETORNA: Caracter

*------------------------------------------------------

FUNCTION _StrToEan8(tcString,tlCheckD)

  LOCAL lcLat, lcMed, lcRet, ;

        lcIni, lcCod, lnI, ;

        lnCheckSum, lnAux

  lcRet = ALLTRIM(tcString)

  IF LEN(lcRet) # 7

        *--- Error en parámetro

        *--- debe tener un largo = 7

        RETURN ''

  ENDIF

  *--- Genero dígito de control

  lnCheckSum = 0

  FOR lnI = 1 TO 7

        IF MOD(lnI,2) = 0

          lnCheckSum = lnCheckSum + VAL(SUBS(lcRet,lnI,1)) * 3

        ELSE

          lnCheckSum = lnCheckSum + VAL(SUBS(lcRet,lnI,1)) * 1

        ENDIF

  ENDFOR

  lnAux = MOD(lnCheckSum,10)

  lcRet = lcRet + ALLTRIM(STR(IIF(lnAux = 0,0,10-lnAux)))

  IF tlCheckD

        *--- Si solo genero dígito de control

        RETURN lcRet

  ENDIF

  *--- Para imprimir con fuente True Type PF_EAN_PXX

  *--- Caracteres lateral y central

  lcLat = CHR(33)

  lcMed = CHR(45)

  *--- Caracteres

  FOR lnI = 1 TO 8

        IF lnI <= 4

          lcRet = STUFF(lcRet,lnI,1,CHR(VAL(SUBS(lcRet,lnI,1)) + 48))

        ELSE

          lcRet = STUFF(lcRet,lnI,1,CHR(VAL(SUBS(lcRet,lnI,1)) + 97))

        ENDIF

  ENDFOR

  *--- Armo código

  lcCod = lcLat + SUBS(lcRet,1,4) + lcMed + SUBS(lcRet,5,4) + lcLat

  RETURN lcCod

ENDFUNC

Pero mi dilema es como genero la cadena la cual al ser enviada a una de estas funciones me generará el dichoso codigo de barras. Otra consulta cual formato uso para codificar los libros el EAN8, EAN13 u otro.

Espero haber sido claro en la consulta.

Saludos

Casimiro Noteví 29-09-2005 22:01:16

Cita:

Empezado por JulioGO
Código:

 
 * FUNCTION _StrToEan13(tcString,.T.) * CODIGO EAN-13
 *------------------------------------------------------
 * Convierte un string para ser impreso con
 * fuente True Type "PF EAN P36" ó "PF EAN P72"
 * PARAMETROS:
 *  tcString: Caracter de 12 dígitos (0..9)
 *  tlCheckD: .T. Solo genera el dígito de control
 *                        .F. Genera dígito y caracteres a imprimir
 * USO: _StrToEan13('123456789012')
 * RETORNA: Caracter
 *------------------------------------------------------


Creo que ese código es de un lenguaje xBase, probablemente Clipper, no delphi.

Cita:

Pero mi dilema es como genero la cadena la cual al ser enviada a una de estas funciones me generará el dichoso codigo de barras. Otra consulta cual formato uso para codificar los libros el EAN8, EAN13 u otro.
La cadena con el código lo tendrás que leer del artículo o en todo caso crearlo tú mismo.

Si usas el EAN13 deberás generar un código de máximo 12 caracteres más el de control.

Te recuerdo que casi todos los generadores de informes incorporan la posibilidad de convertir el código pasado a código de barras, ejemplo: si tienes un artículo con código: 123456789012 descripción: Don Quijote de La Mancha, en el generador de informes pones un componente "código de barras" y él solito te lo imprimirá con las barras correspondientes.

Si quieres validar que sea un código correcto puedes echar un vistazo al truco 465 de trucomanía

Creo que tu pregunta era esa, espero haberme explicado bien.


La franja horaria es GMT +2. Ahora son las 02:43:53.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi