| Dear Alistair,   Could you help me with the following:-   
How do  i design and write a print program in RPG400 to produce a single 
page calendar, as in the example below. It should be able to accept any year 
between 1900 and 2099, passed as a four-character parameter via a data area. NB. 
  Leap years may be calculated by dividing the year by four. With the 
  exception of years ending in 00, unless it is divisible by 400. Eg 2000 is a 
  leap year is notthe 1st of January 1990 was a MondayThe range of years tested will be within 1900 to 2099.Jan, Mar, May, July, Aug, Oct ,Dec have 31 days       Calendar 97   January                              
February                    
March                       April 
 M T  W  T   F  S   
S          M T W T F S 
S          M T W T F S 
S        M T W T F S S          01 02 03 04 05  etc.   I would be grateful for any help Thanks     
  ----- Original Message -----  Sent: Wednesday, January 24, 2001 1:21 
  PM Subject: RE: RPG IV Performance 
 And 
  another thing. I can show you a pointer based trigger program in ILE which 
  only takes a few lines. Try doing that with RPG III.     F* FILE 
  SPECIFICATIONS                                                 
  F*****************************************************************
 F* Inventory Transaction Image 
  file
 FINVL9101  IF   
  E           K 
  DISK
 F* Inventory Transaction header 
  ile
 FETSP960J  O  A 
  E           K 
  DISK
 F*
 F/EJECT
 D*****************************************************************
 D* Data 
  structures
 D*****************************************************************
 D 
  ptr             
  s               
  *
 D 
  arr             
  s              
  1    dim(32767) 
  based(ptr)
 
 D Parm1           
  ds         
  32767
 D  
  FileName               
  1     
  10
 D  
  FileLibr              
  11     20
  D  
  FileMbr               
  21     
  30         D  
  TrEvent               
  31     
  31
 D  
  TrTime                
  32     
  32
 D  
  CommLck               
  33     
  33
 D  
  Reserve               
  34     36
 D  
  CCSID                 
  37     40B 0
 D  
  Reserve2              
  41     48
 D  
  OffsOld               
  49     52B 0
 D  
  LenOld                
  53     56B 0
 D  
  OnOff                 
  57     60B 0
 D  
  OnLen                 
  61     64B 0
 D  
  newoff                
  65     68B 0
 D  
  LenNew                
  69     72B 0
 D  
  NNoff                 
  73     76B 0
 D  
  NNLen                 
  77     80B 0
 D 
  parm2           
  ds
 D   
  plen                         
  9b 0
  * - - - - - - - - - - - - - - - - - - - - - - - 
  - - - - - - - -        D 
  newptr          
  s               
  *
 D newrec        e 
  ds                  
  extname(invp960j) based(newptr)
 * - - - - - - - - - - - 
  - - - - - - - - - - - - - - - - - - - 
  -
 C     
  *entry        
  plist
 C                   
  parm                    
  parm1
 C                   
  parm                    
  parm2
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
  -
 C                   
  eval      ptr    = 
  %addr(parm1)
 C                   
  eval      newptr = %addr(arr(newoff + 
  1))
 C     VendrJ        
  IfEq      'SKB     
  '
 C     WRNUMJ        
  Chain     
  INV910I                            
  55
 C                   
  move      
  INNO@I        
  REFNOJ
 C                   
  Write     
  ETS960J
 C                   
  Endif
 C                   
  return
 ****************** End of data 
  ****************************************
   Sounds like they know not what they 
  do.   Alistair                                     
 
    Lisa, et al, 
 In a message dated 1/19/01 8:15:37 AM Eastern 
    Standard Time,
 Lisa.Abney@universalflavors.com writes:
 
 
 
 Hi all!  I've just heard some rather negative performance 
      things on RPG IV, and
 wonder if anyone can give me some feedback 
      on how true this might be.
 
 We're working with a consulting company 
      who is doing some performance
 analysis
 on some of our programs. 
       They seem very knowledgeable, and I have a lot of
 confidence in 
      what they've done up until now.  However, today they were
 showing
 us a mock-up of a trigger program they want to use.  As they 
      explained it,
 this
 trigger program will be constantly running in 
      the background for every user
 on
 the system to monitor changes to 
      two files, and will feed data to a dataque.
 The program they showed me 
      was written in RPGIII, and I made my usual
 request to an outside 
      contractor that this be done in RPGIV.  His response
 was "Sure, 
      if
 you want the program size to be 5 - 10 times the size of an RPGIII 
      program."
 When I asked him to explain that, he only said that, in his 
      experience,
 this is
 always true, and that it would have a very 
      negative performance.  I even
 mentioned removing observability 
      (not that I really understand what that
 means,
 but I just read 
      something the other day about that being a way to reduce
 program
 size!), and he said that might move it down to 3 - 5 times the size of 
      an
 equivalent RPGIII program.  The program will only be about 50 
      - 100 lines of
 code.
 
 Can someone explain if this is true, and, 
      if so, why?  And, if true, what
 does
 this really mean from a 
      performance standpoint?
 
 
 To reiterate some points 
    already made, and to highlight some that weren't.
 Program size 
    has absolutely no impact on it's performance.  I could write an
 absolutely enormous program in RPG III that, given a single unexecutable 
    IF
 statement skipping 98% of the logic, would still perform quite well.
 However, comparing apples to apples, RPG IV will almost always be 
    larger
 given the same functionality.  This is a case where size 
    doesn't matter.
 
 Now to the unmentioned!  Unless you're running 
    SETOBJACC against it, a
 trigger program is _NOT_ constantly running in 
    the background.  It is invoked
 as part of whatever job "triggers" 
    it by performing the proscribed change
 action against the relative file. 
     Unless the only thing that every single
 one of your users is doing 
    is constantly updating one or both of these two
 files at the same time, 
    the trigger is not running at all times.  The trigger
 also does 
    _NOT_ write to a data queue unless that's how you wrote it.
 
 It 
    sounds to _ME_, with the information given, that one of two things is
 happening here:
 
 1.  Simon and Mr. Peabody have stepped into 
    the "Wayback" machine and we're
 rehashing ILE performance on CISC in the 
    days when there weren't many RISC
 machines on the market (see the 
    archives from three or so years ago).  There
 was no performance 
    advantage indeed, a degradation, of ILE on CISC.
 
 2.  These 
    "consultants" do not understand true UDB/400 triggers, and have
 written 
    some sort of "NEP" solution involving read waits and data queues
 instead 
    of utilizing the native "TRG" commands.
 
 The more I think about it, 
    the more the latter seems to be the case.  I
 suppose that the "acid 
    test" would be to ask your consultants which AS/400
 command adds a 
    trigger to a file, and which removes it.  During add, what is
 the 
    significance of the ALWRPTCHG parameter?
 
 Finally, I don't know what 
    we're talking about in terms of "lines of code",
 but I have yet to write 
    a trigger that required more than 20 "C" specs.  If
 you need more 
    than that, you either need to normalize your database or
 reconsider why 
    you're using triggers...
 
 JMHO,
 
 Dean Asmussen
 Enterprise 
    Systems Consulting, Inc.
 Fuquay-Varina, NC  USA
 E-mail: 
     DAsmussen@aol.com
 
 "Without a struggle, there can be no 
    progress." -- Frederick Douglass
 |