Después de crear un envío en el área de administración de Magento, aparece el siguiente error en la var/report
carpeta (después de una página de bloqueo predeterminada de Magento) al ver la página de la cuadrícula de órdenes de administración:
Item (Mage_Sales_Model_Order) with the same id "1234" already exist
Puedo deshacerme de este error agregando una cláusula DISTINCT al selector de objetos varien en la app/code/core/Mage/Eav/Model/Entity/Collection/Abstact.php
línea 662. Sin embargo, realmente no quiero hacerlo por varias razones (consultas lentas, edición de archivos principales, etc.).
¿Cuál es la mejor manera de resolver esto mientras se mantiene la integridad de los datos? ¿Debo eliminar el pedido? Agradecería cualquier aporte constructivo, especialmente sobre lo que causaría este conflicto en primer lugar. Gracias.
- editar -
Aquí está el rastro completo de la pila para mayor claridad / para señalar mi estupidez:
a:5:{i:0;s:67:"Item (Mage_Sales_Model_Order) with the same id "1234" already exist";i:1;s:4829:"#0 lib/Varien/Data/Collection/Db.php(576): Varien_Data_Collection->addItem(Object(Mage_Sales_Model_Order))
#1 app/code/core/Mage/Adminhtml/Block/Widget/Grid.php(533): Varien_Data_Collection_Db->load()
#2 app/code/core/Mage/Adminhtml/Block/Sales/Order/Grid.php(61): Mage_Adminhtml_Block_Widget_Grid->_prepareCollection()
#3 app/code/core/Mage/Adminhtml/Block/Widget/Grid.php(626): Mage_Adminhtml_Block_Sales_Order_Grid->_prepareCollection()
#4 app/code/core/Mage/Adminhtml/Block/Widget/Grid.php(632): Mage_Adminhtml_Block_Widget_Grid->_prepareGrid()
#5 app/code/core/Mage/Core/Block/Abstract.php(862): Mage_Adminhtml_Block_Widget_Grid->_beforeToHtml()
#6 app/code/core/Mage/Core/Block/Abstract.php(582): Mage_Core_Block_Abstract->toHtml()
#7 app/code/core/Mage/Core/Block/Abstract.php(526): Mage_Core_Block_Abstract->_getChildHtml('grid', true)
#8 app/code/core/Mage/Adminhtml/Block/Widget/Grid/Container.php(77): Mage_Core_Block_Abstract->getChildHtml('grid')
#9 app/design/adminhtml/default/default/template/widget/grid/container.phtml(36): Mage_Adminhtml_Block_Widget_Grid_Container->getGridHtml()
#10 app/code/core/Mage/Core/Block/Template.php(241): include('/var/www/html/m...')
#11 app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('adminhtml/defau...')
#12 app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView()
#13 app/code/core/Mage/Adminhtml/Block/Template.php(81): Mage_Core_Block_Template->_toHtml()
#14 app/code/core/Mage/Adminhtml/Block/Widget/Container.php(308): Mage_Adminhtml_Block_Template->_toHtml()
#15 app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Adminhtml_Block_Widget_Container->_toHtml()
#16 app/code/core/Mage/Core/Block/Text/List.php(43): Mage_Core_Block_Abstract->toHtml()
#17 app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Core_Block_Text_List->_toHtml()
#18 app/code/core/Mage/Core/Block/Abstract.php(582): Mage_Core_Block_Abstract->toHtml()
#19 app/code/core/Mage/Core/Block/Abstract.php(526): Mage_Core_Block_Abstract->_getChildHtml('content', true)
#20 app/design/adminhtml/default/default/template/page.phtml(74): Mage_Core_Block_Abstract->getChildHtml('content')
#21 app/code/core/Mage/Core/Block/Template.php(241): include('/var/www/html/m...')
#22 app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('adminhtml/defau...')
#23 app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView()
#24 app/code/core/Mage/Adminhtml/Block/Template.php(81): Mage_Core_Block_Template->_toHtml()
#25 app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Adminhtml_Block_Template->_toHtml()
#26 app/code/core/Mage/Core/Model/Layout.php(555): Mage_Core_Block_Abstract->toHtml()
#27 app/code/core/Mage/Core/Controller/Varien/Action.php(390): Mage_Core_Model_Layout->getOutput()
#28 app/code/core/Mage/Adminhtml/controllers/Sales/OrderController.php(95): Mage_Core_Controller_Varien_Action->renderLayout()
#29 app/code/core/Mage/Core/Controller/Varien/Action.php(419): Mage_Adminhtml_Sales_OrderController->indexAction()
#30 app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('index')
#31 app/code/core/Mage/Core/Controller/Varien/Front.php(176): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#32 app/code/core/Mage/Core/Model/App.php(354): Mage_Core_Controller_Varien_Front->dispatch()
#33 app/Mage.php(683): Mage_Core_Model_App->run(Array)
#34 index.php(71): Mage::run('base', 'website')
#35 {main}";s:3:"url";s:72:"/index.php/admin/sales_order/index/key/0b7375aca52608483edc0cf879bd4361/";s:11:"script_name";s:10:"/index.php";s:4:"skin";s:5:"admin";}
fuente
Respuestas:
Agregó algo a la colección, que agrega duplicados al resultado de la consulta.
Lo que hace magento con el resultado de la consulta es generar un objeto a partir de cada fila y luego agregar estos elementos a la colección. Si el elemento ya existe, se genera este error.
Solución: cualquiera que sea la unión que agregue, verifique que su resultado sea distinto.
Si agregó más campos además de los de
sales_flat_order
, estos campos pueden diferir y, por lo tanto, se filtran con la notaDISTINCT
.fuente
Estoy agregando una respuesta ya que aún no puedo agregar un comentario. Estoy de acuerdo con @fabian; sin embargo, desaconsejo el uso de
DISTINCT
yGROUP BY
, por lo general, puede filtrar su unión a un único resultado distinto si planifica correctamente.Por ejemplo (sé que este es un ejemplo trivial):
Si tuviera que recoger un pedido utilizando
sales/flat_order
y se uniera a la dirección de los clientes, hay dos registros almacenados: una dirección de facturación y una dirección de entrega . Para resolver este problema, se puede especificar a qué tipo de dirección desean unirse.Esto suena similar a su situación, excepto que no este escenario.
fuente
También hemos enfrentado algún problema en nuestro sistema. Analizamos el problema y encontramos mi
Grid.php
(ejemplo: /namespace/modulename/Block/Adminhtml/Sales/Order/Grid.php)Hemos encontrado la
_prepareCollection()
función en elGrid.php
archivo.Los códigos de error son:
Solución:
Tenemos uso
->group('value')
en la función de filtro. Ahora funciona bien ... !!!fuente
Sé que esta es una pregunta antigua y ya ha sido respondida, pero quiero agregar mi respuesta porque siento que podría ayudar a otros que enfrentan problemas similares. Estoy tratando de explicar las causas generales de este tipo de error.
Para empezar,
Mage_Sales_Model_Order
en una instalación estándar de Magento nunca se debe dar ese error. Por lo tanto, sospecho que este error es causado por una extensión de terceros (observador, método de enlace, reescritura, etc.) o una personalización de código incorrecta que corrompió los datos en primer lugar. Cuando se habla de componentes centrales que actúan de forma "extraña", ladistinct
solución ni siquiera debería existir porque los datos nunca deberían haberse corrompido en primer lugar. Mejor arregle los datos primero que cambiar el código.Me enfrenté a un problema similar cuando construí un tipo de entidad EAV personalizado y todo funcionó bien hasta que edité una de las entidades. De alguna manera, la edición resultó en un valor duplicado para uno de los atributos de texto de la entidad, es decir, dos filas en la tabla de valores de texto para el mismo atributo de la misma entidad. Las consultas sin procesar solo en la tabla custom_entity se veían perfectamente bien sin duplicados (¿cómo podría ser? La restricción de clave principal ya garantizaba la integridad), por lo que el problema estaba en otro lugar.
Como ya habrás adivinado al cargar la colección, debido a las uniones utilizadas para recuperar las filas de la base de datos y considerando que había dos mismos valores de texto para el mismo atributo de una entidad, recuperó dos filas con el mismo
entity_id
valor pero diferentesvalue_id
.Como regla general, cuando se produce un error de este tipo, debe sospechar que los datos de la base de datos ya se han dañado o que las uniones que tienen lugar en la consulta final recuperarán dos filas casi exactas de la base de datos, duplicando el identificador único de la colección artículos.
Espero que esto ayude.
PD: En cuanto a por qué el valor de texto eav duplicado en mi caso, verifique el comentario de Marius aquí http://inchoo.net/magento/creating-an-eav-based-models-in-magento/
fuente
Este es mi código que funciona bien después de tener el mismo problema:
He agregado -> group ('entity_id') para resolver el problema.
fuente
tienes que intentar anular lo
Mage_Sales_Model_Resource_Order_Grid_Collection::addItem
que arroja esta excepción:fuente