Plex 2E

  • 1.  RDi plugin

    Posted Jun 22, 2015 01:33 PM

    Is there an RDi plugin for C2E? or some other IDE ?



  • 2.  Re: RDi plugin

    Posted Jun 22, 2015 03:05 PM

    I don't think C2E is stored in a way you can edit with an IDE.



  • 3.  Re: RDi plugin

    Posted Jun 22, 2015 04:27 PM

    Saw you were previously looking for CA 2E training (to give it it's full name). Any luck?

     

    RDi would be great but judging by the speed at which native rpg developers have adopted RDi and the huge undertaking to bring 2E into eclipse I would say it is a hard sell

     

    That is not to say it wont happen as other ISV may well give it a go Dragons Den "Plex/2E"



  • 4.  Re: RDi plugin

    Posted Jun 22, 2015 04:41 PM

    Is how CA 2e stores the functions even documents ? you would need the for sure...



  • 5.  Re: RDi plugin

    Posted Jun 22, 2015 07:15 PM

    Why do you need the information from C2E in RDi (or any other IDE)?

     

    I have several export utilities that can take C2E information into other tools - including one that I shelved a decade ago that produced XML/XSLT to document the whole data model so that you could view it.

     

    At the conference I demonstrated another tool I worked on a year ago that could import/export xml out-of/into C2E - which enabled you to use more modern techniques for merging function logic.This was only done as a PoC for a large client that decided not to move forward with the idea. I have even designed a new language for C2E that enables it to be maintained in an XML based

     

    We actually used the same concepts during one of the hackathon projects to reolve a merging issue with OBASE Plex models.

     

    I'm currently designing a plug-in for NetBrains IntelliJ that can be used for Plex - and will probably move onto C2E once I get that up and running. I have designed the IDE language so that C2E is a subset of the Plex language - which should make it easier to migrate between C2E and Plex. I expect it will take me 6 months before I complete the Plex one. I like NetBrains IDE as it allows for custom language design very easily.

     

    Regards,

     

    Darryl



  • 6.  Re: RDi plugin

    Posted Jun 25, 2015 11:52 AM

    I don't need it in an IDE, I was just curious if there was a way to develop from an eclipse style environment.



  • 7.  Re: RDi plugin

    Posted Jun 25, 2015 01:29 PM

    I would love to use RDI over Edit Action Diagram, I HATE the fact you can not scroll down a number of line. Full Screen paging 8&*&@##*



  • 8.  Re: RDi plugin

    Posted Jun 25, 2015 07:32 PM

    So - if you could just edit an action diagram in RDi or any other modern IDE - you would be happy?

     

    I'm trying to understand what would be the Minimum Viable Product to get it out for general use. I've already built the action diagram export/import for CA 2E and could feasibly get an AD editor up and running in most popular IDEs in a very short time.

     

    I've not used RDi - although I did use earlier versions of the Eclipse IDE that was first shipped with AS/400 many years ago. I've sat through the webcasts that IBM have and read a little about it.

     

    In the tool I was developing last year that enabled the export/import of CA 2E batch functions I designed a new XML based language for CA 2E - that is a real language and not the pseudo AD language of CA 2E that is difficult to parse. Below is a sample of that language for a simple CA 2E RTVOBJ function. Would editing this language as an XML document in RDi (or any other IDE) be of interest to you? Unfortunately it is hard to show the syntax highlighting and indentation correctly using cut'n'paste of XML code.

     

    Regards,

     

    Darryl

     

    <?xml version="1.0" encoding="utf-8" ?>
    <Model>
         <Objects>
              <Object Type="FUN" Name="My Test 3" OwnerName="My Test File" AccessPathName="Retrieval index" ProtoType="RTVOBJ">
                   <Options>
                        <Option Name="Share subroutine" Value="Y" />
                   </Options>
                   <Parameters>
                        <Parameter Sequence="" Type="ACP" Name="Retrieval index" OwnerName="My Test File" PassedAs="FLD" Fixed="" >
                             <ParameterDetail Name="My Test Key" Usage="I" Role="RST" Error="" />
                             <ParameterDetail Name="My Test Atr" Usage="O" Role="" Error="" />
                        </Parameter>
                   </Parameters>
                   <ActionDiagram>
                        <Declarations>
                             <Declare Type="FLD" Name="*Return code" Replacement="~Return_code" />
                             <Declare Type="FLD" Name="*Scan limit" Replacement="~Scan_limit" />
                             <Declare Type="FLD" Name="*Synon (17,7) work field" Replacement="~Synon_~17~7~_work_field" />
                             <Declare Type="FLD" Name="*API Number of keys" Replacement="~API_Number_of_keys" />
                             <Declare Type="FLD" Name="*API Exec&amp;amp;apos;d Pgm Rtn Code" Replacement="~API_Exec'd_Pgm_Rtn_Code" />
                             <Declare Type="FLD" Name="*Field text" Replacement="~Field_text" />
                             <Declare Type="FLD" Name="*Array index" Replacement="~Array_index" />
                             <Declare Type="FLD" Name="*Array maximum" Replacement="~Array_maximum" />
                             <Declare Type="FLD" Name="test atr" Replacement="test_atr" />
                             <Declare Type="FLD" Name="test another new fld" Replacement="test_another_new_fld" />
                             <Declare Type="FLD" Name="My Test Key" Replacement="My_Test_Key" />
                             <Declare Type="FLD" Name="My Test Atr" Replacement="My_Test_Atr" />
                             <Declare Type="CND" Name="*Rounded" OwnerName="*Rounded" Replacement="~Rounded.~Rounded" />
                             <Declare Type="CND" Name="*Normal" OwnerName="*Return code" Replacement="~Return_code.~Normal" />
                             <Declare Type="CND" Name="*Record does not exist" OwnerName="*Return code" Replacement="~Return_code.~Record_does_not_exist" />
                             <Declare Type="CND" Name="*Factor 1" OwnerName="*Quotient definition fld" Replacement="~Quotient_definition_fld.~Factor_1" />
                             <Declare Type="FUN" Name="test" OwnerName="My Test File" Replacement="My_Test_File.test" />
                             <Declare Type="ARR" Name="test structure" OwnerName="*Arrays" Replacement="~Arrays.test_structure" />
                        </Declarations>
                        <UserPoint Name="USER: Initialize routine">
    <![CDATA[
    // * This is a text block
    /! This is a case block
    if (
          PGM.~Return_code == ~Return_code.~Normal
    ) {
          // * This is the first block in the case sub-block
    };
    // * This is another text block
    /! This is an iteration title
    while (
          PGM.~Return_code == ~Return_code.~Normal
    ) {
          // * This is the first block in the iteration sub-block
    };
    /! This is a sequence title
    {
          // * This is the first block in the sequence sub-block
    };
    /! This is a negated case block
    if (
          !c1,
          c1 := PGM.~Return_code == ~Return_code.~Normal
    ) {
          // * This is the first block in the case sub-block
    };
    /! This is a compound case block
    if (
          /! this is title for condition
          c1 & c2 | c3,
          c1 := PGM.~Return_code == ~Return_code.~Normal,
          c2 := PGM.~Return_code == ~Return_code.~Record_does_not_exist,
          c3 := !!!.NewCondition
    ) {
          // * This is the first block in the case sub-block
    };
    ]]>
                        </UserPoint>
                        <UserPoint Name="USER: Processing if Data record not found">
    <![CDATA[
    /! actio9n title
    My_Test_File.test (
          My_Test_Key := PAR.My_Test_Key,
          My_Test_Atr := LCL.My_Test_Atr
    );
    ]]>
                        </UserPoint>
                        <UserPoint Name="USER: Process Data record">
    <![CDATA[
    /! test compute
    LCL.test_another_new_fld = COMPUTE( x1 + x2 \ x1 - x3 * x4,
          x1 := LCL.~API_Exec'd_Pgm_Rtn_Code,
          ADD := PGM.~Synon_~17~7~_work_field,
          x2 := LCL.~API_Number_of_keys,
          MODULO := ( PGM.~Synon_~17~7~_work_field, CND.~Quotient_definition_fld.~Factor_1 ),
          x1 := LCL.~API_Exec'd_Pgm_Rtn_Code,
          SUB := PGM.~Synon_~17~7~_work_field,
          x3 := LCL.~Array_index,
          MULT := ( PGM.~Synon_~17~7~_work_field, CND.~Rounded.~Rounded ),
          x4 := LCL.~Array_maximum
    );
    /! test compute
    LCL.test_another_new_fld = COMPUTE( (x1 + x2) \ ((x1 - x3) * x4),
          x1 := LCL.~API_Exec'd_Pgm_Rtn_Code,
          ADD := PGM.~Synon_~17~7~_work_field,
          x2 := LCL.~API_Number_of_keys,
          MODULO := ( PGM.~Synon_~17~7~_work_field, CND.~Quotient_definition_fld.~Factor_1 ),
          x1 := LCL.~API_Exec'd_Pgm_Rtn_Code,
          SUB := PGM.~Synon_~17~7~_work_field,
          x3 := LCL.~Array_index,
          MULT := ( PGM.~Synon_~17~7~_work_field, CND.~Rounded.~Rounded ),
          x4 := LCL.~Array_maximum
    );
    ]]>
                        </UserPoint>
                        <UserPoint Name="USER: Exit processing">
    <![CDATA[
    COMMIT;
    ROLLBACK;
    QUIT;
    EXIT_PROGRAM( PGM.~Return_code );
    PAR == LCL, WRK, DB1, PGM;
    LCL.My_Test_Atr = SUBSTRING( LCL.test_atr, CON.5, CON.1 );
    ELM.~Arrays.test_structure = CVTVAR( LCL.~Field_text );
    LCL.~Field_text = CVTVAR( ELM.~Arrays.test_structure );
    LCL.test_another_new_fld = CVTVAR( LCL.My_Test_Atr );
    LCL.My_Test_Atr = LCL.My_Test_Key;
    LCL.test_another_new_fld = PGM.~Scan_limit + CON.12345;
    LCL.test_another_new_fld = PGM.~Scan_limit - CON.12345;
    LCL.test_another_new_fld = PGM.~Scan_limit / CON.12345;
    LCL.test_another_new_fld = ROUND( PGM.~Scan_limit / CON.12345 );
    LCL.test_another_new_fld = PGM.~Scan_limit * CON.12345;
    LCL.test_another_new_fld = ROUND( PGM.~Scan_limit * CON.12345 );
    LCL.test_another_new_fld = ( CND.~Quotient_definition_fld.~Factor_1 ) PGM.~Scan_limit \ CON.12345;
    ]]>
                        </UserPoint>
                   </ActionDiagram>
              </Object>
         </Objects>
    </Model>
    
    


  • 9.  Re: RDi plugin

    Posted Jun 25, 2015 08:13 PM

    Here are the user point AD statements in a Java syntax highlighter - which is close to the AD language constructs apart from some variable expressions.

     

    // * This is a text block
    /! This is a case block
    if (
          PGM.~Return_code == ~Return_code.~Normal
    ) {
          // * This is the first block in the case sub-block
    };
    // * This is another text block
    /! This is an iteration title
    while (
          PGM.~Return_code == ~Return_code.~Normal
    ) {
          // * This is the first block in the iteration sub-block
    };
    /! This is a sequence title
    {
          // * This is the first block in the sequence sub-block
    };
    /! This is a negated case block
    if (
          !c1,
          c1 := PGM.~Return_code == ~Return_code.~Normal
    ) {
          // * This is the first block in the case sub-block
    };
    /! This is a compound case block
    if (
          /! this is title for condition
          c1 & c2 | c3,
          c1 := PGM.~Return_code == ~Return_code.~Normal,
          c2 := PGM.~Return_code == ~Return_code.~Record_does_not_exist,
          c3 := !!!.NewCondition
    ) {
          // * This is the first block in the case sub-block
    };
    

     

    /! actio9n title
    My_Test_File.test (
          My_Test_Key := PAR.My_Test_Key,
          My_Test_Atr := LCL.My_Test_Atr
    );
    

     

    /! test compute
    LCL.test_another_new_fld = COMPUTE( x1 + x2 \ x1 - x3 * x4,
          x1 := LCL.~API_Exec'd_Pgm_Rtn_Code,
          ADD := PGM.~Synon_~17~7~_work_field,
          x2 := LCL.~API_Number_of_keys,
          MODULO := ( PGM.~Synon_~17~7~_work_field, CND.~Quotient_definition_fld.~Factor_1 ),
          x1 := LCL.~API_Exec'd_Pgm_Rtn_Code,
          SUB := PGM.~Synon_~17~7~_work_field,
          x3 := LCL.~Array_index,
          MULT := ( PGM.~Synon_~17~7~_work_field, CND.~Rounded.~Rounded ),
          x4 := LCL.~Array_maximum
    );
    /! test compute
    LCL.test_another_new_fld = COMPUTE( (x1 + x2) \ ((x1 - x3) * x4),
          x1 := LCL.~API_Exec'd_Pgm_Rtn_Code,
          ADD := PGM.~Synon_~17~7~_work_field,
          x2 := LCL.~API_Number_of_keys,
          MODULO := ( PGM.~Synon_~17~7~_work_field, CND.~Quotient_definition_fld.~Factor_1 ),
          x1 := LCL.~API_Exec'd_Pgm_Rtn_Code,
          SUB := PGM.~Synon_~17~7~_work_field,
          x3 := LCL.~Array_index,
          MULT := ( PGM.~Synon_~17~7~_work_field, CND.~Rounded.~Rounded ),
          x4 := LCL.~Array_maximum
    );
    

     

    COMMIT;
    ROLLBACK;
    QUIT;
    EXIT_PROGRAM( PGM.~Return_code );
    PAR == LCL, WRK, DB1, PGM;
    LCL.My_Test_Atr = SUBSTRING( LCL.test_atr, CON.5, CON.1 );
    ELM.~Arrays.test_structure = CVTVAR( LCL.~Field_text );
    LCL.~Field_text = CVTVAR( ELM.~Arrays.test_structure );
    LCL.test_another_new_fld = CVTVAR( LCL.My_Test_Atr );
    LCL.My_Test_Atr = LCL.My_Test_Key;
    LCL.test_another_new_fld = PGM.~Scan_limit + CON.12345;
    LCL.test_another_new_fld = PGM.~Scan_limit - CON.12345;
    LCL.test_another_new_fld = PGM.~Scan_limit / CON.12345;
    LCL.test_another_new_fld = ROUND( PGM.~Scan_limit / CON.12345 );
    LCL.test_another_new_fld = PGM.~Scan_limit * CON.12345;
    LCL.test_another_new_fld = ROUND( PGM.~Scan_limit * CON.12345 );
    LCL.test_another_new_fld = ( CND.~Quotient_definition_fld.~Factor_1 ) PGM.~Scan_limit \ CON.12345;
    


  • 10.  Re: RDi plugin

    Posted Jun 25, 2015 11:47 AM

    yes, we are going with cmfirst