Question I want to convert this C# code to ABL :)

Cecil

19+ years progress programming and still learning.
Who fancy's helping me out? I want to convert this C# code to ABL :)

The little I know about .NET is limited. I need to learn byexample.

Code:
using System;
using System.Globalization;
using System.IO;
using System.Collections.ObjectModel;

public class Example
{
    public static void Main()
    {
        const string OUTPUTFILENAME = @"C:\Temp\TimeZoneInfo.txt";

        DateTimeFormatInfo dateFormats = CultureInfo.CurrentCulture.DateTimeFormat;
        ReadOnlyCollection<TimeZoneInfo> timeZones = TimeZoneInfo.GetSystemTimeZones();
        StreamWriter sw = new StreamWriter(OUTPUTFILENAME, false);

        foreach (TimeZoneInfo timeZone in timeZones)
        {
            bool hasDST = timeZone.SupportsDaylightSavingTime;
            TimeSpan offsetFromUtc = timeZone.BaseUtcOffset;
            TimeZoneInfo.AdjustmentRule[] adjustRules;
            string offsetString;

            sw.WriteLine("ID: {0}", timeZone.Id);
            sw.WriteLine("   Display Name: {0, 40}", timeZone.DisplayName);
            sw.WriteLine("   Standard Name: {0, 39}", timeZone.StandardName);
            sw.Write("   Daylight Name: {0, 39}", timeZone.DaylightName);
            sw.Write(hasDST ? "   ***Has " : "   ***Does Not Have ");
            sw.WriteLine("Daylight Saving Time***");
            offsetString = String.Format("{0} hours, {1} minutes", offsetFromUtc.Hours, offsetFromUtc.Minutes);
            sw.WriteLine("   Offset from UTC: {0, 40}", offsetString);
            adjustRules = timeZone.GetAdjustmentRules();
            sw.WriteLine("   Number of adjustment rules: {0, 26}", adjustRules.Length);
            if (adjustRules.Length > 0)
            {
                sw.WriteLine("   Adjustment Rules:");
                foreach (TimeZoneInfo.AdjustmentRule rule in adjustRules)
                {
                    TimeZoneInfo.TransitionTime transTimeStart = rule.DaylightTransitionStart;
                    TimeZoneInfo.TransitionTime transTimeEnd = rule.DaylightTransitionEnd;

                    sw.WriteLine("      From {0} to {1}", rule.DateStart, rule.DateEnd);
                    sw.WriteLine("      Delta: {0}", rule.DaylightDelta);
                    if (!transTimeStart.IsFixedDateRule)
                    {
                        sw.WriteLine("      Begins at {0:t} on {1} of week {2} of {3}", transTimeStart.TimeOfDay,
                                                                                      transTimeStart.DayOfWeek,
                                                                                      transTimeStart.Week,
                                                                                      dateFormats.MonthNames[transTimeStart.Month - 1]);
                        sw.WriteLine("      Ends at {0:t} on {1} of week {2} of {3}", transTimeEnd.TimeOfDay,
                                                                                      transTimeEnd.DayOfWeek,
                                                                                      transTimeEnd.Week,
                                                                                      dateFormats.MonthNames[transTimeEnd.Month - 1]);
                    }
                    else
                    {
                        sw.WriteLine("      Begins at {0:t} on {1} {2}", transTimeStart.TimeOfDay,
                                                                       transTimeStart.Day,
                                                                       dateFormats.MonthNames[transTimeStart.Month - 1]);
                        sw.WriteLine("      Ends at {0:t} on {1} {2}", transTimeEnd.TimeOfDay,
                                                                     transTimeEnd.Day,
                                                                     dateFormats.MonthNames[transTimeEnd.Month - 1]);
                    }
                }
            }
        }
        sw.Close();
    }
}
 

Osborne

Active Member
Hopefully the following will give you a start, but two problems:

  1. System.TimeZoneInfo.AdjustmentRule would not compile.
  2. Do not know what the relevant ABL is for this: {0, 40}

Code:
using System.*.
using System.Globalization.*.
using System.IO.*.
using System.Collections.ObjectModel.*.

DEFINE VARIABLE OUTPUTFILENAME AS CHARACTER INITIAL "C:\Temp\TimeZoneInfo.txt" NO-UNDO.
DEFINE VARIABLE dateFormats AS System.Globalization.DateTimeFormatInfo NO-UNDO.
DEFINE VARIABLE timeZones AS "System.Collections.Generic.ICollection<System.TimeZoneInfo>" NO-UNDO.
DEFINE VARIABLE sw AS System.IO.StreamWriter NO-UNDO.

dateFormats = System.Globalization.CultureInfo:CurrentCulture:DateTimeFormat.
timeZones = System.TimeZoneInfo:GetSystemTimeZones().
sw = NEW System.IO.StreamWriter(OUTPUTFILENAME, FALSE).

DEFINE VARIABLE vTimeZone AS System.TimeZoneInfo NO-UNDO.
DEFINE VARIABLE vCount AS INTEGER NO-UNDO.
DO vCount = 0 TO timeZones:Count - 1:
   vTimeZone = /* timeZones[vCount] */
               System.TimeZoneInfo:GetSystemTimeZones():Item[vCount].
   DEFINE VARIABLE hasDST AS LOGICAL NO-UNDO.
   DEFINE VARIABLE offsetFromUtc AS System.TimeSpan NO-UNDO.
   hasDST = vTimeZone:SupportsDaylightSavingTime.
   offsetFromUtc = vtimeZone:BaseUtcOffset.
   /*DEFINE VARIABLE adjustRules AS "System.TimeZoneInfo.AdjustmentRule[]" NO-UNDO.*/
   /*DEFINE VARIABLE adjustRules AS System.TimeZoneInfo.AdjustmentRule EXTENT NO-UNDO.*/
   DEFINE VARIABLE offsetString AS CHARACTER NO-UNDO.
   sw:WriteLine("ID: 0", vTimeZone:Id).
   sw:WriteLine("   Display Name: 0, 40", vTimeZone:DisplayName).
   sw:WriteLine("   Standard Name: 0, 39", vTimeZone:StandardName).
   sw:Write("   Daylight Name: 0, 39", vTimeZone:DaylightName).
   sw:Write(IF hasDST THEN "   ***Has " ELSE "   ***Does Not Have ").
   sw:WriteLine("Daylight Saving Time***").
   offsetString = SUBSTRING("0 hours, 1 minutes", offsetFromUtc:Hours, offsetFromUtc:Minutes).
   sw:WriteLine("   Offset from UTC: 0, 40", offsetString).
   /*adjustRules = vTimeZone:GetAdjustmentRules().*/
   /*sw:WriteLine("   Number of adjustment rules: 0, 26", adjustRules:Length).*/
   ...
END.
sw:Close().
 

Osborne

Active Member
Regarding my previous post, timeZones is actually this:
Code:
DEFINE VARIABLE timeZones AS "System.Collections.ObjectModel.ReadOnlyCollection<System.TimeZoneInfo>" NO-UNDO.
So you will have:
Code:
DO vCount = 0 TO timeZones:Count - 1:
   vTimeZone = timeZones:Item[vCount].
   ...
And for System.TimeZoneInfo.AdjustmentRule, I think it is this:
Code:
DEFINE VARIABLE adjustRules AS "System.TimeZoneInfo+AdjustmentRule[]" NO-UNDO.
adjustRules = vTimeZone:GetAdjustmentRules().
MESSAGE EXTENT(adjustRules) VIEW-AS ALERT-BOX.
...
 

Cecil

19+ years progress programming and still learning.
Thanks for your hard work. I struggle to get my head around the .NET class naming in the ABL.

Here is the updated version.

Code:
/* ***************************  Definitions  ************************** */

BLOCK-LEVEL ON ERROR UNDO, THROW.

/* ********************  Preprocessor Definitions  ******************** */


/* ***************************  Main Block  *************************** */
USING System.*.
USING System.Globalization.*.
USING System.IO.*.
USING System.Collections.ObjectModel.*.

DEFINE STREAM sOutput.

DEFINE VARIABLE OUTPUTFILENAME AS CHARACTER                                                                INITIAL "C:\Temp\TimeZoneInfo.txt" NO-UNDO.
DEFINE VARIABLE dateFormats    AS System.Globalization.DateTimeFormatInfo                                  NO-UNDO.
/*DEFINE VARIABLE timeZones AS "System.Collections.Generic.ICollection<System.TimeZoneInfo>" NO-UNDO.*/
DEFINE VARIABLE timeZones      AS "System.Collections.ObjectModel.ReadOnlyCollection<System.TimeZoneInfo>" NO-UNDO.
DEFINE VARIABLE sw             AS System.IO.StreamWriter                                                   NO-UNDO.

dateFormats = System.Globalization.CultureInfo:CurrentCulture:DateTimeFormat.
timeZones = System.TimeZoneInfo:GetSystemTimeZones().

DEFINE VARIABLE objTimeZone   AS System.TimeZoneInfo NO-UNDO.
DEFINE VARIABLE vCount        AS INTEGER             NO-UNDO.
DEFINE VARIABLE offsetString  AS CHARACTER           NO-UNDO.
DEFINE VARIABLE hasDST        AS LOGICAL             NO-UNDO.
DEFINE VARIABLE offsetFromUtc AS System.TimeSpan     NO-UNDO.

OUTPUT STREAM sOutput TO VALUE(OUTPUTFILENAME).

DO vCount = 0 TO timeZones:Count - 1:
  
    /*objTimeZone = /* timeZones[vCount] */
                System.TimeZoneInfo:GetSystemTimeZones():Item[vCount].*/
              
    objTimeZone = timeZones:Item[vCount].               
              
    hasDST = objTimeZone:SupportsDaylightSavingTime.
    offsetFromUtc = objTimeZone:BaseUtcOffset.
  
    /*DEFINE VARIABLE objAdjustments AS "System.TimeZoneInfo.AdjustmentRule[]" NO-UNDO.*/
    /*DEFINE VARIABLE objAdjustments AS System.TimeZoneInfo.AdjustmentRule EXTENT NO-UNDO.*/
    PUT STREAM sOutput UNFORMATTED SKIP(1).
  
    PUT STREAM sOutput UNFORMATTED SUBSTITUTE("ID: &1", objTimeZone:Id) SKIP.
    PUT STREAM sOutput UNFORMATTED SUBSTITUTE("   Display Name: &1", objTimeZone:DisplayName) SKIP.
    PUT STREAM sOutput UNFORMATTED SUBSTITUTE("   Standard Name: &1", objTimeZone:StandardName ) SKIP.
    PUT STREAM sOutput UNFORMATTED SUBSTITUTE("   Daylight Name: &1", objTimeZone:DaylightName) SKIP.
    PUT STREAM sOutput UNFORMATTED SUBSTITUTE("   Total Minutes: &1", objTimeZone:BaseUtcOffset:TotalMinutes) SKIP.
    PUT STREAM sOutput UNFORMATTED (IF hasDST THEN "   ***Has " ELSE "   ***Does Not Have ")  "Daylight Saving Time***" SKIP.
  
    offsetString = SUBSTITUTE("&1 hours, &2 minutes", offsetFromUtc:Hours, offsetFromUtc:Minutes).
  
    PUT STREAM sOutput UNFORMATTED SUBSTITUTE("   Offset from UTC: &1", offsetString) SKIP.
    /*objAdjustments = objTimeZone:GetAdjustmentRules().*/
    /*sw:WriteLine("   Number of adjustment rules: 0, 26", objAdjustments:Length).*/
    DEFINE VARIABLE objAdjustments AS "System.TimeZoneInfo+AdjustmentRule[]" NO-UNDO.
    DEFINE VARIABLE objAdjustment  AS CLASS                                  System.TimeZoneInfo+AdjustmentRule NO-UNDO.
  
    objAdjustments = objTimeZone:GetAdjustmentRules().
    
    
    DEFINE VARIABLE iAdjustmentRule AS INTEGER NO-UNDO.
  
    IF objAdjustments:length EQ 0 THEN
        PUT STREAM sOutput UNFORMATTED SUBSTITUTE("&1 has no adjustment rules", objTimeZone:StandardName) SKIP.
    
    
    
    DO iAdjustmentRule = 0 TO objAdjustments:length - 1:
      
        objAdjustment = CAST(objAdjustments:GetValue(iAdjustmentRule), System.TimeZoneInfo+AdjustmentRule).
      
      
        PUT STREAM sOutput UNFORMATTED
            "Start Date:" objAdjustment:DateStart SKIP.
        PUT STREAM sOutput UNFORMATTED SUBSTITUTE("  Time Change: &1:&2, Minuets: &3",
            TRIM(STRING(INTEGER(objAdjustment:DaylightDelta:Hours), "-99")),
            TRIM(STRING(INTEGER(objAdjustment:DaylightDelta:Minutes), "-99")),
            objAdjustment:DaylightDelta:TotalMinutes)  SKIP.
      
        
             /*
        PUT STREAM sOutput UNFORMATTED objAdjustment:DaylightDelta:Milliseconds SKIP.
        PUT STREAM sOutput UNFORMATTED objAdjustment:DaylightDelta:Minutes SKIP.
        PUT STREAM sOutput UNFORMATTED objAdjustment:DaylightDelta:Seconds SKIP.
        PUT STREAM sOutput UNFORMATTED objAdjustment:DaylightDelta:TotalMinutes SKIP.
        */
        
      
        PUT STREAM sOutput UNFORMATTED "  Day:" objAdjustment:DaylightTransitionStart:Day SKIP.
        PUT STREAM sOutput UNFORMATTED "  Day of Week:" objAdjustment:DaylightTransitionStart:DayOfWeek SKIP.
        PUT STREAM sOutput UNFORMATTED "  Month:" objAdjustment:DaylightTransitionStart:Month SKIP.
        PUT STREAM sOutput UNFORMATTED "  Week:" objAdjustment:DaylightTransitionStart:Week SKIP.
        PUT STREAM sOutput UNFORMATTED "  TimeOfDay:" objAdjustment:DaylightTransitionStart:TimeOfDay SKIP.
        
        
      
        PUT STREAM sOutput UNFORMATTED
            "End Date:" objAdjustment:DateEnd SKIP.
        PUT STREAM sOutput UNFORMATTED objAdjustment:DaylightTransitionEnd:Day SKIP.
        PUT STREAM sOutput UNFORMATTED objAdjustment:DaylightTransitionEnd:DayOfWeek SKIP.
      
        PUT STREAM sOutput UNFORMATTED objAdjustment:DaylightTransitionEnd:Month SKIP.
        PUT STREAM sOutput UNFORMATTED objAdjustment:DaylightTransitionEnd:Week SKIP.
        PUT STREAM sOutput UNFORMATTED objAdjustment:DaylightTransitionEnd:TimeOfDay SKIP.
      
    END.
    
/*MESSAGE EXTENT(objAdjustments) VIEW-AS ALERT-BOX.*/

END.

OUTPUT STREAM sOutput CLOSE.
 

Osborne

Active Member
Yes, the .NET class naming in the ABL can be a struggle at times, especially when a lot of C# code does not give the full reference. Makes it a lot easier to see System.Collections.ObjectModel.ReadOnlyCollection<System.TimeZoneInfo> as opposed to just ReadOnlyCollection<System.TimeZoneInfo>
 
Top