Банк данных ПРОДУКЦИЯ РОССИИ

Банк данных ПРОДУКЦИЯ РОССИИ

Таблица показателей КЛП

Озниев Н.К. ктн

Дата публикации: 18.01.2018 г.

Создание таблицы в JavaScript

1. Таблица рождается или пересоздается при заполнении нового КЛП функцией createParamsTableN(rnum, vnum) модуля rusprodfuncs.js.

rnum  количество строк (показателей),

vnum  количество колонок значений (исполнений).

var tb_div = document.getElementsByClassName("scrollable")[0] – блок, где располагается таблица.

var divVer = document.getElementById("params_tb_navigator") – блок, где располагается навигатор таблицы.

В таблице отображается только та колонка, на которую указывает навигатор. Если колонка одна – навигатор не создается.

 

При очередной работе функции createParamsTableN  таблица может существовать. Тогда текущие значения в ячейках существующей таблицы перед началом ее создания (пересоздания) запоминаются в буферном массиве tableData.

2. Место назначения таблицы очищается.

3. Создается навигаторобщем случае заново).

Навигатор – это набор тегов INPUT типа RADIO.

Они получают id  navRButton0, navRButton1, ..navRButton<vnum-1> - это основа упорядочения всех элементов создаваемой таблицы слева направо. Они также соответственно получают классы

class navVer0, navVer1, .. navVer vnum-1.

Каждый тег INPUT навигатора получает обработчик onClick = changePropVersion(this, vnum)

4. Создается таблица (тег TABLE)

Она получает класс class = sortable resizable tabular

5. Создается заголовок таблицы (тег CAPTION)

Он оставлен пустым, просто добавляется в список объектов таблицы.

6. Создается шапка таблицы (тег THEAD)

Внутри THEAD размещаются теги TH, а в них – теги INPUT типа TEXT для размещения наименований колонок.

Три колонки (теги TH) статические (№№, Характеристика и Едзм.) Они получают соответственно классы

first_column, second_column, third_column

и обработчики для изменения ширины (кроме колонки №№).

Далее идут vnum колонок (теги TH) - 0…vnum-1. Текст в тегах INPUT этих колонок:

<Исполнение j>, где j=0…vnum-1.

Каждый из них (теги TH ) получает класс td_valueObjH<j>, т.е. набор классов

td_valueObjH0, td_valueObjH1,..td_valueObjH<vnum-1>

Теги INPUT внутри TH имеют уникальные имена атрибута nameCH<j>, т.е. набор

CH0, CH1, .. CH<vnum-1>

7. Создается тело таблицы (тег TBODY).

Внутри TBODY создается набор тегов TR, строки 0, 1, .. rnum-1. Это – основа упорядочения всех элементов создаваемой таблицы сверху вниз.

В каждом теге TR создается три первых TD.  Первый из них имеет класс

first_column,

остальные без класса. Далее идут 0,1, .. vnum-1 тегов TD, каждый из них имеет класс td_valueObj<j>, т.е. имеем набор классов

td_valueObj0, valueObj1, .. td_valueObj<vnum-1>

Таким образом, все теги TD в колонках по вертикали имеют одинаковые классы.

Внутри тегов TD размещаются теги INPUT типа TEXT для данных. Они имеют уникальные атрибуты name. Правила именования этих атрибутов для первых трех колонок

C<k+1>1, C<k+1>2, C<k+1>3, где k=0,1,..num-1

и для остальных колонок

C<k+1><j+3>, где k=0…rnum-1, j=0,1,..vnum-1

Таким образом, в любой строке таблицы, кроме шапки соблюдается сквозная нумерация по j.

8. Данные из массива tableData возвращаются в таблицу.

Окончательно таблица наглядно имеет вид

Работает исправно эта схема. Проверено в том числе при экспорте таблицы показателей из ARM4.

Случаи неправильного отображения таблицы совместно с навигатором остались загадкой, если они еще встретятся.

Запрос показателей для заданного КЛП

SELECT pv.`id`, pv.`clp_prop_id`, pv.`klpprop_ver_name`, pv.`klpprop_value`,

  p.`id`, p.`property_name`, p.`unit_name`

FROM `clp_prop_ver` pv

INNER JOIN `clp_ver` cv ON cv.`clp_prop_id` = pv.`clp_prop_id`

INNER JOIN `clp_main` c ON c.`id` = cv.`clp_id`

INNER JOIN `clp_prop` p ON p.`id` = pv.`clp_prop_id`

WHERE c.`id` = 309713

Создание и отсылка таблицы показателей в браузер

Есть два варианта создания таблицы показателей: с элементами ввода INPUT, когда таблица предназначается для ввода и редактирования данных, и без оных, когда таблица нужна только для отображения информации.

Таблица для ввода данных

Функция создания таблицы следующая:

private function getTableVarN() {

  if (!isset($_SESSION["F30Cnt"]))

     return "";

   

  $rowcount = $_SESSION["F30Cnt"];

  if ($rowcount == 0)

     return "";

  $vercount = 1;

  if (isset($_SESSION["F30Ver"]))

     $vercount = $_SESSION["F30Ver"];

  if (($vercount == "") && ($vercount == "0") &&

($vercount == 0) && ($vercount == 1))

     $vercount = 1;

 

  $res = '<table class="sortable resizable tabular" style="width:766px;">'."\n".

  ' <caption></caption>'.

 

  // Начало шапки таблицы (первые 3 колонки)

  ' <thead>'.

  '   <tr>'.

  '    <th class="first_column" style="width:20px;"></th>'."\n".

   

  '    <th class="second_column" style="width: 300px;" '.

  '      onmousemove="doColumnResize(this, event)" '.

  '      onmouseover="doColumnResize(this, event)" '.

  '      onmouseout="doneColumnResizing()"'.

  '    >Наименование характеристики</th>'."\n".

   

  '    <th class="third_column" style="width:50px;" '.

  '      onmousemove="doColumnResize(this, event)" '.

  '      onmouseover="doColumnResize(this, event)" '.

  '      onmouseout="doneColumnResizing()"'.

  '    >Ед.изм.</th>'."\n";

 

  // Шапка таблицы, последняя колонка

  if ($vercount == 1) {

     $res = $res.'    <th>Значение</th>'."\n";

    

  // ..если колонок больше одной

  } else {

     for ($j=0; $j < $vercount; $j++) {

       $cellAddr = 'CH'.($j);

       $val = $_SESSION[$cellAddr];

       //$val = "Ячейка ".$cellAddr;

       //$val = str_replace('"', "'", $val);

       if ($j == 0) { // Для первого исполнения ($j == 0) колонка видна

          $res = $res."\n".'    <th  class="td_valueObjH'.$j.'" > '.

            "<input type='text' name='".$cellAddr."' value='".$val."' /></th>";

       } else { // Для остальных исполнений ($j > 0) все колонки прячем

          $res = $res."    <th class='td_valueObjH".$j."' style='display:none'> ".

            "<input type='text' name='".$cellAddr."' value='".$val."' /></th>";

       }

     }

  }

 

  $res = $res.'  </tr></thead>';

  $res = $res.'  <tbody>';

 

  for ($j=0; $j < $rowcount; $j++) { // Строк в $rowcount-1

     $res = $res."\n".'  <tr>'."\n".'    <td class="first_column">'.($j+1).'</td>';

 

     if (($j+1) < 10) $cellAddr = 'C0'.($j+1).'01';

     else      $cellAddr = 'C'.($j+1).'01';

     $val = $_SESSION[$cellAddr];

     //$val = "Ячейка ".$cellAddr;

    

     $res = $res."\n".'    <td class="second_column">'.

  "<input type='text' class='ClpField' name='".

     $cellAddr."' oncontextmenu = 'putSymbolContextMenu(this);' value='".

$val."' /></td>";

 

     if (($j+1) < 10) $cellAddr = 'C0'.($j+1).'02';

     else      $cellAddr = 'C'.($j+1).'02';

     $val = $_SESSION[$cellAddr];

    

     $res = $res."\n"."    <td><input type='text' class='ClpField' name='".

       $cellAddr."' oncontextmenu = 'putSymbolContextMenu(this);' value='".

$val."' /></td>";

 

     if ($vercount == 1) {

       if (($j+1) < 10) $cellAddr = 'C0'.($j + 1).'03';

       else      $cellAddr = 'C'.($j + 1).'03';

       $val = $_SESSION[$cellAddr];

      

       //$res = $res."\n".'    <td><input type="text" class="ClpField" name="'.

       $res = $res."\n"."    <td><input type='text' class='ClpField' name='".

          $cellAddr."' oncontextmenu = 'putSymbolContextMenu(this);' value='".

$val."' /></td>";

     } else {

       // Перебор исполнений КЛП

       for ($j1=0; $j1 < $vercount; $j1++) {

         

          if (($j+1) < 10) $a1 = 'C0'.($j+1);

          else      $a1 = 'C'.($j+1);

          if (($j1 + 3) < 10) $a2 = '0'.($j1 + 3);

          else        $a2 = ''.($j1 + 3);

          $cellAddr = $a1.$a2;

          $val = $_SESSION[$cellAddr];

          //$val = "Ячейка ".$cellAddr." в БД:".$val;

         

          if ($j1 == 0) // Тестовые данные

            $res = $res."\n".'    <td class="td_valueObj'.$j1.'" > '.

            "<input type='text' class='ClpField' name='".

              $cellAddr."' oncontextmenu = 'putSymbolContextMenu(this);'”.

“value='".$val."' /></td>";

          else

            $res = $res."\n".'    <td class="td_valueObj'.$j1.

'" style="display: none;"> '.

            "<input type='text' class='ClpField' name='".

              $cellAddr."' oncontextmenu = “.

'putSymbolContextMenu(this);' "value='".$val."'/></td>";

       }

     }

 

     $res = $res."\n".'  </tr>';

  }

  $res = $res."\n".'</tbody></table>';

  return $res;

}

Таблица для отображения данных

Таблица для отображения данных не содержит тегов INPUT, она позволяет только просматривать показатели продуцкии, или же вывести таблицу на принтер

private function getTableVarN_noinputs() {

  if (!isset($_SESSION["F30Cnt"]))

     return "";

 

  $rowcount = $_SESSION["F30Cnt"];

  if ($rowcount == 0)

     return "";

 

  $vercount = 1;

  if (isset($_SESSION["F30Ver"]))

     $vercount = $_SESSION["F30Ver"];

  if (($vercount == "") && ($vercount == "0") &&

($vercount == 0) && ($vercount == 1))

     $vercount = 1;

 

  $res = '<table class="sortable resizable tabular" style="width: 766px;">'."\n".

  ' <caption></caption>'.

 

  // Начало шапки таблицы (первые 3 колонки)

  ' <thead>'.

  '   <tr>'.

  '    <th class="first_column" style="width:20px; border:1px solid #000;">№</th>'."\n".

   

  '    <th class="second_column" style="width: 60%; border:1px solid #000;" '.

  '      onmousemove="doColumnResize(this, event)" '.

  '      onmouseover="doColumnResize(this, event)" '.

  '      onmouseout="doneColumnResizing()"'.

  '    >Наименование характеристики</th>'."\n".

   

  '    <th class="third_column" style="width:50px; border:1px solid #000;" '.

  '      onmousemove="doColumnResize(this, event)" '.

  '      onmouseover="doColumnResize(this, event)" '.

  '      onmouseout="doneColumnResizing()"'.

  '    >Ед.изм.</th>'."\n";

 

  // Шапка таблицы, последняя колонка

  if ($vercount == 1) {

     $res = $res.'    <th style="border:1px solid #000;">Значение</th>'."\n";

  } else {

     for ($j=0; $j < $vercount; $j++) {

       $cellAddr = 'CH'.($j);

       $val = $_SESSION[$cellAddr];

       if ($j == 0) { // Для первого исполнения ($j == 0) колонка значений видна

          $res = $res."\n".'    <th class="td_valueObjH'.$j.'".

“ style="border:1px solid #000;"> '.$val.'</th>';

       } else { // Для остальных исполнений ($j > 0) все колонки значений прячем

          $res = $res."\n".'    <th class="td_valueObjH'.$j.

'" style="border:1px solid #000; display:none"> '.$val.'</th>';

       }

     }

  }

 

  $res = $res.'  </tr></thead>';

  $res = $res.'  <tbody>';

 

  for ($j=0; $j < $rowcount; $j++) { // Строк в таблице: $rowcount

     $res = $res."\n".'  <tr>'."\n".'    <td class="first_column">'.($j+1).'</td>';

 

     if (($j+1) < 10) $cellAddr = 'C0'.($j+1).'01';

     else      $cellAddr = 'C'.($j+1).'01';

     $val = $_SESSION[$cellAddr];

 

     $pieces = explode(' ', $val);

     $str1 = '';

     $str2 = '';

     for ($k = 0; $k < count($pieces); $k++) {

       if ((mb_strlen($str1) < 50))

         $str1 = $str1 . ' ' . $pieces[$k];

       else

          $str2 = $str2 . ' ' . $pieces[$k];

     }

     if ($str2 != '')

       $res = $res."\n".'    <td class="second_column">'.$str1 .

'<br />'. $str2 .'</td>';

     else

       $res = $res."\n".'    <td class="second_column">'.$str1 . '</td>';

 

     if (($j+1) < 10) $cellAddr = 'C0'.($j+1).'02';

     else      $cellAddr = 'C'.($j+1).'02';

     $val = $_SESSION[$cellAddr];

     $res = $res."\n".'    <td>'.$val.'</td>';

 

     if ($vercount == 1) {

       if (($j+1) < 10) $cellAddr = 'C0'.($j+1).'03';

       else      $cellAddr = 'C'.($j+1).'03';

       $val = $_SESSION[$cellAddr];

       $res = $res."\n".'    <td>'.$val.'</td>';

     } else {

  // Перебор исполнений КЛП

  for ($j1=0; $j1 < $vercount; $j1++) {

     if (($j+1) < 10) $a1 = 'C0'.($j+1);

     else      $a1 = 'C'.($j+1);

     if (($j1+3)<10)  $a2 = '0'.($j1+3);

     else      $a2 = ''.($j1+3);

     $cellAddr = $a1.$a2;

     $val = $_SESSION[$cellAddr];

     if ($j1 == 0)

       $res = $res."\n".'    <td class="td_valueObj'.$j1.'"> '.$val.'</td>';

          else

            $res = $res."\n".'    <td class="td_valueObj'.$j1.

'" style="display: none;">'.$val.'</td>';

       }

     }

     $res = $res."\n".'  </tr>';

  }

  $res = $res."\n".'</tbody></table>';

  return $res;

}

 

Навигатор

Навигатор служит для переключения колонок. Для его построения используются данные, которые предварительно сохраняются в сессии. Его реализует функция:

private function getTableNavigator($page="") {

  $vercount = 1;

  if (isset($_SESSION["F30Ver"]))

     $vercount = $_SESSION["F30Ver"];

  if ($vercount <= 1)

     return;

 

  // Рисуем ряд из радиокнопок

  $res = '';

  for($j=0; $j < $vercount; $j++) {

     $message = 'Исполнение '.$j;

    

     if ($j == 0) {

       if ($page!="")

          $res = $res."\n".'<input type="radio" name="clp_vRButton" id="navRButton'.$j.'" checked="checked" '.

          'class="navVer'.$j.'" '.

          'style="width:20px; text-align:center;" value="navRButton' . $j .'" '.

          'onclick="changePropVersion(this, '.$vercount.', \''.$page.'\');" />';

       else

          $res = $res."\n".'<input type="radio" name="clp_vRButton" id="navRButton'.$j.'" checked="checked" '.

          'class="navVer'.$j.'" '.

          'style="width:20px; text-align:center;" value="navRButton' . $j .'" '.

          'onclick="changePropVersion(this, '.$vercount.');" />';

     } else {

       if ($page!="")

          $res = $res."\n".'<input type="radio" name="clp_vRButton" id="navRButton'.$j.'" '.

          'class="navVer'.$j.'" '.

          'style="width:20px; text-align:center;" value="navRButton' . $j .'" '.

          'onclick="changePropVersion(this, '.$vercount.', \''.$page.'\');" />';

       else

          $res = $res."\n".'<input type="radio" name="clp_vRButton" id="navRButton'.$j.'" '.

          'class="navVer'.$j.'" '.

          'style="width:20px; text-align:center;" value="navRButton' . $j .'" '.

          'onclick="changePropVersion(this, '.$vercount.');" />';

     }

         

     $res = $res."\n".'<label for="navRButton'.$j.'" style="font-size:90%; '.

       'margin-left:-5px; color:navy; cursor:pointer;">';

     $res = $res.'Исп.'.$j.'&nbsp;</label>';

     // Тестовый вариант - идентификатор радиокнопки

     //$res = $res.'navRButton'.$j.'&nbsp;</label>';

  }

  return $res;

}