Как в скрипте получить значение заголовка столбца из сетки
Участились просьбы клиентов настроить автоматический расчёт компенсации за задержку выплаты отпускных.
Два года назад в этой теме Вячеслав предложил сделать некий начальный шаблон таблицы для расчёта суммы и последующей разноски в ЛС. Но дело с мертвой точки похоже не сдвинулось.
Появилась идея написать скриптовый алгоритм для расчёта суммы компенсации, который будет работать так:
- невыплаченная сумма берётся из БЗ вида
- плановая и фактическая даты выплаты даты начала и конца действия вида
- 1/150 ставки центробанка - из сетки.
Проблема в том, что при расчёте необходимо учитывать изменение ставки в периоде задолженности. А для этого надо пробежать по столбцам сетки и считать заголовки столбцов:
Можно ли в скрипте это как-то реализовать?
Ответ
Доброго времени суток! Совсем недавно делал что-то подобное для клиента. Алгоритм во вложении 907.txt
По поводу столбцов тоже задумывался, пересмотрел все калькуляторы расчетов, дак все как один выдавали ставку рефинансирования на момент совершения правонарушения, поэтому не задумываясь поставил в алгоритме текущую ставку. В моем случае разница исчислялась тысячными долями копеек, что не критично.
пересмотрел все калькуляторы расчетов, дак все как один выдавали ставку рефинансирования на момент совершения правонарушения
Но это не правильно. И, кстати, тот калькулятор, который указан в скрипте, считает пени с учетом изменения ставки.
В моем случае разница исчислялась тысячными долями копеек, что не критично.
Это если период задержки короткий и ставка не менялась, или менялась несущественно. А вот если задержали в январе 2020, а выплатили в августе, то разница ощутима
Сваял скрипт для расчёта компенсации с учетом изменения ставки. Сравнил с результатом расчёта Вашего скрипта:
Разница ощутима...
Расчёт в онлайн-калькуляторе :
Пример функции:
/* numSet- номер сетки row - номер строки в сетке ( нумерация с 1) d1 - дата начала периода (в виде строки дд.мм.гггг) d2 - дата окончания периода */ GetRateValues(numSet,row,d1,d2) { var map = CreateObject("MapString"); char zplPath[256]; GetCurrentDirectory(255,zplPath); // путь до zpl char filePath[256];sprintf(filePath,"%s\\TABLSET\\Tabl%d.Set",zplPath,numSet); // путь до сетки if ( access(filePath,0) ) { AmbaMessageBox("Файл с сеткой не найден","Ошибка",MB_OK|MB_ICONERROR,0); return map; } var db=KDateFromStr(d1); var de=KDateFromStr(d2); var tabl = CreateObject("CurPrnTbl"); tabl.InitialNameFile(to_string(filePath)); int countFld=tabl.Count_Fld();// число столбцов //цикл по столбцам double prevRateValue=0.; for(int idxFld=0; idxFld < countFld ;idxFld++) { string fldName=tabl.Name(idxFld);FreeSpaceString (fldName,3,""); var date=KDateFromStr(fldName); //нас интересую только столбцы с датой if(!date.IsValid()) continue; //значение ставки double rateValue=atof(tabl.Text(idxFld,row-1)); prevRateValue=rateValue; //дата не входит в интересующий нас период if (date.GT(de) || date.LT(db)) continue; //добавим значение ставки на начало периода if(!map.IsExist(db.GetDouble())) map.Add(db.GetDouble(),prevRateValue); //добавим значение ставки на дату date map.Add(date.GetDouble(),rateValue); } return map; }
Пример использования:
var map=GetRateValues(85,3,"01.01.2020","31.08.2020"); ShowRates(map,"01.01.2020","31.08.2020");
Результат:
Скрипт: USFUNCRW.S
Если в настройках Windows разделителем дробной и целой части указана запятая, то значение ставки возвращается без десятичных знаков (atof просто не отрабатывает, поскольку значение из сетки=4.25 считывается как 4,25). Windows по умолчанию устанавливается с разделителем = запятая. Значит у всех клиентов сумма компенсации посчитается не правильно. Можно ли это побороть?
либо пользоваться функцией atod(str) - понимает строку и с точкой и с запятой
откуда у вас взялись запятые? КЗ везде работает только с точками (даже если в системе запятые)
Сервис поддержки клиентов работает на платформе UserEcho
Пример функции:
Пример использования:
Результат:
Скрипт: USFUNCRW.S