воскресенье, 30 августа 2015 г.

Разработка GUI для SAP с использованием JScript часть 2

Для реализации случая с отсутствием события OnChange (пользователь просто вышел из HTML окна), пришлось опробовать несколько вариантов: 

    1. Обработка события OnKeyUp элемента ввода данных - В этом случае при каждом нажатии кнопки значение передается в SAP, но так как обработка событий осуществляется в синхронном режиме, то при быстром вводе текста пропадает половина символов. 
    2. Фиксация введенных данных во внутреннюю переменную при событии onKeyUp и по таймеру (ну например 10 секунд) отправка данных в SAP. В принципе работает, но есть вероятность что в момент отправки данных пользователь начнет опять вводить данные - в этом случае опять пропадет символ. Пропаданий символов гораздо меньше чем в первом случае - но они есть. 
    3. Обработка события onUnload элемента <BODY>. Идея в том чтобы передать данные в момент разрушения HTML объекта. Не работает, событие возникает, но SAP не реагирует на передаваемую ссылку. 
    4. Вызов скрипта в HTML со стороны SAP. На первый взгляд такое невозможно, но в классе cl_gui_html_viewer есть пара хитрых методов: set_script и execute_script, правда они protected, но их можно использовать если реализовать потомка. Как это сделать можно посмотреть в примере - SAPHTML_SCRIPT_DEMO. Этот вариант также не подходит для реализации поставленной задачи - SAP также не реагирует на сгенерированную таким образом ссылку, хотя возможность запускать скрипты из кода SAP довольно интересная. 
    5. Комбинированная обработка событий onKeyUp на элементе ввода и onMouseOut на контейнере, который содержит все элементы. Этот вариант полностью подошел, при этом данные не теряются и передаются в SAP. Вот пример кода в HTML шаблоне: 
    Код

    <table onm ouseout="sendKey();">
    <tr>
    <td><textarea onc hange="sendVal(this)" onk eyup="evntKey(this)" name="FIELD"></td>
    </tr>
    </table> 

а вот пример обработчиков: 

Код

    <script>
    var curr_element;
    function evntKey(e){
    curr_element=e;
    }
    function sendKey()
    {
    var l_str=curr_element.value;
    var la_array=l_str.match(/.{1,250}/g);
    var vl_str='SAPEVENT:KeyData?';
    for(var i=0; i<la_array.length; i++){
      if (i>0) {vl_str=vl_str+'&';}
      vl_str=vl_str+curr_element.name+'_'+i+'='+la_array[i];
      }
    location.href=vl_str;
    }
  


    function sendVal(e)
    {
    var l_str=e.value;
    var la_array=l_str.match(/.{1,250}/g);
    var vl_str='SAPEVENT:KeyData?';
    for(var i=0; i<la_array.length; i++){
      if (i>0) {vl_str=vl_str+'&';}
      vl_str=vl_str+e.name+'_'+i+'='+la_array[i];
      }
    location.href=vl_str;
    } 

Комментариев нет:

Отправить комментарий