Skip to content

Mass price update vis custom code

I am trying to find code found in a tutorial that would enable me to update all pricing per sku for a specific store id. I am wondering if row 151 the INSERT qyuery shouldn’t that be an update query to update the price and not an insert of a new row into the catalog_product_entity_decimal table?

The error I am getting is
ERROR:: While updating SKU (at0042-63) with Price (177) => SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (6l7tzyfknugxk_stg.catalog_product_entity_decimal, CONSTRAINT CAT_PRD_ENTT_DEC_ROW_ID_CAT_PRD_ENTT_ROW_ID FOREIGN KEY (row_id) REFERENCES catalog_product_entity (row_id) ON DELETE C), query was: INSERT INTO catalog_product_entity_decimal (attribute_id, store_id, row_id, value) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE value=VALUES(value)

Here is the file I am trying to execute:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// Capture warning / notice as exception
set_error_handler('ctv_exceptions_error_handler');
function ctv_exceptions_error_handler($severity, $message, $filename, $lineno) {
if (error_reporting() == 0) {
    return;
}
if (error_reporting() & $severity) {
    throw new ErrorException($message, 0, $severity, $filename, $lineno);
}
}

require __DIR__ . '/../app/bootstrap.php';
$bootstrap = MagentoFrameworkAppBootstrap::create(BP, $_SERVER);

$obj = $bootstrap->getObjectManager();

$state = $obj->get('MagentoFrameworkAppState');
$state->setAreaCode('adminhtml');

function _mpLog($data, $includeSep = false)
{
  $fileName = BP . '/var/log/m2-import-prices.log';
  if ($includeSep) {
    $separator = str_repeat('=', 70);
    file_put_contents($fileName, $separator . '<br />' . PHP_EOL,  FILE_APPEND | LOCK_EX);
 }
file_put_contents($fileName, $data . '<br />' .PHP_EOL,  FILE_APPEND | LOCK_EX);

}

function mpLogAndPrint($message, $separator = false)
{
 _mpLog($message, $separator);
 if (is_array($message) || is_object($message)) {
    print_r($message);
} else {
    echo $message . '<br />' . PHP_EOL;
}

if ($separator) {
    echo str_repeat('=', 70) . '<br />' . PHP_EOL;
}

}

function getIndex($field)

{
global $headers;
$index = array_search($field, $headers);
if ( !strlen($index)) {
$index = -1;
}
return $index;
}

function readCsvRows($csvFile)
{
$rows = [];
$fileHandle = fopen($csvFile, ‘r’);
while(($row = fgetcsv($fileHandle, 0, ‘,’, ‘”‘, ‘”‘)) !== false) {
$rows[] = $row;
}
fclose($fileHandle);
return $rows;
}

function _getResourceConnection()
{
global $obj;
return $obj->get(‘MagentoFrameworkAppResourceConnection’);
}

function _getReadConnection()
{
return _getConnection(‘core_read’);
}

function _getWriteConnection()
{
return _getConnection(‘core_write’);
}

function _getConnection($type = ‘core_read’)
{
return _getResourceConnection()->getConnection($type);
}

function _getTableName($tableName)
{
return _getResourceConnection()->getTableName($tableName);
}

function _getAttributeId($attributeCode)
{
$connection = _getReadConnection();
$sql = “SELECT attribute_id FROM ” . _getTableName(‘eav_attribute’) . ” WHERE entity_type_id = ? AND attribute_code = ?”;
return $connection->fetchOne(
$sql,
[
_getEntityTypeId(‘catalog_product’),
$attributeCode
]
);
}

function _getEntityTypeId($entityTypeCode)
{
$connection = _getConnection(‘core_read’);
$sql = “SELECT entity_type_id FROM ” . _getTableName(‘eav_entity_type’) . ” WHERE entity_type_code = ?”;
return $connection->fetchOne(
$sql,
[
$entityTypeCode
]
);
}

function _getIdFromSku($sku)
{
$connection = _getConnection(‘core_read’);
$sql = “SELECT entity_id FROM ” . _getTableName(‘catalog_product_entity’) . ” WHERE sku = ?”;
return $connection->fetchOne(
$sql,
[
$sku
]
);

}

function checkIfSkuExists($sku)
{
$connection = _getConnection(‘core_read’);
$sql = “SELECT COUNT(*) AS count_no FROM ” . _getTableName(‘catalog_product_entity’) . ” WHERE sku = ?”;
return $connection->fetchOne($sql, [$sku]);
}

function updatePrices($sku, $price, $storeId = 28)
{
$connection = _getWriteConnection();
$entityId = _getIdFromSku($sku);
$attributeId = _getAttributeId(‘price’);

$sql = "INSERT INTO " . _getTableName('catalog_product_entity_decimal') . " (attribute_id, store_id, row_id, value) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE value=VALUES(value)";
$connection->query(
    $sql,
    [
        $attributeId,
        $storeId,
        $entityId,
        $price
    ]
);

}

//
// UTILITY FUNCTIONS – END
/
/

try {
$csvFile = ‘var/import/prices.csv’; #EDIT – The path to import CSV file (Relative to Magento2 Root)
$csvData = readCsvRows(BP . ‘/’ . $csvFile);
$headers = array_shift($csvData);

$count   = 0;
foreach($csvData as $_data) {
    $count++;
    $sku   = $_data[getIndex('sku')];
    $price = $_data[getIndex('price')];

    if ( ! checkIfSkuExists($sku)) {
        $message =  $count .'. FAILURE:: Product with SKU (' . $sku . ') doesn't exist.';
        mpLogAndPrint($message);
        continue;
    }

    try {
        updatePrices($sku, $price);
        $message = $count . '. SUCCESS:: Updated SKU (' . $sku . ') with price (' . $price . ')';
        mpLogAndPrint($message);
    } catch(Exception $e) {
        $message =  $count . '. ERROR:: While updating  SKU (' . $sku . ') with Price (' . $price . ') => ' . $e->getMessage();
        mpLogAndPrint($message);
    }
}

} catch (Exception $e) {
mpLogAndPrint(
‘EXCEPTION::’ . $e->getTraceAsString()
);
}