バージョン選択

フォーラム

メニュー

オンライン状況

55 人のユーザが現在オンラインです。 (47 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 55
もっと...

サイト内検索

質問 > フロント機能 > 受注管理画面-CSVダウンロードで検索した注文の情報のみを出力する方法(出力項目のカスタマイズ後)を教えてください。

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
tsurtua
投稿日時: 2017/10/19 11:26
対応状況: 解決済
常連
登録日: 2017/3/31
居住地:
投稿: 57
受注管理画面-CSVダウンロードで検索した注文の情報のみを出力する方法(出力項目のカスタマイズ後)を教えてください。
お世話になります。
以下のカスタマイズをおこなった上で、
受注管理画面上の検索結果の対象注文の情報のみをCSV出力する方法
が分かる方、教えて頂けないでしょうか?

カスタマイズ内容は、
受注管理画面のCSVダウンロードボタンを押して、ダウンロードしたCSVファイルに
注文番号、商品番号、商品名、その商品の注文数
の4つの情報をCSVファイルに出力するというものです。
該当の情報をCSVファイルで出力すること自体はできています。

ですが、このカスタマイズをおこなうと、受注管理画面で出力したい注文を注文番号などで検索したときに、
画面に表示されている注文だけでなく、すべての注文(del_flgが0のもの)を対象に情報を出力してしまいます。
例えば、注文番号欄に100~130として検索したときは、該当の31件のみの情報をCSVファイルに出力したいです。

SC_Helper_CSV.phpのsfDownloadCsvのデフォルトのソースの
$sql = $objQuery->getSql($cols, $from, $where);
のあとで$sqlの中身をデバッグでクエリ文を見るとwhere句には特に範囲指定のようなものは見受けられません。
なので、どうやって検索結果の注文のみを出力すればいいのかわかりません。


具体的なカスタマイズ内容は、
SC_Helper_CSV.phpのsfDownloadCsvを以下のようにカスタマイズしています。
変えているところは、 if($csv_id == 3){のところです。

    public function sfDownloadCsv($csv_id, $where = '', $arrVal = array(), $order = '', $is_download = false)
    {
        $objQuery =& SC_Query_Ex::getSingletonInstance();

        // CSV出力タイトル行の作成
        $arrOutput = SC_Utils_Ex::sfSwapArray($this->sfGetCsvOutput($csv_id, 'status = ' . CSV_COLUMN_STATUS_FLG_ENABLE));
        if (count($arrOutput) <= 0) return false; // 失敗終了
        $arrOutputCols = $arrOutput['col'];

        $cols = SC_Utils_Ex::sfGetCommaList($arrOutputCols, true);

        // 商品の場合
        if ($csv_id == 1) {
            // この WHERE 句を足さないと無効な規格も出力される。現行仕様と合わせる為追加。
            $inner_where = 'dtb_products_class.del_flg = 0';
            $from = SC_Product_Ex::prdclsSQL($inner_where);
        // 会員の場合
        } elseif ($csv_id == 2) {
            $from = 'dtb_customer';
        // 注文の場合
        } elseif ($csv_id == 3) {
            $from = 'dtb_order';
        // レビューの場合
        } elseif ($csv_id == 4) {
            $from = 'dtb_review AS A INNER JOIN dtb_products AS B on A.product_id = B.product_id';
        // カテゴリの場合
        } elseif ($csv_id == 5) {
            $from = 'dtb_category';
        }

        $objQuery->setOrder($order);
        if($csv_id == 3){
        	$sql = "SELECT dtb_order.order_id, dtb_order_detail.product_code, dtb_order_detail.product_name, dtb_order_detail.quantity 
        	FROM dtb_order 
        	INNER JOIN dtb_order_detail ON dtb_order.order_id = dtb_order_detail.order_id 
        	WHERE del_flg = 0 
        	ORDER BY order_id DESC";
        	unset($arrOutput['disp_name']);
        	$arrOutput['disp_name'] = array("受注番号","品番","商品名","数量");
        } else {
        	$sql = $objQuery->getSql($cols, $from, $where);
        }

        return $this->sfDownloadCsvFromSql($sql, $arrVal, $this->arrSubnavi[$csv_id], $arrOutput['disp_name'], $is_download);
    }



以上、分かる方、心当たりのある方、何卒よろしくお願いします。
yuh
投稿日時: 2017/10/19 12:14
対応状況: −−−
登録日: 2013/1/9
居住地: 大阪
投稿: 1818
Re: 受注管理画面-CSVダウンロードで検索した注文の情報のみを出力する方法(出力項目のカスタマイズ後)を教えてください。
LC_Page_Admin_OrderのbuildQueryで組み立てたwhere句が$whereに入るはずです。
条件を付けて検索して試してください。
WHERE del_flg = 0


$sql = "SELECT dtb_order.order_id, dtb_order_detail.product_code, dtb_order_detail.product_name, dtb_order_detail.quantity 
        	FROM dtb_order 
        	INNER JOIN dtb_order_detail ON dtb_order.order_id = dtb_order_detail.order_id 
        	WHERE del_flg = 0 ".$where."
        	ORDER BY order_id DESC";

のような形でやればできるかと思います。


----------------


http://ec-lab.net/

tsurtua
投稿日時: 2017/10/19 13:45
対応状況: −−−
常連
登録日: 2017/3/31
居住地:
投稿: 57
Re: 受注管理画面-CSVダウンロードで検索した注文の情報のみを出力する方法(出力項目のカスタマイズ後)を教えてください。
yuh様ご返信ありがとうございます。

buildQueryは見落としていました。

まず、$whereには、[del_flg = 0 AND order_id >= ? AND order_id <= ?]が入っていたため、
教えて頂いた記述から[ del_flg = 0]を削除して修正してみました。

そののち、受注日で範囲指定して、検索を行うと無事範囲の分のみの情報を出力できたのですが、
注文番号で範囲指定して、検索をおこなったところ、
DB処理でエラーが発生しました。とのことで、以下のようなエラーが出ていました。

Fatal error(E_USER_ERROR): DB処理でエラーが発生しました。
SQL: [SELECT dtb_order.order_id, dtb_order_detail.product_code, dtb_order_detail.product_name, dtb_order_detail.quantity FROM dtb_order INNER JOIN dtb_order_detail ON dtb_order.order_id = dtb_order_detail.order_id WHERE del_flg = 0 AND order_id >= ? AND order_id <= ? ORDER BY order_id DESC]
MDB2 Error: unknown error
_doQuery: [Error message: Could not execute statement]
[Last executed query: PREPARE mdb2_statement_mysql_1149765bd7ce4298f8a082834e4ee62d5a240a480b FROM 'SELECT dtb_order.order_id, dtb_order_detail.product_code, dtb_order_detail.product_name, dtb_order_detail.quantity FROM dtb_order INNER JOIN dtb_order_detail ON dtb_order.order_id = dtb_order_detail.order_id WHERE del_flg = 0 AND order_id >= ? AND order_id <= ? ORDER BY order_id DESC']
[Native code: 1052]
[Native message: Column 'order_id' in where clause is ambiguous]

order_id >= ? AND order_id <= ?のところの
「?」に検索した注文番号が来ないといけないのでしょうか?

受注日で範囲指定したときは、
SELECT dtb_order.order_id, dtb_order_detail.product_code, dtb_order_detail.product_name, dtb_order_detail.quantity
FROM dtb_order
INNER JOIN dtb_order_detail ON dtb_order.order_id = dtb_order_detail.order_id
WHERE del_flg = 0 AND create_date >= ? AND create_date <= ?
ORDER BY order_id DESC
というように?でも動いているのですが違いがよくわかりません。。

ちなみに実業務では注文番号で範囲指定してCSVダウンロードをおこなうので、注文番号でできるのは必須という状況です。

何か分かりますでしょうか?
yuh
投稿日時: 2017/10/19 13:53
対応状況: −−−
登録日: 2013/1/9
居住地: 大阪
投稿: 1818
Re: 受注管理画面-CSVダウンロードで検索した注文の情報のみを出力する方法(出力項目のカスタマイズ後)を教えてください。
del_flg = 0を削除すると$whereに入っているのが AND ~~~
から始まる為にクエリのエラーが起こります。
もし、del_flg=0を削除したいのであれば、del_flg = del_flgと書き換えれば対応できます
ただ、del_flg = 1のデータはクレジット画面に行き戻るを押した場合にも発生するので、del_flg = 0はつけておいた方がいいかと思います。


よく見ると
dtb_order INNER JOIN dtb_order_detail ON dtb_order.order_id = dtb_order_detail.order_id

この部分ってなにか別に変更って行ってますか?


----------------


http://ec-lab.net/

tsurtua
投稿日時: 2017/10/19 14:33
対応状況: −−−
常連
登録日: 2017/3/31
居住地:
投稿: 57
Re: 受注管理画面-CSVダウンロードで検索した注文の情報のみを出力する方法(出力項目のカスタマイズ後)を教えてください。
$whereに入っているのは、デバッグで確認したところ、
del_flg = 0 AND order_id >= ? AND order_id <= ?
だったので、

$sql = "SELECT dtb_order.order_id, dtb_order_detail.product_code, dtb_order_detail.product_name, dtb_order_detail.quantity 
        	FROM dtb_order 
        	INNER JOIN dtb_order_detail ON dtb_order.order_id = dtb_order_detail.order_id 
        	WHERE ".$where."
        	ORDER BY order_id DESC";

としています。
間違っていますでしょうか?

dtb_order INNER JOIN dtb_order_detail ON dtb_order.order_id = dtb_order_detail.order_id

の部分は何も変えておりません。


追記、
エラーメッセージに
[Native message: Column 'order_id' in where clause is ambiguous]
というのがあり、
where句のorder_idは、dtb_orderとtb_order_detailのどっちのorder_idなのか分からないよ!
と怒られているみたいですね。。

これ、どうしたらカラム名付きでwhere句を指定できるのでしょうか?
注文番号で検索する場合とそうじゃない場合でも対応できるようにしておきたいので、何かここで使える関数とかあればいいなと思います。
yuh
投稿日時: 2017/10/19 15:31
対応状況: −−−
登録日: 2013/1/9
居住地: 大阪
投稿: 1818
Re: 受注管理画面-CSVダウンロードで検索した注文の情報のみを出力する方法(出力項目のカスタマイズ後)を教えてください。
すいません、勘違いしてました。
ORDER BY order_id DESC


order_idがdtb_order_detailとdtb_orderにあるので、その部分も指定しないとダメです。
ORDER BY dtb_order.order_id DESC

こんな感じに変更してみてください

あと、buildQueryのカラム部分すべてに
dtb_order.
とつけてみてください。

                break;
            case 'search_order_id1':
                $where .= ' AND dtb_order.order_id >= ?';
                $arrValues[] = sprintf('%d', $objFormParam->getValue($key));
                break;
            case 'search_order_id2':
                $where .= ' AND dtb_order.order_id <= ?';

こんな感じで他のカラムすべてにも

多分それで解決するかとは思います。


----------------


http://ec-lab.net/

tsurtua
投稿日時: 2017/10/19 16:41
対応状況: −−−
常連
登録日: 2017/3/31
居住地:
投稿: 57
Re: 受注管理画面-CSVダウンロードで検索した注文の情報のみを出力する方法(出力項目のカスタマイズ後)を教えてください。
buildQueryの
search_order_id1、2のところに「dtb_order.」をつけて、
おっしゃる通りにやってみましたが、うまくいきません。。

試しに、
LC_Page_Admin_Order.phpのactionの
$this->buildQuery($key, $where, $arrWhereVal, $objFormParam);

の一行下で、
デバッグで$whereの中身を確認したところ、
「dtb_order.」
がついておりませんでした。
デバッグ自体はできているのでここを通っているはずではあると思うのですが。。

どういうことか分かりますでしょうか?


追記、
buildQueryの中、
$dbFactory = SC_DB_DBFactory_Ex::getInstance();

の1行上でデバッグしたところ、ログになにも出ていませんでした。
buildQueryの中は通っていないということなんでしょうか???
yuh
投稿日時: 2017/10/19 17:07
対応状況: −−−
登録日: 2013/1/9
居住地: 大阪
投稿: 1818
Re: 受注管理画面-CSVダウンロードで検索した注文の情報のみを出力する方法(出力項目のカスタマイズ後)を教えてください。
LC_Page_Admin_Order_Ex.phpも確認してみてください。


----------------


http://ec-lab.net/

tsurtua
投稿日時: 2017/10/19 17:16
対応状況: −−−
常連
登録日: 2017/3/31
居住地:
投稿: 57
Re: 受注管理画面-CSVダウンロードで検索した注文の情報のみを出力する方法(出力項目のカスタマイズ後)を教えてください。
できました!!!!
確かに、LC_Page_Admin_Order_Ex.phpでした。
ありがとうございます!
本当に助かりました。

後学のために質問させて頂きますが、
EXとそうじゃないファイルのどちらの処理を通っているかの判断はどうすればいいかご存知でしょうか?
これからもいろいろとカスタマイズをおこなう機会は出てくると思うので、ご存知であれば教えて頂きたいです。
yuh
投稿日時: 2017/10/19 18:58
対応状況: −−−
登録日: 2013/1/9
居住地: 大阪
投稿: 1818
Re: 受注管理画面-CSVダウンロードで検索した注文の情報のみを出力する方法(出力項目のカスタマイズ後)を教えてください。
Exに処理が書いてあればclassの方は無視されてExの処理がはしります。

好みの問題とはおもいますが、カスタマイズする場合はすべてExに書いた方が後で見た時にどの部分をカスタマイズしたかわかりやすいので、自分は全部Exに書くようにしています。


----------------


http://ec-lab.net/

(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は88,288名です
総投稿数は109,688件です

投稿数ランキング

1
seasoft
7365
2
468
3217
3
AMUAMU
2712
4
nanasess
2303
5
umebius
2085
6
yuh
1818
7
h_tanaka
1610
8
red
1567
9
mcontact
1240
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
796
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.