Página 1 de 1

TBarCode y su checksum

Publicado: Mié Sep 27, 2017 1:20 pm
por XeviCOMAS
Estoy con las pruebas de Xailer5.
Ahora con TBarCode.

Si pasamos un codigo de barras erroneo EAN13, por ejemplo
8411772557215
Muestra un mensaje "Bad Checksum"
Luego, ya que se calcula automáticamente el digito de control internament, si enviamos 12 dígitos,
841177255721
muestra el codigo de barras correctamente.
PERO...
¿como se cual es ese dígito control???

Lo digo, por generarme yo mismo codigos de barras que éstos precisen de un dígito control.

Podria añadirse una propiedad más???
cChecksum por ejemplo.

Gracias.

Un Saludo,
Xevi.

Re: TBarCode y su checksum

Publicado: Mié Sep 27, 2017 4:14 pm
por bingen
**/
* FUNCION que retorna el dígito de control de un código EAN13
* @author Bingen Ugaldebere

* @param cCodigo Cadena con el nº de EAN13 12 d¡gitos numéricos

* @return cDc Dígito de control 1 caracter numérico
*/

FUNCTION EAN13DC(cCodigo)
LOCAL nT,nFactor,nAcumulador:=0,nDigControl

cCodigo:=LEFT(AllString(cCodigo)+"000000000000",12)

FOR nT:= 1 to 12
nFactor:=if(nT/2==int(nT/2),3,1)
nAcumulador+=(val(subst(cCodigo,nT,1))*nFactor)
NEXT

nDigControl:=10-(nAcumulador%10)

IF nDigControl>9
nDigControl:=0
ENDIF

RETURN STR(nDigControl,1)

//------------------------------------------------------------------------------

Re: TBarCode y su checksum

Publicado: Mié Sep 27, 2017 4:52 pm
por XeviCOMAS
Gracias Bingen por el aporte.


Tenia el fuente de una Clase TBarCode del 2006, retocada por José F. Gimenez, la que estoy utilizando hoy en dia, en la que deducí el cálculo de ese checksum.

Aunque no seria mucho pedir que la misma clase TBarCode llevara una propiedad encargada de ello.

Un Saludo,
Xevi.

Re: TBarCode y su checksum

Publicado: Mié Sep 27, 2017 5:41 pm
por XeviCOMAS
Bingen...

la función que utilizas AllString ???

Vendria a ser AllTrim() ???

Un Saludo,
Xevi.

Re: TBarCode y su checksum

Publicado: Jue Sep 28, 2017 7:26 am
por bingen
Pues no es exactamente Alltrim


//Devuelve un dato de cualquier tipo como un string sin espacios ni Tabuladores Chr(9) que no se ven
//o si se desea, ajustado con espacios a un tamaño y posicion (1 Left 2 Center 3 right)
Function AllString(xValue, nLongitud, nAjuste)
Local cValue

Default nLongitud To 0
Default nAjuste To 1

if xValue == NIL
cValue := ""
else
//Convertir a cadena sin espacios
If ValType(xValue)="L"
cValue:=IF(xValue,"S","N")
ELSEIf ValType(xValue)="N"
cValue:=StrTrim(xValue)
Else
cValue:=AllTrim(ToString(xValue))
ENDIF

//Quitar tabuladores iniciales y finales para que no nos vuelvan locos
Do While Left(cValue,1)==Chr(9)
cValue:=SubStr(cValue,2)
Enddo
Do While Right(cValue,1)==Chr(9)
cValue:=Left(cValue,Len(cValue)-1)
Enddo
endif

//Ajuste y adaptación a una longitud concreta
If nLongitud>0
Do Case
Case nAjuste=1 //Ajuste izquierdo
cValue:=PadL(cValue,nLongitud)
Case nAjuste=2 //Ajuste centrado
cValue:=PadC(cValue,nLongitud)
Case nAjuste=3 //Ajuste izquierdo
cValue:=PadR(cValue,nLongitud)
EndCase
Endif
Return cValue

Re: TBarCode y su checksum

Publicado: Jue Sep 28, 2017 9:21 am
por XeviCOMAS
Bingen...

Si la incluyo, ahora falta StrTrim()

Un Saludo,
Xevi.

Re: TBarCode y su checksum

Publicado: Vie Sep 29, 2017 3:28 pm
por XeviCOMAS
Bingen?

:roll:

Un Saludo,
Xevi.

Re: TBarCode y su checksum

Publicado: Lun Oct 02, 2017 5:10 pm
por bingen
Tampoco te hacía falta complicarte la vida podemos decir que AllString() es igual a Alltrim(ToString()) y eso ya lo tienes en Hb y Xailer


// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// F U N C I O N: StrTrim(<nValor>) -> <cValor>
// DESCRIPCION : Sirve para convertir un valor Numérico a Caracter anulando los espacios
// izquierdo y derecho con AllTrim()
// PARAMETROS : <nValor> = Valor numérico que se desea tratar
// DEVUELVE : <cValor> = Cadena de caracteres sin espacios, indicando <nValor>
// U S O : Esto evita hacer AllTrim( STR(2030) )
// E J E M P L O: ? StrTrim( 2030) => "2030"
// ? StrTrim( 54.25) => "54.25"
// A U T O R : Sanrom's Software de México
// F E C H A : 2004
//
FUNCTION StrTrim( nValor )

LOCAL cType := ValType( nValor )

/*DO CASE
CASE cType == "C"; nValor := AllTrim(nValor)
CASE cType == "N"; nValor := ALLTRIM( STR(nValor, 21, NumGetDecimals(nValor)) ) //Str(nValor,,, .T.) <- Sep'07: No funcionó con xHarbour y el nuevo 4° parámetro
ENDCASE*/

IF cType == "N"
nValor := AllTrim( Str( nValor, 21, NumGetDecimals(nValor ) ) ) //Str(nValor,,, .T.) <- Sep'07: No funcionó con xHarbour y el nuevo 4° parámetro
ELSE
nValor := AllTrim( ToString( nValor ) )
ENDIF

RETURN( nValor )
//
// FIN StrTrim()
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *