「[EC-CUBE]売上集計の職業別集計・会員別集計がシステムエラーで動かない」の編集履歴(バックアップ)一覧はこちら
追加された行は緑色になります。
削除された行は赤色になります。
売上集計機能の職業別、会員別がMySQLの場合、システムエラーになる。
&ref(a02.jpg)
原因はPostgreSQLがデフォルトとして構築されているため、
SQLもポスグレ仕様だから。
基本情報管理>パラメータ管理でDEBUG_MODEをtrueに設定してると、
以下のようなエラーメッセージがわーっと出る。
#highlight(linenumber, php){{
SELECT job, count(*) AS order_count, SUM(total) AS total, trunc(AVG(total)) AS total_average
FROM dtb_customer AS T1 LEFT JOIN dtb_order AS T2 USING ( customer_id )
WHERE T2.create_date >= '2008/10/18' AND T2.create_date < date('2008/10/20') AND T2.del_flg = 0
and T2.status <> 3 GROUP BY job ORDER BY total DESC
DB Error: unknown error
SELECT job, count(*) AS order_count, SUM(total) AS total, trunc(AVG(total)) AS total_average
FROM dtb_customer AS T1 LEFT JOIN dtb_order AS T2 USING ( customer_id )
WHERE T2.create_date >= '2008/10/18' AND T2.create_date < date('2008/10/20') AND T2.del_flg = 0
and T2.status <> 3 GROUP BY job ORDER BY total DESC
[nativecode=1305 ** FUNCTION eccube_db.trunc does not exist]
}}
MySQLにはtrunc関数がない。
ということなので、
trunc関数(小数点以下切り捨て)をtruncate関数に変更する。
DETERMINISTICか、NOT DETERMINISTICなのかについては下記を参考にさせていただきました。
>引数が同じなら結果も同じ場合が DETERMINISTIC であり、 引数が同じでも結果が同じとは限らない場合が NOT DETERMINISTIC のようだ。
>ファンクションを作ることができた | MySQL日本語の旅 | kahua-web
mysql> CREATE FUNCTION `trunc`(dbl double) RETURNS int(11) DETERMINISTIC return truncate(dbl,0);
これで売上集計できた。
売上集計機能の職業別、会員別がMySQLの場合、システムエラーになる。
&ref(a01.jpg)
&ref(a02.jpg)
原因はPostgreSQLがデフォルトとして構築されているため、
SQLもポスグレ仕様だから。
基本情報管理>パラメータ管理でDEBUG_MODEをtrueに設定してると、
以下のようなエラーメッセージがわーっと出る。
#highlight(linenumber, php){{
SELECT job, count(*) AS order_count, SUM(total) AS total, trunc(AVG(total)) AS total_average
FROM dtb_customer AS T1 LEFT JOIN dtb_order AS T2 USING ( customer_id )
WHERE T2.create_date >= '2008/10/18' AND T2.create_date < date('2008/10/20') AND T2.del_flg = 0
and T2.status <> 3 GROUP BY job ORDER BY total DESC
DB Error: unknown error
SELECT job, count(*) AS order_count, SUM(total) AS total, trunc(AVG(total)) AS total_average
FROM dtb_customer AS T1 LEFT JOIN dtb_order AS T2 USING ( customer_id )
WHERE T2.create_date >= '2008/10/18' AND T2.create_date < date('2008/10/20') AND T2.del_flg = 0
and T2.status <> 3 GROUP BY job ORDER BY total DESC
[nativecode=1305 ** FUNCTION eccube_db.trunc does not exist]
}}
LC_Page_Admin_Total->lfGetOrderMemberの上記SQLで
AVG(total)が問題のようです。
正しくはAVG(total),0とすべき。
これでシステムエラーにならない。
2009.5.19追記
headerが先に送信されて、
グラフ出力の際にWarningが出た。
原因はカスタマイズでタイムアウトしないように、
SC_Batch_Daily.phpのリアルタイム集計メソッドlfRealTimeDailyTotal()の中で
SC_Utils_Ex::sfFlush();
を呼び出していたことだった・・・orz
3日間くらいかかってやっとたどり着いた新事実・・・
なので、タイムアウトを防ぐ処理を直にSC_Batch_Daily.phpのlfRealTimeDailyTotal()の最後に以下を書いた。
set_time_limit(0); // 実行時間を制限しない
これでタイムアウトもエラーもない。
はぁ。。。よかった・・・
#comment_num(,size=100,noname)