Page 1 of 2

Problem when print CODE128 using Barlib

Posted: Mon Mar 05, 2018 7:54 pm
by vilian
Hi Guys,

I´m having a problem when try to print barcode using Barlib.

IF I print the string 15140803532877000111550020000018651000018657 using the pattern CODE128 and after I try to read the barcode generated, the value returned is different.

Do you know why ?

Re: Problem when print CODE128 using Barlib

Posted: Mon Mar 05, 2018 11:01 pm
by Enrico Maria Giordano
Try this fixed code:

Code: Select all

FUNCTION _CODE128( cCode, cMode )

    LOCAL aCode := {"212222",;
                    "222122",;
                    "222221",;
                    "121223",;
                    "121322",;
                    "131222",;
                    "122213",;
                    "122312",;
                    "132212",;
                    "221213",;
                    "221312",;
                    "231212",;
                    "112232",;
                    "122132",;
                    "122231",;
                    "113222",;
                    "123122",;
                    "123221",;
                    "223211",;
                    "221132",;
                    "221231",;
                    "213212",;
                    "223112",;
                    "312131",;
                    "311222",;
                    "321122",;
                    "321221",;
                    "312212",;
                    "322112",;
                    "322211",;
                    "212123",;
                    "212321",;
                    "232121",;
                    "111323",;
                    "131123",;
                    "131321",;
                    "112313",;
                    "132113",;
                    "132311",;
                    "211313",;
                    "231113",;
                    "231311",;
                    "112133",;
                    "112331",;
                    "132131",;
                    "113123",;
                    "113321",;
                    "133121",;
                    "313121",;
                    "211331",;
                    "231131",;
                    "213113",;
                    "213311",;
                    "213131",;
                    "311123",;
                    "311321",;
                    "331121",;
                    "312113",;
                    "312311",;
                    "332111",;
                    "314111",;
                    "221411",;
                    "431111",;
                    "111224",;
                    "111422",;
                    "121124",;
                    "121421",;
                    "141122",;
                    "141221",;
                    "112214",;
                    "112412",;
                    "122114",;
                    "122411",;
                    "142112",;
                    "142211",;
                    "241211",;
                    "221114",;
                    "213111",;
                    "241112",;
                    "134111",;
                    "111242",;
                    "121142",;
                    "121241",;
                    "114212",;
                    "124112",;
                    "124211",;
                    "411212",;
                    "421112",;
                    "421211",;
                    "212141",;
                    "214121",;
                    "412121",;
                    "111143",;
                    "111341",;
                    "131141",;
                    "114113",;
                    "114311",;
                    "411113",;
                    "411311",;
                    "113141",;
                    "114131",;
                    "311141",;
                    "411131",;
                    "211412",;
                    "211214",;
                    "211232",;
                    "2331112"}

    LOCAL nSum, cBar, cCar
    LOCAL cTemp, n, nCAr, nCount := 0
    LOCAL lCodeC := .F., lCodeA := .F.

    IF VALTYPE( cCode ) != "C" THEN RETURN NIL

    IF !EMPTY( cMode )
        IF VALTYPE( cMode ) = "C" .AND. UPPER( cMode ) $ "ABC"
            cMode = UPPER( cMode )
        ENDIF
    ENDIF

    IF EMPTY( cMode )
        IF ISNUMBER( cCode )
            lCodeC = .T.
            cTemp  = aCode[ 106 ]
            nSum   = 105
        ELSE
            FOR n = 1 TO LEN( cCode )
                nCount += IF( SUBSTR( cCode, n, 1 ) > 31, 1, 0 )
            NEXT

            IF nCount < LEN( cCode ) / 2
                lCodeA = .T.
                cTemp  = aCode[ 104 ]
                nSum   = 103
            ELSE
                cTemp = aCode[ 105 ]
                nSum  = 104
            ENDIF
        ENDIF
    ELSE
        IF cMode = "C"
            lCodeC = .T.
            cTemp  = aCode[ 106 ]
            nSum   = 105
        ELSEIF cMode = "A"
            lCodeA = .T.
            cTemp  = aCode[ 104 ]
            nSum   = 103
        ELSE
            cTemp = aCode[ 105 ]
            nSum  = 104
        ENDIF
    ENDIF

    nCount = 0

    FOR n = 1 TO LEN( cCode )
        nCount++
        cCar = SUBSTR( cCode, n, 1 )

        IF lCodeC
            IF LEN( cCode ) = n
                CTemp += aCode[ 101 ]
                nSum += 100 * nCount
                nCount++
                nCar = ASC( cCar ) - 31
            ELSE
                nCar = VAL( SUBSTR( cCode, n, 2 ) ) + 1
                n++
            ENDIF
        ELSEIF lCodeA
            IF cCar > "_"
                cTemp += aCode[ 101 ]
                nCar = ASC( cCar ) - 31
            ELSEIF cCar <= " "
                nCar = ASC( cCar ) + 64
            ELSE
                nCar = ASC( cCar ) - 31
            ENDIF
        ELSE
            IF cCar <= " "
                cTemp += aCode[ 102 ]
                nCar = ASC( cCar ) + 64
            ELSE
                nCar = ASC( cCar ) - 31
            ENDIF
        ENDIF

        nSum += ( nCar - 1 ) * nCount
        cTemp = cTemp + aCode[ nCar ]
    NEXT

    nSum  = nSum % 103 + 1
    cTemp = cTemp + aCode[ nSum ] + aCode[ 107 ]
    cBar  = ""

    FOR n = 1 TO LEN( cTemp ) STEP 2
        cBar += REPLICATE( "1", VAL( SUBSTR( cTemp, n, 1 ) ) )
        cBar += REPLICATE( "0", VAL( SUBSTR( cTemp, n + 1, 1 ) ) )
    NEXT

    RETURN cBar
EMG

Re: Problem when print CODE128 using Barlib

Posted: Tue Mar 06, 2018 11:39 am
by vilian
Hi Enrico,

Don't work yet :(
I made a little sample:

Code: Select all

   PRINT oPrn NAME "Teste Barcode" PREVIEW
   oPrn:SetPortrait()

   PAGE
      aMargin:=oPrn:SizeInch2Pix(1,1)
    Code128(aMargin[2],aMargin[1],"15140803532877000111550020000018651000018657",oPrn,"C",0,.T.,0.029,1.20)

   ENDPAGE

   PrintEnd()
 
When I read the barcode that is printed, the number returned is 15140803531118000111550020000018651000018657
The part that is returning different is '1118' that is bold/red in the string.

Re: Problem when print CODE128 using Barlib

Posted: Wed Mar 07, 2018 1:53 pm
by Enrico Maria Giordano
You are right! There was a wrong code. This is the fixed version:

Code: Select all

FUNCTION _CODE128( cCode, cMode )

    LOCAL aCode := {"212222",;
                    "222122",;
                    "222221",;
                    "121223",;
                    "121322",;
                    "131222",;
                    "122213",;
                    "122312",;
                    "132212",;
                    "221213",;
                    "221312",;
                    "231212",;
                    "112232",;
                    "122132",;
                    "122231",;
                    "113222",;
                    "123122",;
                    "123221",;
                    "223211",;
                    "221132",;
                    "221231",;
                    "213212",;
                    "223112",;
                    "312131",;
                    "311222",;
                    "321122",;
                    "321221",;
                    "312212",;
                    "322112",;
                    "322211",;
                    "212123",;
                    "212321",;
                    "232121",;
                    "111323",;
                    "131123",;
                    "131321",;
                    "112313",;
                    "132113",;
                    "132311",;
                    "211313",;
                    "231113",;
                    "231311",;
                    "112133",;
                    "112331",;
                    "132131",;
                    "113123",;
                    "113321",;
                    "133121",;
                    "313121",;
                    "211331",;
                    "231131",;
                    "213113",;
                    "213311",;
                    "213131",;
                    "311123",;
                    "311321",;
                    "331121",;
                    "312113",;
                    "312311",;
                    "332111",;
                    "314111",;
                    "221411",;
                    "431111",;
                    "111224",;
                    "111422",;
                    "121124",;
                    "121421",;
                    "141122",;
                    "141221",;
                    "112214",;
                    "112412",;
                    "122114",;
                    "122411",;
                    "142112",;
                    "142211",;
                    "241211",;
                    "221114",;
                    "413111",;
                    "241112",;
                    "134111",;
                    "111242",;
                    "121142",;
                    "121241",;
                    "114212",;
                    "124112",;
                    "124211",;
                    "411212",;
                    "421112",;
                    "421211",;
                    "212141",;
                    "214121",;
                    "412121",;
                    "111143",;
                    "111341",;
                    "131141",;
                    "114113",;
                    "114311",;
                    "411113",;
                    "411311",;
                    "113141",;
                    "114131",;
                    "311141",;
                    "411131",;
                    "211412",;
                    "211214",;
                    "211232",;
                    "2331112"}

    LOCAL nSum, cBar, cCar
    LOCAL cTemp, n, nCAr, nCount := 0
    LOCAL lCodeC := .F., lCodeA := .F.

    IF VALTYPE( cCode ) != "C" THEN RETURN NIL

    IF !EMPTY( cMode )
        IF VALTYPE( cMode ) = "C" .AND. UPPER( cMode ) $ "ABC"
            cMode = UPPER( cMode )
        ENDIF
    ENDIF

    IF EMPTY( cMode )
        IF ISNUMBER( cCode )
            lCodeC = .T.
            cTemp  = aCode[ 106 ]
            nSum   = 105
        ELSE
            FOR n = 1 TO LEN( cCode )
                nCount += IF( SUBSTR( cCode, n, 1 ) > 31, 1, 0 )
            NEXT

            IF nCount < LEN( cCode ) / 2
                lCodeA = .T.
                cTemp  = aCode[ 104 ]
                nSum   = 103
            ELSE
                cTemp = aCode[ 105 ]
                nSum  = 104
            ENDIF
        ENDIF
    ELSE
        IF cMode = "C"
            lCodeC = .T.
            cTemp  = aCode[ 106 ]
            nSum   = 105
        ELSEIF cMode = "A"
            lCodeA = .T.
            cTemp  = aCode[ 104 ]
            nSum   = 103
        ELSE
            cTemp = aCode[ 105 ]
            nSum  = 104
        ENDIF
    ENDIF

    nCount = 0

    FOR n = 1 TO LEN( cCode )
        nCount++
        cCar = SUBSTR( cCode, n, 1 )

        IF lCodeC
            IF LEN( cCode ) = n
                CTemp += aCode[ 101 ]
                nSum += 100 * nCount
                nCount++
                nCar = ASC( cCar ) - 31
            ELSE
                nCar = VAL( SUBSTR( cCode, n, 2 ) ) + 1
                n++
            ENDIF
        ELSEIF lCodeA
            IF cCar > "_"
                cTemp += aCode[ 101 ]
                nCar = ASC( cCar ) - 31
            ELSEIF cCar <= " "
                nCar = ASC( cCar ) + 64
            ELSE
                nCar = ASC( cCar ) - 31
            ENDIF
        ELSE
            IF cCar <= " "
                cTemp += aCode[ 102 ]
                nCar = ASC( cCar ) + 64
            ELSE
                nCar = ASC( cCar ) - 31
            ENDIF
        ENDIF

        nSum += ( nCar - 1 ) * nCount
        cTemp = cTemp + aCode[ nCar ]
    NEXT

    nSum  = nSum % 103 + 1
    cTemp = cTemp + aCode[ nSum ] + aCode[ 107 ]
    cBar  = ""

    FOR n = 1 TO LEN( cTemp ) STEP 2
        cBar += REPLICATE( "1", VAL( SUBSTR( cTemp, n, 1 ) ) )
        cBar += REPLICATE( "0", VAL( SUBSTR( cTemp, n + 1, 1 ) ) )
    NEXT

    RETURN cBar
EMG

Re: Problem when print CODE128 using Barlib

Posted: Wed Mar 07, 2018 3:06 pm
by vilian
I tried with the new code, but still not working here :(

Re: Problem when print CODE128 using Barlib

Posted: Wed Mar 07, 2018 3:10 pm
by Enrico Maria Giordano
Double check that you are using the new code, please. It works fine here now with your sample. Maybe you need this function:

Code: Select all

FUNCTION ISNUMBER( cStr )

    LOCAL i

    FOR i = 1 TO LEN( cStr )
        IF !ISDIGIT( SUBSTR( cStr, i, 1 ) ) THEN RETURN .F.
    NEXT

    RETURN .T.
EMG

Re: Problem when print CODE128 using Barlib

Posted: Wed Mar 07, 2018 5:29 pm
by vilian
Enrico,

You are right. I was doing "IsNumber" by a wrong way. Everything is fine now.
Thank you very much ;)

Re: Problem when print CODE128 using Barlib

Posted: Tue Feb 12, 2019 10:29 am
by jds
Hallo,
Where can I find the barlib library?
José

Re: Problem when print CODE128 using Barlib

Posted: Mon Mar 18, 2019 3:22 pm
by jds
vilian wrote:Enrico,

You are right. I was doing "IsNumber" by a wrong way. Everything is fine now.
Thank you very much ;)
Hi Vilian
Can you send me the complete program to print code 128 starting from any number or name
Do you use barlib.lib or barlib32.lib and barcode.ch
Where do you position the .lib and the .ch (in fwh or harbour map)
Thank you
deschutterjose@gmail.com

Re: Problem when print CODE128 using Barlib

Posted: Mon Mar 18, 2019 10:30 pm
by Otto
Hello,
May I ask why you don't use FIVEWIN’s build in EASYREPORT?

You read what you print.
15140803532877000111550020000018651000018657
Get Outlook for Android


Best regards
Otto

Image

Image

Re: Problem when print CODE128 using Barlib

Posted: Tue Mar 19, 2019 2:55 am
by nageswaragunupudi
The built-in barcode functionality of EasyReport can also be used directly using Printer class with this code:

Code: Select all

function printbarcode()

   local oPrn, oBarcode
   local cText := "FiveTechSoft"

   cText := "15140803532877000111550020000018651000018657"

   PRINT oPrn PREVIEW
   oPrn:SetLandScape()
   PAGE

      oBarCode := FWER_BarCode():New( oPrn:hDCOut, cText, 700,100, 3000, 400, 3 )
      WITH OBJECT oBarCode
         :nBCodeType    := 3  // CODE 128
         :nPinWidth     := 10
         :ShowBarCode()
      END

   ENDPAGE
   ENDPRINT

return nil
 
Using the same barcode class that FWH EasyReport uses.
This class is already available in FWH. You do not need any external library.

Re: Problem when print CODE128 using Barlib

Posted: Tue Mar 19, 2019 8:15 am
by jds
nageswaragunupudi wrote:The built-in barcode functionality of EasyReport can also be used directly using Printer class with this code:

Code: Select all

function printbarcode()

   local oPrn, oBarcode
   local cText := "FiveTechSoft"

   cText := "15140803532877000111550020000018651000018657"

   PRINT oPrn PREVIEW
   oPrn:SetLandScape()
   PAGE

      oBarCode := FWER_BarCode():New( oPrn:hDCOut, cText, 700,100, 3000, 400, 3 )
      WITH OBJECT oBarCode
         :nBCodeType    := 3  // CODE 128
         :nPinWidth     := 10
         :ShowBarCode()
      END

   ENDPAGE
   ENDPRINT

return nil
 
Using the same barcode class that FWH EasyReport uses.
This class is already available in FWH. You do not need any external library.

Is Easyreport also included in my 9.0 version of FWHarbour?
José (jds)

Re: Problem when print CODE128 using Barlib

Posted: Tue Mar 19, 2019 8:19 am
by nageswaragunupudi
What is 9.0 version?

Did you try the above code?
If it works for you, then the Easy Report runtime is included in your version.

Re: Problem when print CODE128 using Barlib

Posted: Tue Mar 19, 2019 9:39 am
by Marc Venken
[quote="nageswaragunupudi"]The built-in barcode functionality of EasyReport can also be used directly using Printer class with this code:

Code: Select all

function printbarcode()

   local oPrn, oBarcode
   local cText := "FiveTechSoft"

   cText := "15140803532877000111550020000018651000018657"

   PRINT oPrn PREVIEW
   oPrn:SetLandScape()
   PAGE

      oBarCode := FWER_BarCode():New( oPrn:hDCOut, cText, 700,100, 3000, 400, 3 )
      WITH OBJECT oBarCode
         :nBCodeType    := 3  // CODE 128
         :nPinWidth     := 10
         :ShowBarCode()
      END

   ENDPAGE
   ENDPRINT

return nil
 
Where is this function located ? :

FWER_BarCode():New( oPrn:hDCOut, cText, 700,100, 3000, 400, 3 )
Looking for the options that exist for :

 :nBCodeType    := 3  // CODE 128

Re: Problem when print CODE128 using Barlib

Posted: Tue Mar 19, 2019 9:41 am
by nageswaragunupudi
Available from FWH 18.05 onwards.