PHP таблица. Показать итоги перед новой группой

0

У меня проблема с отображением общего количества в группах.

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

У меня уже есть строка для группы областей.

То, что я хочу сделать, - показать общее количество товаров в каждой области перед строкой для следующей группы. В настоящее время он показывает общее количество после каждой строки.

Вот мой код.

<?php if (isset($summaryPerArea)): ?>
  <div class="col-lg-12">
    <table id="" class="table table-bordered table-condensed table-striped">
      <thead>
        <tr>
          <th>Area</th>
          <th>Material</th>
          <th>Quantity</th>
        </tr>
      </thead>
      <tbody>
      <?php 
        $prevArea = '';
        $total = 0;
        $currentQty = 0;
      ?>
      <?php foreach ($summaryPerArea as $key => $value): ?>
        <?php $currentQty = $value['totalQty']; ?>
        <?php $total += $value['totalQty']; ?>
        <?php if ($value['area'] != $prevArea): ?>
          <tr class="bg-info">
            <?php if ($key != 0) {$total = $currentQty;} ?>
            <td colspan="3"><?php echo $value['area']; ?></td>
            <?php $prevArea = $value['area']; ?>
          </tr>
        <?php endif; ?>
        <tr>
          <td><?php echo $value['area']; ?></td>
          <td><?php echo $value['material']; ?></td>
          <td><?php echo $value['totalQty']; ?></td>
        </tr>
        <?php if ($value['area'] == $prevArea): ?>
          <tr class="bg-success">
            <td colspan="3"><?php echo $total; ?></td>
          </tr>
        <?php endif; ?>       
      <?php endforeach ?>
      </tbody>
    </table>
  </div> 
<?php endif ?>

запрос:

SELECT d.SOffcNm as area,
           c.ProdNm as material,
           SUM(Qty) as totalQty
    FROM   BigEMerchandiser.dbo.tbl_Delivery_H as a

           INNER JOIN BigEMerchandiser.dbo.tbl_Delivery_D as b
           ON a.TransCtr = b.TransCtr

           INNER JOIN BigESales.dbo.tbl_Materials as c
           ON b.Material = c.ExtMatGrp

           INNER JOIN BigESales.dbo.tbl_Customers as d
           ON a.CustCode = d.CustCode

           WHERE d.SOffc LIKE ISNULL('%' + @area + '%', d.SOffc) 
           AND a.DtRcv BETWEEN @DtRcvFrom AND @DtRcvTo
GROUP BY   d.SOffcNm,
           c.ProdNm
ORDER BY   d.SOffcNm asc

текущий результат:

Изображение 174551

Спасибо. Я ценю вашу помощь.

Теги:

2 ответа

1
Лучший ответ

попробуйте изменить свой код в соответствии с комментариями в коде ниже (только часть foreach)

  <?php foreach ($summaryPerArea as $key => $value): ?>
    <?php if ($value['area'] != $prevArea and $prevArea): // show total when changing area from second area onward ?>
      <tr class="bg-success">
        <td colspan="3"><?php echo $total; ?></td>
      </tr>
      <?php $total = 0; // reset the total after displaying it ?>
    <?php endif; ?>       
    <?php if ($value['area'] != $prevArea):// show area header at every area change ?>
      <tr class="bg-info">
        <td colspan="3"><?php echo $value['area']; ?></td>
      </tr>
    <?php endif; ?>
    <?php //$currentQty = $value['totalQty']; // does not needed ?>
    <?php $total += $value['totalQty']; ?>
    <tr>
      <td><?php echo $value['area']; ?></td>
      <td><?php echo $value['material']; ?></td>
      <td><?php echo $value['totalQty']; ?></td>
    </tr>
    <?php $prevArea = $value['area']; // set prevArea to the processed row ?>
  <?php endforeach ?>
  <?php // show the last total ?>
  <tr class="bg-success">
    <td colspan="3"><?php echo $total; ?></td>
  </tr>

обратите внимание, что порядок строк повторяется следующим образом:

--area total--
--area header--
--area item--

и затем следуют:

--area total--

на первом foreach, prevArea все еще '' поэтому первое условие в --area total-- (and $prevArea) приведет к false, так что --area total-- будет подавлен, но --area header-- не имеет этого условия, поэтому --area header-- не подавляется.

  • 0
    Большое вам спасибо за вашу помощь am05hz! Теперь он работает с вашим кодом. Еще раз спасибо. :)
0

Я использую другой синтаксис php, используя if (condition) {code};

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

Я переписываю ваш код следующим образом:

<tbody>
  <?php 
    $prevArea = 'AnElementLikeFlag';
    $total = 0;
    $currentQty = 0;
  ?>
  <?php foreach ($summaryPerArea as $key => $value): ?>
    <?php $currentQty = $value['totalQty']; ?>
    <?php if ($value['area'] != $prevArea && $value['area']!="AnElementLikeFlag"): ?>

      <tr class="bg-success">
        <td colspan="3"><?php echo $total; ?></td>
      </tr>
      <tr class="bg-info">
        <td colspan="3"><?php echo $value['area']; ?></td>
        <?php $prevArea = $value['area']; ?>
      </tr>
    <?php $total=0; ?>
    <?php endif; ?>
    <?php $total += $value['totalQty']; ?>
    <tr>
      <td><?php echo $value['area']; ?></td>
      <td><?php echo $value['material']; ?></td>
      <td><?php echo $value['totalQty']; ?></td>
    </tr>

  <?php endforeach ?>
  </tbody>

Надеюсь, я помогу вам, и я, возможно, ошибся.

PS Вы печатаете общее количество каждый раз, потому что есть условие if, что оно не является необходимым

Ещё вопросы

Сообщество Overcoder
Наверх
Меню