0
Отвечен

Как в скрипте получить значение заголовка столбца из сетки

Игорь Шалдин 4 года назад в Расчеты начислений и удержаний / Алгоритмы обновлен Гашков Николай (Эксперт) 4 года назад 12

Участились просьбы клиентов настроить автоматический расчёт компенсации за задержку выплаты отпускных.

Два года назад в этой теме Вячеслав предложил сделать некий начальный шаблон таблицы для расчёта суммы и последующей разноски в ЛС. Но дело с мертвой точки похоже не сдвинулось. 

Появилась идея написать скриптовый алгоритм для расчёта суммы компенсации, который будет работать так:

- невыплаченная сумма берётся из БЗ вида

- плановая и фактическая даты выплаты даты начала и конца действия вида

- 1/150 ставки центробанка - из сетки.

Проблема в том, что при расчёте необходимо учитывать изменение ставки в периоде задолженности. А для этого надо пробежать по столбцам сетки и считать заголовки столбцов:

Image 4459

Можно ли в скрипте это как-то реализовать?

Script

Ответ

Ответ

Пример функции:

/*
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

ХОРОШО, МНЕ ПОНРАВИЛОСЬ
Оценка удовлетворенности от Игорь Шалдин 4 года назад

Доброго времени суток! Совсем недавно делал что-то подобное для клиента. Алгоритм во вложении 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 по умолчанию устанавливается с разделителем = запятая. Значит у всех клиентов сумма компенсации посчитается не правильно. Можно ли это побороть?

Заменяем запятые на точки:

replac0(',','.',buf,strlen(buf));

либо пользоваться функцией atod(str) - понимает строку и с точкой и с запятой

откуда у вас взялись запятые? КЗ везде работает только с точками (даже если в системе запятые)

Сервис поддержки клиентов работает на платформе UserEcho