In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
TBarCode y su checksum
TBarCode y su checksum
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.
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.
Un Saludo,
Xevi.
Xevi.
Re: TBarCode y su checksum
**/
* 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)
//------------------------------------------------------------------------------
* 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)
//------------------------------------------------------------------------------
BiSoft Desarrollo de software profesional
http://www.bisoft.es
http://www.bisoft.es
Re: TBarCode y su checksum
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.
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.
Un Saludo,
Xevi.
Xevi.
Re: TBarCode y su checksum
Bingen...
la función que utilizas AllString ???
Vendria a ser AllTrim() ???
Un Saludo,
Xevi.
la función que utilizas AllString ???
Vendria a ser AllTrim() ???
Un Saludo,
Xevi.
Un Saludo,
Xevi.
Xevi.
Re: TBarCode y su checksum
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
//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
BiSoft Desarrollo de software profesional
http://www.bisoft.es
http://www.bisoft.es
Re: TBarCode y su checksum
Bingen...
Si la incluyo, ahora falta StrTrim()
Un Saludo,
Xevi.
Si la incluyo, ahora falta StrTrim()
Un Saludo,
Xevi.
Un Saludo,
Xevi.
Xevi.
Re: TBarCode y su checksum
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()
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// 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()
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
BiSoft Desarrollo de software profesional
http://www.bisoft.es
http://www.bisoft.es