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


Вычисление..


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

#1 Dinak

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

  • Пользователи
  • PipPipPip
  • 207 сообщений
  • Пол:Мужчина
  • Город:Новосибирск

Отправлено 18 Июнь 2014 - 07:05

Хелло, помогите с вычислением, есть таблица "Валюта" с полями "Дата" и "Курс", как мне получить в другой таблицы данные из первой при условия что курс берется по текущей дате. :rolleyes: :rolleyes: :rolleyes:

#2 CbCoder

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

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

Отправлено 18 Июнь 2014 - 10:11

Запрос к таблице "Валюта" с условием "поле Дата равно текущей дате".

#3 Dinak

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

  • Пользователи
  • PipPipPip
  • 207 сообщений
  • Пол:Мужчина
  • Город:Новосибирск

Отправлено 18 Июнь 2014 - 12:02

А в коде можно ?

#4 CbCoder

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

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

Отправлено 18 Июнь 2014 - 12:21

Полно ведь примеров запросов на форуме. В чем конкретно у вас сложность возникает?

#5 arsenal

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

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

Отправлено 24 Июнь 2014 - 19:41

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

#6 CbCoder

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

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

Отправлено 25 Июнь 2014 - 08:58

http://clientbase.ru...indpost&p=19479

Соответственно, вам необходимо выполнять запрос data_delete без данного флага.

#7 L-ink

    Участник

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

Отправлено 12 Январь 2017 - 02:54

Просмотр сообщенияDinak (18 Июнь 2014 - 07:05) писал:

Хелло, помогите с вычислением, есть таблица "Валюта" с полями "Дата" и "Курс", как мне получить в другой таблицы данные из первой при условия что курс берется по текущей дате. 
					
					<br />
					
				</div>
				
<script type= ipb.global.registerReputation( 'rep_post_32408', { domLikeStripId: 'like_post_32408', app: 'forums', type: 'pid', typeid: '32408' }, parseInt('0') );

#8 Dinak

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

  • Пользователи
  • PipPipPip
  • 207 сообщений
  • Пол:Мужчина
  • Город:Новосибирск

Отправлено 12 Январь 2017 - 06:44

Просмотр сообщенияL-ink (12 Январь 2017 - 02:54) писал:

А не подскажете, как реализовали таблицу с курсами?

Через крон, получаем курсы и дописываем в таблицу. Какой именно этап интересует?

Сообщение отредактировал Dinak: 12 Январь 2017 - 06:44


#9 L-ink

    Участник

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

Отправлено 12 Январь 2017 - 10:50

Просмотр сообщенияDinak (12 Январь 2017 - 06:44) писал:

Через крон, получаем курсы и дописываем в таблицу. Какой именно этап интересует?

Если откровенно, то практически все.
С самой системой (SaaS) ковыряюсь 3й день, еще не все и не совсем понятно, особенно вычисления всякие...

Пробовал 3 варианта парсинга курсов с сайта ЦБ - не работают.
Да и с пхп последний раз работал лет 7 незад, забыл уже все.

Собственно задача, думаю, мало отличается от чьих либо еще:
Есть прайс, в котором надо пересчитывыать цену розницы (из отдельного столбика еур) в рур по актуальному курсу каждый день.
Ну и есть счета, в которых надо прописывать цену именно на дату выставления счета и так, что бы она не менялась с изменением курса.

Можно в ЛС. С меня конь))))

#10 Dinak

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

  • Пользователи
  • PipPipPip
  • 207 сообщений
  • Пол:Мужчина
  • Город:Новосибирск

Отправлено 12 Январь 2017 - 13:43

require_once("include/snoopy.class.php");
$url = "http://www.cbr.ru/scripts/XML_daily.asp?";
$snoopy = new Snoopy();
$snoopy->fetch($url);
$xml = simplexml_load_string($snoopy->results);
$cnt=Count($xml->Valute);
for($i = 0; $i < $cnt; $i++)
{
  $code=$xml->Valute[$i]->CharCode;
  if ($code=='EUR')
  {
	$value=$xml->Valute[$i]->Value;
	$EUR=str_replace (",", ".",$value); //Заменим запятую на точку
  }
  // Аналогично  и с другими валютами..
   if ($code=='USD')
  {
	$value=$xml->Valute[$i]->Value;
	$USD=str_replace (",", ".",$value);    
  }
}
// Вставка в таблицу КБ, предварительно создал таблицу и поля: Дата, Курс Евро (f100), Курс Доллара(f101)
data_insert(id_таблицы, array('f101' => $USD, 'f100' => $EUR));
echo "Done";

Сообщение отредактировал Dinak: 12 Январь 2017 - 13:57


#11 L-ink

    Участник

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

Отправлено 12 Январь 2017 - 21:39

Просмотр сообщенияDinak (12 Январь 2017 - 13:43) писал:

require_once("include/snoopy.class.php");
$url = "http://www.cbr.ru/scripts/XML_daily.asp?";
$snoopy = new Snoopy();
$snoopy->fetch($url);
$xml = simplexml_load_string($snoopy->results);
$cnt=Count($xml->Valute);
for($i = 0; $i < $cnt; $i++)
{
  $code=$xml->Valute[$i]->CharCode;
  if ($code=='EUR')
  {
	$value=$xml->Valute[$i]->Value;
	$EUR=str_replace (",", ".",$value); //Заменим запятую на точку
  }
  // Аналогично  и с другими валютами..
   if ($code=='USD')
  {
	$value=$xml->Valute[$i]->Value;
	$USD=str_replace (",", ".",$value);	
  }
}
// Вставка в таблицу КБ, предварительно создал таблицу и поля: Дата, Курс Евро (f100), Курс Доллара(f101)
data_insert(id_таблицы, array('f101' => $USD, 'f100' => $EUR));
echo "Done";

Агонь! Наконец- то заработало! Огромное спасибо!

Хотя и осталось пара нюансов - данные в новую таблицу парсятся, а вот поле Дата не заполняется, хотя и стоит галочка Дата добавления записи.

Хотя в сути можно на это забить и сделать просто через $data_update ежедневное обновление курса просто в двух ячейках.
Дальше, я так понимаю, нужно повесить вычисление на Цену в прайсе типа

if ($event['changed'][291, 'f4751']) // таблица и ячейка с курсом
{
    $line['Цена'] = $line[291, 'f4751'] * $line['Цена в EUR'];
}

и словие выполнения при показе, например....ну или может я совсем дурак)


И еще вопрос, а не юудут ли в таком случае цены автоматически подтягиваться в уже выставленные счета и тд?

#12 maksn

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

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

Отправлено 12 Январь 2017 - 22:09

Просмотр сообщенияL-ink (12 Январь 2017 - 21:39) писал:

Хотя и осталось пара нюансов - данные в новую таблицу парсятся, а вот поле Дата не заполняется, хотя и стоит галочка Дата добавления записи.

В данном коде нет добавления даты курса. Посмотрите на страницу XML от ЦБ в браузере - http://www.cbr.ru/sc.../XML_daily.asp?
И увидите там в самом начале дату, на которую представлены курсы.
<ValCurs Date="13.01.2017" name="Foreign Currency Market">

Чтобы считать ее и добавить в базу, немного скорректируйте код

require_once("include/snoopy.class.php");
$url = "http://www.cbr.ru/scripts/XML_daily.asp?";
$snoopy = new Snoopy();
$snoopy->fetch($url);
$xml = simplexml_load_string($snoopy->results);
/*****Получить дату курсов из файла XML****/
$date_rate = form_eng_time($xml['Date']);
/***********************************/
$cnt=Count($xml->Valute);
for($i = 0; $i < $cnt; $i++)
{
  $code=$xml->Valute[$i]->CharCode;
  if ($code=='EUR')
  {
		$value=$xml->Valute[$i]->Value;
		$EUR=str_replace (",", ".",$value); //Заменим запятую на точку
  }
  // Аналогично  и с другими валютами..
   if ($code=='USD')
  {
		$value=$xml->Valute[$i]->Value;
		$USD=str_replace (",", ".",$value);	
  }
}
// Вставка в таблицу КБ, предварительно создал таблицу и поля: Дата, Курс Евро (f100), Курс Доллара(f101)
data_insert(id_таблицы, array('ВАШЕ ПОЛЕ С ДАТОЙ КУРСА'=>$date_rate,'f101' => $USD, 'f100' => $EUR));
echo "Done";
//ВАШЕ ПОЛЕ С ДАТОЙ КУРСА - в формате fXXX

Сообщение отредактировал maksn: 12 Январь 2017 - 22:42

"...Сижу, паяю. CRM починяю..."
Мои разработки

#13 L-ink

    Участник

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

Отправлено 13 Январь 2017 - 01:59

Просмотр сообщенияmaksn (12 Январь 2017 - 22:09) писал:

В данном коде нет добавления даты курса. Посмотрите на страницу XML от ЦБ в браузере - http://www.cbr.ru/sc.../XML_daily.asp?
И увидите там в самом начале дату, на которую представлены курсы.
<ValCurs Date="13.01.2017" name="Foreign Currency Market">

Чтобы считать ее и добавить в базу, немного скорректируйте код

require_once("include/snoopy.class.php");
$url = "http://www.cbr.ru/scripts/XML_daily.asp?";
$snoopy = new Snoopy();
$snoopy->fetch($url);
$xml = simplexml_load_string($snoopy->results);
/*****Получить дату курсов из файла XML****/
$date_rate = form_eng_time($xml['Date']);
/***********************************/
$cnt=Count($xml->Valute);
for($i = 0; $i < $cnt; $i++)
{
  $code=$xml->Valute[$i]->CharCode;
  if ($code=='EUR')
  {
		$value=$xml->Valute[$i]->Value;
		$EUR=str_replace (",", ".",$value); //Заменим запятую на точку
  }
  // Аналогично  и с другими валютами..
   if ($code=='USD')
  {
		$value=$xml->Valute[$i]->Value;
		$USD=str_replace (",", ".",$value);	
  }
}
// Вставка в таблицу КБ, предварительно создал таблицу и поля: Дата, Курс Евро (f100), Курс Доллара(f101)
data_insert(id_таблицы, array('ВАШЕ ПОЛЕ С ДАТОЙ КУРСА'=>$date_rate,'f101' => $USD, 'f100' => $EUR));
echo "Done";
//ВАШЕ ПОЛЕ С ДАТОЙ КУРСА - в формате fXXX

Огромное спасибо! Я с ПХП то 7 лет не работал (хотя у уже и начал вспоминаться), а с XML вообще никогда...

Теперь пытаюсь через вычисление Цену в прайсе привязать к курсу. В прайсе есть ячейка Цена в валюте.


$cur_date = date("d-m-Y");
data_select_field(281, "'f4741' as cur1", "'f4721' =", $cur_date);
$line['Цена'] = $line['Цена в валюте'] * $cur1;

но ничего не происходит....

#14 Dinak

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

  • Пользователи
  • PipPipPip
  • 207 сообщений
  • Пол:Мужчина
  • Город:Новосибирск

Отправлено 13 Январь 2017 - 07:19

$cur_date = date("d-m-Y"); // Неверный формат даты нужно date('Y-m-d 00:00:00')
data_select_field(281, "'f4741' as cur1", "'f4721' =", $cur_date); // а тут где преобразования в массив? sql_fetch_assoc
$line['Цена'] = $line['Цена в валюте'] * $cur1;

или можно проще сделать - сортировать таблицу по дате добавления записи в обратном порядке и выбрать 1 строчку, вот и актуальная дата

$result = data_select(id таблицы с курсами, "status=0 ORDER BY f5630(поле дата добавления) DESC LIMIT 1");
$row = sql_fetch_assoc($result);
$line['Цена'] = $line['Цена в валюте'] * $row['f150'] (поле с курсом нужной валюты);

Сообщение отредактировал Dinak: 13 Январь 2017 - 07:22


#15 maksn

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

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

Отправлено 13 Январь 2017 - 13:51

Просмотр сообщенияL-ink (13 Январь 2017 - 01:59) писал:

Теперь пытаюсь через вычисление Цену в прайсе привязать к курсу. В прайсе есть ячейка Цена в валюте.


$cur_date = date("d-m-Y");
data_select_field(281, "'f4741' as cur1", "'f4721' =", $cur_date);
$line['Цена'] = $line['Цена в валюте'] * $cur1;

но ничего не происходит....

Вопрервых, Вы не верно определили формат даты. В базе они хранятся в виде YYYY-mm-dd
А во вторых, нигде не используется результат запроса. Нужно так
//$cur_date = date("d-m-Y"); //Не верный формат даты
$cur_date = date("Y-m-d");
$result = data_select_field(281, "'f4741' as cur1", "'f4721' =", $cur_date);
$row = sql_fetch_assoc($result);
$cur1 = $row['cur1'];
$line['Цена'] = $line['Цена в валюте'] * $cur1;

Синтаксис в data_select_field не проверял. Взял Ваш. Честно сказать - не люблю все эти data_select.
Предпочитаю нативный SQL

Сообщение отредактировал maksn: 13 Январь 2017 - 14:57

"...Сижу, паяю. CRM починяю..."
Мои разработки

#16 Dinak

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

  • Пользователи
  • PipPipPip
  • 207 сообщений
  • Пол:Мужчина
  • Город:Новосибирск

Отправлено 16 Январь 2017 - 10:17

Кстати, у меня возникла сложность с вычисление подобного плана
$result = data_select_field(281, "'f4741' as cur1", "'f4721' =", $cur_date);

Т.к. не может найти select при условии дат, например пробовал так:
$result = data_select_field(281, "'f4741' as cur1", "`f4721` =", $cur_date); // Не работает
$result = data_select_field(281, "'f4741' as cur1", date_format(f5630, '%Y-%m-%d')=", $newDate); // Не работает
$result = data_select_field(281, "'f4741' as cur1", "`f4721` = CURDATE()"); // единственный вариант который работает, но он не совсем мне подходит

Есть идеи что может быть не так ?

#17 CbCoder

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

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

Отправлено 16 Январь 2017 - 12:12

Переменные $cur_date и $newDate должны быть в кавычках внутри запроса, т.к. дата в данном случае - это строковые данные, а не числовые (у вас они в число сконвертируются).

Плюс у вас синтаксическая ошибка во втором запросе, которая очевидна уже при простом взгляде на подсветку кода. Подсказка: кавычка перед date_format не открыта.

#18 Dinak

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

  • Пользователи
  • PipPipPip
  • 207 сообщений
  • Пол:Мужчина
  • Город:Новосибирск

Отправлено 17 Январь 2017 - 06:53

Просмотр сообщенияCbCoder (16 Январь 2017 - 12:12) писал:

Переменные $cur_date и $newDate должны быть в кавычках внутри запроса, т.к. дата в данном случае - это строковые данные, а не числовые (у вас они в число сконвертируются).

Плюс у вас синтаксическая ошибка во втором запросе, которая очевидна уже при простом взгляде на подсветку кода. Подсказка: кавычка перед date_format не открыта.

Нашёл ошибку в $cur_date и $newDate, а в синтаксисе - спасибо, это просто в примере не написал, а так была кавычка!





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

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