1. For perhaps 20 years here we have been using HP-GL/2.  What follows is
the UniBasic Source Code for an example program.  I believe that HP-GL/2
lives in every HP laser printer, but not on most inkjets.  Thus, except for
development time, HP-GL/2 is free.  There is plenty of HP documentation on
HP-GL/2. 

2. In my former Epicor.com Avante SB+ life, we bought a 3rd party tool via
Epicor from Optio .com (a big forms software company in Atlanta).  I found
Optio to be robust... and more than respectable.  

Regards,

--Bill

*---------------------------------------------------------------------------
------------
$OPTIONS A

      AM  = char(254)
      VM  = char(253)
      SVM = char(252)

      CLR = @(-1) : STR(char(0),3)
      
      equate true to 1, false to 0

      gosub Set.Dimensions

      open 'CM'            to F.CM        else null 
      open 'IM'            to F.IM        else null
      open 'JOB.ROUTE'     to F.JOB.ROUTE else null
      open 'OP'            to F.OP        else null 
      open 'PPAP'          to F.PPAP      else null
      open 'ROUTE.REMARKS' to F.RR        else null
      open 'ROUTE.OPS'     to F.RO        else null
      open 'SHIP.TO'       to F.SHIP.TO   else null 
      open 'SOD'           to F.SOD       else null 
      open 'SOH'           to F.SOH       else null 
      open 'VOC'           to F.VOC       else null
      open 'WOH'           to F.WOH       else null 
      
*---------------------------------------------------------------------------
---
      
      EOJ = 0
      gosub Clear.Variables

      common PORT
      PORT = @USERNO

      TEMP.COMMAND = 'TEMP.COMMAND.':PORT
     
      input SO.ID
      
      read R.WOH from F.WOH, SO.ID  else null
        HK.PN = R.WOH<31>
        
      read R.Router from F.RR,   HK.PN  else null
      
      PPAP = true
      read R.PPAP   from F.PPAP, HK.PN  else PPAP = false
      close F.PPAP

      gosub EXTRACT.JOB.INFO
      gosub FORMAT.Part.Description

      call *PRINTER.SETUP.R2('Portrait')
      
      Z = 1

      call *INIT.LASER.PRINTER( "GRAPHIC", "PORTRAIT", "REGULAR", "UPPER")

      print char(27):'%0A'
      print char(27):'&l1X'         ;* "1X" is for the number of copies
      print char(27):'%0B'

      gosub Print.Form       
        
      call *EJECT.PAGE
      gosub RESET.BACK
      
      printer OFF
      printer CLOSE
      
      execute 'STD.SP.ASSIGN'
      execute 'RESET.PRINTER'
      
      go The.End

*---------------------------------------------------------------------------
-----
Clear.Variables:

      Created    = ''
      Cust.Part  = ''
      Cust.Rev   = ''
      Cust.Name  = ''
      DESC       = ''
      D.Message  = ''
      Page.count = 0
      HK.PN      = ''
      HK.Rev     = ''
      Last.Date  = ''
      Line.Hgt   = ''
      Line.Pg    = ''
      Line.Hgt   = ''
      Machine    = ''
      Message    = ''
      Op.Desc    = ''
      OP.Code    = ''
      P.Message  = ''
      Qty.Compl  = ''
      Seq.ID     = ''
      Seq.Note.1 = ''
      Seq.Note.2 = ''
      Seq.Note.3 = ''
      
      Total.Pages = 0   
      X           = 1   
      
return

*---------------------------------------------------------------------------
---------
Set.Dimensions:

      DETAIL.AREA.HGT = 7.5
      
      Detail.Ht     = 0.6   ;* Note.Ht * 3

      INDENT        = 0.5   ;* Headers
      Message.Len   = 7.8

      HK.PN.Len     = 1.0   
      HK.Rev.Len    = 0.9
      Cust.Name.Len = 2.5
      Cust.Part.Len = 1.5
      Cust.Rev.Len  = 1.0
      Created.Len   = 1.0
      SO.ID.Len     = 1.0

      Op.Desc.Len   = 1.0   ;* Details          
      OP.BAR.Len    = 1.5
      Last.Mod.Len  = 1.5
      Machine.Len   = 0.5
      Notes.Len     = 5.1
      Note.Ht       = 0.2
      Seq.Nbr.Len   = 0.5
      Initials.Len  = 0.8
      
      DETAIL.HEAD.EXTRA.Len.Len = 0.7

return

*---------------------------------------------------------------------------
---------
Print.Form:

  call *HK.LOGO(0, 8.7, 1.25 )
  call *TITLE.TEXT( 3.0, 9.5, 'R', 'T', '', 30, 'Router')

  X.Now = 5.0
  
  Ht   = 0.3
  Wide = 1.5
  Font = 14

  call *ONE.LINE.TEXT.BOX(X.Now,10.0, Wide, Ht, 2,'Y','C','', Font, 'Sales
Order')  
  call *ONE.LINE.TEXT.BOX(X.Now, 9.7, Wide, Ht, 0,'Y','C','', Font,  SO.ID)

  
  Font = 36
  if PPAP = true then call *ONE.LINE.TEXT.BOX(X.Now, 9.35, Wide, Ht,
0,'N','C','', Font, "PPAP")  
  
  Font = 14
  X.Now += Wide

  call *ONE.LINE.TEXT.BOX(X.Now,10.0, Wide, Ht, 2, 'Y', 'C', '', Font, 'HK
PN')
  call *ONE.LINE.TEXT.BOX(X.Now, 9.7, Wide, Ht, 0, 'Y', 'C', '', Font,
HK.PN)
  
  Y.Now = 9.4
  Ht    = 0.2
  Font  = 8

  read R.RR from F.RR, HK.PN     else     null
  R = R.RR<1>
  Last.Rec   = count(R,VM) + 1
  Last.Mod   = R.RR<1,Last.Rec>
  Last.Mod.A = Last.Mod[1,5]
  Last.Mod.F = oconv(Last.Mod.A, 'D4')
  
  call *ONE.LINE.TEXT.BOX(X.Now,Y.Now, Wide, Ht, 1, 'Y', 'C', '',Font,
"Rev'd  ":Last.Mod.F); X.Now += HK.PN.Len 
  
*---------------------------------------------------------------------------
------------
Print.Job.Header.Desc:

  Font  = 12
  Ht    = 0.3
  X.Now = 2.5
  Y.Now = 9.0

  call *ONE.LINE.TEXT.BOX(X.Now,Y.Now, Cust.Name.Len, Ht,1,'Y','C','',Font,
'Customer')     ; X.Now += Cust.Name.Len
  call *ONE.LINE.TEXT.BOX(X.Now,Y.Now, Wide         , Ht,1,'Y','C','',Font,
'Customer PN')  ; X.Now += Wide
  call *ONE.LINE.TEXT.BOX(X.Now,Y.Now, Wide         , Ht,1,'Y','C','',Font,
'Customer Rev')    
  
*---------------------------------------------------------------------------
-----------------------
Print.Customer.Header:

  Y.Now -= Ht
  X.Now  = 2.5
  
  call *ONE.LINE.TEXT.BOX(X.Now, Y.Now, Cust.Name.Len, Ht, 0, 'Y', 'C', '',
Font,Cust.Name); X.Now += Cust.Name.Len
  call *ONE.LINE.TEXT.BOX(X.Now, Y.Now, Wide         , Ht, 0, 'Y', 'C', '',
Font,Cust.Part); X.Now += Cust.Part.Len
  call *ONE.LINE.TEXT.BOX(X.Now, Y.Now, Wide         , Ht, 0, 'Y', 'C', '',
Font,Cust.Rev)  
      
*---------------------------------------------------------------------------
-----------------
Print.Part.Description:

  Font   = 14
  
  Y.Now  = Y.Now - 0.2
  Ht     = 0.2
  Lnth   = 3.3

  for LL = 1 to Max.Desc.Lines
    Y.Now = Y.Now - .20
    
    TEXT = DESC<LL>;                X.Now = 0.5; call
*ONE.LINE.TEXT.BOX(X.Now,Y.Now,Lnth,Ht,0,'N','L','',Font,TEXT)
    TEXT = DESC<LL+Max.Desc.Lines>; X.Now = 4.0; call
*ONE.LINE.TEXT.BOX(X.Now,Y.Now,Lnth,Ht,0,'N','L','',Font,TEXT)
    
  next LL

  Y.Now = Y.Now + 0.2

*---------------------------------------------------------------------------
---------------------
Print.Job.Detail.Header:

  Font = 12

  Ht = 0.4
  X.Now   = 0.01
  Y.Now = Y.Now - 0.5
  
  call *ONE.LINE.TEXT.BOX(X.Now, Y.Now, Seq.Nbr.Len,  Ht, 1, 'Y', 'C', '',
Font, 'Sequence')   ; X.Now += Seq.Nbr.Len    
  call *ONE.LINE.TEXT.BOX(X.Now, Y.Now, Op.Desc.Len,  Ht, 1, 'Y', 'L', '',
Font,' Operation')  ; X.Now += Op.Desc.Len
  call *ONE.LINE.TEXT.BOX(X.Now, Y.Now, Machine.Len,  Ht, 2, 'Y', 'L', '',
Font,' Machine')    ; X.Now += Machine.Len
  call *ONE.LINE.TEXT.BOX(X.Now, Y.Now, Notes.Len,    Ht, 1, 'Y', 'L', '',
Font,' Notes')      ; X.Now += Notes.Len
  call *ONE.LINE.TEXT.BOX(X.Now, Y.Now, Initials.Len, Ht, 1, 'Y', 'C', '',
Font, 'Sign/Date')  ; X.Now += Initials.Len

*---------------------------------------------------------------------------
-------------------------
Print.Job.Detail.Data:

  Font = 12
  X.Now = 0.01
  Y.Now = Y.Now - 0.4

  Out.Process.Printed = false

  Total.Ops = 11
  read R.RR from F.RR, HK.PN else null
    Total.Ops = count(R.RR<2>,VM) + 1

  for Op = 1 to Total.Ops  

    This.Seq    = R.RR<2,Op>

    gosub Read.This.Seq

    if This.Seq < 310 then gosub Print.Line.Item

    if This.Seq > 349 then
      if Out.Process.Printed = false then gosub Print.Out.Process
      gosub Print.Line.Item
    end 

  next Op

    if Out.Process.Printed = false then gosub Print.Out.Process

*---------------------------------------------------------------------------
--------------------

   call *ONE.LINE.TEXT.BOX(X.Now, Y.Now       , Notes.Len, Note.Ht, 0, 'N',
'L', '', Font, Message.1)  
   call *ONE.LINE.TEXT.BOX(X.Now, Y.Now - 0.21, Notes.Len, Note.Ht, 0, 'N',
'L', '', Font, Message.2)  
   call *ONE.LINE.TEXT.BOX(X.Now, Y.Now - 0.42, Notes.Len, Note.Ht, 0, 'N',
'L', '', Font, Message.3) 
   
   X.Now = 4.4

   call *ONE.LINE.TEXT.BOX(X.Now, Y.Now       , Notes.Len, Note.Ht, 0, 'N',
'L', '', Font, Message.4)  
   call *ONE.LINE.TEXT.BOX(X.Now, Y.Now - 0.21, Notes.Len, Note.Ht, 0, 'N',
'L', '', Font, Message.5)  
   call *ONE.LINE.TEXT.BOX(X.Now, Y.Now - 0.42, Notes.Len, Note.Ht, 0, 'N',
'L', '', Font, Message.6) 

return

*---------------------------------------------------------------------------
---
Read.This.Seq:

  read R.RO from F.RO, This.Seq  else null
    This.Op.Desc = R.RO<1>

  Machine<Op> = R.RR<4,Op>
    
  Seq.Note.1<Op> = R.RR<10,Op>
  Seq.Note.2<Op> = R.RR<11,Op>
  Seq.Note.3<Op> = R.RR<12,Op>

  Seq.ID.F  = This.Seq
  Op.Desc.F = ' ' : This.Op.Desc
  Machine.F =       Machine<Op>
     
  Seq.Note.1F = ' ':Seq.Note.1<Op>
  Seq.Note.2F = ' ':Seq.Note.2<Op>
  Seq.Note.3F = ' ':Seq.Note.3<Op>

return

*---------------------------------------------------------------------------
--------
Print.Line.Item:

    call *ONE.LINE.TEXT.BOX(X.Now, Y.Now, Seq.Nbr.Len, Detail.Ht, 0, 'Y',
'C', '', Font, Seq.ID.F ); X.Now += Seq.Nbr.Len
    call *ONE.LINE.TEXT.BOX(X.Now, Y.Now, Op.Desc.Len, Detail.Ht, 0, 'y',
'L', '', Font, Op.Desc.F); X.Now += Op.Desc.Len
    call *ONE.LINE.TEXT.BOX(X.Now, Y.Now, Machine.Len, Detail.Ht, 0, 'Y',
'C', '', Font, Machine.F); X.Now += Machine.Len
    
    call *ONE.LINE.TEXT.BOX(X.Now, Y.Now, Notes.Len, Detail.Ht, 0, 'Y', 'C',
'', Font, '')
     
    call *ONE.LINE.TEXT.BOX(X.Now, Y.Now       , Notes.Len, Note.Ht, 0, 'N',
'L', '', Font, Seq.Note.1F) ; 
    call *ONE.LINE.TEXT.BOX(X.Now, Y.Now - 0.21, Notes.Len, Note.Ht, 0, 'N',
'L', '', Font, Seq.Note.2F) ; 
    call *ONE.LINE.TEXT.BOX(X.Now, Y.Now - 0.42, Notes.Len, Note.Ht, 0, 'N',
'L', '', Font, Seq.Note.3F) ; X.Now += Notes.Len
     
    call *ONE.LINE.TEXT.BOX(X.Now, Y.Now, Initials.Len,
Detail.Ht,0,'Y','C','',Font,''         ) ; X.Now += Initials.Len
         
    X.Now = 0.01
    Y.Now = Y.Now - Detail.Ht

return

*---------------------------------------------------------------------------
--------
Print.OP.Item:

    call *ONE.LINE.TEXT.BOX(X.Now, Y.Now, Seq.Nbr.Len, Note.Ht, 0, 'Y', 'C',
'', Font, Seq.ID.F ); X.Now += Seq.Nbr.Len
    call *ONE.LINE.TEXT.BOX(X.Now, Y.Now, Op.Desc.Len, Note.Ht, 0, 'y', 'L',
'', Font, Op.Desc.F); X.Now += Op.Desc.Len
    call *ONE.LINE.TEXT.BOX(X.Now, Y.Now, Machine.Len, Note.Ht, 0, 'Y', 'C',
'', Font, Machine.F); X.Now += Machine.Len
    
    call *ONE.LINE.TEXT.BOX(X.Now, Y.Now, Notes.Len, Note.Ht, 0, 'Y', 'C',
'', Font, '')
   
    call *ONE.LINE.TEXT.BOX(X.Now, Y.Now       , Notes.Len, Note.Ht, 0, 'N',
'L', '', Font, OP.Note.1F)  
    
    X.Now += Notes.Len
     
    call *ONE.LINE.TEXT.BOX(X.Now, Y.Now, Initials.Len,
Note.Ht,0,'Y','C','',Font,''         ) ; X.Now += Initials.Len
         
    X.Now = 0.01
    Y.Now = Y.Now - Note.Ht

return

*---------------------------------------------------------------------------
---
Print.Out.Process:

  read R.IM from F.IM, HK.PN else R.IM = ''
    OP.Code.1 = R.IM<71,1>
    OP.Code.2 = R.IM<71,2>
    OP.Code.3 = R.IM<71,3>

    OP.Code.A1 = field(OP.Code.1, '.', 1)  ;  OP.Code.A11 = OP.Code.A1[1,1]
    OP.Code.A2 = field(OP.Code.1, '.', 2)  ;  OP.Code.A21 = OP.Code.A2[1,1]
    OP.Code.A3 = field(OP.Code.1, '.', 3)  ;  OP.Code.A31 = OP.Code.A3[1,1]
    OP.Code.A4 = field(OP.Code.1, '.', 4)  ;  OP.Code.A41 = OP.Code.A4[1,1]
    OP.Code.A5 = field(OP.Code.1, '.', 5)  ;  OP.Code.A51 = OP.Code.A5[1,1]

    OP.Code.B1 = field(OP.Code.2, '.', 1)  ;  OP.Code.B11 = OP.Code.B1[1,1]
    OP.Code.B2 = field(OP.Code.2, '.', 2)  ;  OP.Code.B21 = OP.Code.B2[1,1]
    OP.Code.B3 = field(OP.Code.2, '.', 3)  ;  OP.Code.B31 = OP.Code.B3[1,1]
    OP.Code.B4 = field(OP.Code.2, '.', 4)  ;  OP.Code.B41 = OP.Code.B4[1,1]
    OP.Code.B5 = field(OP.Code.2, '.', 5)  ;  OP.Code.B51 = OP.Code.B5[1,1]

    OP.Code.C1 = field(OP.Code.3, '.', 1)  ;  OP.Code.C11 = OP.Code.C1[1,1]
    OP.Code.C2 = field(OP.Code.3, '.', 2)  ;  OP.Code.C21 = OP.Code.C2[1,1]
    OP.Code.C3 = field(OP.Code.3, '.', 3)  ;  OP.Code.C31 = OP.Code.C3[1,1]
    OP.Code.C4 = field(OP.Code.3, '.', 4)  ;  OP.Code.C41 = OP.Code.C4[1,1]
    OP.Code.C5 = field(OP.Code.3, '.', 5)  ;  OP.Code.C51 = OP.Code.C5[1,1]

    read R.OP.A1 from F.OP, OP.Code.A1  else null
                                                   OP.Desc.A1 = R.OP.A1<2>
    read R.OP.A2 from F.OP, OP.Code.A2  else null
                                                   OP.Desc.A2 = R.OP.A2<2>
    read R.OP.A3 from F.OP, OP.Code.A3  else null
                                                   OP.Desc.A3 = R.OP.A3<2>
    read R.OP.A4 from F.OP, OP.Code.A4  else null
                                                   OP.Desc.A4 = R.OP.A4<2>
    read R.OP.A5 from F.OP, OP.Code.A5  else null
                                                   OP.Desc.A5 = R.OP.A5<2>

    read R.OP.B1 from F.OP, OP.Code.B1  else null
                                                   OP.Desc.B1 = R.OP.B1<2>
    read R.OP.B2 from F.OP, OP.Code.B2  else null
                                                   OP.Desc.B2 = R.OP.B2<2>
    read R.OP.B3 from F.OP, OP.Code.B3  else null
                                                   OP.Desc.B3 = R.OP.B3<2>
    read R.OP.B4 from F.OP, OP.Code.B4  else null
                                                   OP.Desc.B4 = R.OP.B4<2>
    read R.OP.B5 from F.OP, OP.Code.B5  else null
                                                   OP.Desc.B5 = R.OP.B5<2>

    read R.OP.C1 from F.OP, OP.Code.C1  else null
                                                   OP.Desc.C1 = R.OP.C1<2>
    read R.OP.C2 from F.OP, OP.Code.C2  else null
                                                   OP.Desc.C2 = R.OP.C2<2>
    read R.OP.C3 from F.OP, OP.Code.C3  else null
                                                   OP.Desc.C3 = R.OP.C3<2>
    read R.OP.C4 from F.OP, OP.Code.C4  else null
                                                   OP.Desc.C4 = R.OP.C4<2>
    read R.OP.C5 from F.OP, OP.Code.C5  else null
                                                   OP.Desc.C5 = R.OP.C5<2>

    OP.Desc.A1 = ' ' : OP.Desc.A1
    OP.Desc.A2 = ' ' : OP.Desc.A2
    OP.Desc.A3 = ' ' : OP.Desc.A3
    OP.Desc.A4 = ' ' : OP.Desc.A4
    OP.Desc.A5 = ' ' : OP.Desc.A5

    OP.Desc.B1 = ' ' : OP.Desc.B1
    OP.Desc.B2 = ' ' : OP.Desc.B2
    OP.Desc.B3 = ' ' : OP.Desc.B3
    OP.Desc.B4 = ' ' : OP.Desc.B4
    OP.Desc.B5 = ' ' : OP.Desc.B5

    OP.Desc.C1 = ' ' : OP.Desc.C1
    OP.Desc.C2 = ' ' : OP.Desc.C2
    OP.Desc.C3 = ' ' : OP.Desc.C3
    OP.Desc.C4 = ' ' : OP.Desc.C4
    OP.Desc.C5 = ' ' : OP.Desc.C5

    OP.Spec.A1 = R.IM<72,1>
    OP.Spec.A2 = R.IM<96,1>
    OP.Spec.A3 = R.IM<96,2>
    OP.Spec.A4 = R.IM<96,3>
    OP.Spec.A5 = R.IM<96,4>

    OP.Spec.B1 = R.IM<72,2>
    OP.Spec.B2 = R.IM<97,1>
    OP.Spec.B3 = R.IM<97,2>
    OP.Spec.B4 = R.IM<97,3>
    OP.Spec.B5 = R.IM<97,4>

    OP.Spec.C1 = R.IM<72,3>
    OP.Spec.C2 = R.IM<98,1>
    OP.Spec.C3 = R.IM<98,2>
    OP.Spec.C4 = R.IM<98,3>
    OP.Spec.C5 = R.IM<98,4>

*---------------------------------------------------------------------------
---

    begin case
      case OP.Code.A11 = ' ' ;  OP.Code.A1X = ''
      case OP.Code.A11 = ''  ;  OP.Code.A1X = ''
      case 1                 ;  OP.Code.A1X = OP.Code.A1
    end case

    begin case
      case OP.Code.A21 = ' ' ;  OP.Code.A2X = ''
      case OP.Code.A21 = ''  ;  OP.Code.A2X = ''
      case 1                 ;  OP.Code.A2X = OP.Code.A2
    end case

    begin case
      case OP.Code.A31 = ' ' ;  OP.Code.A3X = ''
      case OP.Code.A31 = ''  ;  OP.Code.A3X = ''
      case 1                 ;  OP.Code.A3X = OP.Code.A3
    end case

    begin case
      case OP.Code.A41 = ' ' ;  OP.Code.A4X = ''
      case OP.Code.A41 = ''  ;  OP.Code.A4X = ''
      case 1                 ;  OP.Code.A4X = OP.Code.A4
    end case

    begin case
      case OP.Code.A51 = ' ' ;  OP.Code.A5X = ''
      case OP.Code.A51 = ''  ;  OP.Code.A5X = ''
      case 1                 ;  OP.Code.A5X = OP.Code.A5
    end case

*---

    begin case
      case OP.Code.B11 = ' ' ;  OP.Code.B1X = ''
      case OP.Code.B11 = ''  ;  OP.Code.B1X = ''
      case 1                 ;  OP.Code.B1X = OP.Code.B1
    end case

    begin case
      case OP.Code.B21 = ' ' ;  OP.Code.B2X = ''
      case OP.Code.B21 = ''  ;  OP.Code.B2X = ''
      case 1                 ;  OP.Code.B2X = OP.Code.A2
    end case

    begin case
      case OP.Code.B31 = ' ' ;  OP.Code.B3X = ''
      case OP.Code.B31 = ''  ;  OP.Code.B3X = ''
      case 1                 ;  OP.Code.B3X = OP.Code.A3
    end case

    begin case
      case OP.Code.B41 = ' ' ;  OP.Code.B4X = ''
      case OP.Code.B41 = ''  ;  OP.Code.B4X = ''
      case 1                 ;  OP.Code.B4X = OP.Code.A4
    end case

    begin case
      case OP.Code.B51 = ' ' ;  OP.Code.B5X = ''
      case OP.Code.B51 = ''  ;  OP.Code.B5X = ''
      case 1                 ;  OP.Code.B5X = OP.Code.A5
    end case

*---
    
    begin case
      case OP.Code.C11 = ' ' ;  OP.Code.C1X = ''
      case OP.Code.C11 = ''  ;  OP.Code.C1X = ''
      case 1                 ;  OP.Code.C1X = OP.Code.C1
    end case

    begin case
      case OP.Code.C21 = ' ' ;  OP.Code.C2X = ''
      case OP.Code.C21 = ''  ;  OP.Code.C2X = ''
      case 1                 ;  OP.Code.C2X = OP.Code.C2
    end case

    begin case
      case OP.Code.C31 = ' ' ;  OP.Code.C3X = ''
      case OP.Code.C31 = ''  ;  OP.Code.C3X = ''
      case 1                 ;  OP.Code.C3X = OP.Code.C3
    end case

    begin case
      case OP.Code.C41 = ' ' ;  OP.Code.C4X = ''
      case OP.Code.C41 = ''  ;  OP.Code.C4X = ''
      case 1                 ;  OP.Code.C4X = OP.Code.C4
    end case

    begin case
      case OP.Code.C51 = ' ' ;  OP.Code.C5X = ''
      case OP.Code.C51 = ''  ;  OP.Code.C5X = ''
      case 1                 ;  OP.Code.C5X = OP.Code.C5
    end case

*---------------------------------------------------------------------------
---
    
    begin case
      case len(OP.Spec.A1) <= 1   ;  OP.Spec.A1X = ''
      case 1                      ;  OP.Spec.A1X = OP.Spec.A1
    end case

    begin case
      case len(OP.Spec.A2) <= 1   ;  OP.Spec.A2X = ''
      case 1                      ;  OP.Spec.A2X = OP.Spec.A2
    end case

    begin case
      case len(OP.Spec.A3) <= 1   ;  OP.Spec.A3X = ''
      case 1                      ;  OP.Spec.A3X = OP.Spec.A3
    end case

    begin case
      case len(OP.Spec.A4) <= 1   ;  OP.Spec.A4X = ''
      case 1                      ;  OP.Spec.A4X = OP.Spec.A4
    end case

    begin case
      case len(OP.Spec.A5) <= 1   ;  OP.Spec.A5X = ''
      case 1                      ;  OP.Spec.A5X = OP.Spec.A5
    end case

*---

    begin case
      case len(OP.Spec.B1) <= 1   ;  OP.Spec.B1X = ''
      case 1                      ;  OP.Spec.B1X = OP.Spec.B1
    end case

    begin case
      case len(OP.Spec.B2) <= 1   ;  OP.Spec.B2X = ''
      case 1                      ;  OP.Spec.B2X = OP.Spec.B2
    end case

    begin case
      case len(OP.Spec.B3) <= 1   ;  OP.Spec.B3X = ''
      case 1                      ;  OP.Spec.B3X = OP.Spec.B3
    end case

    begin case
      case len(OP.Spec.B4) <= 1   ;  OP.Spec.B4X = ''
      case 1                      ;  OP.Spec.B4X = OP.Spec.B4
    end case

    begin case
      case len(OP.Spec.B5) <= 1   ;  OP.Spec.B5X = ''
      case 1                      ;  OP.Spec.B5X = OP.Spec.B5
    end case

*---

    begin case
      case len(OP.Spec.C1) <= 1   ;  OP.Spec.C1X = ''
      case 1                      ;  OP.Spec.C1X = OP.Spec.C1
    end case

    begin case
      case len(OP.Spec.C2) <= 1   ;  OP.Spec.C2X = ''
      case 1                      ;  OP.Spec.C2X = OP.Spec.C2
    end case

    begin case
      case len(OP.Spec.C3) <= 1   ;  OP.Spec.C3X = ''
      case 1                      ;  OP.Spec.C3X = OP.Spec.C3
    end case

    begin case
      case len(OP.Spec.C4) <= 1   ;  OP.Spec.C4X = ''
      case 1                      ;  OP.Spec.C4X = OP.Spec.C4
    end case

    begin case
      case len(OP.Spec.C5) <= 1   ;  OP.Spec.C5X = ''
      case 1                      ;  OP.Spec.C5X = OP.Spec.C5
    end case

*---

    OP.Code.1F = ' (' : OP.Code.1 : ')'
    OP.Code.2F = ' (' : OP.Code.2 : ')'
    OP.Code.3F = ' (' : OP.Code.3 : ')'

    OP.Note.1F = ''

  read R.OP from F.OP, OP.Code.1  else Nbr.OPs = 0
    OP.Desc.1 = R.OP<2>

  read R.OP from F.OP, OP.Code.2  else Nbr.OPs = 1
    OP.Desc.2 = R.OP<2>

  read R.OP from F.OP, OP.Code.3  else Nbr.OPs = 2
    OP.Desc.3 = R.OP<2>

  A2x = 0  ;  B2x = 0  ;  C2x = 0
  A3x = 0  ;  B3x = 0  ;  C3x = 0
  A4x = 0  ;  B4x = 0  ;  C4x = 0
  A5x = 0  ;  B5x = 0  ;  C5x = 0

  if ((OP.Code.A2X # '') or (OP.Spec.A2X # '')) then A2x = 1
  if ((OP.Code.A3X # '') or (OP.Spec.A3X # '')) then A3x = 1
  if ((OP.Code.A4X # '') or (OP.Spec.A4X # '')) then A4x = 1
  if ((OP.Code.A5X # '') or (OP.Spec.A5X # '')) then A5x = 1

  if ((OP.Code.B2X # '') or (OP.Spec.B2X # '')) then B2x = 1
  if ((OP.Code.B3X # '') or (OP.Spec.B3X # '')) then B3x = 1
  if ((OP.Code.B4X # '') or (OP.Spec.B4X # '')) then B4x = 1
  if ((OP.Code.B5X # '') or (OP.Spec.B5X # '')) then B5x = 1

  if ((OP.Code.C2X # '') or (OP.Spec.C2X # '')) then C2x = 1
  if ((OP.Code.C3X # '') or (OP.Spec.C3X # '')) then C3x = 1
  if ((OP.Code.C4X # '') or (OP.Spec.C4X # '')) then C4x = 1
  if ((OP.Code.C5X # '') or (OP.Spec.C5X # '')) then C5x = 1


  if  OP.Code.1  # '' then 
                           Seq.ID.F = 310  ;  Op.Desc.F = ' Outside'    ;
OP.Note.1F = OP.Desc.A1 : '...' : OP.Spec.A1X  ; gosub Print.OP.Item
    if A2x            then Seq.ID.F = ''   ;  Op.Desc.F = ' Process'    ;
OP.Note.1F = OP.Desc.A2 : '...' : OP.Spec.A2X  ; gosub Print.OP.Item
    if A3x            then Seq.ID.F = ''   ;  Op.Desc.F = ''            ;
OP.Note.1F = OP.Desc.A3 : '...' : OP.Spec.A3X  ; gosub Print.OP.Item
    if A4x            then Seq.ID.F = ''   ;  Op.Desc.F = ''            ;
OP.Note.1F = OP.Desc.A4 : '...' : OP.Spec.A4X  ; gosub Print.OP.Item
    if A5x            then Seq.ID.F = ''   ;  Op.Desc.F = ''            ;
OP.Note.1F = OP.Desc.A5 : '...' : OP.Spec.A5X  ; gosub Print.OP.Item
    if OP.Code.1 # '' then Seq.ID.F = 319  ;  Op.Desc.F = ' Inspect OP' ;
OP.Note.1F = ' Inspect Outside Process 310 @ HK' ; gosub Print.OP.Item
  end

  if  OP.Code.2  # '' then 
                           Seq.ID.F = 320  ;  Op.Desc.F = ' Outside'    ;
OP.Note.1F = OP.Desc.B1 : '...' : OP.Spec.B1X  ; gosub Print.OP.Item
    if B2x            then Seq.ID.F = ''   ;  Op.Desc.F = ' Process'    ;
OP.Note.1F = OP.Desc.B2 : '...' : OP.Spec.B2X  ; gosub Print.OP.Item
    if B3x            then Seq.ID.F = ''   ;  Op.Desc.F = ''            ;
OP.Note.1F = OP.Desc.B3 : '...' : OP.Spec.B3X  ; gosub Print.OP.Item
    if B4x            then Seq.ID.F = ''   ;  Op.Desc.F = ''            ;
OP.Note.1F = OP.Desc.B4 : '...' : OP.Spec.B4X  ; gosub Print.OP.Item
    if B5x            then Seq.ID.F = ''   ;  Op.Desc.F = ''            ;
OP.Note.1F = OP.Desc.B5 : '...' : OP.Spec.B5X  ; gosub Print.OP.Item
    if OP.Code.2 # '' then Seq.ID.F = 329  ;  Op.Desc.F = ' Inspect OP' ;
OP.Note.1F = ' Inspect Outside Process 320 @ HK' ; gosub Print.OP.Item
  end

  if  OP.Code.3  # '' then 
                           Seq.ID.F = 330  ;  Op.Desc.F = ' Outside'    ;
OP.Note.1F = OP.Desc.C1 : '...' : OP.Spec.C1X  ; gosub Print.OP.Item
    if C2x            then Seq.ID.F = ''   ;  Op.Desc.F = ' Process'    ;
OP.Note.1F = OP.Desc.C2 : '...' : OP.Spec.C2X  ; gosub Print.OP.Item
    if C3x            then Seq.ID.F = ''   ;  Op.Desc.F = ''            ;
OP.Note.1F = OP.Desc.C3 : '...' : OP.Spec.C3X  ; gosub Print.OP.Item
    if C4x            then Seq.ID.F = ''   ;  Op.Desc.F = ''            ;
OP.Note.1F = OP.Desc.C4 : '...' : OP.Spec.C4X  ; gosub Print.OP.Item
    if C5x            then Seq.ID.F = ''   ;  Op.Desc.F = ''            ;
OP.Note.1F = OP.Desc.C5 : '...' : OP.Spec.C5X  ; gosub Print.OP.Item
    if OP.Code.3 # '' then Seq.ID.F = 339  ;  Op.Desc.F = ' Inspect OP' ;
OP.Note.1F = ' Inspect Outside Process 330 @ HK' ; gosub Print.OP.Item
  end

*----------

  Out.Process.Printed = true

  gosub Read.This.Seq

return
*---------------------------------------------------------------------------
--------
RESET.BACK:

  print char(27):"%0A"
  print char(27):"E"

return

*---------------------------------------------------------------------------
----------
EXTRACT.JOB.INFO:

  read R.SOH     from F.SOH, SO.ID                     else R.SOH = ''
  read R.SOD     from F.SOD, SO.ID:'*1'                else R.SOD = ''
  read R.CM      from F.CM,  R.SOH<1>                  else R.CM = ''
  read R.WOH     from F.WOH, SO.ID                     else R.WOH = ''
  
  HK.PN        = R.SOD<16>
  Cust.Part    = R.SOD<15>
  Cust.Rev     = R.SOD<38>
  Cust.Name    = R.CM<1,1>

  Message.1 = R.WOH<35,1>
  Message.2 = R.WOH<35,2>
  Message.3 = R.WOH<35,3>
  Message.4 = R.WOH<35,4>
  Message.5 = R.WOH<35,5>
  Message.6 = R.WOH<35,6>

return

*---------------------------------------------------------------------------
------------
FORMAT.Part.Description:

      Max.Desc.Lines = count(R.SOD<14>,VM) + 1
      DESC = ''
      for LL = 1 to Max.Desc.Lines
         DESC<-1> = R.SOD<14,LL>
      next LL
      
      Max.Desc.Lines = count(R.SOD<63>,VM) + 1
      
      if R.SOD<63> = '' then Max.Desc.Lines = 0
      
      for LL = 1 to Max.Desc.Lines
         DESC<-1> = R.SOD<63,LL>
      next LL

      Max.Desc.Lines = count(DESC,AM) + 1
      for LL = Max.Desc.Lines to 1 STEP -1
         if DESC<LL> = '' then DESC = DELETE(DESC,LL,0,0)
      next LL

      Max.Desc.Lines = INT(Max.Desc.Lines/2) + 1

return

*---------------------------------------------------------------------------
---      
The.End:      

  crt @(-1)  

  END

-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] Behalf Of James F Thompson
Sent: Thursday, January 03, 2008 6:43 PM
To: u2-users@listserver.u2ug.org
Subject: [U2] Graphic Printing


Does anyone have a suggestion for doing graphical printing from Windows and
Aix? I need to be able to embed dynamic images (i.e. Division logo, Shipping
label), along with form data.  We are using Universe.

James F Thompson 
Senior System Analyst 
Cypress Business Solutions 
678.494.9353 x1410

[EMAIL PROTECTED] 
www.cypressesolutions.com <http://www.cypressesolutions.com/>  
-------
u2-users mailing list
u2-users@listserver.u2ug.org
To unsubscribe please visit http://listserver.u2ug.org/
-------
u2-users mailing list
u2-users@listserver.u2ug.org
To unsubscribe please visit http://listserver.u2ug.org/

Reply via email to