Kaynağa Gözat

fixed sql join in ZamZlec.netto

Piotr Labudda 9 yıl önce
ebeveyn
işleme
b8e7fe96c8

+ 28 - 4
SE/schema/gui/company/biuro_pro_netmedia_pl/default_db.crm_lista_zasobow_orders.php

@@ -5,12 +5,36 @@ class Schema__biuro_pro_netmedia_pl__default_db__crm_lista_zasobow_orders extend
 	public function initTypes() {
 		parent::initTypes();
 		$this->_types['NETTO'] = 'p5:alias';
+		// $this->_params['NETTO'] = [
+		// 	'type' => 'sql_table_alias',
+		// 	'local_join_key' => 'ID',
+		// 	// 'remote_table_name' => 'CRM_LISTA_ZASOBOW_ORDERS_summary_view',
+		// 	'remote_table_name' => "
+		// 		(
+		// 			SELECT o.ID
+		// 				, SUM( COALESCE(f.OFFER_QUANTITY, 0) * COALESCE(f.OFFER_PRICE_PER_UNIT, 0) ) as SUM_POS
+		// 			FROM `CRM_LISTA_ZASOBOW_ORDERS` o
+		// 				LEFT JOIN `CRM_LISTA_ZASOBOW_OFFERS` f on(f.ID_ORDER = o.ID and (f.A_STATUS is null or f.A_STATUS != 'DELETED'))
+		// 			GROUP BY o.`ID`
+		// 		)
+		// 	",
+		// 	'remote_join_key' => 'ID',
+		// 	'remote_column_value' => 'SUM_POS',
+		// 	'format' => '<span style="text-align:right">{0}</span>',
+		// ];
 		$this->_params['NETTO'] = [
-			'type' => 'sql_table_alias',
+			'type' => 'sql_query_alias',
 			'local_join_key' => 'ID',
-			'remote_table_name' => 'CRM_LISTA_ZASOBOW_ORDERS_summary_view',
-			'remote_join_key' => 'ID',
-			'remote_column_value' => 'SUM_POS',
+			'join_query_format' => "
+				SELECT o.ID
+					, SUM( COALESCE(f.OFFER_QUANTITY, 0) * COALESCE(f.OFFER_PRICE_PER_UNIT, 0) ) as remote_value
+				FROM `CRM_LISTA_ZASOBOW_ORDERS` o
+					LEFT JOIN `CRM_LISTA_ZASOBOW_OFFERS` f on(f.ID_ORDER = o.ID and (f.A_STATUS is null or f.A_STATUS != 'DELETED'))
+				WHERE o.ID in(
+					{sql_in_local_join_key}
+				)
+				GROUP BY o.`ID`
+			",
 			'format' => '<span style="text-align:right">{0}</span>',
 		];
 		$this->_types['APPROVE_STATUS'] = 'p5:string';

+ 60 - 36
SE/se-lib/TableAjax.php

@@ -6191,10 +6191,16 @@ jQuery(document).ready(function(){
 					$aliasType = $acl->getXsdFieldParam($fieldName, 'type');// 'type' => 'sql_table_alias',
 					if ('sql_table_alias' == $aliasType) {
 						$p5Alias[$fieldName] = (array)$conf;
+						$p5Alias[$fieldName]['type'] = 'sql_table_alias';
 						$p5Alias[$fieldName]['local_join_key'] = $acl->getXsdFieldParam($fieldName, 'local_join_key');// 'local_join_key' => 'ID',
 						$p5Alias[$fieldName]['remote_table_name'] = $acl->getXsdFieldParam($fieldName, 'remote_table_name');// 'remote_table_name' => 'CRM_LISTA_ZASOBOW_ORDERS_summary_view',
 						$p5Alias[$fieldName]['remote_join_key'] = $acl->getXsdFieldParam($fieldName, 'remote_join_key');// 'remote_join_key' => 'ID',
 						$p5Alias[$fieldName]['remote_column_value'] = $acl->getXsdFieldParam($fieldName, 'remote_column_value');// 'remote_column_value' => 'SUM_POS',
+					} else if ('sql_query_alias' == $aliasType) {
+						$p5Alias[$fieldName] = (array)$conf;
+						$p5Alias[$fieldName]['type'] = 'sql_query_alias';
+						$p5Alias[$fieldName]['local_join_key'] = $acl->getXsdFieldParam($fieldName, 'local_join_key');
+						$p5Alias[$fieldName]['join_query_format'] = $acl->getXsdFieldParam($fieldName, 'join_query_format');
 					}
 				}
 			}
@@ -6204,48 +6210,66 @@ jQuery(document).ready(function(){
 				$sqlLocalTableName = $acl->getRootTableName();
 				$primaryKeyField = $acl->getPrimaryKeyField();
 				foreach ($p5Alias as $fieldName => $conf) {
-					$localKeys = [];
-					$localKeyName = V::get('local_join_key', '', $conf);
-					if ($localKeyName) {
-						if (!array_key_exists($localKeyName, $localKeys)) {
-							$localKeys[$localKeyName] = [];
-							foreach ($items as $item) {
-								$keyLocal = V::get($localKeyName, 0, $item);
-								if ($keyLocal) $localKeys[$localKeyName][] = DB::getPDO()->quote($keyLocal, PDO::PARAM_STR);
+					$aliasValuesRaw = [];
+
+					if ('sql_table_alias' == $conf['type']) {
+						$localKeys = [];
+						$localKeyName = V::get('local_join_key', '', $conf);
+						if ($localKeyName) {
+							if (!array_key_exists($localKeyName, $localKeys)) {
+								$localKeys[$localKeyName] = [];
+								foreach ($items as $item) {
+									$keyLocal = V::get($localKeyName, 0, $item);
+									if ($keyLocal) $localKeys[$localKeyName][] = DB::getPDO()->quote($keyLocal, PDO::PARAM_STR);
+								}
+							}
+							if(V::get('DBG', '', $_GET)){$jsonData->__DBG__['$localKeys'] = $localKeys;}
+							if (!empty($localKeys[$localKeyName])) {
+								$sqlRemoteTable = V::get('remote_table_name', '', $conf);
+								$sqlRemoteValueFieldName = V::get('remote_column_value', '', $conf);
+								$sqlRemoteKeyName = V::get('remote_join_key', '', $conf);
+								$sqlLocalKeyName = $acl->getSqlFieldName($localKeyName);
+								$aliasValuesRaw = DB::getPDO()->fetchAllByKey("
+									select r.{$sqlRemoteKeyName} as {$sqlLocalKeyName}, r.{$sqlRemoteValueFieldName} as remote_value
+									from {$sqlRemoteTable} r
+									where r.{$sqlRemoteKeyName} in(" . implode(",", $localKeys[$localKeyName]) . ")
+								", $sqlLocalKeyName);
+								if(V::get('DBG', '', $_GET)){$jsonData->__DBG__['$aliasValuesRaw'][$fieldName] = $aliasValuesRaw;}
+							}
+						}
+					} else if ('sql_query_alias' == $conf['type']) {
+						$localKeys = [];
+						$localKeyName = V::get('local_join_key', '', $conf);
+						$sqlFormat = V::get('join_query_format', '', $conf);
+						if ($localKeyName && $sqlFormat) {
+							if (!array_key_exists($localKeyName, $localKeys)) {
+								$localKeys[$localKeyName] = [];
+								foreach ($items as $item) {
+									$keyLocal = V::get($localKeyName, 0, $item);
+									if ($keyLocal) $localKeys[$localKeyName][] = DB::getPDO()->quote($keyLocal, PDO::PARAM_STR);
+								}
 							}
 						}
-						if(V::get('DBG', '', $_GET)){$jsonData->__DBG__['$localKeys'] = $localKeys;}
 						if (!empty($localKeys[$localKeyName])) {
-							$sqlRemoteTable = V::get('remote_table_name', '', $conf);
-							$sqlRemoteValueFieldName = V::get('remote_column_value', '', $conf);
-							$sqlRemoteKeyName = V::get('remote_join_key', '', $conf);
+							$sql = str_replace('{sql_in_local_join_key}', implode(",", $localKeys[$localKeyName]), $sqlFormat);
 							$sqlLocalKeyName = $acl->getSqlFieldName($localKeyName);
-							$aliasValuesRaw = DB::getPDO()->fetchAllByKey("
-								select r.{$sqlRemoteKeyName} as {$sqlLocalKeyName}, r.{$sqlRemoteValueFieldName} as remote_value
-								from {$sqlRemoteTable} r
-								where r.{$sqlRemoteKeyName} in(" . implode(",", $localKeys[$localKeyName]) . ")
-							", $sqlLocalKeyName);
-							if(V::get('DBG', '', $_GET)){$jsonData->__DBG__['SQL__$aliasValuesRaw'][$fieldName] = "
-								select r.{$sqlRemoteKeyName} as {$sqlLocalKeyName}, r.{$sqlRemoteValueFieldName} as remote_value
-								from {$sqlRemoteTable} r
-								where r.{$sqlRemoteKeyName} in(" . implode(",", $localKeys[$localKeyName]) . ")
-							";}
-							if(V::get('DBG', '', $_GET)){$jsonData->__DBG__['$aliasValuesRaw'][$fieldName] = $aliasValuesRaw;}
-							if (!empty($aliasValuesRaw)) {
-								if(V::get('DBG_P5', '', $_GET)){echo '{ "$aliasValuesRaw": '.json_encode($aliasValuesRaw).', "dbg": [' . "\n";}
-								array_walk($items, function (&$item) use ($fieldName, $sqlLocalKeyName, $aliasValuesRaw) {
-									$sqlValue = V::get($sqlLocalKeyName, null, $item);
-									if(V::get('DBG_P5', '', $_GET)){echo '{ "sqlValue": "'.$sqlValue.'", "remote_value": "'.$aliasValuesRaw[$sqlValue]['remote_value'].'", "item": '.json_encode($item) . '},' . "\n";}
-									if ($sqlValue !== null && array_key_exists($sqlValue, $aliasValuesRaw)) {
-										if(V::get('DBG_P5', '', $_GET)){echo '{ "TODO_update_value": "'.$aliasValuesRaw[$sqlValue]['remote_value'].'"},' . "\n";}
-										$item[$fieldName] = $aliasValuesRaw[$sqlValue]['remote_value'];
-										if(V::get('DBG_P5', '', $_GET)){echo '{ "TODO_updated_value": "'.$item[$fieldName].'"},' . "\n";}
-									}
-								});
-								if(V::get('DBG_P5', '', $_GET)){echo "\n".'{}]}';die();}
-							}
+							$aliasValuesRaw = DB::getPDO()->fetchAllByKey($sql, $sqlLocalKeyName);
 						}
 					}
+					DBG::log($aliasValuesRaw, 'array', '$aliasValuesRaw');
+					if (!empty($aliasValuesRaw)) {
+						if(V::get('DBG_P5', '', $_GET)){echo '{ "$aliasValuesRaw": '.json_encode($aliasValuesRaw).', "dbg": [' . "\n";}
+						array_walk($items, function (&$item) use ($fieldName, $sqlLocalKeyName, $aliasValuesRaw) {
+							$sqlValue = V::get($sqlLocalKeyName, null, $item);
+							if(V::get('DBG_P5', '', $_GET)){echo '{ "sqlValue": "'.$sqlValue.'", "remote_value": "'.$aliasValuesRaw[$sqlValue]['remote_value'].'", "item": '.json_encode($item) . '},' . "\n";}
+							if ($sqlValue !== null && array_key_exists($sqlValue, $aliasValuesRaw)) {
+								if(V::get('DBG_P5', '', $_GET)){echo '{ "TODO_update_value": "'.$aliasValuesRaw[$sqlValue]['remote_value'].'"},' . "\n";}
+								$item[$fieldName] = $aliasValuesRaw[$sqlValue]['remote_value'];
+								if(V::get('DBG_P5', '', $_GET)){echo '{ "TODO_updated_value": "'.$item[$fieldName].'"},' . "\n";}
+							}
+						});
+						if(V::get('DBG_P5', '', $_GET)){echo "\n".'{}]}';die();}
+					}
 				}
 			}
 		}