Функции работы с записями
#21
Отправлено 22 Август 2013 - 08:50
#22
Отправлено 22 Август 2013 - 10:26
CbCoder (22 Август 2013 - 08:50) писал:
Зы. Столкнулся, отправил заявку в техподдержку, но на всякий случай продублирую последовательность действий. Есть функция во внешнем файле.
/** * Устанавливает значение для поля "Статус комплектующего" в таблицах категории "Комплектующие". * Статус комплектующего может быть: Установлен и Свободен. Установлен - если комплектующее уже * установлено в каком-либо ПК (Компьютеры-ПК) и свободоен - если нигде не установлено. * Основная цель функции устанавливать статус комплектующего при установке и снятии, не дать установить * в разные ПК одно и тоже комплектующее * * @author WonderTalik * @date 21/08/13 * @param $idConNameState int айди поле связи в таблице ПК * @param $idFnameState int айди поля "Статус комплектующего" комплектующего в таблице * @param $table_id_w int айди таблицы комплектующего */ function change_item_pc($idConNameState, $idFnameState, $table_id_w) { global $line, $table, $event; $statemenent_w = $line['f'.$idConNameState]['f'.$idFnameState]; echo "Статус комплектующего: ".$statemenent_w."<br>"; //Если поле заполняется впервые if (empty($event['changed'][$idConNameState]['old'])) { //Если комплектующие все еще свободное if ($statemenent_w == "Свободен") { $line['f'.$idConNameState]['f'.$idFnameState] = "Установлен"; } elseif ($statemenent_w == "Установлен") { //если комплектующее уже установлено $line['f'.$idConNameState] = ""; } } else { if ($statemenent_w == "Свободен") { //Обновляем статус комплектующего старой позиции data_update($table_id_w, array("f".$idFnameState => "Свободен"), "`id` =" . intval($event['changed'][$idConNameState]['old'])); data_update($table_id_w, array("f".$idFnameState => "Установлен"), "`id` =" . intval($event['changed'][$idConNameState]['new'])); } elseif ($statemenent_w == "Установлен") { // Обновляем поле "ОЗУ" прямым запросом, чтобы вычисление рекурсивно не сработало. data_update($table['id'], array("f".$idConNameState => $event['changed'][$idConNameState]['old']), "`id`=", $line['id']); } } }
Добавляю вычисление в поле, срабатывает при его изменении:
//Подробности смотрим в внешнем файле функций change_item_pc(991, 2801, 151);
Выводит:
Статус комплектующего: 1
Добавляю код в это вычисление после вызова функции:
//Подробности смотрим в внешнем файле функций change_item_pc(991, 2801, 151); //айди поля связи $idConNameState = 991; //айди поля статус комплектующего $idFnameState = 2801; //айди таблицы ОЗУ $table_id_w = 151; $statemenent_w = $line['f'.$idConNameState]['f'.$idFnameState]; echo $statemenent_w."<br>";
И вот тут начинаются непонятки. То выводится айди строки, то выводится "Установлен".
Статус комплектующего: 2 2Потом добавляю такой код:
//Подробности смотрим в внешнем файле функций change_item_pc(991, 2801, 151); $statemenent_w = $line['f991']['f2801']; echo "<br>".$statemenent_w."<br>"; //айди поля связи $idConNameState = 991; //айди поля статус комплектующего $idFnameState = 2801; //айди таблицы ОЗУ $table_id_w = 151; $statemenent_w = $line['f'.$idConNameState]['f'.$idFnameState]; echo "<br>".$statemenent_w."<br>";B вот здесь тогда уже все статемент уже содержат значение, а не айди.
Статус комплектующего: Свободен Свободен Свободен
Сообщение отредактировал wondertalik: 22 Август 2013 - 10:52
#23
Отправлено 22 Август 2013 - 10:52
#24
Отправлено 27 Август 2013 - 17:01
#26
Отправлено 02 Октябрь 2013 - 00:56
require_once("backup/dev/debug.php"); //Определяем айди строки изменяемой позиции в таблице Партии и айди строки в таблице Склад $sqlQuery = "SELECT `id` as id_part, `f1106` as id_sklad, `f1109` as price_rub, `f1346` as price_usd, `f1347` as price_eur, `f1110` as count FROM " . DATA_TABLE . "86 WHERE `status` = 0 AND `f1348` = 'Расход' AND `f2030`=" . intval($line['id']) . " LIMIT 1"; $result = sql_query($sqlQuery) or die(mysql_error() . "<br>" . $sqlQuery); $row = mysql_fetch_assoc($result); $lie['Цена РУБ'] = round($line['f1146']['f1359']*$line['f1354']/$line['f1146']['f1360'],2); $lie['Цена EUR'] = round($line['f1146']['f1361']*$line['f1354']/$line['f1146']['f1360'],2); T::prtw($line);
$line выглядит так:
Array ( [id] => 2288 [user_id] => 3 [add_time] => 2013-09-24 23:03:29 [status] => 0 [f1146] => Array ( [id] => 1841 [user_id] => 3 [add_time] => 2013-09-24 23:03:29 [status] => 0 [f1127] => 1728 [f1128] => 2013-09-24 00:00:00 [f1129] => 1382 [f1130] => 2096.85 [f1131] => 1 [f1164] => [f1165] => 0 [f1351] => account [f1352] => 65.80 [f1353] => 48.75 [f1358] => x61hmdk [f1359] => 43.02 [f1360] => 1.35 [f1361] => 1.00 [f1365] => Нет [f1367] => В расходе [f2861] => 49.10 [f2871] => 4.05 [f2881] => 1.25 [r] => 1 [u] => 0 [raw] => 1841 ) [f1149] => 419.37 [f1150] => 5 [f1151] => 2096.85 [f1354] => 13.16 [f1355] => 9.75 [f1356] => 65.80 [f1357] => 48.75 [f1362] => В расходе [f1363] => 1 [f1366] => 3396 [f1384] => Импорт [f2891] => 2013-09-24 00:00:00 [f2901] => x61hmdk [f3211] => 117 [f3231] => 49.10 [f3241] => 4.05 [f3251] => 1.25 [r] => 1 [u] => 0 )
В тоже время помещаю код в файл, в редакторе добавляю только строку:
require_once("backup/dev/rechange_rasxod.php");
и $line уже не содержит массивы связанных строк. Что я делаю не так?
Array ( [id] => 2288 [user_id] => 3 [add_time] => 2013-09-24 23:03:29 [status] => 0 [f1146] => 1841 [f1149] => 419.37 [f1150] => 5 [f1151] => 2096.85 [f1354] => 13.16 [f1355] => 9.75 [f1356] => 65.80 [f1357] => 48.75 [f1362] => В расходе [f1363] => 1 [f1366] => 3396 [f1384] => Импорт [f2891] => 2013-09-24 00:00:00 [f2901] => x61hmdk [f3211] => 117 [f3231] => 49.10 [f3241] => 4.05 [f3251] => 1.25 [r] => 1 [u] => 0 )
#27
Отправлено 02 Октябрь 2013 - 09:51
// Используются следующие поля связи: $line[f1146][f1127]
Либо не использовать автоматический переход по полям связи, и разворачивать их самостоятельно в вычислениях.
#28
Отправлено 02 Октябрь 2013 - 11:10
Analitic (02 Октябрь 2013 - 09:51) писал:
// Используются следующие поля связи: $line[f1146][f1127]
Либо не использовать автоматический переход по полям связи, и разворачивать их самостоятельно в вычислениях.
$line['f1146']['f1359']*$line['f1354']/$line['f1146']['f1360']этой строки в внешнем файле не достаточно для разворачивания поля связи? и нужно обозначить его комментарием
// Используются следующие поля связи: $line[f1146][f1359] $line['f1146']['f1359']*$line['f1354']/$line['f1146']['f1360']
Сообщение отредактировал Analitic: 02 Октябрь 2013 - 11:14
#29
Отправлено 02 Октябрь 2013 - 11:15
Для того чтобы во внешнем файле использовать развернутые $line. Нужно обозначить строку в самом вычислении. Как уже написал выше обозначение может быть в комментарии.
#30
Отправлено 02 Октябрь 2013 - 13:54
Цитата
Для срабатывания напоминания при добавлении/изменении строк через вычисления посредством функций data_update(), data_inser() и т.п., необходимо присваивать системным полям u (флаг изменённой записи) и r (флаг новой записи) значение "1".
Пример (добавление записи):
$insert_data['f345'] = "ООО Компания";
$insert_data['u'] = 1;
$insert_data['r'] =1;
data_insert(21, $insert_data);
Пример (изменение записи):
$update_data['f345'] = "Компания 2";
$update_data['u'] = 1;
data_update(21, $update_data);
А если я использую EVENTS_ENABLE, получается что вычисления сработают, в зависимости от добавления или обновления записи и в тоже время мне вручную еще нужно для напоминаний u и(или) r править? Я все правильно понимаю?
#31
Отправлено 02 Октябрь 2013 - 14:01
wondertalik (02 Октябрь 2013 - 13:54) писал:
Сообщение отредактировал andibrag: 03 Октябрь 2013 - 08:34
Творческая группа "ТАВР".
www.TAVR.pro Художественная ковка, металлоконструкции.
www.СтолМет.рф Складные столы, стулья и системы для их хранения
#32
Отправлено 06 Февраль 2014 - 02:05
function all_sum_uan($tableID, $lineID, $tableIDParent) { $sqlQuery = "SELECT * FROM ".DATA_TABLE.$tableID." WHERE `id` = ".intval($lineID)." LIMIT 1"; $result = sql_query($sqlQuery); if(sql_num_rows($result) > 0) { $row = sql_fetch_assoc($result); $data['f471'] = round($row['f451'] * $row['f441'] + $row['f461'], 2); //return $data['f471']; data_update($tableID, EVENTS_ENABLE, $data, "`id` = ".intval($lineID)); } }
Есть такая функция в внешнем файле. Во-первых, почему-то необходимо использовать require_once. Во-вторых, в подчиненной таблице выражение не обновляется.
require_once "include/customs_function.php"; all_sum_uan(11, $line['id'];, 0);
Меняю немного функцию
function all_sum_uan($tableID, $lineID, $tableIDParent) { $sqlQuery = "SELECT * FROM ".DATA_TABLE.$tableID." WHERE `id` = ".intval($lineID)." LIMIT 1"; $result = sql_query($sqlQuery); if(sql_num_rows($result) > 0) { $row = sql_fetch_assoc($result); //Общая сумма в юанях = Кол-во * Цена одной единицы + Доставка внутри Китая (EMS) $data['f471'] = round($row['f451'] * $row['f441'] + $row['f461'], 2); return $data['f471']; // data_update($tableID, EVENTS_ENABLE, $data, "`id` = ".intval($lineID)); } }
Код вызова вычисления теперь такой:
require_once "include/customs_function.php"; $line['f471'] = all_sum_uan(11, $line['id'],0);
И при изменении поля количество, поле f471 уже меняет значение на лету. Саас, ревизия последняя. Баг?
#34
Отправлено 06 Февраль 2014 - 09:46
data_update($tableID, EVENTS_ENABLE, $data, "`id` = ".intval($lineID))
Не совсем рекомендуемый вариант работы с функцией, рекомендуется писать так:
data_update($tableID, EVENTS_ENABLE, $data, "`id` = ",$lineID)
Так $lineID автоматом будет обработана, и ваш intval уже не нужен. На функционал это не влияет, просто "для порядка".
Аналогично можно было реализовать select запрос выше:
$result = data_select($tableID, "`id` = ",$lineID," LIMIT 1");
#36
Отправлено 06 Февраль 2014 - 12:14
#37
Отправлено 16 Июль 2014 - 20:06
P. S. Разобрался. Вопрос снят!
Сообщение отредактировал dolphin: 17 Июль 2014 - 07:05
#38
Отправлено 01 Август 2014 - 10:26
#39
Отправлено 01 Август 2014 - 10:44
#40
Отправлено 01 Август 2014 - 10:47
Количество пользователей, читающих эту тему: 8
0 пользователей, 8 гостей, 0 анонимных