0
Отвечен

Как учесть совместительство сотрудника при использовании функций R_BZ и poisk_row

Анатолий Русин 8 месяцев назад в Отчетность обновлен Шинкарев Вячеслав (Менеджер разработки) 8 месяцев назад 6


Добрый день.

Клиент попросил вот такой отчёт в КЗ:

Расчётчик при формировании выбирает произвольную надбавку, в отчёт выводится её базовое значение и сумма.

Сложность в том, что в ту же самую таблицу необходимо принять оклад сотрудника, умножить его на процент надбавки и вывести её сумму (см. последние 3 столбца на скриншоте).

Таблицу я реализовал, но не могу придумать, как учесть возможность, что у сотрудника 2 оклада по 2 разным должностям.

Вот при такой картине:

В отчёт выводится базовое значение только по одному окладу.

Для приёма пользовался функциями:

R_BZ(0,0,104)

и

poisk_row(4,0,data,0); (она нужна потому, что для каждого оклада ещё необходимо вытаскивать доп.реквизит строки)

Подскажите, пожалуйста, как заставить данные функции "реагировать" на код совместительства сотрудника?

Или, возможно, я не в ту сторону думаю, и такую таблицу проще по-другому реализовать?


Script
На рассмотрении

Добрый день, Анатолий.
Для ускорения решения проблемы лучше сразу прилагать вашу таблицу.
Доп.реквизиты сейчас из нужной строки вытаскиваются?
Если да, то есть смысл, поставить вытаскивание БЗ после столбца с кодом оклада.

Так как пользователю будет не очень понятно видеть код оклада не 104 (как он привык) а 4, то луче если в столбец будет вытаскиваться внешний код (Intern_To_ExternE(GetCode(inCode)));
Чисто для красоты есть смысл в этом случае имя поля сделать не IntCode а
ExtCode... ну и тогда где обращались к IntCode надо заменить на
Extern_To_InternE(ExtCode)


Тогда вытаскивать БЗ можно будет R_BZ(0,0,ExtCode);

ZPL2907_zplinfo_full(20190813_144422).cab

Tabl6.Sum

На всякий случай приложил парочку сохранённых ЛС, чтоб не передавать отдельно ТВХ, список доп.реквизитов и прочее.

Код оклада клиент видеть не будет, ей только базовое значение нужно.

Доп реквизиты вытаскиваются тоже неправильные - оба по одной и той де строке (в том примере - 4.01.

Сложность ещё и в том, что у клиента существует "повышающий коэффициент для оклада", который передаётся из КП и записывается в доп. реквизит строки. И при приёме в таблицу мы не можем просто воспользоваться функцией R_BZ, необходимо принять также и доп.реквизит.

Поэтому приходится принимать БЗ оклада, принимать повышающий коэф-т из доп.реквизита, а потом перемножать их.

Но это уже усложнение исходной задачи - сейчас даже просто принять БЗ или принять доп.реквизит получается только если у сотрудника одна действующая строка оклада.

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

Сейчас набросаю пример

2.zip

userGetCodeBz(code)
{
  int rowkod[ROWMAX];//массив с номерами строк
  int cntrow=poiskosnkod(Extern_To_InternE(code),rowkod,1,0);//получаем список строк с внешним кодом code
  if(!cntrow)
        return 0.;
    var ListBZ;// = CreateObject("MapString");
    unsigned cnt=GetListBZ(Extern_To_InternE(code),data+0.01,data+countday/100.,GetBase(rowkod[0]),ListBZ);
    //тут надо из доп реквизита достать "повышающий коэф."
    return ListBZ[0][0];//БЗ вида (первое найденное значение) 
}

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

Потому что сначала мы туда принимаем точный код надбавки, например, 121, как на скриншоте. А потом - точный код оклада сотрудника по данной должности (опять же см.скриншот).

Приведённая функция работает отлично, но она работает с уже готовым внешним кодом вида. Как его вычислить?

Например:

Совместительство 1 - оклад 104.02 - надбавка - 121.01

Совместительство 2 - оклад 104.04 - надбавка - 121.02

Проблема в том, чтобы именно вот эти данные в таком разрезе получить.
Дальше с помощью приведённой вами функции или через Rkv_from все необходимые данные вытащить будет уже не проблема.

var prop= CreateObject("APropBE");Prob.Init(CLL_TOTAL_SRC,CLL_TOTAL_SUBJECT,CLL_TOTAL_PODR,combine); //инициализируем APropBE вн.кодом совместительства
int rowkod[ROWMAX];//массив с номерами строк
int cntrow=poiskosnkodProp(Extern_To_Intern(code),rowkod,0,prop);//получаем список всех строк с кодом==kod  по должности с внутр.кодом combine 
for (int row=0; row < cntrow; row++) //перебираем все строки
{
//тут определяем - подходит нам эта строка вида или нет...

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