[EC-CUBE]売上集計の職業別集計・会員別集計がシステムエラーで動かない

売上集計機能の職業別、会員別がMySQLの場合、システムエラーになる。


原因はPostgreSQLがデフォルトとして構築されているため、
SQLもポスグレ仕様だから。

基本情報管理>パラメータ管理でDEBUG_MODEをtrueに設定してると、

以下のようなエラーメッセージがわーっと出る。

  1. SELECT job, count(*) AS order_count, SUM(total) AS total, trunc(AVG(total)) AS total_average
  2. FROM dtb_customer AS T1 LEFT JOIN dtb_order AS T2 USING ( customer_id )
  3. WHERE T2.create_date >= '2008/10/18' AND T2.create_date < date('2008/10/20') AND T2.del_flg = 0
  4. and T2.status <> 3 GROUP BY job ORDER BY total DESC
  5. DB Error: unknown error
  6.  
  7. SELECT job, count(*) AS order_count, SUM(total) AS total, trunc(AVG(total)) AS total_average
  8. FROM dtb_customer AS T1 LEFT JOIN dtb_order AS T2 USING ( customer_id )
  9. WHERE T2.create_date >= '2008/10/18' AND T2.create_date < date('2008/10/20') AND T2.del_flg = 0
  10. and T2.status <> 3 GROUP BY job ORDER BY total DESC
  11. [nativecode=1305 ** FUNCTION eccube_db.trunc does not exist]
  12.  

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);	// 実行時間を制限しない

これでタイムアウトもエラーもない。
はぁ。。。よかった・・・


  • 売り上げ集計の会員別集計と職業別集計でのSQLバグ[eccube2.3.3+mysql] 環境:eccube 2.3.3+apache2.2+MySQL 5.0.75+PHP5.2.6+Linux(ubuntu) 状況:会員別集計を実行するとシステムエラーがでる site.log抜粋: SELECT COUNT(*) AS order_count, SUM(total) AS total, TRUNCATEATE*1 AS total_average, order_sex FROM dtb_order WHERE create_date >= '2009/1/1 00:00:00' AND create_date < date('2009/02/01') AND customer_id <> 0 AND del_flg = 0 AND status <> 3 GROUP BY order_sex [nativecode=1064 ** You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'total_average, order_sex FROM dtb_order WHERE create_date >= '2009/1/1 00:00:00' at line 1] 原因:TRUNCATEATE*2→trunc(AVG(total),0)に変更 ※職業別集計もバグっていたので下記の通り変更しました (2009/1/28 12:00 更新) LC_Page_Admin_Total->lfGetOrderMemberの711行目 trunc(AVG(total))→trunc(AVG(total),0)に変更 ※念のため記述しておきますが、当方公式サイトの開発環境ソースのコミット権はありませんので、公式サイトの開発環境ソースの変更はしていません。 上記の変更箇所は当方開発環境内の話です ただし、公式サイトの2.3.3のソースであれば、上記と同様の変更で対応可能です 上記の変更で当方開発中のサイトは間に合いますが、 根本的にclass[SC_DB_DBFactory_MYSQL]の[sfChangeTrunc]と[sfChangeRANDOM]を再入可能に変更すべきかと思います 例えば、SC_DB_DBFactory_MYSQLの246行目でeregi_replace関数の正規表現を $changesql = eregi_replace("( TRUNC)", " TRUNCATE", $sql); から $changesql = eregi_replace("( TRUNC *\()", " TRUNCATE(", $sql); のようにするとか。(上記は不完全でTRUNCの前に四則演算子等が来るとヒットしません) SQL文は将来において、おおいに変更される箇所なので、 内部の処理を知らないとSQLが書けないことに問題があると思います (2009/1/28 20:30 更新) -- 2009-05-14 19:55:58
コメント:

すべてのコメントを見る
最終更新:2009年05月19日 12:30
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。
添付ファイル

*1 AVG(total

*2 AVG(total))となっており構文エラー 正しくは→TRUNCATE(AVG(total),0) class[SC_DB_DBFactory_MYSQL]のメソッド[sfChangeMySQL]をSQL発行までに2重呼び出し(SC_Query->select内とSC_DbConn->getAll内)している さらに、TRANCATE関数の第2引数[桁数(精度)]の指定が無い 対応方法: SC_Query->selectの94行目削除 // $sqlse = $dbFactory->sfChangeMySQL($sqlse); LC_Page_Admin_Total->lfGetOrderMemberの641行目 trunc(AVG(total