4

Magento でクレジット/デビット カードを使用して注文すると、次のエラーが表示されます。

Order saving error: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '282-189' for key 2

それを見せたくなかったので、正確なトレースを取得できませんでしたが、app/code/core/Mage/Checkout/controllers/OnepageController.phpオンライン501(未編集)までトレースしました。正確な行は次のとおりです。

$this->getOnepage()->saveOrder();

さて、ロジックは、注文を追加しようとすると、これは同じキーを持つ 2 つの注文であると教えてくれます。それとも完全に間違っているのでしょうか?

とにかく、これ以外で、これを修正する最良の方法は何ですか? 注文をエクスポートして、すべて削除してから再インポートすることを考えましたが、うまくいかない気がします。

私はMagento 1.6.2.0を使用しています

編集:整合性チェックに失敗しているテーブルを見つけた場合、そのテーブルを空にする可能性があることに気付きました(テーブルによっては)。これで自動的に修正されますか? どのテーブルが台無しになっているかを調べる方法についてのアイデアはありますか?

EDIT2:OğuzÇelikdemirの答えの後、次のことが原因であることがわかりました:

2012-03-14T13:59:01+00:00 DEBUG (7): SQL: INSERT INTO `sales_order_tax_item` (`tax_id`, `item_id`, `tax_percent`) VALUES (?, ?, ?) (254, 8, 10)
2012-03-14T13:59:01+00:00 DEBUG (7): SQL: INSERT INTO `sales_order_tax_item` (`tax_id`, `item_id`, `tax_percent`) VALUES (?, ?, ?) (254, 8, 10)

明らかに、同じ tax_id を 2 つ挿入することはできません。誰でもそれを修正する方法を知っていますか?

4

3 に答える 3

3

log次の表を切り捨てます。身を守るために、Magento ではなく、CONSOLE からバックアップを作成してください。

TRUNCATE `log_customer`;
ALTER TABLE `log_customer` AUTO_INCREMENT=1;
TRUNCATE `log_quote`;
ALTER TABLE `log_quote` AUTO_INCREMENT=1;
TRUNCATE `log_summary`;
ALTER TABLE `log_summary` AUTO_INCREMENT=1;
TRUNCATE `log_visitor_info`;
ALTER TABLE `log_visitor_info` AUTO_INCREMENT=1;
TRUNCATE `log_url`;
ALTER TABLE `log_url` AUTO_INCREMENT=1;
TRUNCATE `log_url_info`;
ALTER TABLE `log_url_info` AUTO_INCREMENT=1;
TRUNCATE `log_visitor`;
ALTER TABLE `log_visitor` AUTO_INCREMENT=1;
TRUNCATE `report_event`;
ALTER TABLE `report_event` AUTO_INCREMENT=1;
TRUNCATE `log_summary_type`;
ALTER TABLE `log_summary_type` AUTO_INCREMENT=1;

編集: SQL デバッグの場合は、/lib/Varien/Db/Adapter/Pdo/Mysql.phpファイルを開いて検索しますprotected $_debug。デフォルトのステータスは ですがfalse、に変更してtrueください。

その後、ログファイルはvar/debug/sql.txt

また、このstackoverflowの回答を取得してください。Magentoですべてのクエリを印刷するにはどうすればよいですか?

EDIT 2: したがって、ここに販売品目税を処理するファイルがあります。 app/code/core/Mage/Tax/Model/Observer/Observer.php

# Line 144 ( Magento 1.6 edition )
Mage::getModel('tax/sales_order_tax_item')->setData($data)->save();

sales_order_tax_itemモデルを呼び出しています。

app/core/Mage/Tax/Model/Resource/Sales/Order/Tax/Itemp.php

# Line 51
public function getTaxItemsByItemId($item_id)
{
    $adapter = $this->_getReadAdapter();
    $select = $adapter->select()
        ->from(array('item' => $this->getTable('tax/sales_order_tax_item')), array('tax_id', 'tax_percent'))
        ->join(
            array('tax' => $this->getTable('tax/sales_order_tax')),
            'item.tax_id = tax.tax_id',
            array('title', 'percent', 'base_amount')
        )
        ->where('item_id = ?', $item_id);

    return $adapter->fetchAll($select);
}

これが Observer から呼び出す関数です。では、今できることは、Observer または Function にブレークポイントを追加して、デバッガーの出力を確認することです。なぜこの関数を 2 回呼び出すのでしょう!

于 2012-03-14T06:39:58.207 に答える
2

クイックダーティーハックを見つけました。これをバグとして開発者に投稿しようと思います。ファイルを開き、app/code/core/Mmage/Tax/Model/Observer.php132 行目に移動します。if($item)そのステートメント内に、コードを次のようにラップするステートメントがあります。

$define = 'FIX_'.$item->getId().'_'.$result->getTaxId();
if(!defined($define) || constant($define) != true) {
            // code
    define($define, true);
}

例:

if (isset($ratesIdQuoteItemId[$id])) {
    foreach ($ratesIdQuoteItemId[$id] as $quoteItemId) {
        if ($quoteItemId['code'] == $tax['code']) {
            $item = $order->getItemByQuoteItemId($quoteItemId['id']);
            if ($item) {
                $define = 'FIX_'.$item->getId().'_'.$result->getTaxId();
                if(!defined($define) || constant($define) != true) {
                    $data = array(
                        'item_id'       => $item->getId(),
                        'tax_id'        => $result->getTaxId(),
                        'tax_percent'   => $quoteItemId['percent']
                    );
                    Mage::getModel('tax/sales_order_tax_item')->setData($data)->save();
                    define($define, true);
                }
            }
        }
    }
}
于 2012-03-14T15:52:35.537 に答える
2

管理パネルのセクションSales -> Tax -> Manage Tax Rulesに移動し、そこにあるすべてのレコードにゾーンクラスの関係の重複がないか確認してください。

私の場合、税クラス「課税対象商品」を持つ製品のチェックアウト ページで同じエラーが発生し、税規則ではこのクラスに 2 つのエントリがあり、各エントリは同じ税ゾーンでした。そのため、システムは製品に対して同じ税金を 2 回適用しようとしました。

于 2012-12-04T13:37:11.057 に答える