スレッド表示 | フラット表示〕 全トピック 920 件中 434 番目 次≫ ≪前

PHP+Oracleでのデータ抽出・加工・表示

created: 2005-05-26 17:15 | modified: 2005-06-07 10:32 | reply: 14

[2274] PHP+Oracleでのデータ抽出・加工・表示

user: びすある | created: 2005-05-26 17:15
はじめまして。5/4よりPHPを勉強しはじめました超初心者です。
よろしくお願い致します。

質問は、2005/03/27の、たかぽん様の[2212]「phpでのhtml formタグ生成」と内容的には、よく似ています。

<転記させていただきました。>
> やりたいこと
> 1.ORACLEから店番店名を取ってきて
> 2.HTMLformのプルダウンに表示させる(全店)
> 3.そのプルダウンの中から一つの店番、店名  を選び、またORACLEから売り上げ等のデータをブラウザに表示させる

私も全く同じで、店舗の売上データ等を扱いたいんですが、SQLでデータ抽出・表示は実行出来ました。
しかし、売上と取引点数で平均売価とか、売上と客数で客単価とか、構成比、前年対比等を抽出したデータより計算して
表示させるやり方が全くわかりません。
配列を用いるのでしょうか?

SQLでひとつのカラム(例えば平均売価)として抽出すれば、表示自体は用意されている関数で簡単に出来そうですが、
検索スピードが遅くなるのではないかと思っています。

初歩的な質問ですが、お願い致します。
どうか皆様のご返事をお待ちしております。

<環境>
php 5.04
Apache 2.0.54
ORACLE 8i (8.1.6)
Windows2000Server SP4
reply: 2277 返信 編集 削除

[2277] Re:PHP+Oracleでのデータ抽出・加工・表示

user: ぱぴよん | created: 2005-05-27 12:51
びすあるさんはじめまして、ぱぴよんと申します。


> しかし、売上と取引点数で平均売価とか、売上と客数で客単価とか、構成比、前年対比等を抽出したデータより計算して
> 表示させるやり方が全くわかりません。
> SQLでひとつのカラム(例えば平均売価)として抽出すれば、表示自体は用意されている関数で簡単に出来そうですが、
> 検索スピードが遅くなるのではないかと思っています。

びすあるさんが言われるように
SQLで取得する方法とPHPで処理をする方法
の2種類があると思います。
SQLでは複雑すぎて計算できないということであれば、
PHPで計算をする方法の方がいいかもしれません。

しかし、検索スピードがどちらの方が速いかは実際に二つを比べてみないと何とも言えません。
2種類の処理を試してみて、検索速度を比べてみてはどうでしょうか?
Parent: 2274  reply: 2278 返信 編集 削除

[2278] Re:PHP+Oracleでのデータ抽出・加工・表示

user: びすある | created: 2005-05-27 14:28
ぱぴよん様、ありがとうございます。
超初心者ですが、よろしくお願い致します。

確かに、2種類の処理を試す事でスピードの件は、はっきりしますね。
しかし、私の場合はそれ以前にどう記述してやれば良いのかよくわからず困っています。

現在の私の勉強として、テーブルにある項目をそのまま出力させるところまでは、OCIResult関数を用いて行う事が出来ました。
下記、どこにでも載っているようなものです。
-------------------------------------------------------------
echo"<TABLE border='1'>";
while(OCIFetch($stmt))
{
echo"<TR>";
for($i = 1; $i <= $ncols; $i++){
$column_name = OCIColumnName($stmt,$i);
echo"<TD>".OCIResult($stmt,$column_name)."</TD>";
}
echo"</TR>";
}
echo"</TABLE>";
-------------------------------------------------------------

また、2種類の処理について私なりに、

> SQLでは複雑すぎて計算できないということであれば、

今現在のところ複雑なSQLは書けませんし、複雑すぎる。と言う事は無いと思いますが、例えば除算のときの分母が
ゼロの場合等その行で処理がエラーとなってしまい、その先どうしたら良いのかわかりません。

また、
> PHPで計算をする方法の方がいいかもしれません。

PHPで計算させる場合に、OCIResult関数とどう関連づけて表示させるのかわからないですし、想定ですがこのような場合
OCIResult関数は、使えない。ということになるのでしょうか?
もしそうであれば、表示にはカラム、計算した結果毎に記述してやる必要があるのでしょうか?

素人質問でしょうが、何卒お力を下さい。
部分的なサンプルだけでもいただけたら大変助かります。
よろしくお願い致します。



> びすあるさんが言われるように
> SQLで取得する方法とPHPで処理をする方法
> の2種類があると思います。
> SQLでは複雑すぎて計算できないということであれば、
> PHPで計算をする方法の方がいいかもしれません。
>
> しかし、検索スピードがどちらの方が速いかは実際に二つを比べてみないと何とも言えません。
> 2種類の処理を試してみて、検索速度を比べてみてはどうでしょうか?
Parent: 2277  reply: 2279 返信 編集 削除

[2279] Re:PHP+Oracleでのデータ抽出・加工・表示

user: ぱぴよん | created: 2005-05-27 18:44
>ぱぴよん様、ありがとうございます。
>超初心者ですが、よろしくお願い致します。

私もPHPに詳しくないのでどれだけお力になれるか分かりません^^;
私でできる範囲で答えたいと思います。


>OCIResult関数を用いて行う事が出来ました。
OCIを使ったことがないのでよく分からないのですが、Oracleにアクセスするための関数と
理解すればいいでしょうか?

OCIColumnName() => フィールド名の取得
OCIResult()   => フィールドデータの取得
であっていますでしょうか^^;


>今現在のところ複雑なSQLは書けませんし、複雑すぎる。と言う事は無いと思いますが、例えば除算のときの分母が
>ゼロの場合等その行で処理がエラーとなってしまい、その先どうしたら良いのかわかりません。

どのようなSQLを書けばよいのか私にはわかりません。
なので私ならPHPで処理をします。


例)(店名ごとの売上を求める)
テーブル:店名、売上
  $now_store_name = "";  //参照中の店名
$sum = 0; //売上合計
$store_array = array(); // 店ごとの売上合計を格納する配列
※SQLでクエリを取得する際、ORDER BY で店順にする
while(データの終わりまで) {
//1番最初の店名を取得する処理
if($now_store_name == "") {
$now_store_name = 店名;
}
//店名が変わった場合
//(次の店のレコードになったのでその前の店の売上合計を配列に格納する)
if($now_store_name != 店名) {
$store_array[$now_store_name] = $sum;
$now_store_name = 店名;
$sum = 売上;
//同じ店の場合
//(同じ店のレコードなので売上合計に足す)
} else {
$sum += 売上;
}
}
//一番最後の店の売上合計を配列に格納する
$store_array[$now_store_name] = $sum;
実際にどのような表示の仕方をするのか分からなかった(HTMLのTableの表示の仕方)ので、
見当違いなやり方かもしれませんが、こんな風にすれば各店ごとの売上合計が求められると思います。

また、0除算をしないためには・・・
//割る数が0でない場合
if(割る数 != 0) {
/* 除算をする処理 */
//割る数が0の場合
} else {
/* 除算をしない処理 */
}
※割られる数÷割る数=商

のような方法はどうでしょうか?(@^-^@)
Parent: 2278  reply: 2280 返信 編集 削除

[2280] Re:PHP+Oracleでのデータ抽出・加工・表示

user: びすある | created: 2005-05-27 21:26
ありがとうございます。
ぱぴよん様のレスとても参考になりました。

これで、合計値(月計)は解決出来そうです。

> OCIを使ったことがないのでよく分からないのですが、Oracleにアクセスするための関数と
> 理解すればいいでしょうか?
> OCIColumnName() => フィールド名の取得
> OCIResult()   => フィールドデータの取得
> であっていますでしょうか^^;

すいません。説明不足でした。ぱぴよん様のご察しと通りでございます。

実は、関連してもうひとつ解決したい事項がございまして、以下に例を記します。

例)
<DBテーブル>
店名、YMD、売上金額、買上点数、客数


<HTML表示したい表>
店名、YMD、曜日、売上金額、買上点数、平均売価、客単価、前年対比

-----------------------------------------------------------------
合計行(←ぱぴよん様に教えていただきました。)


テーブルにある項目をそのまま出力表示させることは出来るのですが、計算で求める値の計算方法と表示の仕方が
わかりません。
特に日別での前年対比となりますと、当月と前年同月と比べる事になりますが、当月(日別)を単純に縦軸にした
場合、定休日があるとその日(行)は表から抜けてしまいます。このような場合はどのようにしたら良いのでしょうか?

あと、HTML表示させた表をそのままHTMLファイルに保存しておく。というような事は技術的に可能でしょうか?


欲張っていろいろ書いてしまいました。すいません。
よろしくお願いします。
Parent: 2279  reply: 2281 返信 編集 削除

[2281] Re:Re:PHP+Oracleでのデータ抽出・加工・表示

user: ぱぴよん | created: 2005-05-28 00:59
>テーブルにある項目をそのまま出力表示させることは出来るのですが、計算で求める値の計算方法と表示の仕方が
>わかりません。

計算で求める値の計算方法が分からないということなのですが、
これは「PHPを使ってどのように計算すれば自分の考えている計算式になるのか分からない」
ということではなく、数学的に計算式が分からないということなのでしょうか?
もしそうだとすると、びすあるさんが自分でどのように計算すればよいかを考えなければならない部分ですよね^^;
(私が示した計算式が必ず正しいわけではありませんし、計算式が違うからといって私の責任にされては困りますし^^;)


まず、「平均売価、客単価、前年対比」のそれぞれの計算式について考えてみてはいかがでしょうか?
計算式が分かれば、それによりどのように計算すればよいか分かりますよね?

例えば、長方形があるとします。
長方形の面積を求めるにはどうするでしょうか?
「縦 × 横 = 面積」で求められますね。
そうするとプログラムでも
「$tate * $yoko = $menseki」 と書けばいいと分かるはずです。

計算式をたてるためには、求めたいもの(平均売価、客単価、前年対比)の意味を考えてみて下さい。
意味が分かれば自ずとどのような計算式をたてれば答えが出てくるかという糸口になると思います。

最初に全体図を見ることは大事なことですが、
次にその部品になる部分を一つずつ組み立てていくことが必要です。

今回の場合全体図は
><HTML表示したい表>
>店名、YMD、曜日、売上金額、買上点数、平均売価、客単価、前年対比
>
>-----------------------------------------------------------------
>合計行
これですよね?

・計算の方法(計算式)はどうするか?
・曜日をどのように求めるか?
・頭の中で描いているようにHTMLで表示する方法は?
・表示した表をHTMLファイルとして保存する方法は?

などなど、他にも色々な部品があると思います。

じっくりと一つずつクリアしていけば、完成に近づきます(@^-^@)


>あと、HTML表示させた表をそのままHTMLファイルに保存しておく。というような事は技術的に可能でしょうか?

この件ですが、表示させたページをHTMLファイルに保存することは可能です。
ですが、その前にまず、びすあるさんが思い描かれているHTMLを完成させることを考えてみてはいかがでしょうか?
保存は次のステップです^^

長くなってしまいましたが、
あれもこれもとなってしまうと、どれから手を付けていいのか分からなくなってしまいます。
そういう時は、自分がしたい内容を箇条書きにしておいて、
どれからやるべきかを順位付けし、
クリアできればチェックしていくようにしてみてはいかがでしょうか(。^o^。)
Parent: 2280  reply: 2284 返信 編集 削除

[2284] Re:PHP+Oracleでのデータ抽出・加工・表示

user: びすある | created: 2005-05-28 11:29
ぱぴよん様、いろいろアドバイスありがとうございます。


> 計算で求める値の計算方法が分からないということなのですが、
> これは「PHPを使ってどのように計算すれば自分の考えている計算式になるのか分からない」
> ということではなく、数学的に計算式が分からないということなのでしょうか?

 説明が下手で申し訳ございません。
 数学的に計算式は解りますよー。お聞きしたかったのは、PHPを使っての計算方法でした。


> 最初に全体図を見ることは大事なことですが、
> 次にその部品になる部分を一つずつ組み立てていくことが必要です。
>
> ・計算の方法(計算式)はどうするか?
> ・曜日をどのように求めるか?
> ・頭の中で描いているようにHTMLで表示する方法は?
> ・表示した表をHTMLファイルとして保存する方法は?
>
> などなど、他にも色々な部品があると思います。
>
> じっくりと一つずつクリアしていけば、完成に近づきます(@^-^@)

 そうですね。改めてじっくり考えてみます。


> あれもこれもとなってしまうと、どれから手を付けていいのか分からなくなってしまいます。
> そういう時は、自分がしたい内容を箇条書きにしておいて、
> どれからやるべきかを順位付けし、
> クリアできればチェックしていくようにしてみてはいかがでしょうか(。^o^。)

 ご指摘の通りです。はやく何かかたちにしたくて、基礎知識も無いのにあれもこれもと・・・。
 精進致します。

 よろしくお願い致します。
Parent: 2281  reply: 2285 返信 編集 削除

[2285] Re:PHP+Oracleでのデータ抽出・加工・表示

user: ぱぴよん | created: 2005-05-28 12:35
>数学的に計算式は解りますよー。お聞きしたかったのは、PHPを使っての計算方法でした。

そうですよね^^
今まで計算式が書かれておらず、計算方法が分からないという部分しか
私には情報がなかったので、どうしようもありませんでした^^;



>店名、YMD、曜日、売上金額、買上点数、平均売価、客単価、前年対比

これについてですが、
曜日は YMDからPHPの関数で求めることができます。
その他の「平均売価、客単価、前年対比」については計算方法を教えてもらえるとヒントを出せるかもしれません。

前回前年対比について書いて頂いたのですが、もう少し分かりませんでした^^;
前年の同日で比較をしたいということでしょうか?
また前年の同月でも比較をするのでしょうか?
休みの日とは比較ができないので、その辺はどのような処理をするかは難しいですね。
前年と比較できないことを目で見て分かるようにしておくのも方法だと思います。


>特に日別での前年対比となりますと、当月と前年同月と比べる事になりますが、当月(日別)を単純に縦軸にした
>場合、定休日があるとその日(行)は表から抜けてしまいます。

この当月(日別)を縦軸にするとは
HTMLのテーブルでいうと
<table>
<caption>2005年5月</caption>
<tr><td>1日の行</td></tr>
<tr><td>2日の行</td></tr>
<tr><td>3日の行</td></tr>
       ・
       ・
       ・
</table>
ということでしょうか?
Parent: 2284  reply: 2286 返信 編集 削除

[2286] Re:PHP+Oracleでのデータ抽出・加工・表示

user: びすある | created: 2005-05-28 17:53
ぱぴよん様、ありがとうございます。

> 今まで計算式が書かれておらず、計算方法が分からないという部分しか
> 私には情報がなかったので、どうしようもありませんでした^^;
> 店名、YMD、曜日、売上金額、買上点数、平均売価、客単価、前年対比

 実は、ちょっと、なにかつかめた!ような気がしてます。計算式は、以下のようになります。
 平均売価 = 売上金額 / 買上点数
 客単価 = 売上金額 / 客数
 日で前年対比 = 当月の日毎の売上金額 / 前年の同日の売上金額 * 100
 月(日別合計)で前年対比 = 当月の売上金額 / 前年の同月の売上金額 * 100


> 前回前年対比について書いて頂いたのですが、もう少し分かりませんでした^^;
> 前年の同日で比較をしたいということでしょうか?
> また前年の同月でも比較をするのでしょうか?

 そうです。


> この当月(日別)を縦軸にするとは
> HTMLのテーブルでいうと
>
> <table>
> <caption>2005年5月</caption>
> <tr><td>1日の行</td></tr>
> <tr><td>2日の行</td></tr>
> <tr><td>3日の行</td></tr>
>        ・
>        ・
>        ・
> </table>
>

> ということでしょうか?

 そういう感じです。文章でなかなか説明しづらいところですが、
例えば、
期間:今月20050501?前日20050527で、一回SQLを掛けます。ただし、20050510は、定休日と仮定しレコードそのものが無いとします。
次に、前年20040501?前日20040531で、一回SQLを掛けます。ただし、20040512は、定休日と仮定しレコードそのものが無いとします。
これを、ぱぴよん様に書いていただいたHTMLのテーブルのように表示したいのです。

 <table>
<caption>2005年5月</caption>
<tr><td>1日の行</td> <td>当月の売上</td> <td>前年同月の売上</td> <td>前年対比</td> </tr>
<tr><td>2日の行</td> <td>当月の売上</td> <td>前年同月の売上</td> <td>前年対比</td> </tr>
<tr><td>3日の行</td> <td>当月の売上</td> <td>前年同月の売上</td> <td>前年対比</td> </tr>
       ・
       ・
       ・
<tr><td>10日の行</td> <td>★売上無し</td> <td>前年同月の売上</td> <td>★NG★</td> </tr> /* ←この行は表示可能か? */
<tr><td>11日の行</td> <td>当月の売上</td> <td>前年同月の売上</td> <td>前年対比</td> </tr>
<tr><td>12日の行</td> <td>当月の売上</td> <td>★売上無し  </td> <td>★NG★</td> </tr>
<tr><td>13日の行</td> <td>当月の売上</td> <td>前年同月の売上</td> <td>前年対比</td> </tr>
       ・
       ・
       ・
</table>



また、同じような事が、うるう年の次の年で発生してきそうです。
期間:20050201?20050228 の前年データで
期間:20050201?20050229 との前年比較です。

 <table>
<caption>2005年2月</caption>
<tr><td>1日の行</td> <td>当月の売上</td> <td>前年同月の売上</td> <td>前年対比</td> </tr>
       ・
       ・
       ・
<tr><td>27日の行</td> <td>当月の売上</td> <td>前年同月の売上</td> <td>前年対比</td> </tr>
<tr><td>28日の行</td> <td>当月の売上</td> <td>前年同月の売上</td> <td>前年対比</td> </tr>
<tr><td>29日の行</td> <td>★売上無し</td> <td>前年同月の売上</td> <td>★NG★</td> </tr> /* ←この行は表示可能か? */
</table>



なにか良い方法がありましたら、教えて下さい。
よろしくお願いします。
Parent: 2285  reply: 2289 返信 編集 削除

[2289] Re:PHP+Oracleでのデータ抽出・加工・表示

user: ぱぴよん | created: 2005-05-30 10:13
>実は、ちょっと、なにかつかめた!ような気がしてます。

よかったです^^


> 平均売価 = 売上金額 / 買上点数
> 客単価 = 売上金額 / 客数
> 日で前年対比 = 当月の日毎の売上金額 / 前年の同日の売上金額 * 100
> 月(日別合計)で前年対比 = 当月の売上金額 / 前年の同月の売上金額 * 100

なるほどこのような計算になるのですね。

割り算をする部分は
・分母が0でないか
・値があるか
をチェックしなければいけないですね。


前年比(月ごと)は集計した結果を出すのでよさそうですが、
やはり日ごとの比較は難しそうですね。
比較できない時の処理を考えないといけませんね。
(例えば、びすあるさんが書かれているように文字を表示して分かるようにしたり、
文字の色やテーブル(trまたは、td)の背景色を変えてみたりなど)

他にもあるとは思いますが、日ごとではなく週ごとの比較などではダメですよね?^^;
Parent: 2286  reply: 2293 返信 編集 削除

[2293] Re.Re:PHP+Oracleでのデータ抽出・加工・表示

user: びすある | created: 2005-05-30 15:35
ぱぴよん様、ありがとうございます。

> 前年比(月ごと)は集計した結果を出すのでよさそうですが、
> やはり日ごとの比較は難しそうですね。
> 比較できない時の処理を考えないといけませんね。
> (例えば、びすあるさんが書かれているように文字を表示して分かるようにしたり、
> 文字の色やテーブル(trまたは、td)の背景色を変えてみたりなど)

やり方としては、データのYMDをを用いず、現在の日付から、月初から月末までを用意して、その値とYMDを比較
しながら合致する値(売上等)を表示させればよろしいんでしょうか?

> 他にもあるとは思いますが、日ごとではなく週ごとの比較などではダメですよね?^^;

比較・分析としては、週別も必要ではありますが、日別もほしいところです。

よろしくお願い致します。
Parent: 2289  reply: 2294 返信 編集 削除

[2294] Re:PHP+Oracleでのデータ抽出・加工・表示

user: ぱぴよん | created: 2005-06-01 09:27
> やり方としては、データのYMDをを用いず、現在の日付から、月初から月末までを用意して、その値とYMDを比較
> しながら合致する値(売上等)を表示させればよろしいんでしょうか?

現在が2005年5月20日だとすれば、比較が可能なのは20日までなので
20日まで行を表示する方法や
21日以降を空の行で表示する方法など
それはびすあるさん次第だと思います。

びすあるさんが言われるように前もって当月の全ての日の行を用意しておき、
その中で表示できる部分はデータを入れて、
比較できない部分は空データなどにするというのもあると思います。
ただ、何度も言うようですが、そのあたりの判断はびすあるさん次第です(@^-^@)
(私が「こうしなさい」とは言えないので^^;)


> 比較・分析としては、週別も必要ではありますが、日別もほしいところです。

比較なので色々なデータが必要ということですね。



仕事の合間に簡単なサンプルを作成しようと思っているのですが、なかなか時間がありません^^;
(途中までできましたが、動作チェックなどもしていません。)
Parent: 2293  reply: 2297 返信 編集 削除

[2297] サンプルを作成しました。

user: ぱぴよん | created: 2005-06-01 19:43
[テスト環境]
PHP: 5.0.3
Apache:1.3.27
DB:ACCESS 2000
接続:odbc

上記の環境でテストしました。
環境により、サンプルでエラーが出る場合は環境に合った書き方に直してください。
(例:odbcなど)

以下サンプルです。(長いです^^;)
<?php
//////////////////////////////////////////////////////
// 関数
//////////////////////////////////////////////////////
// 指定月の売上情報を取得する関数
function get_month_sales_info($s_yy, $s_mm) {
global $db_name, $db_user, $db_pw, $tbl_name;
$e_dd = get_days($s_yy, $s_mm);
$result = array(); // 戻り値(売上情報)
//oracleはこれでいけるかな?(ダメだったらSQLを変更してください^^;)
//$sql = "SELECT * FROM $tbl_name WHERE (YMD>=CAST('$s_yy/$s_mm/1' AS DATE)) AND (YMD<=CAST('$s_yy/$s_mm/$e_dd' AS DATE)) ORDER BY 店名;";
//ACCESS
$sql = "SELECT * FROM $tbl_name WHERE (YMD>=DATESERIAL($s_yy, $s_mm, 1)) AND (YMD<=DATESERIAL($s_yy, $s_mm, $e_dd)) ORDER BY 店名;";
$conn = odbc_connect($db_name, $db_user, $db_pw);
$res = odbc_exec($conn, $sql) or die("データベース接続エラー");
while(odbc_fetch_row($res)) {
$store_name = odbc_result($res, '店名');
$ymd = odbc_result($res, 'YMD');
$seconds = get_stamp($ymd);
$sales_money = odbc_result($res, '売上金額');
$purchase_num = odbc_result($res, '買上点数');
$visitor_num = odbc_result($res, '客数');
$dd = date('j', $seconds);
$result[$dd]['店名'] = $store_name;
$result[$dd]['YMD'] = $dd;
$result[$dd]['売上金額'] = $sales_money;
$result[$dd]['買上点数'] = $purchase_num;
$result[$dd]['客数'] = $visitor_num;
}
odbc_close($conn);
return $result;
}
// タイムスタンプから1970年1月1日00:00:00からの通算秒数を取得する関数
function get_stamp($date_time_stamp) {
list($date, $time) = split(" ", $date_time_stamp);
list($year, $month, $day) = split("-", $date);
//list($hour, $minute, $second) = split(":", $time);
return mktime(0, 0, 0, $month, $day, $year);
}
// 指定年月の日数を取得する関数
function get_days($year, $month) {
return (int)date("t", mktime(0, 0, 0, $month, 1, $year));
}

//////////////////////////////////////////////////////
// 初期化
//////////////////////////////////////////////////////
$db_name = 'データベース名'; // データベース名
$db_user = ''; // ユーザー名
$db_pw = ''; // パスワード
$tbl_name = 'テーブル名'; // テーブル名
$html = ''; // HTML
$week = array('日', '月', '火', '水', '木', '金', '土');
$this_sales_w_sum = 0; // 当月週売上合計
$this_count_w_sum = 0; // 当月週買上点数合計
$this_sales_sum = 0; // 当月売上合計
$this_count_sum = 0; // 当月買上点数合計
$prev_sales_w_sum = 0; // 前年同月週売上合計
$prev_sales_sum = 0; // 前年同月売上合計
$this_year = date('Y'); // 当年
$this_month = date('n'); // 当月
$this_day = date('j'); // 当日
$prev_year = (int)$this_year - 1; // 前年
$prev_array = array(); // 前年売上情報
$this_array = array(); // 当年売上情報

//////////////////////////////////////////////////////
//売上情報の取得
//////////////////////////////////////////////////////
$prev_array = get_month_sales_info($prev_year, $this_month);
$this_array = get_month_sales_info($this_year, $this_month);

$html .= "<html>\n".
"<head>\n".
"<title>売上実績</title>\n".
"</head>\n".
"<center>\n".
"<body>\n".
"<table border=\"0\" cellspacing=\"0\" cellpadding=\"5\" style=\"text-align:right;\">\n".
" <caption><b><u><&nbsp;".$this_year."年".$this_month."月期売上実績&nbsp;></u></b></caption>\n".
" <tr style=\"line-height:3px;\"><td>&nbsp;</td></tr>\n".
" <tr style=\"background-color:e1e1e1; text-align:center;\"><th>店名</th><th>日</th><th>曜日</th><th>売上金額</th><th>買上点数</th><th>平均売価</th><th>客単価</th><th>前年対比</th></tr>\n";

//////////////////////////////////////////////////////
// 売上情報の表示処理
//////////////////////////////////////////////////////
for($i = 1; $i <= (int)$this_day; $i++) {
// 曜日の処理
$week_pos = date('w', get_stamp($this_year."-".$this_month."-".$i));
$day_of_week = $week[$week_pos];
// 平日の色
$w_color = "black";
// 日曜日の色
if($week_pos == 0) $w_color = "red";
// 土曜日の色
else if($week_pos == 6) $w_color = "blue";
// 前年同月(日)データが存在する場合
if(isset($prev_array[$i])) {
// 前年同月週合計
$prev_sales_w_sum += $prev_array[$i]['売上金額'];
// 前年同月合計
$prev_sales_sum += $prev_array[$i]['売上金額'];
}
// 当月(日)データが存在する場合
if(isset($this_array[$i])) {
// 当月週合計
$this_sales_w_sum += $this_array[$i]['売上金額'];
$this_count_w_sum += $this_array[$i]['買上点数'];
// 当月合計
$this_sales_sum += $this_array[$i]['売上金額'];
$this_count_sum += $this_array[$i]['買上点数'];
// 平均売価 = 売上金額 / 買上点数
if($this_array[$i]['買上点数'] != 0) $sales_avg = $this_array[$i]['売上金額'] / $this_array[$i]['買上点数'];
else $sales_avg = "──";
// 客単価 = 売上金額 / 客数
if($this_array[$i]['客数'] != 0) $visitor_unit_price = $this_array[$i]['売上金額'] / $this_array[$i]['客数'];
else $visitor_unit_price = "──";
// 日で前年対比 = (int)(当月の日毎の売上金額 / 前年の同日の売上金額 * 1000) / 10
if(isset($prev_array[$i]) && ($prev_array[$i]['売上金額'] != 0)) $daily_contrast = (int)($this_array[$i]['売上金額'] / $prev_array[$i]['売上金額'] * 1000) / 10;
else $daily_contrast = "──";
$html .= " <tr style=\"background-color:eeeeff;\">\n".
" <td style=\"text-align:center;\">".$this_array[$i]['店名']."</td>\n".
" <td>".$i."日</td>\n".
" <td style=\"color:$w_color; text-align:center;\">$day_of_week</td>\n".
" <td>\\".number_format($this_array[$i]['売上金額'])."</td>\n".
" <td>".number_format($this_array[$i]['買上点数'])."</td>\n".
" <td>\\".number_format($sales_avg)."</td>\n".
" <td>\\".number_format($visitor_unit_price)."</td>\n".
" <td>$daily_contrast</td>\n".
" </tr>\n";
// 週合計行の表示(土曜日で判断、または月最後の日)
if(($week_pos == 6) || ($i == $this_day)) {
// 月(週別合計)で前年対比 = (int)(当月週の売上金額 / 前年の同月週の売上金額 * 1000) / 10
if($prev_sales_w_sum != 0) $week_contrast = (int)($this_sales_w_sum / $prev_sales_w_sum * 1000) / 10;
else $week_contrast = "──";
$html .= " <tr style=\"background-color:ccccff;\">\n";
// 土曜日の場合
if($week_pos == 6) $html .= " <th colspan=\"3\" style=\"text-align:center;\">週合計[".($i>=7?$i-6:1)."-$i]&nbsp;</th>\n";
// 月最後の日の場合
else $html .= " <th colspan=\"3\" style=\"text-align:center;\">週合計[".($i-$week_pos)."-$i]&nbsp;</th>\n";
$html .= " <td>\\".number_format($this_sales_w_sum)."</td>\n".
" <td>".number_format($this_count_w_sum)."</td>\n".
" <td>──</td>\n".
" <td>──</td>\n".
" <td>$week_contrast</td>\n".
" </tr>\n";
$this_sales_w_sum = 0;
$this_count_w_sum = 0;
$prev_sales_w_sum = 0;
}
// 当月(日)データが存在しない場合
} else {
$html .= " <tr style=\"background-color:eeeeff;\"><td style=\"text-align:center;\">──</td><td>".$i."日</td><td style=\"color:$w_color; text-align:center;\">$day_of_week</td><td>──</td><td>──</td><td>──</td><td>──</td><td>──</td></tr>\n";
}
}
// 月(日別合計)で前年対比 = (int)(当月の売上金額 / 前年の同月の売上金額 * 1000) / 10
if($prev_sales_sum != 0) $month_contrast = (int)($this_sales_sum / $prev_sales_sum * 1000) / 10;
else $month_contrast = "──";
$html .= " <tr style=\"background-color:333333; color:ffffff\">\n".
" <th colspan=\"3\" style=\"text-align:center;\">月合計[1-$this_day]&nbsp;</th>\n".
" <th>\\".number_format($this_sales_sum)."</th>\n".
" <th>".number_format($this_count_sum)."</th>\n".
" <th>──</th>\n".
" <th>──</th>\n".
" <th>$month_contrast</th>\n".
" </tr>\n";
$html .= "</table>\n<center>\n</body>\n</html>";
print $html;
?>
Parent: 2294  reply: 2298 返信 編集 削除

[2298] ありがとうございます。

user: びすある | created: 2005-06-03 19:22
すいません。月初でバタバタしておりまして、お返事が遅くなりました。

サンプル大変ありがとうございます。

まだ、私のレベルではザッと目を通しただけでは、理解出来ないので、じっくり見せていただいた上で、
改めて質問なりをさせていただけたらと思います。

改めて大変参考になります。

ぱぴよん様、ありがとうございます。
Parent: 2297  reply: 2303 返信 編集 削除

[2303] Re:ありがとうございます。

user: ぱぴよん | created: 2005-06-07 10:32
色々しているうちにサンプルが大きくなってしまいました^^;
読みにくい部分があるかと思いますので、質問してください(@^-^@)

あと・・・ サンプルでは1日分のレコードは1つしかないという前提で作りましたので、
一日分のレコードが複数あるとうまく動作しないはずです。
(先のサンプルで書き忘れていました。複数レコードの場合は大きくプログラムが変わってきます^^;)



PS.管理人様、問題なく投稿することができました^^
Parent: 2298  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 434 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑