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

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Ну как-то так:
    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 Посмотреть сообщение
    PHP код:
    if(!cache_num_rows())
    {
        
    cache_delete(result);
        return 
    0;

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

  2. #12
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±
    В принципе почти то что и надо.. Можно как то день в месяце +1 сделать. То есть, в фин. статистике должен последний день быть сегодняшний (т.е. в нашем случае 13 июня 2017), а в таблице сейчас последний день получится 12 июня 2017

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    PHP код:
    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 
    на
    PHP код:
    format(stringsizeof(string), "%s%02d %s %04d\t\t%d$\n"stringday-COUNT_FINANC_STAT_DAYS+i+1month_names[month-1], yearbuff);//6+2+sizeof(month_names[])-1+4+11 
    У тебя же значения в БД, фактически, не привязаны к конкретной дате, так что всё форматирование идёт на уровне сервера.

    Можно выделить в таблице 1 столбец под дату, в котором будет хранится дата последнего изменения значений. И уже от неё плясать, когда будешь обновлять данные (то бишь, если ты обновил данные и потом на 3 дня выключил сервер, в текущем состоянии система перенесёт значения прошлых дней на эти 3 неактивных дня. Но можно при включении сервера проверять дату в столбце и если окажется, что 3 дня сервер был выключен, то, соответственно, 3 столбца нужно отчистить).
    Последний раз редактировалось DeimoS; 13.06.2017 в 21:43.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

 
Страница 2 из 2 ПерваяПервая 1 2

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

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

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

Ваши права

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