LoginSignup
0
0

More than 5 years have passed since last update.

EC-Cube2で複数同時購入された商品郡を一挙に確認して、配送するときに必要になるファンクションの実用例

Last updated at Posted at 2017-02-03

普通のショップでは使わないと思うのですが、
MySQLでのファンクションをどのように使えばいいか?
についての話。

MySQLのfunctionとはなになのか?について

こういえば一発で判ると思います。
functionとは、Rubyならdef Perlならsub MySQLならfunctionです。
ただ、ほとんど普段は使う必要がありません。

今回、functionで何を行ったか

EC-Cube2の高度な管理から出力するCSV出力を使ったCSV作成処理で、
11111の商品を買った時と22222の商品を買った時で、【選択Aがある】と【選択Aがある】【選択Bがある】と【選択Bがある】の3値をとる可能性が出てきたため、今後選択CやDが増える可能性がある状態を考慮しつつ、これを [商品選択状況]というカラム1個にまとめる処理をSQLとfunctionで実現

なぜこの対応が必要だったかという背景 

EC-Cube2からデータをCSVで配送会社のシステムに送った際、この配送会社のシステムが少し賢いため、order_idを基準に1回の出荷としてまとめてくれています。とても素敵な機能なのですが、出荷指示の項目だけが上書き処理されるため、たとえば3つの商品を購入した際に、2個目の商品と3個目の商品でおまけグッヅが異なる場合には、3個目の商品についてくるオマケだけが記載され、ピッキング処理にわたってしまう問題が起きていました。

この状況を解決するために、EC-Cube2から出力するCSV自体に、同時購入商品に関連する全てのおまけぐっづ情報を記載し、1つの受注idでどのように上書きされても必ず全てのオプションがピッキング指示に入るようになりました。

以下が実現したfunction

order_idを使い、同じorder_idで他の対象AやBの同時購入チェックを行い、文字列で返却するファンクションを作って対応しています。







DROP FUNCTION IF EXISTS checkitem;
DELIMITER //
CREATE FUNCTION checkitem (orderId INT) RETURNS CHAR(50) DETERMINISTIC


BEGIN

  DECLARE x TEXT;
  DECLARE y TEXT;

  /* 初期値を置いておくことにした */
  SET x = "";
  SET y = "";

  /* 選択肢Aが入る条件のテスト */ 
  CASE 
    WHEN (SELECT product_id FROM dtb_order_detail WHERE order_id = orderId and product_id in (商品ID, 商品ID) limit 1)  then 
     SET x = "【Bあり】";
    ELSE BEGIN END;
  END CASE;

  /* 選択肢Bが入る条件のテスト */
  CASE 
    WHEN (SELECT product_id FROM dtb_order_detail WHERE order_id = orderId and product_id in ( 商品ID, 商品ID)  limit 1) then 
     SET y = "【Aあり】";
    ELSE BEGIN END;
  END CASE;


 RETURN concat(x,y);

END 

//
DELIMITER ;


運用方法

新しい特殊対応商品が増えた際は、caseを増やしていくことで、
いくらでも対応できることになります。
レンタルサーバなどではできないことかもしれませんね。

使い道

特殊な配送会社とシステム会社があって必要となる機能なので、普通は使わないと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0