× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.



What would you propose the structure to be?

The fact that they wrote in RPG IV and used subroutines makes me barf.

Good structured design would say that you have procedures that make decisions 
and control and procedures that perform actions. 

Generally speaking, you would have a mainline that drives(Makes decisions and 
controls) and then calls lower level procedures to perform actions. This sounds 
a bit like what they were trying to do here but using subroutines can make the 
whole thing an exercise in frustration. Subroutines are nothing but computed 
goto's.   

"A procedure does one thing and only one thing and can be described with the 
use of a conjunctive verb (AND OR)." 

All this works very well if you are using procedure and using them correctly 
since a procedure is basically a black box. It has a known set of inputs and a 
known set of outputs and its own local variables. If you see a procedure that 
says BuildOpenString, do you really need to know how it works as long as it 
works? If you are getting back what you want, who cares? But try to implement 
with a Subroutine. If you are debugging you have no choice except go down into 
the code and walk through it all and because everything is global, you have to 
consider everything in the program because the subroutine could have changed 
anything. 

So if you are planning to rewrite it a using a good structure and using 
procedures correctly, I would say, go for it. If you just want to put 
everything inline, then I would leave it alone. 

This is a recent example of a green screen. The top level just makes the 
decision and controls. If I maintaining this program and I want to add for 
error checking, I can just go to the ValidInput(). Is this what they were 
doing? 

    If Not ScreenOpen;                                                          
 
      ScreenOpen = cTrue;                                                       
 
      Open TG0002_D01;                                                          
 
    EndIf;                                                                      
 
                                                                                
 
    LoadScreenFields();                                                         
 
                                                                                
 
    MSGF_ClearProgramMessageQueue(cMainProcedureName            :               
 
                                  SystemDataStructure.ModuleName:               
 
                                  ProgramName                   );              
 
    DoU 0 = 1;                                                                  
 
                                                                                
 
      // Display subfile message.                                               
 
      DisplaySubfileEndOnSubfileMessageQueue = cTrue;                           
 
      SFM_C_PGMQ = '*';                                                         
 
      Write SFMSG_CTL;                                                          
 
                                                                                
 
      ExFmt RD01_01;                                                            
 
                                                                                
 
      MSGF_ClearProgramMessageQueue(cMainProcedureName            :             
 
                                    SystemDataStructure.ModuleName:  
                                    ProgramName                   ); 
      MSGF_ClearErrorIndicators(*IN                  :               
                                cStartErrorIndicators:               
                                cEndErrorIndicators  );              
      Select;                                                        
        When FI01.KeyPressed = F3 or                                 
             FI01.KeyPressed = F12;                                  
           Return FI01.KeyPressed;                                   
        Other;                                                       
          If Not ValidInput();                                       
            Iter;                                                    
          EndIf;                                                     
                                                                     
          Select;                                                    
            When B_OPTION = cMaintainTriggerControl;                 
              KeyPressed = ProcessScreen02();                        
            When B_OPTION = cMaintainTriggerDetail;                  
              KeyPressed = ProcessScreen03();                        
          EndSl;                                                     
                                                                     
          If KeyPressed = F3;                                        
            Return KeyPressed;                                       
          EndIf;                                                     
                                                                     
          LoadScreenFields();                                        
          Iter;                                                      
      EndSl;                                                         
    EndDo;                                                           

As an Amazon Associate we earn from qualifying purchases.

This thread ...


Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.