

Функции работы с записями
#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
//Подробности смотрим в внешнем файле функцийB вот здесь тогда уже все статемент уже содержат значение, а не айди.
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>";
Статус комплектующего: Свободен
Свободен
Свободен
Сообщение отредактировал 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
Количество пользователей, читающих эту тему: 2
0 пользователей, 2 гостей, 0 анонимных