Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 13
  1. #1
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±

    Финансовая статистика в бизнесе, подкиньте идей)

    Здравствуйте. Собираюсь сделать финансовую статистику бизнеса (показывается последняя прибыль за 10 дней), так вот, не знаю как лучше сделать "переброс" финансовой статистики каждый день в 00:00.

    Вот как в базе выглядит само поле:
    PHP код:
    4141,1474,4881,4756,9427,4000,4371,3138,5818,4918 
    В моде, это хранится в енаме, в виде одномерного массива, обращение по такому принципу:
    PHP код:
    gBusiness[id][busiFinStat][0// выведет соответственно 4141$
    gBusiness[id][busiFinStat][1// выведет соответственно 1474$
    ..
    gBusiness[id][busiFinStat][9// выведет соответственно 4918$ 
    Так вот, в чем сам вопрос, как сделать лучше и правильно переброс цены в 00:00 (интересует сам функционал), то есть когда наступит новый день, финка должна выглядить так:
    PHP код:
    4141,1474,4881,4756,9427,4000,4371,3138,5818,4918 // До 00:00 (now day)
    0,4141,1474,4881,4756,9427,4000,4371,3138,5818 // После 00:00 (new day) 
    - - - Добавлено - - -

    В голову приходит следующая только мысль:
    PHP код:
    gBusiness[id][busiFinStat][9] = gBusiness[id][busiFinStat][8];
    gBusiness[id][busiFinStat][8] = gBusiness[id][busiFinStat][7];
    ...
    gBusiness[id][busiFinStat][2] = gBusiness[id][busiFinStat][1];
    gBusiness[id][busiFinStat][0] = 0;
    // Ну и потом сохранить 
    Но, может это как то глупо, и есть какой то другой вариант, заранее спасибо!

  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Советую ознакомиться с понятием "Нормальная форма", ибо сейчас то, как ты работаешь с базой данных, далеко от идеала.
    Собственно, если переписать всё под первую нормальную форму, то все изменения можно произвести одним запросом в БД и не мучиться.

    Ну а вообще люди не просто так придумали циклы :3
    PHP код:
    for(new 9!= 0i--)
        
    gBusiness[id][busiFinStat][i] = gBusiness[id][busiFinStat][i-1];

    gBusiness[id][busiFinStat][0] = 0
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  3. Пользователь сказал cпасибо:
    StevenH (13.06.2017)
  4. #3
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Советую ознакомиться с понятием "Нормальная форма", ибо сейчас то, как ты работаешь с базой данных, далеко от идеала.
    Собственно, если переписать всё под первую нормальную форму, то все изменения можно произвести одним запросом в БД и не мучиться.

    Ну а вообще люди не просто так придумали циклы :3
    PHP код:
    for(new 9!= 0i--)
        
    gBusiness[id][busiFinStat][i] = gBusiness[id][busiFinStat][i-1];

    gBusiness[id][busiFinStat][0] = 0
    Можно подробнее про 1 запрос в БД?

  5. #4
    Аватар для TheMallard
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.12.2015
    Адрес
    San Fierro
    Сообщений
    217
    Репутация:
    39 ±
    Надо создать отдельную базу в БД, назвать её допустим bizstats. Структура:
    PHP код:
    id             bizid         time         profit
    ид финстаты    ид бизнеса    timestamp    доход 
    В 00:00 инсертить в таблицу финстату всех бизнесов одним запросом
    Информацию получать используя ORDER BY id DESC LIMIT 10
    То есть запрос на получение будет примерно таким:
    PHP код:
    SELECT FROM bizstats WHERE bizid '%d' ORDER BY id DESC LIMIT 10 

  6. Пользователь сказал cпасибо:
    StevenH (13.06.2017)
  7. #5
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±
    Цитата Сообщение от TheMallard Посмотреть сообщение
    Надо создать отдельную базу в БД, назвать её допустим bizstats. Структура:
    PHP код:
    id             bizid         time         profit
    ид финстаты    ид бизнеса    timestamp    доход 
    В 00:00 инсертить в таблицу финстату всех бизнесов одним запросом
    Информацию получать используя ORDER BY id DESC LIMIT 10
    То есть запрос на получение будет примерно таким:
    PHP код:
    SELECT FROM bizstats WHERE bizid '%d' ORDER BY id DESC LIMIT 10 
    Неплохая кстати идея)

    Но возник вопрос, как сделать инсерт около 90 записей (столько примерно бизов), одним запросом?

  8. #6
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    В данном случае можно немножко "набыдлокодить" и сделать для каждого дня свой столбец. То бишь, структура будет такой:
    PHP код:
    id
    bizid
    day_1
    day_2
    day_3
    day_4
    day_5
    day_6
    day_7 
    Названия, естественно, для столбцов нормальные придумай. Я сделал такие для наглядности в запросе обновления.

    Обновление будет таким:
    PHP код:
    UPDATE bizstats SET day_7 day_6day_6 day_5day_5 day_4day_4 day_3day_3 day_2day_2 day_1day_1 0
    // Это весь запрос. То бишь, форматировать его и поставлять вручную значения не нужно. MySQL всё сделает за тебя 
    И всё. В теории, это запрос должен все значения перемешать как тебе нужно.
    Только не забывай при всяком изменении счёта бизнеса обновлять значение "day_1", дабы там всегда была актуальная информация. Остальные столбцы обновлять вручную не нужно.

    Именно про это я и говорил, когда упоминал один запрос. Можно, конечно, и более правильный вариант TheMallard преобразовать в один запрос, но он будет гораздо сложнее + в данном случае довольно бессмысленно делать "гибкую" структуру (как в примере TheMallard), ибо количество дней, информацию о которых мы будем хранить, вряд ли когда-то изменится.
    Последний раз редактировалось DeimoS; 13.06.2017 в 16:30.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  9. Пользователь сказал cпасибо:
    StevenH (13.06.2017)
  10. #7
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    В данном случае можно немножко "набыдлокодить" и сделать для каждого дня свой столбец. То бишь, структура будет такой:
    PHP код:
    id
    bizid
    day_1
    day_2
    day_3
    day_4
    day_5
    day_6
    day_7 
    Названия, естественно, для столбцов нормальные придумай. Я сделал такие для наглядности в запросе обновления.

    Обновление будет таким:
    PHP код:
    UPDATE bizstats SET day_7 day_6day_6 day_5day_5 day_4day_4 day_3day_3 day_2day_2 day_1day_1 0
    // Это весь запрос. То бишь, форматировать его и поставлять вручную значения не нужно. MySQL всё сделает за тебя 
    И всё. В теории, это запрос должен все значения перемешать как тебе нужно.
    Только не забывай при всяком изменении счёта бизнеса обновлять значение "day_1", дабы там всегда была актуальная информация. Остальные столбцы обновлять вручную не нужно.

    Именно про это я и говорил, когда упоминал один запрос. Можно, конечно, и более правильный вариант StevenH преобразовать в один запрос, но он будет гораздо сложнее + в данном случае довольно бессмысленно делать "гибкую" структуру (как в примере StevenH), ибо количество дней, информацию о которых мы будем хранить, вряд ли когда-то изменится.
    Мм, логику я понял. Но вот теперь дилемма, не могу определиться как сделать правильно, т.е. использовать вариант TheMallard (и доставать последние 10 записей нужного биза, и в 00:00 инсертить новую стату), либо использовать твой вариант, хотя по сути он тоже хорош, и да, ты прав, кол-во дней врятли когда изменится...

    И да, ты ошибся, предлагал не я (StevenH), а TheMallard.. :)

  11. #8
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от StevenH Посмотреть сообщение
    Мм, логику я понял. Но вот теперь дилемма, не могу определиться как сделать правильно, т.е. использовать вариант TheMallard (и доставать последние 10 записей нужного биза, и в 00:00 инсертить новую стату), либо использовать твой вариант, хотя по сути он тоже хорош, и да, ты прав, кол-во дней врятли когда изменится...
    В твоём случае, как мне кажется, лучше мой вариант, ибо он в разы проще как в реализации, так и в работе с данными. Вариант, описанный TheMallard, больше подошёл бы для той же системы инвентаря, в которой большое количество столбцов и их количество может меняться.

    Цитата Сообщение от StevenH Посмотреть сообщение
    И да, ты ошибся, предлагал не я (StevenH), а TheMallard.. :)
    Точно, прошу прощения. Просто час ночи и "Ctrl + C/Ctrl + V" :)
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  12. Пользователь сказал cпасибо:
    StevenH (13.06.2017)
  13. #9
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    В твоём случае, как мне кажется, лучше мой вариант, ибо он в разы проще как в реализации, так и в работе с данными. Вариант, описанный TheMallard, больше подошёл бы для той же системы инвентаря, в которой большое количество столбцов и их количество может меняться.
    Спасибо, думаю попробую сделать по твоему варианту

    Но возникло два вопроса..
    Пример того, что должно получится:
      Открыть/закрыть


    1. Как это все правильно взять из таблицы и куда записать

    В голову приходит следующее:
    Сделать запрос на нужный бизнес, создать 10 переменных, и сделать что то типа такого:
    PHP код:
    new profit[10];
    cache_get_value_name_int(0"day_1"profit[0]);
    cache_get_value_name_int(0"day_2"profit[1]);
    ...
    cache_get_value_name_int(0"day_10"profit[9]); 
    И потом в диалоге соответственно вывести, это все (по скриншоту выше). Не знаю почему, но мне кажется что есть какой то более оптимальный и правильный вариант, а может и нету :)

    2. Как видно на скриншоте, там написан месяц, ладно, допустим этот текст откуда то берется (из массива например обычного), но вопрос, как правильно это все сделать..

    Например та же проверка, если сегодня 2 число нового месяца, а статистика выводится за последние 10 дней, как то узнать какой правильный месяц вывести..
    Последний раз редактировалось StevenH; 13.06.2017 в 16:54.

  14. #10
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Ну как-то так:
    PHP код:
    new taxation 7;// Эту переменную замени на ту, где у тебя хранится значение налогообложения


    #define COUNT_FINANC_STAT_DAYS 10

    stock ShowFinancStatDialog(playeridbizid)
    {
        static const 
            
    month_names[12][9] =
            {
                
    "января""февраля""марта""апреля""мая""июня",
                
    "июля""августа""сентября""октября""ноября""декабря"
            
    },
            
    month_days[12] =// Для текущего года
            
    {
                
    312831303130313130313031
            
    };

        new 
    string[(32+2+7)+(20+11)+((6+2+sizeof(month_names[])-1+4+11)*COUNT_FINANC_STAT_DAYS)+(9+11)+1];
        
    format(stringsizeof(string), "SELECT * FROM bizstats WHERE bizid = %d LIMIT 1"bizid);
        new 
    Cache:result mysql_query(mysql_connection_IDstringtrue);
        if(!
    cache_num_rows())
        {
            
    cache_delete(result);
            return 
    0;
        }


        
    string "Статистика доходов за последние "#COUNT_FINANC_STAT_DAYS" дней:\n";//32+2+7
        
    format(stringsizeof(string), "%sНалогообложение: %d%%\n\n"stringtaxation);//20+11

        
    new year,
            
    month
            
    day,
            
    total_buff;
        
    getdate(yearmonthday);

        if(
    day >= COUNT_FINANC_STAT_DAYS)
        {
            for(new 
    ibuffCOUNT_FINANC_STAT_DAYSi++)
            {
                
    cache_get_value_index_int(0i+2buff);// +2 так как перед столбцами с нужными нам данными есть ещё столбец с ID строки и столбец с ID бизнеса, которые нужно пропустить
                
    total_buff += buff;
                
    format(stringsizeof(string), "%s%02d %s %04d\t\t%d$\n"stringday-COUNT_FINANC_STAT_DAYS+imonth_names[month-1], yearbuff);//6+2+sizeof(month_names[])-1+4+11
            
    }
        }
        else
        {
            if(
    month != 1)// Если месяц не январь
            
    {
                
    month-=1;// Просто перейдём к предыдущему месяцу
            
    }
            else
    // Если январь
            
    {
                
    month 12;// Перейдём к декабрю
                
    year-=1;// Отнимем один год
            
    }

            new 
    0,
                
    month_days[month-1] + day-COUNT_FINANC_STAT_DAYS 1,// Высчитаем первый день в нашем списке для предыдущего месяца по формуле "максимальное_количество_дней_в_предыдущем_месяце + (день_в_текущем_месяце-количество_дней_в_статистике)+1"
    /*
        То бишь, если представим, что сегодня второе июля 2017 (02.06.2017), то формула будет такой:
        31+(2-10)+1
        В итоге получаем: 31-8+1 (получаем 24 мая)
        То бишь, вот тут "day-COUNT_FINANC_STAT_DAYS" всегда будет отрицательное число, именно поэтому перед ними стоит +, а не -
        (с минусом значения наоборот прибавлялись бы, ибо минус на минус даёт плюс)
    */
                
    last_iter month_days[month-1]+1,// Ну а тут просто узнаём максимальное количество дней в текущем месяце (31+1 = 32)
                
    buff;

            for(; 
    last_iteri++, d++)// Условие цикла получится таким "24 < 32"
            
    {// То бишь, выведет с 24 по 31 число
                
    cache_get_value_index_int(0i+2buff);// Почему +2 - объяснял выше
                
    total_buff += buff;// Вычисляем общую сумму
                
    format(stringsizeof(string), "%s%02d %s %04d\t\t%d$\n"stringdmonth_names[month-1], yearbuff);//6+2+sizeof(month_names[])-1+4+11
            
    }

            if(
    month == 12)// Если в переменной хранится декабрь, значит мы брали данные для предыдущего года и
            
    {
                
    year++;// Возвращаем текущий год
                
    month 1;// Устанавливаем январь
            
    }
            else
    // Иначе
            
    {
                
    month++;// Восстанавливаем текущий месяц
            
    }
            
    1;// Устанавливаем первый день (так как это начало месяца)
            
    last_iter day;// Устанавливаем текущий день (напомню, что мы в пример рассматриваем дату "02.06.2017")
            
    for(; <= last_iteri++, d++)// Получается условие "1 <= 2"
            
    {// То бишь, выведет с 1 по 2 число
                
    cache_get_value_index_int(0i+2buff);
                
    total_buff += buff;
                
    format(stringsizeof(string), "%s%02d %s %04d\t\t%d$\n"stringdmonth_names[month-1], yearbuff);//6+2+sizeof(month_names[])-1+4+11
            
    }
        }
        
    format(stringsizeof(string), "%s\nВсего: %d$"stringtotal_buff);// 9+11
        
    ShowPlayerDialog(playerid1DIALOG_STYLE_MSGBOX"Доходы"string"Ок""");
        
    cache_delete(result);
        return 
    1;

    У каждой строки для диалога указан свой размер в формуле.
    Вот в этой формуле
    PHP код:
    6+2+sizeof(month_names[])-1+4+11 
    6 - размер самой строки (то бишь, пробелы между значениями + спецсимволы "\t" и "\n" + $)
    2 - место для дня
    sizeof(month_names[]) - и так понятно
    4 - место для года
    11 - место для прибыли

    В остальных формулах принцип тот же: сначала указан размер строки без вставляемых значений и без учёта спецификаторов, а потом уже размер вставляемых значений.

    Соответственно, если будешь раскрашивать диалог, то нужно будет формулу поправить.
    Немного намудрил, конечно, с кодом, но работать будет
    Последний раз редактировалось DeimoS; 13.06.2017 в 19:19.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  15. Пользователь сказал cпасибо:
    StevenH (13.06.2017)
 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •