バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > 管理機能 > 2.13.1 環境のデータを 4.0.4 環境にて移行させ商品規格登録をするとエラーが出る

管理機能

新規スレッドを追加する

スレッド表示 | 古いものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
miwa
投稿日時: 2020/7/12 22:22
対応状況: −−−
半人前
登録日: 2014/12/9
居住地:
投稿: 11
Re: 2.13.1 環境のデータを 4.0.4 環境にて移行させ商品規格登録をするとエラーが出る
 お世話になっております
 返信が大幅に遅れ、誠に申し訳ありません

> 2系も4系も管理画面で商品登録を行う流れは同じで
> 1.商品を新規登録
> 2.商品規格を編集
> の流れかと思います。
 はい

> 通常であれば、「1.商品を新規登録」が完了した時点で
> dtb_productとdtb_product_class(2系の場合、dtb_productsとdtb_products_class)に1件ずつレコードが登録されると思います。
 ええ

> この時、dtb_product_classテーブルにはclass_category_id1=null, class_category_id2=null(2系の場合、dtb_products_classテーブルにはclass_category_id1=0, class_category_id2=0)
> のレコードが登録されていると思います。
 はい、そしてこのレコードが「デフォルト商品規格」であり、また、
> ※規格を持たない商品もdtb_product_classテーブルにレコードを持つ仕様。
とのことで、特に規格に対して操作することが皆無だったとしても、このレコードは存在している、ということですよね?

> 続けて「2.商品規格を編集」が完了した時点で
> 規格の組み合わせとチェックボックスの内容を基に
> dtb_product_classテーブルへ必要なレコードを追加していると思います。
> (2系の場合、dtb_products_classテーブル)
 ええ

> ここで「1.商品を新規登録」で既に登録されているclass_category_id1=null, class_category_id2=nullのレコードに対して
> 4系の場合、visible=0に変更していると思います。
> ※今回の問題はここでエラーが発生する事
 はい、仰る通りです

> 規格を持たない商品用のレコードを非表示にする事が目的と思いますが
> 2系の場合、dtb_products_classテーブルのclass_category_id1=0, class_category_id2=0のレコードに対して
> del_flg=1の変更を行っているようです。
 こちらも、返信するまでの間、多分そうではないかと思うに至りました

> ここで少し気になったのですが
> 2系のサイトを構築する際、何度か移行作業を行っていたりしていないでしょうか?
 この度、返信が遅れたのは、この部分から気付きがあったからでした
 弊サイトは、一番初めは業者様にて構築をお願いしたのでした
 構築環境を用意して頂き、そこにこちらが商品登録をしていきました
 そして最終的に、その構築環境をまるごと、今の環境に入れ(直し)て頂いたのです
 大変お恥ずかしいのですが、このご返信を戴いて、こういった経緯を思い出すに至ります(本当に申し訳ありません)

 その業者様が、例えばこちらに提供して下さった構築環境以前に、例えば(業者様側の)ローカルでテンプレートを含め構築されていらっしゃったとしても、最終的にはこちらが商品登録をしていくので、こちらに提供して頂いた環境こそが、
  商品データが入っている一番の先祖(オリジナル)
だと考えます

 幸い、その構築環境のデータベースはまだ生きており、
  SELECT `product_class_id` FROM `dtb_products_class` WHERE `classcategory_id1`=0 AND `classcategory_id2`=0 AND product_id = XXX
で色々見ましたが、このオリジナルの時点で、既にこのレコードは「あったりなかったり」の状態でした

> あくまで予想ですがデータ移行の際、del_flg=1のレコードは不要と判断して破棄していたりすると
> レコードの欠落は発生してしまうかと思います。
> もしくはサイト構築時のデータ投入時に規格商品のclass_category_id1=0, class_category_id2=0のレコードを追加しなかったのかもしれませんが。
 最初は、バージョン違いですが、
  複製した商品で、「規格の初期化」ができない · Issue #1383 · EC-CUBE/ec-cube · GitHub
  https://github.com/EC-CUBE/ec-cube/issues/1383
といったことも含め、イレギュラーなことが起きたのかなと思いつつも、そういったバグ的なものがなければ、【なるべきしてなった】と思います
 そこで考えたのは、ご指摘の様に、業者様が本番環境に移行させる際に、文字通り「del_flg=1」、つまり削除フラグが 1 なので、当該レコードを破棄されたのかも知れません

 こちらの事情となってしまいますが、この業者様とは今は交流がない為、確認のしようがありません
 また、仮に聞けたとしてデフォルト規格のレコードを業者様が削除されたとしても、元のデータが戻って来る訳でもありません
 犯人探しをしたいのではなく、兎に角この状況を何とかしたいというのが目的なので、オリジナルがこの状態だともうデータは取り戻せないと結論するに至りました

 そこで、もしもに備え、EC-CUBE 4 の環境を更に別に用意し、既存の商品を全て【廃止】し、商品をゼロから登録することと致しました

 この返信までの間、経緯を思い出し、色々調べ、オリジナルデータから結論を出し、別環境構築後、約 150 の商品データを登録するところまで来ました
 ご返信の通り、規格の分類数が多い程、組み合わせは膨大になります
 オリジナルデータにデフォルト規格のレコード欠落がなければまだしも、数百もある商品のデータからテーブルを逐一見るよりはゼロから再登録した方が賢明と判断したのです

 ですが「再登録することにしました」で終わってはまだ納得がゆかず、ある程度の数の登録をこなして、改めて確認しようと決めていました

 既述の通りですが、150 余の登録を済ませた現状で、任意にどの商品を引っ張っても「デフォルト規格のレコード」は存在し、管理画面上でも「商品規格登録をするとエラーが出る」ことがありません

 結果論で言えば、デフォルト規格のレコードが欠落した確実な理由や、それを復元する方法を導き出せず、最初から登録し直すという意味では「仕方なくこうした」感が強く、しかも多くの時間が掛かってしまいました
 ですが EC-CUBE の内部ロジックをより理解することが出来ましたし、何よりも「運営に於ける教訓」を得ることが出来ました
 多くの時間苦労した分、こういったことを忘れることはないと思います

 また、素人故に多くの技術資料に触れることが出来、株式会社シロハチ様のサイトも沢山拝見しました
 ここまでに至れたのは、株式会社シロハチ様のご返信によるお導きがあったに他なりません

 こういう形での解決となりましたこと、報告申し上げます
 返信が遅れてしまったことの非礼をお詫びし、心より御礼申し上げます

 末筆ではありますが、株式会社シロハチ様の今後益々のご発展とご活躍を心よりお祈り申し上げます
468
投稿日時: 2020/7/6 10:01
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3217
Re: 2.13.1 環境のデータを 4.0.4 環境にて移行させ商品規格登録をするとエラーが出る
2系も4系も管理画面で商品登録を行う流れは同じで

1.商品を新規登録
2.商品規格を編集

の流れかと思います。

通常であれば、「1.商品を新規登録」が完了した時点で
dtb_productとdtb_product_class(2系の場合、dtb_productsとdtb_products_class)に1件ずつレコードが登録されると思います。
この時、dtb_product_classテーブルにはclass_category_id1=null, class_category_id2=null(2系の場合、dtb_products_classテーブルにはclass_category_id1=0, class_category_id2=0)
のレコードが登録されていると思います。
※規格を持たない商品もdtb_product_classテーブルにレコードを持つ仕様。

続けて「2.商品規格を編集」が完了した時点で
規格の組み合わせとチェックボックスの内容を基に
dtb_product_classテーブルへ必要なレコードを追加していると思います。
(2系の場合、dtb_products_classテーブル)
ここで「1.商品を新規登録」で既に登録されているclass_category_id1=null, class_category_id2=nullのレコードに対して
4系の場合、visible=0に変更していると思います。
※今回の問題はここでエラーが発生する事

規格を持たない商品用のレコードを非表示にする事が目的と思いますが
2系の場合、dtb_products_classテーブルのclass_category_id1=0, class_category_id2=0のレコードに対して
del_flg=1の変更を行っているようです。

ここで少し気になったのですが
2系のサイトを構築する際、何度か移行作業を行っていたりしていないでしょうか?
あくまで予想ですがデータ移行の際、del_flg=1のレコードは不要と判断して破棄していたりすると
レコードの欠落は発生してしまうかと思います。
もしくはサイト構築時のデータ投入時に規格商品のclass_category_id1=0, class_category_id2=0のレコードを追加しなかったのかもしれませんが。


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

miwa
投稿日時: 2020/7/5 6:00
対応状況: −−−
半人前
登録日: 2014/12/9
居住地:
投稿: 11
Re: 2.13.1 環境のデータを 4.0.4 環境にて移行させ商品規格登録をするとエラーが出る
 ご丁寧なご返信、本当に有難う御座います

 色々と検証したり考えたりで返信が遅れたことをお詫び致します

> ECCUBE4で新しく商品規格を持つ商品を登録してデータを確認してみましたが
> 商品規格登録画面でチェックを付けた件数(2件チェック)+1件( class_category_id1 / class_category_id2 共に NULL)のレコードが
> dtb_product_classテーブルに登録されました。
 ご確認有難う御座います

> よって、やはり編集しようとされている商品IDかつ、class_category_id1 / class_category_id2 共に NULLのレコードが無い事が原因で間違いないと思います。
 なるほどです

> なぜ、レコードの欠落が起きているか分かりませんが
> 2系のデータベースで既に以下のようなレコードが存在していないという事はないでしょうか?
> SELECT `product_class_id` FROM `dtb_products_class` WHERE `classcategory_id1`=0 AND `classcategory_id2`=0
> AND product_id = XXX
> ※XXXのところに商品IDを指定してみてください
 このことで、幾つか確認を行っていました
---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---
・EC-CUBE 2 の実稼働環境
 A:
SELECT `product_class_id` FROM `dtb_products_class` WHERE `classcategory_id1`=0 AND `classcategory_id2`=0
AND product_id = XXX
 ではヒットするものとしないものとがあった
 B:
SELECT * FROM `dtb_products_class` WHERE `classcategory_id1` =0 AND `classcategory_id2` =0
 は多数ヒット
---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---
・EC-CUBE 4 の移転働環境(将来正式稼働予定)
 C:
SELECT id FROM `dtb_product_class` WHERE `class_category_id1` IS NULL AND `class_category_id2` IS NULL and `product_id`=XXX
 ではヒットするものとしないものとがあった
 D:
SELECT * FROM `dtb_product_class` WHERE `class_category_id1` IS NULL AND `class_category_id2` IS NULL
 は多数ヒット
---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---
・B / D のヒット数は違う
・規格を持ちつつもデフォルト規格が無いものがあることが判明した
・A / C では、デフォルト規格を持つ商品 ID の場合は 1 件ヒットする筈だが、C では 2 件ヒットするものもあった
・EC-CUBE 4 の移転働環境では、商品規格を有する商品が 300 あり、その内デフォルト規格を持つものは 50 だった
 250 商品は商品規格登録時にエラーが出る(ことになる)

> ECCUBE4のソースを全て網羅している訳ではないので
> 該当レコードが存在しない事による不都合があるのかどうか判断できないのですが
 大丈夫です

> レコードが存在しているほうが安心な気もします。
 ええ

> コードをコメントアウトしたりするのではなく、
> 欠落している商品を特定してレコードを追加する対応をされたほうが良いのではないでしょうか?
 そうだとは思います
 ただ、2 系でレコードを追加するのと、4 系で追加するのと、どちらが良いのか判断出来ない状態です
 レコードの追加ではなく、2 系でも 4 系でも構わないので「管理画面でこの操作をするとデフォルト規格が出来る」というのがあれば良いのですが……
 一度商品を削除して再登録すれば良いかも知れませんが、その場合は商品 ID が変わってしまうので避けたい所です
 また、多くの商品が規格を沢山持っているので、規格だけを削除することも出来ません……

 2 系は現在稼働中なのでソースをイジれないのですが 4 系なら可能なので、
$DefaultProductClass = $this->productClassRepository->findOneBy([
'Product' => $Product,
'ClassCategory1' => null,
'ClassCategory2' => null,
]);
if ( is_null( $DefaultProductClass ) ) {
// ここにレコード追加処理
} else {
$DefaultProductClass->setVisible(false);
}
$this->entityManager->flush();
 を入れたらどうだろうと思いつつも、他に影響が出ないかの懸念もあります

 ソースをイジるにしても手動でレコード追加するにしても、レコード追加時に「何を入力したら良いか」で悩んでいます
 product_id / class_category_id1 / class_category_id2 等は自明ですが、他はどうすべきかと……

 仰る通り、何故 `classcategory_id1`=0 AND `classcategory_id2`=0 なレコードが欠落したのかこちらも分からず、思い当たる節がありません
 気になったのは、
・`classcategory_id1`=0 AND `classcategory_id2`=0 なレコードが欠落した商品の規格を更新してもエラーは出ない
・`classcategory_id1`=0 AND `classcategory_id2`=0 なレコードが欠落した商品は、
  EC-CUBE 4 環境でも `class_category_id1` IS NULL AND `class_category_id2` IS NULL ではない
 と思ったら、`class_category_id1` IS NULL AND `class_category_id2` IS NULL なレコードを持つ商品もありました
といったことです 

 この、商品規格を持っているのに `class_category_id1` IS NULL AND `class_category_id2` IS NULL 出ない商品がある問題は「商品企画の初期化」にも関わると思います

 2 系 / 4 系それぞれの整合性や、共通点、相違点、色々考えていたら時間が掛かってしまいました
 まだ悩んでいる所ですが、現状報告という形で返信させて頂きます

 もし、お気付きがあればご指摘頂けたら幸いです
468
投稿日時: 2020/7/4 15:52
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3217
Re: 2.13.1 環境のデータを 4.0.4 環境にて移行させ商品規格登録をするとエラーが出る
ECCUBE4で新しく商品規格を持つ商品を登録してデータを確認してみましたが
商品規格登録画面でチェックを付けた件数(2件チェック)+1件( class_category_id1 / class_category_id2 共に NULL)のレコードが
dtb_product_classテーブルに登録されました。

よって、やはり編集しようとされている商品IDかつ、class_category_id1 / class_category_id2 共に NULLのレコードが無い事が原因で間違いないと思います。

なぜ、レコードの欠落が起きているか分かりませんが
2系のデータベースで既に以下のようなレコードが存在していないという事はないでしょうか?

SELECT `product_class_id` FROM `dtb_products_class` WHERE `classcategory_id1`=0 AND `classcategory_id2`=0
AND product_id = XXX
※XXXのところに商品IDを指定してみてください

ECCUBE4のソースを全て網羅している訳ではないので
該当レコードが存在しない事による不都合があるのかどうか判断できないのですが
レコードが存在しているほうが安心な気もします。
コードをコメントアウトしたりするのではなく、
欠落している商品を特定してレコードを追加する対応をされたほうが良いのではないでしょうか?


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

miwa
投稿日時: 2020/7/4 8:19
対応状況: −−−
半人前
登録日: 2014/12/9
居住地:
投稿: 11
Re: 2.13.1 環境のデータを 4.0.4 環境にて移行させ商品規格登録をするとエラーが出る
 ご返答有難う御座います

> 操作しようとされた商品のレコードは見つかりますか?
> SELECT * FROM `dtb_product_class` WHERE `class_category_id1` is NULL AND `class_category_id2`is NULL
> AND product_id = XXX
> XXXのところに商品IDを指定してみてください。
 商品 ID を指定して確認した所、1 件もヒットしませんでした
 同じく、
  SELECT * FROM `dtb_product_class` WHERE product_id = XXX
をやってみると、3 件ヒットし、これは一番最初の
> 「商品規格登録」画面にて、現在数十個の組み合わせがあるのですが、一番左にチェックが入っているものとそうでないものとが混在している状態です
> チェックが入っているものについて在庫を入力して「登録」をしようとすると、
の「チェックが入っている」数と一致します
・商品 ID だけを条件にした場合はヒットするので商品規格登録画面でチェックが入った状態で見れる
・しかしその商品 ID で class_category_id1 / class_category_id2 共に NULL なものがない
・だから $DefaultProductClass が null になり、setVisible しようがない
ということでしょうか?

 もしそうである場合、管理画面で、或いは DB 上でこれを解決する方法はありますでしょうか?
 それとも、コードをイジる方法となりますでしょうか?

 聞くばかりに終止してしまい大変申し訳ありませんが、ご教示頂けたら幸いです

> あと、「= NULL」ではなくて「IS NULL」でないとレコードがヒットしませんね。
> 1つ前のSQLは打ち間違えていました。
> 紛らわしい間違いで申し訳ございません。
 いえいえ、とんでもありません
 今こうやって問題の所在を掴み掛けていること自体、お導きあってのことであり、とても感謝しております
468
投稿日時: 2020/7/4 2:34
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3217
Re: 2.13.1 環境のデータを 4.0.4 環境にて移行させ商品規格登録をするとエラーが出る
操作しようとされた商品のレコードは見つかりますか?
SELECT * FROM `dtb_product_class` WHERE `class_category_id1` is NULL AND `class_category_id2`is NULL
AND product_id = XXX
XXXのところに商品IDを指定してみてください。

あと、「= NULL」ではなくて「IS NULL」でないとレコードがヒットしませんね。
1つ前のSQLは打ち間違えていました。
紛らわしい間違いで申し訳ございません。


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

miwa
投稿日時: 2020/7/3 22:03
対応状況: −−−
半人前
登録日: 2014/12/9
居住地:
投稿: 11
Re: 2.13.1 環境のデータを 4.0.4 環境にて移行させ商品規格登録をするとエラーが出る
ご返信、誠に有難う御座います

> 4系のデータベースで
> SELECT * FROM `dtb_product_class` WHERE `class_category_id1` is NULL AND `class_category_id2`= NULL
> を実行するとレコードは出てきますか?
 いえ、一致するレコードは 0 件でした

 因みに、
  SELECT * FROM `dtb_product_class` WHERE `class_category_id1` is NULL AND `class_category_id2`is NULL
は無数に出て来ます

(返答するだけしか出来ずに申し訳ありません)
468
投稿日時: 2020/7/3 21:08
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3217
Re: 2.13.1 環境のデータを 4.0.4 環境にて移行させ商品規格登録をするとエラーが出る
4系のデータベースで
SELECT * FROM `dtb_product_class` WHERE `class_category_id1` is NULL AND `class_category_id2`= NULL
を実行するとレコードは出てきますか?


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

miwa
投稿日時: 2020/7/3 20:15
対応状況: −−−
半人前
登録日: 2014/12/9
居住地:
投稿: 11
Re: 2.13.1 環境のデータを 4.0.4 環境にて移行させ商品規格登録をするとエラーが出る
 ご返信誠に有難う御座います

> データ移行プラグインを使った事がないのであくまで予想ですが
> 2系のdtb_products_classテーブルでは
> classcategory_id1=0, classcategory_id2=0でレコードが存在しており
 確かに
  SELECT `product_class_id` FROM `dtb_products_class` WHERE `classcategory_id1`=0 AND `classcategory_id2`=0
にて、複数のレコードが出て来ました

> 移行時にclasscategory_id1=0→null, classcategory_id2=0→nullという変換が上手くいかず、
> dtb_product_classテーブルのclasscategory_id1, classcategory_id2に「0」が入ったままなのではないでしょうか?
> classcategory_id1, classcategory_id2がnullで無い為、条件に一致せず$DefaultProductClassが取得できていないのではないでしょうか?
 そこで、
  SELECT * FROM `dtb_product_class` WHERE `class_category_id1`=0 OR `class_category_id2`=0
をしてみましたが、1 件も該当するレコードはありませんでした

> データベースを直接編集できる環境であれば、
> dtb_product_classテーブルのclasscategory_id1, classcategory_id2に0が入っていないか確認して
> 0→nullに変更してエラーが解消されるかどうか確認されてみては如何でしょうか?
 上記の通り 0 が入っているレコードがありませんでしたので、null にしようがなく、確認することが出来ませんでした
468
投稿日時: 2020/7/3 18:59
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3217
Re: 2.13.1 環境のデータを 4.0.4 環境にて移行させ商品規格登録をするとエラーが出る
データ移行プラグインを使った事がないのであくまで予想ですが
2系のdtb_products_classテーブルでは
classcategory_id1=0, classcategory_id2=0でレコードが存在しており
移行時にclasscategory_id1=0→null, classcategory_id2=0→nullという変換が上手くいかず、
dtb_product_classテーブルのclasscategory_id1, classcategory_id2に「0」が入ったままなのではないでしょうか?

classcategory_id1, classcategory_id2がnullで無い為、条件に一致せず$DefaultProductClassが取得できていないのではないでしょうか?

データベースを直接編集できる環境であれば、
dtb_product_classテーブルのclasscategory_id1, classcategory_id2に0が入っていないか確認して
0→nullに変更してエラーが解消されるかどうか確認されてみては如何でしょうか?


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

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


 



ログイン


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

統計情報

総メンバー数は88,883名です
総投稿数は110,000件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2313
5
umebius
2085
6
yuh
1819
7
h_tanaka
1646
8
red
1570
9
mcontact
1295
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
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.