Blog Pro de Jean-Baptiste HEREN

Notes d'un consultant Freelance en Informatique

To content | To menu | To search

Imprimer une étiquette sur Zebra en Sqr

Voici un morceau de code illustrant comment générer un programme ZPL2 en sqr, afin d'imprimer une étiquette sur une imprimante Zebra. L'exemple ci-après imprime une étiquette contenant du texte, deux codes barre et un cadre.

Les "imprimantes codes barre" ne sont pas des imprimantes classiques. Pour obtenir un résultat de leur part, il faut leur transmettre des instructions dans un langage spécifique. Il s'agit donc dans cet exemple, de transmettre à l'imprimante, un fichier contenant un programme compréhensible par celle-ci. Les Zebra utilisent un langage de balises appelé ZPL. Les instructions se présente sous la forme suivante : ^XXparm0,parm1,parm3 Où XX est le nom de l'instruction, et parmx sont les paramètres. Pour plus de détails sur ce langage, vous trouverez facilement la documentations sur le site de Zebra.

L'unité utilisée pour les coordonnées sur l'étiquette est le pixel. Tout dépend donc de la résolution de l'imprimante, généralement définie en points par pouce (DPI). Ici j'utilise une fonction qui se charge de la conversion de cm à pixel, en utilisant un dpi paramétré à 300.

!----------------------------------------------------------------------!
! Author : Jean-Baptiste Heren                                         !
! Procedure print-zebra-tag                                   !
!----------------------------------------------------------------------!
! Description: Print Tags on a Zebra Printer                           !
!----------------------------------------------------------------------!
begin-procedure print-zebra-tag

  ! Set Filename
  let $filepath = RTRIM($filepath,' ')
  if substr($filepath,length($filepath),1) <> '\'
    let $filepath = $filepath || '\'
  end-if

  let $filename = $barcode_value || '.txt'
  let $filename = $filepath || $filename
    
  ! Open File
  open $filename as 1  for-writing record=1000:vary status=#filestat
  if #filestat <> 0
    SHOW 'Could not Open File ' $filename
  else   
       ! Get Positions in Pixels
       do cm-to-pixels(5  ,#YLABEL)
       do cm-to-pixels(18 ,#XLABEL)
       ! cols
       do cm-to-pixels(0.5,#XCOL0)
       do cm-to-pixels(3  ,#XCOL1)
       do cm-to-pixels(6  ,#XCOL2)
       do cm-to-pixels(12 ,#XCOL3)
       ! Lines
       do cm-to-pixels(1.5,#YGZONE)
       do cm-to-pixels(0.1,#YLINE6)
       do cm-to-pixels(0.3,#YLINE5)
       do cm-to-pixels(1  ,#YLINE4)
       do cm-to-pixels(1.8,#YLINE3)
       do cm-to-pixels(2.6,#YLINE2)
       do cm-to-pixels(3.4,#YLINE1)
       do cm-to-pixels(4.3,#YLINE0)
       
       let $label_format  = '^XA^LRN^FWR^CF0,52,39^LH20,20^PON'
       let $heading       = '^FO'|| TO_CHAR(#YLINE0) ||','|| TO_CHAR(#XCOL0) || '^CF0,52,39^FD' || 'Address : ' || $LOCAL_ADDRESS || ' Tel: '|| $LOCAL_PHONE || ' Fax: ' || $LOCAL_FAX ||'^FS'
       let $line1_1       = '^FO'|| TO_CHAR(#YLINE1) ||','|| TO_CHAR(#XCOL1) || '^CF0,65,52^FD' || 'Ref :' || '^FS'
       let $line1_2       = '^FO'|| TO_CHAR(#YLINE1) ||','|| TO_CHAR(#XCOL2) || '^CF0,65,52^FD' || $inv_item_id || ', Rev ' || $revision || '^FS'
       let $line1_3       = '^FO'|| TO_CHAR(#YLINE1) ||','|| TO_CHAR(#XCOL3) || '^B3,,110,Y^FD' || $inv_item_id || '^FS'
       let $line2_1       = '^FO'|| TO_CHAR(#YLINE2) ||','|| TO_CHAR(#XCOL1) || '^CF0,52,39^FD' || 'Designation :' || '^FS'
       let $line2_2       = '^FO'|| TO_CHAR(#YLINE2) ||','|| TO_CHAR(#XCOL2) || '^CF0,52,39^FD' || $ITEM_DESCR || '^FS'
       let $line3_1       = '^FO'|| TO_CHAR(#YLINE3) ||','|| TO_CHAR(#XCOL1) || '^CF0,52,39^FD' || 'Quantite :' || '^FS'
       let $line3_2       = '^FO'|| TO_CHAR(#YLINE3) ||','|| TO_CHAR(#XCOL2) || '^CF0,52,39^FD' || To_CHAR(#QtyOnTag) || '^FS'
       let $line4_1       = '^FO'|| TO_CHAR(#YLINE4) ||','|| TO_CHAR(#XCOL1) || '^CF0,52,39^FD' || 'N. Lot :' || '^FS'
       let $line4_2       = '^FO'|| TO_CHAR(#YLINE4) ||','|| TO_CHAR(#XCOL2) || '^CF0,52,39^FD' || $barcode_value || '^FS'
       let $line4_3       = '^FO'|| TO_CHAR(#YLINE4) ||','|| TO_CHAR(#XCOL3) || '^B3,,110,Y^FD' || $barcode_value || '^FS'
       let $line5_1       = '^FO'|| TO_CHAR(#YLINE5) ||','|| TO_CHAR(#XCOL1) || '^CF0,52,39^FD' || 'Date :' || '^FS'
       let $line5_2       = '^FO'|| TO_CHAR(#YLINE5) ||','|| TO_CHAR(#XCOL2) || '^CF0,52,39^FD' || $SysDateTime || '^FS'
       ! Graphics
       let $graphic_box   = '^FO0,0^GB' || TO_CHAR(#YLABEL) || ','|| TO_CHAR(#XLABEL) || ',5^FS'
       let $graphic_line  = '^FO0,0^GB0,' || TO_CHAR(#YLABEL) || ',5^FS'
       let $label_end     = '^XZ'
       
       let $LINE = $label_format || $heading || $line1_1  || $line1_2 || $line1_3 || $line2_1 || $line2_2 || $line3_1 || $line3_2 || $line4_1 || $line4_2 || $line4_3 || $line5_1 || $line5_2 || $graphic_box || $graphic_line || $label_end
      ! Write File
      #DEBUG SHOW 'Zebra data : ' $LINE
      write 1 from $LINE
  end-if
  CLOSE 1
end-if
end-procedure

!----------------------------------------------------------------------!
! Author : Jean-Baptiste Heren                                         !
! Procedure To convert cm to pixels using a DPI fixed parameter        !
! Cette procédure convertit des cm en Pixels suivant un dpi paramétré  !
!----------------------------------------------------------------------!
begin-procedure cm-to-pixels(#cm, :#pixels)
! This Could be also a parameter
let #dpi = 300
! Conversion
let #inches = #cm *0.39
! Rounding
let #pixels = round(#dpi * #inches,0) ! Integer divide
end-procedure

Jean-Baptiste Heren

Author: Jean-Baptiste Heren

Stay in touch with the latest news and subscribe to the RSS Feed about this category

Comments are closed



You Might Also Like

Finding one component location in the peoplesoft portal

Just replace the 'MY_COMPONENT_GBL' parameter in the following sql script. This works for MS SQl Server. You can add more levels by adding Outer Joins. [SQL] /* Where is my component in the portal */...

Continue reading

02_-_new_component_interface.png

Peoplesoft Component interface HOWTO

Here is a tutorial explaining how you can create a function containing one Component INterface, and make use of it from any peolplecode. Following example takes the PO Receipt Component to make...

Continue reading