Connect, learn, share, and engage with IBM Power.
An RPG programmer wants to substitute the values of variables ITEM and PRICE into the string template "The price of item %ITEM% is $%PRICE%.".
The programmer can use DATA-GEN to handle this.The program using the DATA-GEN opcode
**free// price_msg - a data structure for the MULTRPL generator for DATA-GEN// - the first subfield is the message template// - the second subfield is the character that surrounds the replacement names// - the remaining subfields are the replacement subfieldsdcl-ds price_msg qualified; message varchar(100) inz('The price of item "%ITEM%" is $%PRICE%.'); marker char(1) inz('%'); item varchar(20) inz('Table'); price packed(5:2) inz(123.45);end-ds price_msg; // A variable to receive the formatted messagedcl-s output char(50); // This DATA-GEN will substitute ITEM and PRICE data-gen ds %data(output) %gen('MULTRPL'); // Display the result: The price of item "Table" is $123.45.dsply output; return; The DATA-GEN generator program MULTRPL
**free// A generator for the DATA-GEN opcode to substitute// several values into a string//// Usage:// 1. Define a data structure where // - the first subfield is the string "template"// message inz('The price of item "%ITEM%" is $%PRICE%')// - the second subfield is the character placed before// and after the replacement values// marker inz('%')// - the remaining subfields are the replacement values// - they can have any data type// item varchar(20) inz('Table');// price packed(7:2) inz(123.45);// 2. Specify the data structure as the first operand of DATA-GEN// 3. Specify this program for %GEN/if defined(*crtbndrpg) ctl-opt dftactgrp(*no);/endifctl-opt option(*srcstmt);ctl-opt debug(*constants);ctl-opt ccsid(*ucs2 : *utf16);ctl-opt main(multipleReplacements);/copy qoar/qrpglesrc,qrndtagendcl-proc multipleReplacements; dcl-pi *n; parm likeds(QrnDgParm_T); end-pi; dcl-s subf varchar(100); dcl-s i int(10); dcl-s value ucs2(1000) based(pValue); dcl-s subfValue varucs2(1000); dcl-s replaceName varucs2(1000); dcl-ds state qualified based(pState); result varucs2(10000); marker varucs2(10); end-ds; pQrnDgEnv = parm.env; if parm.event = QrnDgEvent_03_Start; // Start of generation: Allocate the // "state" info parm.generatorState = %alloc(%size(state)); endif; pState = parm.generatorState; if parm.event = QrnDgEvent_04_End; // End of generation: Report the resulting string QrnDgAddText (parm.handle : %addr(state.result : *data) : %len(state.result)); // Free the state info dealloc(n) parm.generatorState; elseif parm.event = QrnDgEvent_11_ScalarValue; if parm.scalar.subfieldNumber = 1; // The first subfield has the template string pValue = parm.scalar.value; state.result = %subst(value : 1 : parm.scalar.valueLenChars); elseif parm.scalar.subfieldNumber = 2; // The second subfield has the substitution marker // - it is placed before and after each substitution // value in the template string pValue = parm.scalar.value; state.marker = %subst(value : 1 : parm.scalar.valueLenChars); else; // The result of the subfields have the replacement // values pValue = parm.scalar.value; subfValue = %subst(value : 1 : parm.scalar.valueLenChars); replaceName = state.marker + %upper(parm.name) + state.marker; state.result = %scanrpl(replaceName : subfValue : state.result); endif; endif; return;end-proc;
Copy