Перейти к содержимому


Функции работы с записями


Сообщений в теме: 58

#21 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 693 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 22 Август 2013 - 08:50

Должно быть значение поля "статус комплектующего", разумеется. Почему выводился id, затрудняюсь сказать.

#22 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 156 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 22 Август 2013 - 10:26

Просмотр сообщенияCbCoder (22 Август 2013 - 08:50) писал:

Должно быть значение поля "статус комплектующего", разумеется. Почему выводился id, затрудняюсь сказать.
Тогда если еще раз столкнусь с этой проблемой. Отправляю в ТП заявку.

Зы. Столкнулся, отправил заявку в техподдержку, но на всякий случай продублирую последовательность действий. Есть функция во внешнем файле.
/**
* Устанавливает значение для поля "Статус комплектующего" в таблицах категории "Комплектующие".
* Статус комплектующего может быть: Установлен и Свободен. Установлен - если комплектующее уже
* установлено в каком-либо ПК (Компьютеры-ПК) и свободоен - если нигде не установлено.
* Основная цель функции устанавливать статус комплектующего при установке и снятии, не дать установить
* в разные ПК одно и тоже комплектующее
*
* @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 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 156 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 22 Август 2013 - 10:52

Исправил прошлое сообщение.

#24 Analitic

    Активный участник

  • Пользователи
  • PipPipPip
  • 700 сообщений
  • Пол:Мужчина

Отправлено 27 Август 2013 - 17:01

Не надо работать с global $line. Изза этого расхождения. $line передавайте как массив по ссылке в функцию. Аналогично и для других переменных.

#25 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 156 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 27 Август 2013 - 17:05

Просмотр сообщенияAnalitic (27 Август 2013 - 17:01) писал:

Не надо работать с global $line. Изза этого расхождения. $line передавайте как массив по ссылке в функцию. Аналогично и для других переменных.
ок. спасибо.

Сообщение отредактировал wondertalik: 27 Август 2013 - 17:06


#26 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 156 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 02 Октябрь 2013 - 00:56

Почему если я вставляю код в редакторе вычислений, то я могу обратится в $line[связанное поле][поле]:

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 Analitic

    Активный участник

  • Пользователи
  • PipPipPip
  • 700 сообщений
  • Пол:Мужчина

Отправлено 02 Октябрь 2013 - 09:51

Как вы уже правильно заметили $line разворачивается только если он есть в самом вычислении. При сохранении, вычисляется используемые поля связи в вычислении, и при запуске вычисления данные поля связи разворачиваются, если они не развернуты. В вашем случае можете обозначить используемые поля связи в комментариях типа:
// Используются следующие поля связи: $line[f1146][f1127]

Либо не использовать автоматический переход по полям связи, и разворачивать их самостоятельно в вычислениях.

#28 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 156 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 02 Октябрь 2013 - 11:10

Просмотр сообщенияAnalitic (02 Октябрь 2013 - 09:51) писал:

Как вы уже правильно заметили $line разворачивается только если он есть в самом вычислении. При сохранении, вычисляется используемые поля связи в вычислении, и при запуске вычисления данные поля связи разворачиваются, если они не развернуты. В вашем случае можете обозначить используемые поля связи в комментариях типа:
// Используются следующие поля связи: $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 Analitic

    Активный участник

  • Пользователи
  • PipPipPip
  • 700 сообщений
  • Пол:Мужчина

Отправлено 02 Октябрь 2013 - 11:15

Строки во внешнем файле вообще не идут в расчет.
Для того чтобы во внешнем файле использовать развернутые $line. Нужно обозначить строку в самом вычислении. Как уже написал выше обозначение может быть в комментарии.

#30 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 156 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 02 Октябрь 2013 - 13:54

По поводу работы с функциями типа data_*. Мне в тп отписали:

Цитата


Для срабатывания напоминания при добавлении/изменении строк через вычисления посредством функций 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 andibrag

    Прежде, чем задать вопрос, продумайте свое решение.

  • Активный пользователь
  • PipPipPip
  • 1 332 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

Отправлено 02 Октябрь 2013 - 14:01

Просмотр сообщенияwondertalik (02 Октябрь 2013 - 13:54) писал:

А если я использую EVENTS_ENABLE, получается что вычисления сработают, в зависимости от добавления или обновления записи и в тоже время мне вручную еще нужно для напоминаний u и(или) r править? Я все правильно понимаю?
У меня аналогичная ситуация возникла. Обращался в ТП, сказали, что для срабатывания уведомлений требуется править поле u. Мне только не ясно почему это не происходит автоматом? Это же также системное поле, которое должно обновляться при внесении изменений в запись через update_data. Или я не прав?

Сообщение отредактировал andibrag: 03 Октябрь 2013 - 08:34

Творческая группа "ТАВР".

www.MEGATAVR.com Художественная ковка, витражи, мозаика, фрески.

www.iGal.pro Уникальный мангал.


#32 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 156 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 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 уже меняет значение на лету. Саас, ревизия последняя. Баг?

#33 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 693 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 06 Февраль 2014 - 09:42

Просмотр сообщенияwondertalik (06 Февраль 2014 - 02:05) писал:

require_once "include/customs_function.php";
all_sum_uan(11, $line['id'];, 0);

Почему точка с запятой в аргументе? Опечатка?

#34 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 693 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 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");


#35 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 156 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 06 Февраль 2014 - 11:59

Просмотр сообщенияCbCoder (06 Февраль 2014 - 09:42) писал:

Почему точка с запятой в аргументе? Опечатка?
Да просто опечатка, подгонял код в редакторе на форуме. Вопрос в том, почему данные в подчиненной таблице не обновляются как c $line если я использую data_update.

#36 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 693 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 06 Февраль 2014 - 12:14

Должны обновляться, возможно где-то в другом месте ошибка. Вы пробовали прямой запрос к БД, не через data_update?

#37 dolphin

    Активный участник

  • Пользователи
  • PipPipPip
  • 341 сообщений

Отправлено 16 Июль 2014 - 20:06

Подскажите пожалуйста, у меня такая задача. Хотелось бы записать в таблицу несколько значений, но в то же время еще несколько значений скопом в подчиненную таблицу? Как это сделать? На простом примере?

P. S. Разобрался. Вопрос снят!

Сообщение отредактировал dolphin: 17 Июль 2014 - 07:05


#38 dolphin

    Активный участник

  • Пользователи
  • PipPipPip
  • 341 сообщений

Отправлено 01 Август 2014 - 10:26

Как "вытащить" данные из поля "Инфо", если знаешь id записи?

#39 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 693 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 01 Август 2014 - 10:44

Стандартно уж - обратится запросом к таблице с условием по id. Хотя, если это id из поля связи, можно обойтись и без запроса. В документации все есть.

#40 dolphin

    Активный участник

  • Пользователи
  • PipPipPip
  • 341 сообщений

Отправлено 01 Август 2014 - 10:47

нет нет, как раз id это не поле связи. Понял. Стандартно обращусь тады. Думал мож для $line есть такой универсальный способ "вытянуть" нужное значение для конкретного поля с известным id записи.





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных