Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Отображение процента от суммы
Форумы портала PHP.SU » » Хранение данных, их вывод и обработка » Отображение процента от суммы

Страниц (1): [1]
 

1. Stas11 - 09 Мая, 2011 - 23:59:09 - перейти к сообщению
Здравствуйте гуру и форумчане, возник такой вопрос и никак не могу найти решение этого вопроса.
Суть в следующем, у меня в админке выводится сумма оборота по продажам за выбранный период, и отображается как полная сумма оборота, так и чистая сумма.
Например было офомлено 2 заказа на сумму 1000 руб,. 1 заказ с курьерской доставкой на 100 руб и 1 заказ по почте со стоимостью пересылки 200 руб.
Отображение общей суммы стоит 2300 руб, а чистая сумма 2100 руб, так как сумма пересылки не учитывается.
Но мне нужно сделать отображение ещё одной строки которая будет отображать 30% заработка от чистой суммы, то есть по примеру двух заказов выше, сумма заработка должна составить 630 руб.

Общая сумма 2300 руб.
Чистая сумма 2100 руб.
Заработок 630 руб.

Но вот как написать код формулы которая будет расчитывать эти 30% я никак не могу нигде найти Недовольство, огорчение Подскажите пожалуйста как это реализовать?
Вот код запроса к таблице для отображения общей суммы:

PHP:
скопировать код в буфер обмена
  1. $q = db_query("select order_amount, currency_value from ".ORDERS_TABLE." where statusID > 1 and order_time>='".$start." 00:00:00' AND order_time<='".$end." 23:59:59'");
  2.                 $revenue = 0;
  3.                 while($r = db_fetch_row($q))
  4.                 {
  5.                         $revenue += $r[0];
  6.                 }
  7.                 $total["revenue"] = show_price( $revenue, CONF_DEFAULT_CURRENCY );


А этот код запроса отвечает за отображение чистой суммы:

PHP:
скопировать код в буфер обмена
  1. $q = db_query("select order_amount, currency_value, shipping_type, shipping_cost from ".ORDERS_TABLE." where statusID > 1 and order_time>='".$start." 00:00:00' AND order_time<='".$end." 23:59:59'");
  2.                 $revenue_clear = 0;
  3.                 while($r = db_fetch_row($q))
  4.                 {
  5.                         $revenue_clear += $r[0];
  6.             if($r['shipping_type']!='Курьер в пределах метро')
  7.                         $revenue_clear -= $r['shipping_cost'];
  8.                 }
  9. $total["revenue_clear"] = show_price( $revenue_clear, CONF_DEFAULT_CURRENCY );



Подскажите пожалуйста, что нужно написать чтоб формула расчитывала и выводила сумму в 30% от чистой суммы?
Заранее благодарен всем откликнувшимся помочь в решении этого вопроса.



(Добавление)
Опа! а немного подумав и сам нашол решение Улыбка Всё гениальное просто ;)
Просто добавить параметр /100*30
PHP:
скопировать код в буфер обмена
  1. $total["revenue_clear"] = show_price( $revenue_clear/100*30, CONF_DEFAULT_CURRENCY );

И всё работает Улыбка
Вопрос закрыт, в любом случае спасибо за помощь которую вы бы мне оказали.
2. Uchkuma - 10 Мая, 2011 - 11:15:23 - перейти к сообщению
Это же 4-й или 5-й класс. Сколько вам лет?
3. movEAX - 10 Мая, 2011 - 12:40:51 - перейти к сообщению
Uchkuma пишет:
Это же 4-й или 5-й класс. Сколько вам лет?

оффтоп: где надпись "Адвокааат"? Улыбка
4. Stas11 - 10 Мая, 2011 - 18:18:40 - перейти к сообщению
Uchkuma Как математичесое решение я-то знаю, а вот как написать на языке программирования эту формулу и в каком месте кода вставить, это уже другой вопрос Улыбка
Но тем не менее разобрался сам.
Зато возник другой вопрос, как можно составить код, чтобы при этом сам код был покомпактнее если учесть что все 3 запроса для сбора инфы идут с одинаковыми параметрами, разница лишь в формуле расчёта и названии переменных.

Вот первый запрос на вывод полной суммы за выбранный период:

PHP:
скопировать код в буфер обмена
  1. $q = db_query("select order_amount, currency_value, shipping_type, shipping_cost from ".ORDERS_TABLE." where statusID > 1 and order_time>='".$start." 00:00:00' AND order_time<='".$end." 23:59:59'");
  2.                 $revenue_clear = 0;
  3.                 while($r = db_fetch_row($q))
  4.                 {
  5.                         $revenue_clear += $r[0];
  6.             if($r['shipping_type']!='Курьер в пределах метро')
  7.                         $revenue_clear -= $r['shipping_cost'];
  8.                 }
  9. $total["revenue_clear"] = show_price( $revenue_clear, CONF_DEFAULT_CURRENCY );


Далее идёт по тому же запросу из той же самой суммы вычисление 30%

PHP:
скопировать код в буфер обмена
  1. $q = db_query("select order_amount, currency_value, shipping_type, shipping_cost from ".ORDERS_TABLE." where statusID > 1 and order_time>='".$start." 00:00:00' AND order_time<='".$end." 23:59:59'");
  2.                 $revenue_clearpercent = 0;
  3.                 while($r = db_fetch_row($q))
  4.                 {
  5.                         $revenue_clearpercent += $r[0];
  6.             if($r['shipping_type']!='Курьер в пределах метро')
  7.                         $revenue_clearpercent -= $r['shipping_cost'];
  8.                 }
  9. $total["revenue_clearpercent"] = show_price( $revenue_clearpercent/100*30, CONF_DEFAULT_CURRENCY );


И третье отображение суммы это 30% от той же суммы поделённое на 2

PHP:
скопировать код в буфер обмена
  1. $q = db_query("select order_amount, currency_value, shipping_type, shipping_cost from ".ORDERS_TABLE." where statusID > 1 and order_time>='".$start." 00:00:00' AND order_time<='".$end." 23:59:59'");
  2.                 $revenue_percent2 = 0;
  3.                 while($r = db_fetch_row($q))
  4.                 {
  5.                         $revenue_percent2 += $r[0];
  6.             if($r['shipping_type']!='Курьер в пределах метро')
  7.                         $revenue_percent2 -= $r['shipping_cost'];
  8.                 }
  9. $total["revenue_percent2"] = show_price( $revenue_percent2/100*30/2, CONF_DEFAULT_CURRENCY );


То есть во всех трёх частях кода запрос к базе на выборку прописан одинаковый, разница лишь в названии переменных $revenue_clear, $revenue_clearpercent и $revenue_percent2

Пробовал сократить код выполнив такое написание:

PHP:
скопировать код в буфер обмена
  1. $q = db_query("select order_amount, currency_value, shipping_type, shipping_cost from ".ORDERS_TABLE." where statusID > 1 and order_time>='".$start." 00:00:00' AND order_time<='".$end." 23:59:59'");
  2.                 $revenue_clear = 0;
  3.                 $revenue_clearpercent = 0;
  4.                 while($r = db_fetch_row($q))
  5.                 {
  6.                         $revenue_clear += $r[0];
  7.                         $revenue_clearpercent += $r[0];
  8.             if($r['shipping_type']!='Курьер в пределах метро')
  9.                         $revenue_clear -= $r['shipping_cost'];
  10.                         $revenue_clearpercent -= $r['shipping_cost'];
  11. }
  12. $total["revenue_clear"] = show_price( $revenue_clear, CONF_DEFAULT_CURRENCY );
  13. $total["revenue_clearpercent"] = show_price( $revenue_clearpercent/100*30, CONF_DEFAULT_CURRENCY );


При этом расчёт отображается не совсем верно, то есть если 3 части кода по отдельности, то цифры одни, если добавить все переменные в один код и использовать только один запрос к к БД, то цифры немного меньше становятся.
Как правильно составить код, чтобы было и компактно и всё работало?

Я прошу прощения если мои вопросы покажутся смешными и наивными, но я не программист и програмирование изучаю так сказать методом тыка и подсказкам более продвинутых гуру в области программирования Улыбка
Пока буду ждать ответа, попробую и сам поковыряться, может методом тыка и перестановок кода удастся собрать конструктор с более компактным кодом и рабочим при этом Улыбка Ведь уверен что если запрос везде одинаковый
PHP:
скопировать код в буфер обмена
  1. $q = db_query("select order_amount, currency_value, shipping_type, shipping_cost from ".ORDERS_TABLE." where statusID > 1 and order_time>='".$start." 00:00:00' AND order_time<='".$end." 23:59:59'");
то как бы нет нужды повторять один и тот же код в трёх местах, можно как то обойтись одним запросом, но при этом заставить обработчик отображать нужные данные с каждой переменной.
Все когда то начинали с нуля и потихоньку достигли высот, я тоже когда начинал знал только <b> и всё, а щас уже ковыряюсь в php Улыбка и надеюсь с Вашей помощью узнать как оптимизировать данный код.
5. Uchkuma - 10 Мая, 2011 - 21:45:43 - перейти к сообщению
У вас под одно условие попадают несколько выражений. Кто будет заключать их в фигурные скобки?
6. Stas11 - 10 Мая, 2011 - 23:04:05 - перейти к сообщению
Uchkuma А поподробнее и желательно на примерах Улыбка
Я понимаю что надо разделить выражения, но не знаю как и в каком порядке и самое главное как его составить от и до.
7. OrmaJever - 10 Мая, 2011 - 23:33:38 - перейти к сообщению
Stas11 пишет:
PHP:
скопировать код в буфер обмена
  1.             if($r['shipping_type']!='Курьер в пределах метро')
  2.                         $revenue_clear -= $r['shipping_cost'];
  3.                         $revenue_clearpercent -= $r['shipping_cost'];

Вот например. Судя по табуляциям под условие должно попасть 2 строки, а без фигурных скобок попадает только первая срока, а вторая выполнится даже если условие false.
Для этого нужно брать в фигурные скобки
PHP:
скопировать код в буфер обмена
  1.             if($r['shipping_type']!='Курьер в пределах метро') {
  2.                         $revenue_clear -= $r['shipping_cost'];
  3.                         $revenue_clearpercent -= $r['shipping_cost'];
  4.             }
8. Stas11 - 11 Мая, 2011 - 19:37:24 - перейти к сообщению
OrmaJever Спасибо большое, помогло Улыбка какая то скобочка, а какую огромную роль играет Улыбка

В итоге полный код получился компактнее аж на 920 килобайт.

PHP:
скопировать код в буфер обмена
  1. $q = db_query("select order_amount, currency_value, shipping_type, shipping_cost from ".ORDERS_TABLE." where statusID > 1 and order_time>='".$start." 00:00:00' AND order_time<='".$end." 23:59:59'");
  2.         $revenue_clear = 0;
  3.         $revenue_clearpercent = 0;
  4.         $revenue_percent2 = 0;
  5.         $revenue_percent = 0;
  6.                 while($r = db_fetch_row($q))
  7.         {
  8.                         $revenue_clear += $r[0];
  9.             $revenue_clearpercent += $r[0];
  10.             $revenue_percent2 += $r[0];
  11.             $revenue_percent += $r[0];
  12.             if($r['shipping_type']!='Курьер в пределах метро')
  13.         {
  14.             $revenue_clear -= $r['shipping_cost'];
  15.             $revenue_clearpercent -= $r['shipping_cost'];
  16.             $revenue_percent2 -= $r['shipping_cost'];
  17.             $revenue_percent -= $r['shipping_cost'];
  18.         }
  19.         }
  20. $total["revenue_clear"] = show_price( $revenue_clear, CONF_DEFAULT_CURRENCY );
  21. $total["revenue_clearpercent"] = show_price( $revenue_clearpercent/100*30, CONF_DEFAULT_CURRENCY );
  22. $total["revenue_percent2"] = show_price( $revenue_percent2/100*30/2, CONF_DEFAULT_CURRENCY );
  23. $total["revenue_percent"] = show_price( $revenue_percent/100*30/2-7500, CONF_DEFAULT_CURRENCY );


Только вот по прежнему смущает наличие некоторых дубликатов, например

$revenue_clear = 0;
$revenue_clearpercent = 0;
$revenue_percent2 = 0;
$revenue_percent = 0;

и

$revenue_clear -= $r['shipping_cost'];
$revenue_clearpercent -= $r['shipping_cost'];
$revenue_percent2 -= $r['shipping_cost'];
$revenue_percent -= $r['shipping_cost'];

Где повторяются -= $r['shipping_cost']; и = 0;
Может быть есть способ объединить 4 строки одним условием, например так:

PHP:
скопировать код в буфер обмена
  1. $revenue_clear/$revenue_clearpercent/$revenue_percent2/$revenue_percent -= $r['shipping_cost'];


Или через запятую, точно не знаю какой разделитель поставить, или же тот полный код который я привёл выше является окончательным и по другому никак не получится уменьшить код без нарушения работоспособности?

Впринципи и так уже стало намного компактнее, но как говорится нет предела совершенству и хочется больше Улыбка
(Добавление)
Хотя уже сам понял что это самый простой код, проще только удалить строку Улыбка
Насколько я понял каждое условие должно иметь свой параметр, а чтобы было 4 условия с 1 параметром это только в сказке, интепритатор такого читать не умеет Улыбка

 

Powered by ExBB FM 1.0 RC1