Mainframe COBOL to Java, C# & Cloud


Side-by-Side Comparison: COBOL vs. C# Translated Code

The following shows the translation of a small COBOL program to C# using SoftwareMining COBOL Refactoring tool.


Download COBOL to C# Converter


See success story: ING Bank migrates from CICS COBOL to Java Cloud

The primary aim of this example is to demonstrate the legibility of the generated code and its maintainability. This simple example does not attempt to cover complex issues such as removal of GO TO statements, removal of dead code, REDEFINEs, CICS, Pointers, etc.

Handling of such issues is covered in Essential Features for Successful COBOL to C# Conversion Projects.

Alternatively, you can download and evaluate the tool to see how your organization's code is handled.

Noteworthy issues:


COBOL vs C# - Side by side

   
  PROGRAM-ID. LOAN.
  DATA DIVISION.
  FILE SECTION.

  WORKING-STORAGE SECTION.
  01  WS-VARS.
    05 PRINCIPAL          PIC 9(9) VALUE 0.
    05 INTEREST-RATE      PIC 99V99 VALUE 0.
    05 LOAN-LENGTH        PIC 99 VALUE 0.
    05 NEXT-INTEREST      PIC 99V99.
    05 NEXT-YEAR          PIC 99.
  01 CLIENT-RECORD.
    05 NAME               PIC X(20).
    05 ADDRESS            PIC X(20) OCCURS 3 TIMES.
    05 ID                 PIC 9(4) COMP.

  ...
  
  
  
  
  
 /// Sample COBOL to C# translated code
namespace Softwaremining.Cobol2CSharp.Example
{
 public sealed class Loan  : BaseService  {
  
  // Note: 01 level WS-VARS name is simplified (Optional) 
  // and converted to a DAO
  // The DAO handles REDEFINES, COMP, OCCURS-DEPENDING, ... 
  private Vars ;
  
  // Client-RECORD has been translated to ClientRecord DAO, 
  // but since the program does not reference ClientRecord, 
  // it will automatically be commented out.
  
  // private ClientRecord clientRecord;
  ...
  /// constructor 
  public Loan(BaseService parent) : base(parent) 
  {
    vars = new Vars(this);
    // clientRecord = new ClientRecord(this);
	
   ...
  
  * Main entry point to program
   LOAN-MAIN-001.
   
  *  -
  * CLEAR SCREEN AND READ DATA
  *  -

       IF LOAN-LENGTH > 4 THEN
          COMPUTE START-YEAR = LOAN-LENGTH - 4
       ELSE
      COMPUTE START-YEAR = 0.

       IF INTEREST-RATE > 0.4 THEN
          COMPUTE START-INTEREST = INTEREST-RATE - 0.4
       ELSE
          COMPUTE START-INTEREST = 0
       END-IF
     
       MOVE 1 TO YEAR-ROW.
   
  
  *  -
  * GO THRU THE NUMBER OF YEARS
  *  -

       MOVE "% Rate->" TO DSP-NO-YRS(1).
       MOVE START-YEAR TO NEXT-YEAR
       PERFORM VARYING YEAR-ROW FROM 2 BY 1 UNTIL YEAR-ROW = 11
         PERFORM DO-NEXT-ROW
         ADD 1 TO NEXT-YEAR
       END-PERFORM.

	   


	   

  *  -
  *  AND EXIT
  *  -
       STOP RUN.
	   
  
  /// <summary>
  /// Main Entrance to program
  /// </summary> 
  protected void LoanMain () 
  {
   
   //   - 
   //  CLEAR SCREEN AND READ DATA 
   //   - 
   if (vars.LoanLength > 4)
   {
     vars.StartYear = vars.LoanLength - 4;
   } else
   {
     vars.StartYear = 0;
   }
	  
   if (vars.InterestRate > 0.4)
   {
     vars.StartInterest = vars.InterestRate - 0.4;
   } else
   {
     vars.StartInterest = 0;
   }
   vars.YearRow = 1;
   vars.setYearRow(1);
   //   - 
   //  GO THRU THE NUMBER OF YEARS 
   //   - 
   displayResult.SetNoYrs(0, "% Rate->");
   vars.NextYear = vars.StartYear;
   vars.YearRow = 2;
   while (vars.YearRow != 11)
   {
     DoNextRow ();
     vars.NextYear = vars.NextYear + 1;
     vars.YearRow = vars.YearRow + 1;
   }
   //   - 
   //   AND EXIT 
   //   - 
   Stop();
 }


  * 
  * Calculates values for individual rows
  * 
   DO-NEXT-ROW.

       MOVE START-INTEREST TO NEXT-INTEREST

	   
       PERFORM VARYING INTEREST-COL FROM 1 BY 1
         UNTIL INTEREST-COL = 10
         MOVE NEXT-INTEREST TO DSP-RESULT(1, INTEREST-COL)
         PERFORM CALCULATE
         MOVE NEXT-RESULT TO DSP-RESULT(YEAR-ROW, INTEREST-COL)
         ADD 0.1 TO NEXT-INTEREST
       END-PERFORM.

	   
	   
  /// <summary>
  /// Calculates values for individual rows
  </summary>
  protected void DoNextRow () {
   vars.NextInterest = vars.StartInterest;
      
   vars.InterestCol = 1;
	  
   while (vars.InterestCol != 10)
   {
     displayResult.SetResult(0, vars.InterestCol - 1
	    , vars.NextInterest);
     Calculate();
     displayResult.SetResult(vars.YearRow - 1, vars.InterestCol - 1
	    , vars.NextResult);
     vars.NextInterest = vars.NextInterest + 0.1;
     vars.InterestCol = vars.InterestCol + 1;
   }
 }

  * 
  * The next paragraph calculates CELL values
  * 
   CALCULATE.
       COMPUTE INTDEC = NEXT-INTEREST / (12.0 * 100.0)
       COMPUTE NUMMONTHS = NEXT-YEAR * 12.0
	   ...
   
  /// <summary>
  /// The next paragraph calculates CELL values
  </summary>
  protected void Calculate () {
   vars.Intdec = vars.NextInterest / (12.0 * 100.0);
   vars.Nummonths = (int)((double)vars.NextYear * 12.0);
   ...
 }
 


x
This site uses cookies from Google to analyze traffic. OK



  © 2023 SoftwareMining is a trademark of Software Modernization Technologies Ltd (UK). Registered in England company no: 07300248. Reg Offices: 79 Stevens House, Jerome Place, Kingston Upon Thames, KT1 1HX, United Kingdom.