Adsense Ad

Wednesday 24 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: