Adsense Ad

Thursday 4 January 2018

HOW TO - Performing Text_IO on the client using WebUtil. Introduction

Many Forms applications utilize Text_IO to read and write data from the file system. When moving your Forms application to the Web, Text_IO works in exactly the same manner as client/server. However, you must now remember that your application is running on the application server and not the client machine.
This may infact be the behavior you desire (for example, using Text_IO to write out auditing information). However, it could be that you need Text_IO to access the machine at which the user is sitting. For example, a salesman logs onto the Forms application and wants the application to read sales data from his local machine.
WebUtil provides you the functionality to perform client side Text_IO.

Set Up

For the steps to set up WebUtil, please refer to the WebUtil Familiarization Manual available as part of the software download.

Changing code

Consider the following code:
PROCEDURE WRITE_ITEM_BLOCK (FILENAME IN VARCHAR2) IS 
  MYFILE TEXT_IO.FILE_TYPE; 
  CUR_REC NUMBER; 
BEGIN 
  GO_BLOCK('S_ITEM'); 
  CUR_REC := :SYSTEM.CURSOR_RECORD; 
  IF :SYSTEM.BLOCK_STATUS != 'NEW' THEN 
    FIRST_RECORD; 
    MYFILE := TEXT_IO.FOPEN(FILENAME, 'W'); 
    TEXT_IO.PUTF(MYFILE,'Item_ID,Proudct_ID,Description'||CHR(10)); 
    LOOP 
      TEXT_IO.PUTF(MYFILE, TO_CHAR(:S_ITEM.ITEM_ID)||','); 
      TEXT_IO.PUTF(MYFILE, TO_CHAR(:S_ITEM.PRODUCT_ID)||','); 
      TEXT_IO.PUTF(MYFILE, :S_ITEM.DESCRIPTION||','); 
      TEXT_IO.PUTF(MYFILE, CHR(10)); 
      EXIT WHEN :SYSTEM.LAST_RECORD = 'TRUE'; 
      NEXT_RECORD; 
    END LOOP; 
    TEXT_IO.FCLOSE(MYFILE); 
  END IF; 
  GO_RECORD(CUR_REC); 
END;
This code will go through the records of a block and output the data to a named file. To perform the same functionality, but on the client side, attatch the WebUtil object library and PL/SQL library, and replace any instance of TEXT_IO with CLIENT_TEXT_IO.
The resulting code will now work, as before, but write the file to the client machine.
PROCEDURE WRITE_ITEM_BLOCK (FILENAME IN VARCHAR2) IS 
  MYFILE CLIENT_TEXT_IO.FILE_TYPE; 
  CUR_REC NUMBER; 
BEGIN 
  GO_BLOCK('S_ITEM'); 
  CUR_REC := :SYSTEM.CURSOR_RECORD; 
  IF :SYSTEM.BLOCK_STATUS != 'NEW' THEN 
    FIRST_RECORD; 
    MYFILE := CLIENT_TEXT_IO.FOPEN(FILENAME, 'W'); 
    CLIENT_TEXT_IO.PUTF(MYFILE,'Item_ID,Proudct_ID,Description'||CHR(10)); 
    LOOP 
      CLIENT_TEXT_IO.PUTF(MYFILE, TO_CHAR(:S_ITEM.ITEM_ID)||','); 
      CLIENT_TEXT_IO.PUTF(MYFILE, TO_CHAR(:S_ITEM.PRODUCT_ID)||','); 
      CLIENT_TEXT_IO.PUTF(MYFILE, :S_ITEM.DESCRIPTION||','); 
      CLIENT_TEXT_IO.PUTF(MYFILE, CHR(10)); 
      EXIT WHEN :SYSTEM.LAST_RECORD = 'TRUE'; 
      NEXT_RECORD; 
    END LOOP; 
    CLIENT_TEXT_IO.FCLOSE(MYFILE); 
  END IF; 
  GO_RECORD(CUR_REC); 
END;

No comments: