Oracle Forms с использованием OLE2 не сохраняет документ Excel при трехуровневой настройке

Настройка системы:

3-Tier environment
Client Machine - doesn't matter
Web-Tier - Not sure.  Probably Windows Server 2008 64 bit
       -Jdk 7u3
App Server - Windows Server 2008 64 bit
       -Weblogic Server 10.3.6
       -Excel 2010
       -Jdk 7u3
Database Server - Not sure. Probably Windows Server 2008 64 bit.
       -Oracle Database 11g

Programming using Oracle Forms 11.1.1.6

Теперь моя проблема в том, что когда мы проектировали их систему, все, кроме базы данных, было на одном ПК. Я мог читать и писать документы Excel без проблем. Затем мы переместили все в многоуровневую систему, где у нас были клиент, сервер приложений и сервер базы данных. Все по-прежнему работало отлично. Наконец они установили трехуровневую систему, и именно здесь я столкнулся со своими проблемами.

Когда Oracle Forms записывает в документ Excel, код выполняется без каких-либо ошибок, пока я не попытаюсь скопировать файл с сервера приложений с помощью Webutil.

PROCEDURE Export_to_Excel IS
 -- Declare the OLE objects
 application OLE2.OBJ_TYPE;
 workbooks OLE2.OBJ_TYPE;
 workbook OLE2.OBJ_TYPE;
 worksheets OLE2.OBJ_TYPE;
 worksheet OLE2.OBJ_TYPE;
 --cell OLE2.OBJ_TYPE;
 range OLE2.OBJ_TYPE;
 range_col OLE2.OBJ_TYPE;

 -- Declare handles to OLE argument lists
 args OLE2.LIST_TYPE;
 p_filename VARCHAR(255);

 --p_file TOOL_RES.RFHANDLE;
 p_file Text_IO.File_Type;
 p_filename_client      VARCHAR2(500);
 v_filename                     VARCHAR2(500);
 v_error                            VARCHAR2(500);
 passed_filename            VARCHAR2(500);
BEGIN

 -- Retrieve user specific directory to create new file in
 p_filename := Webutil_file_transfer.get_work_area;

 -- Start Excel 
 application:=OLE2.CREATE_OBJ('Excel.Application');

 -- Return object handle to the Workbooks collection 
 workbooks:=OLE2.GET_OBJ_PROPERTY(application, 'Workbooks');

 -- Add a new Workbook object to the Workbooks collection
 workbook:=OLE2.GET_OBJ_PROPERTY(workbooks,'Add');

 -- Return object handle to the Worksheets collection for the Workbook
 worksheets:=OLE2.GET_OBJ_PROPERTY(workbook, 'Worksheets');

 -- Set up the Header worksheet
 args:=OLE2.CREATE_ARGLIST; 
 OLE2.ADD_ARG(args, 1);
 worksheet:=OLE2.GET_OBJ_PROPERTY(worksheets,'Item',args);
 OLE2.DESTROY_ARGLIST(args);
 OLE2.set_property(worksheet,'Name','Header');

 -- Build header form
 populate_header(worksheet);

 -- Autofit columns
 range := OLE2.GET_OBJ_PROPERTY( worksheet,'UsedRange');
 range_col := OLE2.GET_OBJ_PROPERTY( range,'Columns');
 OLE2.INVOKE( range_col,'AutoFit' );
 OLE2.RELEASE_OBJ( range );
 OLE2.RELEASE_OBJ( range_col );


 -- Set up the Item worksheet
 args:=OLE2.CREATE_ARGLIST; 
 OLE2.ADD_ARG(args, 2);
 worksheet:=OLE2.GET_OBJ_PROPERTY(worksheets,'Item',args);
 OLE2.DESTROY_ARGLIST(args);
 OLE2.set_property(worksheet,'Name','Item List');

 -- Build Item sheet
 populate_item_sheet(worksheet);

 -- Delete the last worksheet that excel automatically creates
 args:=OLE2.CREATE_ARGLIST; 
 OLE2.ADD_ARG(args, 3);
 worksheet:=OLE2.GET_OBJ_PROPERTY(worksheets,'Item',args);
 OLE2.DESTROY_ARGLIST(args);
 OLE2.invoke(worksheet, 'Delete');

 -- Save as worksheet
 OLE2.SET_PROPERTY(application,'DisplayAlerts',FALSE);
 IF p_filename is not null THEN
        args := OLE2.CREATE_ARGLIST;
        OLE2.ADD_ARG( args, p_filename || :PARAMETER_B1.FILENAME || '.xlsx');
        OLE2.ADD_ARG( args, 56 );
        OLE2.INVOKE( workbook,'SaveAs',args );
        OLE2.DESTROY_ARGLIST( args );
 END IF;

 -- Close workbook
 OLE2.INVOKE( workbook ,'Close');

 -- Release the OLE objects
 OLE2.RELEASE_OBJ(worksheet);
 OLE2.RELEASE_OBJ(worksheets);
 OLE2.RELEASE_OBJ(workbook);
 OLE2.RELEASE_OBJ(workbooks);
 OLE2.INVOKE(application, 'Quit');
 OLE2.RELEASE_OBJ(application); 

 --Check if file was writen correctly
 p_file := text_io.fopen(p_filename || :PARAMETER_B1.FILENAME || '.xlsx','r');
 Text_IO.Fclose(p_file);

 --Added the following code
 passed_filename := :PARAMETER_B1.FILENAME || '.xlsx';
 v_filename := p_filename || passed_filename;

 -- Popup a dialog box to allow user to select the location to save the file
 p_filename_client := CLIENT_GET_FILE_NAME ( 'C:\', passed_filename, NULL, 'Select A Directory', SAVE_FILE, FALSE );

 if p_filename_client is null then
      message ('Creation of the spreadsheet has been canceled.');
        raise form_trigger_failure;
 end if;

 -- File Transfer to Client
 PROCESS_COMM_FILE_CLIENT.FILE_TRANSFER('O', p_filename_client, v_filename, null, v_error);

 EXCEPTION
      WHEN others THEN
        Text_IO.Fclose(p_file);
                message( SQLERRM( SQLCODE ) ) ;
        if p_filename_client is not null then
          MESSAGE('An error occurred while creating file.');
      end if;
END; 

Код завершается ошибкой в ​​FILE_TRANSFER, потому что форма не создается на сервере приложений, как предполагалось.

Связанная с этим проблема заключается в том, что когда я пытаюсь загрузить документ Excel и прочитать его в оракуле, я получаю ошибку ORA-305500. Я попытался удалить и переустановить Excel с помощью администратора базы данных и убедиться, что все функции/надстройки были включены во время установки, но проблема до сих пор не устранена.

Может ли кто-нибудь дать мне несколько советов о том, что делать, чтобы решить эту проблему или продолжить снимать проблему?

Спасибо,

Счет


person William Edwards    schedule 01.06.2012    source источник


Ответы (3)


Если проблема связана с фактическим созданием файла с использованием OLE, я бы посоветовал вам создать каталог:

C:\Windows\System32\config\systemprofile

Код OLE в Oracle Forms проверяет в этом каталоге параметры конфигурации OLE. Неважно, пуст ли каталог, главное, чтобы он существовал!

person David Roberts    schedule 03.08.2012
comment
Я узнал об этом через неделю после того, как задал вопрос. Ты прав. Отсутствие этого пустого каталога БЫЛО проблемой. Спасибо всем за вашу помощь. - person William Edwards; 24.08.2012

Проверьте свой $ORACLE_HOME/forms/server/webutil.cfg, нет ли ограничений на чтение каталогов.

В общем, проверьте параметры "transfer.appsrv.read.<n>=/.../.../".

person Patrick    schedule 21.06.2012

Насколько я понимаю вашу проблему, вы собираетесь сохранить файл на клиентской машине. Теперь, предполагая, что вы используете WEB_FORMS (т. е. вы используете веб-браузер для доступа к приложению форм), вы можете использовать приведенный ниже код для сохранения файла из AS на клиентском компьютере вместо PROCESS_COMM_FILE_CLIENT.FILE_TRANSFER. Объекты OLE создают файл в AS, вам нужно получить файл из AS (сервер приложений) на локальный компьютер.

l_success := webutil_file_transfer.AS_to_Client_with_progress 
     (clientFile => 'c:\fine.xlsx' 
     ,serverFile => 'c:\data\file.xlsx' 
     ,progressTitle => 'Save file in progress' 
     ,progressSubTitle => 'Please wait');
if l_success then 
     message('File saved successfully'); 
else 
     message('Cannot save file'); 
end if;

Приведенный выше код должен отображать всплывающее окно «Выполняется сохранение файла» с индикатором выполнения, чтобы показать, что ваш файл сохраняется на локальном компьютере.

person AnBisw    schedule 04.08.2012