webdata
DX推進をサポートする技術者向け情報提供サイト

初心者向けPHP・データベース入門

TOP >初心者向けPHP・データベース入門 >5.2配列を使った月毎売上集計一覧の作成

配列を使った月毎売上集計一覧の作成

 2024-06-16 (更新日:2024-07-20)

<学習する内容>

 配列を使って4章の月毎の売上集計を作成しながら理解します。
配列に慣れるまでは混乱するかもしれませんが、配列の中身をprint_r()関数を使って繰り返し、 一つひとつ確認しながら理解を進めて下さい。理解には数をこなして慣れるしかありません。

3)売上一覧の作成

下記のサンプルプログラムをコピーもしくはダウンロードし指定のフォルダーに配置してください。
ファイル名:saleslist5_2.php
配置先:c:\xampp\htdocs\
配置先URL:http://localhost/saleslist5_2.php
サンプルプログラム名:saleslist5_2.php
						<?php

						//DBへの接続
						include('/xampp/data/conn.php');

						//POSTの受信
						$fnc = filter_input(INPUT_POST, 'fnc');
						$select_id = filter_input(INPUT_POST, 'select_id');
						$select_date = filter_input(INPUT_POST, 'select_date');
						$select_sectionCode = filter_input(INPUT_POST, 'select_sectionCode');
						$select_staffCode = filter_input(INPUT_POST, 'select_staffCode');

						//年度option
						$day = date("Y-m-01");					//当月1日
						$day = '2024-04-01';					//デモ用のデータ(2024年度)を表示のため記述
						$num = 10;								//表示期数
						$opt_date = null;						//初期化
						for ($i = 0;$i <= $num;$i++) {
							$s = $i * 6;						//半期6か月毎
							$FY = date("Y",strtotime("-$s month",strtotime($day)));
							$month = date("n",strtotime("-$s month",strtotime($day)));
							$date = date("Y-m-d",strtotime("-$s month",strtotime($day)));
							if ($month >= 4 and $month < 10){
								$opt_date .= '<option value="'.$date.'" >'.$FY.'上期';
							} else {
								$opt_date .= '<option value="'.$date.'" >'.$FY.'下期';
							}
						}
						//年度表示と検索用データ生成
						if (empty($select_date)){
							$select_date = $day;
						}
						$selectFY = date("Y",strtotime($select_date));
						$n = date("n",strtotime($select_date));			//1桁月
						if ($n >= 4 and $n < 10) {
							$startDate = $selectFY.'-04-01';
							$endDate = $selectFY.'-10-01';
							$term = '上期';
							$select_date_display = $selectFY.$term;
						} else {
							$selectFY1 = $selectFY + 1;
							$startDate = $selectFY.'-10-01';
							$endDate = $selectFY1.'-04-01';
							$term = '下期';
							$select_date_display = $selectFY.$term;
						}
						for ($i = 0;$i <= 6;$i++) {
							$ARY_MONTH[$i] = date("Ym",strtotime("+$i month",strtotime($select_date)));
							$ARY_MONTH_INDEX[$i] = date("Y年n月",strtotime("+$i month",strtotime($select_date)));
							if ($i == 6) {				//半期計値用
								$ARY_MONTH[$i] = 'sum';
								$ARY_MONTH_INDEX[$i] = $term.'計';
							}
						}

						//部署option
						$sql = "SELECT sectionCode,sectionName FROM Msection;";
						$res = mysqli_query($conn,$sql) or die("error $sql");
							$OPTION_SECTION = '<option style="color:#2E2E2E;" value="">解除';
						while($row = mysqli_fetch_array($res)){
							$sectionCode_opt = $row["sectionCode"];
							$sectionName_opt = $row["sectionName"];
							$OPTION_SECTION .= '<option style="color:#2E2E2E;" value="'.$sectionCode_opt.'">'.$sectionName_opt;
						}
						//部署option
						$sql = "SELECT sectionCode,sectionName FROM Msection;";
						$res = mysqli_query($conn,$sql) or die("error $sql");
							$OPTION_SECTION = '
<解説>
 プログラムの構成は、検索データの受信やselect文のoption生成、検索実行です。
111行目からはHTML表示用データ抽出やHTML文生成、173行目からはHTML文を記述しております。
4章のsaleslist.phpに比べプログラムの行数が320行→236行に減りプログラムの読みやすくなっている(配列に慣れれば)と思います。

47行目for文 for文により利用する年月データ、項目表示用年月データを生成しております。
for文の$i <= 6 の6は6か月と半期計表示として6としております。0から始まるので6を半期としてます。
$ARY_MONTH これは年月毎の売上データ識別用として実績のキーとして利用します。
$ARY_MONTH_INDEX これはテーブル年月表示用として利用します。

121行目for文
$i < count($ARY_MONTH); count($ARY_MONTH)が7要素なので0~6で回している、

142行目GROUP BY srtaffCode,salesMonth
月別担当者毎に合計値を抽出

148行目$sales[$staffCode][$month]
月別担当者毎の合計値を担当者コードと売上年月をキーとして配列$salesに代入
同様に149行目利益と150行目明細ポップアップも代入
176行目for文
161行目のSQL文により担当者コードを抽出。この担当者コードとfor文による順番(年月)キーとしたデータを取出し $HTML文に代入します。

255行$HTMLの表示
$HTMLに代入されたHTMLを表示させます。
※この$HTMLがどう代入されて表示されるか、ブラウザにてソースを表示させて確認しながら学習してください。