Ваши комментарии
Остальное несущественное. Вашу функцию я слегка модифицировал - мне нужно было знать дату закрытия, чтобы открыть другой вид на следующий день, а проверкой типа в С++ я как-то не владею.При ответе Вячеслава всё наладилось.
var CL=CreateObject("CombineList");
var it = CL.CreateIterator();
for (it.SetBegin();!it.IsEnd();it.Next()) { //цикл по должностям (it.CurKey() - внутр.код совместительства )
long comb = it.CurKey();
if (!IsTimeLS(Tn,comb))
continue;
var d=KDateFromInt_WithDay(1,mrasch);
var last_day_982 = TryFindCodeValidOnDate(comb,982,d);
var last_day_988 = TryFindCodeValidOnDate(comb,988,d);
var open_date = CreateObject("KDate");
open_date.SetDate("01.01.2099");
// проверяем на последний закрытый вид оплаты
bool Otkr982 = false; // true - нужно открыть 982, false - не нужно открывать
bool Otkr988 = false; // true - нужно открыть 988, false - не нужно открывать
if (last_day_982.IsValid()) {
if (last_day_988.IsValid()) {
if (last_day_982.IsEq(open_date) || last_day_988.IsEq(open_date)) { // открыт любой вид
// не нужно ничего открывать
} else { // оба вида закрыты, вычисляем последний закрытый вид
if (last_day_982.LT(last_day_988)) { // если 988 закрыт позже, чем 982
Otkr982 = true;
} else
Otkr988 = true;
}
} else { // 988 не существует
if (!last_day_982.IsEq(open_date)) // 982 закрыт
Otkr988 = true;
}
} else { // 982 не существует
if (last_day_988.IsValid()) {
if (!last_day_988.IsEq(open_date)) // 988 закрыт
Otkr982 = true;
} else {
Otkr982 = true; // если ни один вид не существует, то открываем 982
}
}
//AmbaMessageBox("982 = " + last_day_982.GetStr(),"",MB_OK|MB_ICONINFORMATION,0);
//AmbaMessageBox("988 = " + last_day_988.GetStr(),"",MB_OK|MB_ICONINFORMATION,0);
var tc=CreateObject("TmpCurCombine"); // Класс для временной смены, а затем и восстановления текущей должности
tc.Init(comb);//инициализируем
//AmbaMessageBox("текущее совместительство " + to_string(IntCombineToExt(GetCurCombine())),"",MB_OK|MB_ICONERROR,0);
// соответственно открываем вид оплаты
if (Otkr982 == true) {
var dat = CreateObject("KDate");
if (last_day_988.IsValid()) {
last_day_988.Inc();
dat.SetDateD(last_day_988.GetDouble());
} else
dat = KDateFromInt_WithDay(1,mrasch);
char date[11];
date = dat.GetStr();
if (Panel_Zapros("Дата открытия 982 вида (" + to_string(IntCombineToExt(comb)) + ")"
, "", "Укажите дату открытия (" + to_string(IntCombineToExt(comb)) + ")", date, 10) != ESC) {
var temp = CreateObject("KDate");
temp.SetDate(to_string(date));
if (temp.IsValid()) {
dat.SetDateD(temp.GetDouble());
}
}
if ( otkrsnu(201, dat.GetDouble() , 205001.01, 0.00, "70", 0) == EOF )
AmbaMessageBox("Не получилось открыть вид 982","",MB_OK|MB_ICONERROR,0);
else {
long FullTn = Find_Full_TN(Tn);
if ( FullTn != EOF ) {
char ls[LSSTR];
lsname(FullTn,ls);
lswrite(ls,0);
}
}
} else if (Otkr988) {
var dat = CreateObject("KDate");
if (last_day_982.IsValid()) {
last_day_982.Inc();
dat.SetDateD(last_day_982.GetDouble());
} else
dat = KDateFromInt_WithDay(1,mrasch);
char date[11];
date = dat.GetStr();
if (Panel_Zapros("Дата открытия 988 вида (" + to_string(IntCombineToExt(comb)) + ")"
, "", "Укажите дату открытия (" + to_string(IntCombineToExt(comb)) + ")", date, 10) != ESC) {
var temp = CreateObject("KDate");
temp.SetDate(to_string(date));
if (temp.IsValid()) {
dat.SetDateD(temp.GetDouble());
}
}
if ( otkrsnu(222, dat.GetDouble() , 205001.01, 0.00, "70", 0) == EOF )
AmbaMessageBox("Не получилось открыть вид 988" ,"",MB_OK|MB_ICONERROR,0);
else {
long FullTn = Find_Full_TN(Tn);
if ( FullTn != EOF ) {
char ls[LSSTR];
lsname(FullTn,ls);
lswrite(ls,0);
}
}
}
tc = 0;
}
}
Еще вопросик. Если параметр comb имеет значение, то как получить список совместительств для лицевого счета?
За расчетный месяц. Это связано с автоматическим открытием видов оплаты. Раньше я почему то думал, что закрытие это удаление. А, фактически, закрытие - это проставление даты окончания отличной от 01.01.2050. Поскольку открытие предполагается после записи ЛС (раньше не отловить, насколько я понял), то нужно сделать анализ на предмет того, что открыто и закрыто. У меня 2 вида оплаты - аванс. Алгоритм один, а назначение разное: одно - выплата через банк, другое - через кассу. Разумеется, два одновременно не должны быть открыты. Или одно, или другое. Предполагается, что закрываем одно, открывается другое.
Сервис поддержки клиентов работает на платформе UserEcho
Форма 001. Текстовая форма. В идеале бы какой-нибудь сохранять в PDF, но это так, необязательно.
Один файл на всё точно не надо. Нужно "почеловечно", намного гибче. Нужно чтобы в имя файла входили как минимум номер подразделения (3 символа) и табельный номер (6 символов).