poxy.
NoDeny
Спец
Карма: 10
Offline
Сообщений: 844
|
 |
« : 01 Июля 2013, 08:24:34 » |
|
Доброе утро всем. Вчера почему то упало ядро, запустил сегодня в 8 утра, соответственно поснимало за неполный месяц. Подскажите запрос для обновления баланса, чтоб к примеру 118.80 превратилось в 120.0.
|
|
|
|
|
Записан
|
|
|
|
|
Efendy
|
 |
« Ответ #1 : 01 Июля 2013, 09:41:00 » |
|
Что-то у тебя странное на сервере, я специально не делал перезапускалку ядра, чтобы заставить ядро сделать надежным. На моем сервере работает месяцами и не падает. Платежи и баланс в N+ работают абсолютно по той же схеме как и в Н49/50 - при изменение платежа необходимо править на туже величину и баланс. Т.е. делается 2 sql: update pays set cash=cash+1.2 where id=12345 limit 1; update users set balance=balance+1.2 where id=123 limit 1; здесь: 1.2 - на сколько хотим изменить платеж 12345 - id платежа 123 - id клиента limit 1 - страховка, а то дрогнет рука и без условия заапдейтится вся таблица
|
|
|
|
|
Записан
|
|
|
|
poxy.
NoDeny
Спец
Карма: 10
Offline
Сообщений: 844
|
 |
« Ответ #2 : 01 Июля 2013, 10:11:20 » |
|
по поводу id клиента, изменит тому чей id указан, а мне нужно сразу всем у кого снялось 118, у кого другой тариф не изменять
PS если руками изменяю платеж "снятие за услуги" то баланс тоже меняется, может можно как то поправить платежи "снятие за ... 118.0" на 120?
|
|
|
|
|
Записан
|
|
|
|
|
Efendy
|
 |
« Ответ #3 : 01 Июля 2013, 10:42:18 » |
|
У тебя тарифы в режиме "от текущего момента до 1го числа" типа как в старом нодени? update users set balance=balance-2 where id in(select mid from pays where category=100 and cash=-118 and time>(unix_timestamp()-2*24*3600)); update pays set cash=-120 where category=100 and cash=-118; сначала изменяется баланс клиентов, которых есть платеж "снятие за услуги" (категория 100) в размере 118грн не раньше двух дней назад ( 2*24*3600), затем изменяются эти платежи.
|
|
|
|
|
Записан
|
|
|
|
poxy.
NoDeny
Спец
Карма: 10
Offline
Сообщений: 844
|
 |
« Ответ #4 : 01 Июля 2013, 10:57:46 » |
|
У тебя тарифы в режиме "от текущего момента до 1го числа" типа как в старом нодени? Да, стоит "конец месяца"
|
|
|
|
|
Записан
|
|
|
|
poxy.
NoDeny
Спец
Карма: 10
Offline
Сообщений: 844
|
 |
« Ответ #5 : 01 Июля 2013, 12:00:51 » |
|
спасибо
|
|
|
|
|
Записан
|
|
|
|
poxy.
NoDeny
Спец
Карма: 10
Offline
Сообщений: 844
|
 |
« Ответ #6 : 01 Июля 2013, 13:55:03 » |
|
Чтоб не создавать отдельный пост спрошу тут: В платежах : Проверка системы
Уровень проблемы Проблема 3 Есть расхождения суммы платежей и баланса клиента
Где посмотреть что не сошлось?
|
|
|
|
|
Записан
|
|
|
|
|
Efendy
|
 |
« Ответ #7 : 01 Июля 2013, 13:59:21 » |
|
perl /usr/local/nodeny/nokernel.pl -m=system_check -v где видим: SELECT u.id, u.balance, SUM(p.cash) AS chk_balance FROM users u LEFT JOIN pays p ON u.id=p.mid GROUP BY u.id HAVING u.balance<>chk_balance
|
|
|
|
|
Записан
|
|
|
|
poxy.
NoDeny
Спец
Карма: 10
Offline
Сообщений: 844
|
 |
« Ответ #8 : 01 Июля 2013, 14:04:58 » |
|
спасибо
|
|
|
|
|
Записан
|
|
|
|
|
Efendy
|
 |
« Ответ #9 : 19 Августа 2015, 10:36:16 » |
|
На всякий случай sql, который установит всем абонам, у которых несхождение баланса, правильные балансы по сумме платежей: UPDATE users u JOIN (SELECT u.id, u.balance, SUM(p.cash) AS chk_balance FROM users u LEFT JOIN pays p ON u.id=p.mid GROUP BY u.id HAVING u.balance<>chk_balance) a ON u.id=a.id SET u.balance=a.chk_balance; Естественно, перед выполнением (любых) sql нужно делать бекапы базы
|
|
|
|
|
Записан
|
|
|
|
elvin
Пользователь

Карма: 0
Offline
Сообщений: 48
|
 |
« Ответ #10 : 23 Октября 2020, 09:02:20 » |
|
perl /usr/local/nodeny/nokernel.pl -m=system_check -v где видим: SELECT u.id, u.balance, SUM(p.cash) AS chk_balance FROM users u LEFT JOIN pays p ON u.id=p.mid GROUP BY u.id HAVING u.balance<>chk_balance Не срабатывает если расхождение в пару копеек, но в лог пишет, как быть в этом случае? спасибо!
|
|
|
|
|
Записан
|
|
|
|
|
k291
|
 |
« Ответ #11 : 19 Февраля 2024, 21:45:13 » |
|
На всякий случай sql, который установит всем абонам, у которых несхождение баланса, правильные балансы по сумме платежей: UPDATE users u JOIN (SELECT u.id, u.balance, SUM(p.cash) AS chk_balance FROM users u LEFT JOIN pays p ON u.id=p.mid GROUP BY u.id HAVING u.balance<>chk_balance) a ON u.id=a.id SET u.balance=a.chk_balance; Естественно, перед выполнением (любых) sql нужно делать бекапы базы Чтобы не искали: mysql -u root --password='hardpass' USE nodeny;
UPDATE users u JOIN (SELECT u.id, u.balance, SUM(p.cash) AS chk_balance FROM users u LEFT JOIN pays p ON u.id=p.mid GROUP BY u.id HAVING u.balance<>chk_balance) a ON u.id=a.id SET u.balance=a.chk_balance;
exit
perl /usr/local/nodeny/nokernel.pl -m=system_check -v
|
|
|
|
|
Записан
|
|
|
|
|
k291
|
 |
« Ответ #12 : Сегодня в 01:28:07 » |
|
Сделал проверку(system_check) от 0.01 копейки. Иначе микро расхождение постоянно появляются в Платежи. /usr/local/nodeny/kernel/system_check.pm my $db = Db->sql( 'SELECT u.id, u.name, u.fio, ' . 'CAST(u.balance AS DECIMAL(20,6)) AS full_balance, ' . 'CAST(SUM(p.cash) AS DECIMAL(20,6)) AS full_chk_balance, ' . 'CAST(u.balance - SUM(p.cash) AS DECIMAL(20,6)) AS difference ' . 'FROM users u LEFT JOIN pays p ON u.id=p.mid ' . 'GROUP BY u.id, u.balance ' . [s]# 'HAVING u.balance <> SUM(p.cash) ' [/s]. 'HAVING ABS(u.balance - SUM(p.cash)) > 0.01 ' . 'ORDER BY ABS(u.balance - SUM(p.cash)) DESC' ); "Есть расхождения суммы платежей и баланса клиента"
|
|
|
|
|
Записан
|
|
|
|
|