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;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>