ম্যাজেন্টো সংগ্রহে "থাকা" ব্যবহার করে ইস্যু করুন


20

আমি ম্যাজেন্টো অ্যাডমিন মডিউলে একটি গ্রিডের জন্য একটি কাস্টম সংগ্রহ তৈরির চেষ্টা করছি। আমি "অ্যাডঅ্যাট্রিবিউটহ্যাভিং" নামে একটি নতুন সংগ্রহের পদ্ধতি তৈরি করেছি যা কেবল নিম্নলিখিতটি করে:

public function addAttributeHaving($value)
{
    $this->getSelect()->having($value);
    return $this;
}

সংগ্রহের কোডটি দেখুন:

$collection->addFieldToSelect(
    array(
        'entity_id',
        'created_at',
        'increment_id',
        'customer_email',
        'customer_firstname',
        'customer_lastname',
        'grand_total',
        'status'
    )
);

$collection->getSelect()->joinLeft(array('sfop' => 'sales_flat_order_payment'), 'main_table.entity_id = sfop.parent_id', 'sfop.amount_authorized');
$collection->getSelect()->columns('sum(sfop.amount_authorized) AS AUTHD');
$collection->getSelect()->columns('grand_total - sum(sfop.amount_authorized) AS DIF_AU');
$collection->addFieldToFilter('main_table.state', array('in' => array('new','payment_review')));
$collection->addFieldToFilter('main_table.sd_order_type', array('neq' => 7));
$collection->addFieldToFilter('sfop.method', array('neq' => 'giftcard'));
$collection->addFieldToFilter('main_table.created_at', array('gt' => $this->getFilterDate()));
$collection->getSelect()->group(array('main_table.entity_id'));
$collection->addAttributeHaving('DIF_AU <> 0');
$collection->load(true,true);

$this->setCollection($collection);

এটি নিম্নলিখিত এসকিউএল উত্পাদন করে যা পুরোপুরি সূক্ষ্মভাবে কার্যকর করে এবং ম্যাজেন্টোর বাইরে দৌড়ালে প্রত্যাশিত ফলাফল দেয়।

[METHOD=Varien_Data_Collection_Db->printLogQuery] SELECT `main_table`.`entity_id`, `main_table`.`entity_id`, `main_table`.`created_at`, `main_table`.`increment_id`, `main_table`.`customer_email`, `main_table`.`customer_firstname`, `main_table`.`customer_lastname`, `main_table`.`grand_total`, `main_table`.`status`, `sfop`.`amount_authorized`, sum(sfop.amount_authorized) AS `AUTHD`, grand_total - sum(sfop.amount_authorized) AS `DIF_AU` FROM `sales_flat_order` AS `main_table` LEFT JOIN `sales_flat_order_payment` AS `sfop` ON main_table.entity_id = sfop.parent_id WHERE (main_table.state in ('new', 'payment_review')) AND (main_table.sd_order_type != 7) AND (sfop.method != 'giftcard') AND (main_table.created_at > '2013-04-07') GROUP BY `main_table`.`entity_id` HAVING (DIF_AU <> 0)

যাইহোক, আমি যখন ম্যাজেন্টোর ভিতরে গ্রিডটি লোড করার চেষ্টা করি তখন আমি নিম্নলিখিত ত্রুটিটি পাই:

এসকিউএলসেট [42 এস 22]: কলামটি পাওয়া যায় নি: 1054 অজানা কলাম 'ডিআইএফ_এইউ' 'ক্লজ থাকার কারণে'

অধিকন্তু, আমি যদি এই ধারাটি অপসারণ করি (যা আমার ফলাফলগুলিকে ভেঙে দেয়), আমি গ্রিডে একটি ডেটাসোর্সের জন্য DIF_AU কলামটি ব্যবহার করতে সক্ষম হয়েছি।


1
আপডেট: আমি পিতামাতার getSelectCountSQL () পদ্ধতিতে সমস্যাটি সন্ধান করতে সক্ষম হয়েছি। সংগ্রহের গণনা পাওয়ার চেষ্টা করার সময় সমস্যাটি এখানেই ঘটেছিল।
অ্যান্টনি লিচ জুনিয়র

1
একটি উত্তর পোস্ট করুন! ডাব্লুএইচটি কি sd_order_typeআসছে?
বেনমার্ক

1
শীর্ষ গোপন কাস্টম অর্ডার টাইপ স্টাফ যা ফ্ল্যাট টেবিলগুলিতে যুক্ত করা হয়েছে। আমি এখনও উত্তর খুঁজে কাজ করছি।
অ্যান্টনি লিচ জুনিয়র

1
"10 টিরও কম খ্যাতি সম্পন্ন ব্যবহারকারীরা জিজ্ঞাসা করার পরে 8 ঘন্টা তাদের নিজস্ব প্রশ্নের উত্তর দিতে পারবেন না You ঘন্টা আপনি উত্তর দিতে পারেন then ততক্ষণ দয়া করে মন্তব্যগুলি ব্যবহার করুন বা পরিবর্তে আপনার প্রশ্নটি সম্পাদনা করুন।" (সমাধান 7 ঘন্টা আসতে হবে)।
অ্যান্টনি লিচ জুনিয়র

1
কেউ এই ব্যক্তিকে একটি
উত্সাহ দিন

উত্তর:


12

আমি এখানে আসলে আমার নিজের প্রশ্নের উত্তর দিতে যাচ্ছি। আমি জানি, কৃপণ, তবে সত্যিকারের স্ট্যাক ট্রেসের দিকে তাকিয়ে যখন আমি উত্তরটি হোঁচট খেয়েছি। সংগ্রহটি সূক্ষ্মভাবে লোড হচ্ছে, কার্যকর হওয়ার পরে একটু পরে ব্যর্থতা আসে যখন আমরা ভেরেন_ডাটা_কলেকশন_ডিবি :: getSelectCountSql () এ সংগ্রহের গণনা পাওয়ার চেষ্টা করি । এটি থেকে উত্পাদিত এসকিউএল হ'ল:

SELECT COUNT(*) FROM sales_flat_order AS main_table LEFT JOIN sales_flat_order_payment AS sfop ON main_table.entity_id = sfop.parent_id WHERE (main_table.state in ('payment_review')) AND (main_table.sd_order_type != 7) AND (sfop.method != 'giftcard') AND (main_table.created_at > '2013-04-07') GROUP BY main_table.entity_id HAVING (DIF_AU <> 0)

আপনি লক্ষ্য করবেন যে HAVING স্টেটমেন্টটি সংযুক্ত রয়েছে তবুও আমাদের আর ডিআইএফ_এইউ কলামের সংজ্ঞা নেই। এটি উপস্থিত হিসাবে মনে হচ্ছে সঠিক রেকর্ড গণনা পাওয়ার জন্য আমার সংগ্রহ শ্রেণিতে একটি কাস্টম getSelectCountSql () প্রসারিত করতে হবে।

আমি কাস্টম সংগ্রহ শ্রেণিতে একটি বর্ধিত getSelectCountSQL () তৈরি করেছি যা বিবৃতি দেওয়ার জন্য প্রয়োজনীয় অনুপস্থিত কলামে আবার যুক্ত করে।


public function getSelectCountSql()
  {
    $countSelect = parent::getSelectCountSql();
    $countSelect->columns('grand_total - sum(sfop.amount_authorized) AS DIF_AU');
    $countSelect->reset(Zend_Db_Select::GROUP);
    return $countSelect;
  }

1
মোটেও কঠিন নয়… আপনি যদি সমাধানটি প্রথমে বের করেন তবে তা উত্সাহিত। অন্যরা সম্ভবত এটি রাস্তায় সহায়ক বলে মনে করবে। +1 :)
ডেভিডালগার

আপনার একটি বাগ রিপোর্ট ফাইল করা উচিত! magentocommerce.com/bug-tracking
বেনমার্কস

এটি আমি দেখেছি এমন একটি সমস্যা এবং একটি উত্তর খুঁজে বের করতে ভালই হয়েছে। তবে আপনার সমাধানটি সঠিক বলে আমি মনে করি না - কারণ আপনি গ্রুপটি ব্যবহার করছেন তাই আপনার সিলেক্টকাউন্টএসএইচএলকে গ্রুপের সংখ্যা ফিরিয়ে দেওয়া দরকার। সুতরাং আপনার হয় একটি গণনা প্রয়োজন (ফেচআল ()), অথবা এর count(distinct main_table.entity_id)পরিবর্তে আপনার কোয়েরিটি পুনরায় লেখার জন্যcount(*)
বেনুবার্ড

আমি মনে করি আপনি খুব সম্ভবত সঠিক। এই পোস্টিংয়ের পরে এই প্রকল্পটি ব্যাক বার্নারে রয়েছে, এবং এখনই এটিতে ফিরে আসছে। গত সপ্তাহে একটি ডেমোতে, আমি লক্ষ্য করেছি যে গ্রিডে ভুল রেকর্ড গণনা জানা গেছে। আমি আমার সমাধানগুলি সমাধান করার পরে তা পুনরায় রিপোর্ট করব।
অ্যান্টনি লিচ জুনিয়র

@ অ্যান্থনিলেচ জির আপনার সন্ধানের কোনও সংবাদ?
সাইমন

0

প্রথমত $countSelect->reset(Zend_Db_Select::HAVING);এটি HAVINGআপনার সংগ্রহ থেকে পুনরায় সেট হবে । তার মানে এটি থাকার ধারাটি সরিয়ে ফেলবে। এবং এটি আপনি চান তা নয়। আপনি এটি সংগ্রহে যোগ করতে চাইতে পারেন ( app/code/core/Mage/Catalog/Model/Resource/Product/Collection.php->_getSelectCountSql()এখানে)

তবে মূল অপরাধী এটি getSize()পদ্ধতিতে যা lib/Varien/Data/Collection/Db.phpফাইলটিতে বিদ্যমান ।

আমি @ অ্যান্টনি দ্বারা উল্লিখিত উপরের সমাধানটি চেষ্টা করেছিলাম কিন্তু এটি কার্যকর হয়নি।

এখন আমি নীচে করলাম।

public function getSize()
{
    if (is_null($this->_totalRecords)) {
        //$sql = $this->getSelectCountSql();
        $sql = $this->getSelect();
        $this->_totalRecords = count($this->getConnection()->fetchAll($sql, $this->_bindParams));
    }
    return intval($this->_totalRecords);
}

আমি এমনকি ব্যবহার করছি না পরীক্ষা করুন getSelectCountSql()। আমি কেবল পুরো এসকিউএল QUERY পড়ছি এবং সমস্ত ডেটা আনছি এবং এর গণনা ফিরিয়ে দিচ্ছি । এখানেই শেষ.


0

আমি এই সমস্যাটি এখানে স্থির করেছি: অ্যাপ / কোড / কোর / ম্যাজ / ক্যাটালগ / মডেল / রিসোর্স / পণ্য / সংগ্রহ.পিএপিপি: 943 এটি যুক্ত করুন: $ নির্বাচন করুন-> পুনরায় সেট করুন (জেনড_ডিবি_স্লেট :: হ্যাভিং);

অ্যাপ / কোড / কোর / ম্যাগ / ক্যাটালগ / মডেল / রিসোর্স / প্রোডাক্ট / কালেকশন.এফপি অ্যাপ্লিকেশন / কোড / লোকাল / ম্যাজ / ক্যাটালগ / মডেল / রিসোর্স / প্রোডাক্ট / কালেকশন.এফপি অনুলিপি করুন

আমার কোডটি এখন এ জাতীয় দেখাচ্ছে:

/**
 * Build clear select
 *
 * @param Varien_Db_Select $select
 * @return Varien_Db_Select
 */
protected function _buildClearSelect($select = null)
{
    if (is_null($select)) {
        $select = clone $this->getSelect();
    }
    $select->reset(Zend_Db_Select::ORDER);
    $select->reset(Zend_Db_Select::LIMIT_COUNT);
    $select->reset(Zend_Db_Select::LIMIT_OFFSET);
    $select->reset(Zend_Db_Select::COLUMNS);
    $select->reset(Zend_Db_Select::HAVING);

0

আপনার সিলেক্টের অনন্য কলামের নাম থাকলে এই সমাধানটি কাজ করবে কারণ সাবকিউরি সিলেক্ট তালিকার যে কোনও কলামে অনন্য নাম থাকতে হবে

সাবকিউরি: টেবিল সাবকিউরিটি নকল কলামের নামগুলিকে মঞ্জুরি দেয়

public function getSelectCountSql()
{
    $this->_renderFilters();
    $select = clone $this->getSelect();
    $select->reset(Zend_Db_Select::ORDER);
    $select->reset(Zend_Db_Select::LIMIT_COUNT);
    $select->reset(Zend_Db_Select::LIMIT_OFFSET);        

    $countSelect = clone $this->getSelect();
    $countSelect->reset();
    $countSelect->from(array('a' => $select), 'COUNT(*)');
    return $countSelect;
}

PS: এই উত্তরটি সাধারণ ম্যাজেন্টো সংগ্রহের জন্য। শুধুমাত্র পণ্য সংগ্রহের সাথে সম্পর্কিত নয়।


0

এটি কাজ করছে

পাবলিক ফাংশন getSize () {যদি (is_null ($ এটি -> _ মোট রেকর্ডস)) {// $ sql = $ this-> getSelectCountSQL (); $ sql = $ this-> getSelect (); $ এটি -> _ মোট রেকর্ডস = গণনা ($ এটি-> getConnication () -> ফেচআল ($ বর্গ, $ এটি -> _ বাইন্ডপ্যারাম)); int প্রত্যাবর্তন পূর্বে ($ এটি -> _ মোট রেকর্ডস); }

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.