среда, 2 сентября 2015 г.

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

Итак. Удалось добиться функционирования HTML интерфейса в SAP с использованием библиотеки jquery_ui. Что же дает нам эта библиотека? Прежде всего конечно обилие элементов управления, вот как это выглядит:
Согласитесь - существенная разница с тем, что было показано в первой части. Внешний вид - это конечно хорошо, но как с реализацией всей этой красоты? Спешу обрадовать - количество написанного кода (как в SAP, так и в HTML) существенно сократилось. Например: при реализации вкладок без использования библиотеки приходилось обрабатывать события нажатия на них в SAP, а затем перерисовывать полностью всю страницу. То-есть очень много ручного формирования тегов включая их оформление

Код

DEFINE add_html_creat. "Макрос для формирования таблицы HTML кода для подстановки
     APPEND &1 TO gt_html_creat-html.
  END-OF-DEFINITION.

  CLEAR gt_html_creat.
  gt_html_creat-NAME '<!INFO_PAGE!>'.


form ....
.....
      add_html_creat:
        '<tr>',
         '<td class="menu1_1" onclick="location.href=''SAPEVENT:SubMenu?item=01''" height=60px>Выполнение должностных обязанностей</td>',
        '</tr>',
         '<tr>',
        '<td class="menu1_s" height=47px>Выполнение индивидуальных задач</td> ',
        '</tr>',
         '<tr>',
        '<td class="menu1_1" onclick="location.href=''SAPEVENT:SubMenu?item=03''" height=80px>Достижение ключевых показателей деятельности подразделения</td> ',
        '</tr>',
         '<tr>',
        '<td class="menu1_1" onclick="location.href=''SAPEVENT:SubMenu?item=04''" height=80px>Оценка руководителем корпоративных компетенций </td> ',
        '</tr>',
         '<tr>',
        '<td class="menu1_1" onclick="location.href=''SAPEVENT:SubMenu?item=05''" height=92px>Оценка руководством </td>',
        '</tr>',
         '<tr>',
        '<td class="menu1_1" onclick="location.href=''SAPEVENT:SubMenu?item=06''" height=60px>Выводы по результатам корпоративной аттестации</td>',
        '</tr></table>',
*-----------------------------------------------------------------------------------------
        '<form id="frm" action="sapevent:M_ocenka" method="GET" width=640px BORDER=0 CELLPADDING=0 CELLSPACING=0 style=" margin: 0; ">',
        '<table width=640px BORDER=0 CELLPADDING=0 CELLSPACING=0 style="table-layout:fixed;position: relative;top:23px ;left:150px;">',
        '<tr>',
        '<td class="row_data" style="width: 20px;">№ п/п</td>',
        '<td class="row_data" style="width: 235px;">Наименование задачи</td>',
        '<td class="row_data" style="width: 55px;">Единица измерения</td>',
        '<td class="row_data" style="width: 100px;">Целевое значение</td>',
        '<td class="row_data" style="width: 100px;">Показатель (факт)</td>',
        '</tr>'.

      do times.

        add_html_creat:
          '<tr>',
          '<td class="row_data" style="width: 20px;">',
          sy-index,
          '</td>',
          '<td class="row_data" style="width: 235px;"><textarea name="i_text_1" maxlength=1024 style="width: 230px;"></textarea></td>',
          '<td class="row_data" style="width: 55px;"><input type="text" name="i_ed_1" style="width: 50px;"></td>',
          '<td class="row_data" style="width: 100px"><textarea name="i_val_1" maxlength=50 style="width: 90px;"></textarea></td>',
          '<td class="row_data" style="width: 100px"><textarea name="i_fact_1" maxlength=50 style="width: 90px;"></textarea></td>',
          '</tr>'.
      enddo.
      add_html_creat:
        '</table></form></td>'. 


И это только начало метода по формированию страницы. А вот как выглядит примерно это-же действие при использовании JQUERY

Код
form REFRESH_TAB2_2 .
  data:
    ls_index(2),
    ls_param type string.
  CLEAR gt_html_creat.
  gt_html_creat-NAME = '<!FORM2_2!>'.
  do 5 times.
    ls_index = sy-index.
    condense ls_index.
    add_html_creat:
      '<tr><td class="row_data">',
      ls_index,
      '</td><td class="row_data" ><textarea id=',
      'class="text ui-widget-content ui-corner-all" maxlength=1024>',
      '</textarea><td class="row_data"><input id=',
      ls_param,
      'class="text ui-widget-content ui-corner-all"</td>',
      '<td class="row_data"><input id=',
      ls_param,  
      'class="text ui-widget-content ui-corner-all"></td>',
      '<td class="row_data" ><input id=',
      ls_param,
      'class="text ui-widget-content ui-corner-all"></td></tr>'.
  enddo.
  APPEND gt_html_creat.

endform.                    " REFRESH_TAB2_2

Как видно - гораздо меньше оформления и больше упор сделан на заполнение. Существенного упрощения можно добиться, если перенести ответственность за оформление контента на сторону HTML, а там в свою очередь можно в полный рост использовать всю мощь JQUERY.

Теперь предлагаю вернуться к JScript и посмотреть, как на стороне HTML шаблона реализовать некоторые вещи, полезные при вызове из SAP.
Для облегчения работы с группами объектов (тэгов) в JQuery есть возможность пользоваться селекторами - селекторы, это как-бы групповые описания объектов, например селектор $("input") - означает что будут обрабатываться все тэги <input>, а селектор $("input.edit_phone") означает что будем работать со всеми input у которых в атрибуте class есть "edit_phone". Вообще про селекторы можно писать очень много - лучше поискать информацию на эту тему в интернете. Обратите внимание, что селекторы заключены в обертку $() - это и есть собственно сам класс JQUERY, альтернатива такой записи - jQuery(). Вот пара примеров, которые мне лично пригодились при реализации моей задачи.
Например, чтобы не прописывать обработчики событий в каждом поле ввода в шаблоне, можно в заголовок добавить следующий скрипт:
Код
<script>
  $(function() {
$("input").bind("keyup",function(event){evntKey(event.target);});
        $("input").bind("change",function(event){sendVal(event.target);});

$("textarea").bind("keyup",function(event){evntKey(event.target);});
        $("textarea").bind("change",function(event){sendVal(event.target);});
  }
</script>

Этот скрипт отработает после полной загрузки страницы и ко всем тэгам <input> и <textarea> зарегистрирует обработчики, необходимые для передачи данных в SAP. Теперь при динамическом формировании форм на стороне SAP не нужно беспокоиться о передаче данных. Запись $(function() {....} ) говорит о том что код расположенный внутри фигурных скобок будет отрабатывать после загрузки страницы.
А если добавить еще такой код:
Код
<script>
  $(function() {
     $("table#frm").bind("mouseout",function(event){sendKey();});
  }
</script>
То для корректной отработки передачи данных при отсутствии события OnChange достаточно табличке в которой размещены элементы для ввода данных присвоить атрибут ID="frm".
А вот код скрипта, который превращает поле ввода в поле ввода с бегунком, как на рисунке:

Код
<script>
  $(function() {
$("input.spinner_0_3").each(function(){
            var divslider = $("<div></div>",{
              id: $(this).attr("ID")

              }
            ).css({
              align:'center',
              width: '95%'
              });
            $(this).attr("readonly","");
            $(this).css("text-align", "center");
            $(divslider).slider({min:0,max: 3,step:0.5,value: $(this).attr("value"),slide: function( event, ui ) {
      var sel_name = this.id.replace("#",function myFunction(x){return "\\"+x});
     var edtField = $( "input#"+sel_name );
     $(edtField).val(ui.value );
              evntKey(edtField[0]);
     },
            });

            $(this).after($(divslider));
          });
  }
</script>
Теперь, если мы хотим, чтобы пользователь вводил число не руками, а с помощью бегунка, достаточно добавить в HTML <input class="spinner_0_3" id="EDIT_1"> и все, после загрузки страницы под полем ввода автоматически создастся элемент управления slider, который будет передавать значения в поле ввода, ну и в SAP заодно.


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

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