Esto lo hago en un Source procedure



!Variables en el Local Data
lcStart      CSTRING(100)
lcStop       CSTRING(100)
lcRet        CSTRING(100)
lcCheck      CSTRING(100)
lcCar        CSTRING(100)
lnLong       LONG
lnI          LONG
lnCheckSum   LONG
lnAsc        LONG




!Esto va en el Processed Code

!Dentro de un Case

 CASE GLO:CualBarra               !Le paso x parametro el tipo de Barcode128 a usar  A-B-C

   OF 1                                         ! Barcode128A

      lcStart = CHR(103 + 32)                   !Esta es la unica diferencia con el 128B
      lcStop  = CHR(106 + 32)
      lnCheckSum = VAL(lcStart) - 32
      lcRet = CLIP(LEFT(tcString))
      lnLong = LEN(lcRet)
      LOOP lnI = 1 TO lnLong
         lnAsc =  VAL(SUB(lcRet,lnI,1))-32
         IF ~(lnAsc=>0 AND lnAsc<=64)           !Aqui es hasta <=64
            lcRet[lnI]=CHR(32)
            lnAsc = VAL( SUB(lcRet,lnI,1) )-32
         END
         lnCheckSum = lnCheckSum + (lnAsc * lnI)
      END
      lcCheck = CHR((lnCheckSum%103) + 32)
      lcRet = lcStart & lcRet & lcCheck & lcStop
      LOOP lnI = 1 TO LEN(lcRet)
         IF lcRet[lnI]=CHR(128)
            lcRet[lnI]=CHR(232)
         END
         IF lcRet[lnI]=CHR(32)
            lcRet[lnI]=CHR(232)
         END
         IF lcRet[lnI]=CHR(127)
            lcRet[lnI]=CHR(192)
         END
      END
   
   OF 2                                           !Barcode128B

      lcStart = CHR(104 + 32)
      lcStop  = CHR(106 + 32)

      lnCheckSum = VAL(lcStart) - 32

      lcRet = CLIP(LEFT(tcString))
      lnLong = LEN(lcRet)
      LOOP lnI = 1 TO lnLong
         lnAsc =  VAL(lcRet[lnI])-32
         IF ~(lnAsc=>0 AND lnAsc<=99)             !Aqui es hasta <=99
            lcRet[lnI]=CHR(32)
            lnAsc = VAL(lcRet[lnI]-32)
         END
         lnCheckSum = lnCheckSum + (lnAsc * lnI)
      END
      lcCheck = CHR((lnCheckSum%103) + 32)
      lcRet = lcStart & lcRet & lcCheck & lcStop
      LOOP lnI = 1 TO LEN(lcRet)
         IF lcRet[lnI]=CHR(128)
            lcRet[lnI]=CHR(232)
         END
         IF lcRet[lnI]=CHR(32)
            lcRet[lnI]=CHR(232)
         END
         IF lcRet[lnI]=CHR(127)
            lcRet[lnI]=CHR(192)
         END
      END

   OF 3                                           !Barcode128C

      lcStart = CHR(105 + 32)
      lcStop  = CHR(106 + 32)
      lnCheckSum = VAL(lcStart) - 32
      lcRet = CLIP(LEFT(tcString))
      lnLong = LEN(lcRet)
      IF (lnLong%2)<>0
         lcRet  = '0'&lcRet
         lnLong = LEN(lcRet)
      END
      lcCar=''
      LOOP lnI=1 TO lnLong BY 2
         lcCar=lcCar & CHR( VAL( SUB(lcRet,lnI,2) ) + 32)
      END
      lcRet=lcCar
      lnLong=LEN(lcRet)
      LOOP lnI = 1 TO lnLong
         lnAsc =  VAL(lcRet[lnI])-32
         lnCheckSum = lnCheckSum + (lnAsc * lnI)
      END
      lcCheck = CHR((lnCheckSum%103) + 32)
      lcRet = lcStart & lcRet & lcCheck & lcStop
      LOOP lnI = 1 TO LEN(lcRet)
         IF lcRet[lnI]=CHR(128)
            lcRet[lnI]=CHR(232)
         END
         IF lcRet[lnI]=CHR(32)
            lcRet[lnI]=CHR(232)
         END
         IF lcRet[lnI]=CHR(127)
            lcRet[lnI]=CHR(192)
         END
      END

