This feature is available with Profound UI releases later than Version 6 Fix Pack 3.3.

Since the limit for DDS record size is 32K, Profound UI provides a procedure called universal_overrideValue() as an alternative way to send data for very large fields (size greater than 32K) to a Universal Display File. The procedure prototype is defined in /COPY member PROFOUNDUI/QRPGLEINC, PUIUNI. The procedure is exported from service program UNIVERSAL.

The prototype is shown below:

 D* procedure to override field data, from *SRVPGM UNIVERSAL
 D universal_overrideValue...                                              
 D                 pr                  ExtProc('universal_overrideValue') 
 D  FileName                       *   value options(*string:*trim)        
 D  RecordName                     *   value options(*string:*trim)        
 D  FieldName                      *   value options(*string:*trim)        
 D  Data                           *   value options(*string)              
 D  DataLen                      10i 0 value                   

 

How to use this procedure:

  1.  Include /COPY member PROFOUNDUI/QRPGLEINC, PUIUNI in your progarm.
  2.  Define the field with a small size (less than 32K) in your Universal Display File as normal.
  3.  In your program, before a WRITE, call procedure universal_overrideValue() to indicate to the Universal handler to use the data specified on the procedure call (instead of the data in the DDS record) for the specified field and record format. Use the parameters “Data” and “DataLen” to point to the location and length of the data.
  4.  Compile and run your program with service program UNIVERSAL in the library list.
  5.  At WRITE time, the Universal handler will send that data to the Universal Display File for that field in that record format.

Example program of how this procedure is used:

  • Suppose you have a customer address file CUSTADRP with the following fields
    • CUSTNO: zoned(4:0)
    • NAME: char(30)
    • STREET: char(30)
    • CITY: char(20)
    • STATE: char(2)
    • POSTAL: char(10)
  • The fields NAME, STREET, CITY are defined on the Universal Display File with their normal sizes.
  • However, you want to send very large data (> 32K) for those fields to the Universal Display File at WRITE time.
  • The example program uses procedure universal_overrideValue() to override the value for those fields (NAME, CITY, STREET), using data from the big fields “bigName”, “bigStreet”, “bigCity”,  before doing WRITE to the record format,
  • The large fields can be type CHAR, VARCHAR, or CLOB, as shown in the example.
      /DEFINE PROFOUNDUI
     FCUSTADRP  if   e           k disk
     FMYFILE    CF   E             WorkStn Handler('UNIVERSAL(HANDLER)')
 
      /COPY QRPGLEINC,PUIUNI
 
        dcl-s  bigName    char(35000);
        dcl-s  bigStreet  varchar(40000);
        dcl-s  bigCity    sqlType(clob: 45000);
        dcl-s  temp       char(37000);
        dcl-s  fileName   char(10) inz('MYFILE');
 
        // main()
 
        custno = 1234;
        chain custno custadrp;
 
        if %found(custadrp);
 
          // Override fields NAME, STREET, CITY, to use large fields
 
          // char(35000) field; use %addr(field) for Data, -1 for DataLen for 0-terminated
          // string, 34K bytes
          bigName = *all'X';
          %subst(bigName: 1: 5) = 'START';
          %subst(bigName: 34000-3+1: 3) = 'END';
          %subst(bigName: 34000+1  : 1) = x'00';
 
          universal_overrideValue('MYLIB/MYFILE': 'FM01': 'name':        // fileName can be qualified name
                                  %addr(bigName  ): -1              );   // -1 for 0-terminated
 
          // varchar(40000) field; use %addr(field:*data) for Data, %len(field) for DataLen
          temp = *all'Y';      // 37K
          bigStreet = temp;    // use 37K of 40K
          %subst(bigStreet: 1: 5) = 'START';
          %subst(bigStreet: 37000-3+1: 3) = 'END';
 
          universal_overrideValue(fileName: 'FM01': 'street':
                                  %addr(bigStreet:*data): %len(bigStreet));
 
          // clob(45000) field; use %addr(field_data) for Data, field_len for DataLen
          exec SQL select BIGCITY
                    into  :bigCity
                    from  CUSTADRP2
                    where custno = :CUSTNO;
          if sqlCode <> 0;
             bigCity_data = 'bigCity not found in CUSTADRP2';
             bigCity_len = %len(%trim(bigCity_data));
          endif;
 
          universal_overrideValue(fileName: 'FM01':  'city':
                                  %addr(bigCity_data):  bigCity_len);
  
          write FM01;
 
        endif;
 
        *InLr = *On;
        Return;
 

 

 

 

     

  • No labels