Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
NewAge
Зарегистрирован: 11.06.2010 Сообщения: 108
|
Добавлено: Вт Апр 21, 2020 11:44 Заголовок сообщения: Проблема в z процедуре m_Долги |
|
|
Добрый день.
Поймали проблему в m_Долги в функции CorrectCalcTableRe. Расчет зарплаты просто зависает. Вот код, в котором возникает проблема:
Код: |
j = 0;
while (CalcCorrSumm != CorrSumm) {
RE_VO[j][2] = RE_VO[j][2] + sAdd;
CalcCorrSumm = CalcCorrSumm + sAdd;
j = j + 1;
if (j == CountReVo) {j = 0;};
};
|
Первоначально:
CorrSumm = -31216.19; CalcCorrSumm = -31216.17; sAdd = -0.01
Когда CorrSumm = -31216.19; CalcCorrSumm = -31216.19 программ из цикла while не выходит. Не могу понять почему. Может это связано с особенностями функций trunc и round, которые используются при расчете CorrSumm и CalcCorrSumm.
Меняю
Код: | while (CalcCorrSumm != CorrSumm) { |
на
Код: | while (abs(CalcCorrSumm - CorrSumm) >= 0.01) { |
все работает.
Может кто сталкивался с этой проблемой???
Еще в коде:
Код: |
//корректируем
j = 0;
while (j < CountReVo) {
setРасчСтрока(RE_VO[j][0], _i_Сумма_ВО, RE_VO[j][1] + RE_VO[j][2]); /*т.к. CorrSumm изначально с обратным знаком */
};
|
отсутствует:
|
|
Вернуться к началу |
|
|
DUCKKK Большой шоколадный орден
Зарегистрирован: 16.09.2009 Сообщения: 1680
|
Добавлено: Вт Апр 21, 2020 12:53 Заголовок сообщения: |
|
|
А есть какой-то пример с цифрами, на котором расчет гарантированно зависнет? |
|
Вернуться к началу |
|
|
NewAge
Зарегистрирован: 11.06.2010 Сообщения: 108
|
Добавлено: Вт Апр 21, 2020 13:20 Заголовок сообщения: |
|
|
Такой пример конечно есть у нас на рабочей базе. Только вот не знаю как получится ли у меня воспроизвести такую ситуацию на модельной. Там работник с очень "богатой" историей. Там порядка пяти исполнительных листов и плюс еще больничные. Запустили в апреле по нему перерасчет через ВО 300 и получили бесконечный цикл при корректировки расчетной таблицы.
Мне больше всего не понятно почему вот это условие истино:
Код: | -31216.19 != -31216.19[quote]???[/quote] |
|
|
Вернуться к началу |
|
|
DUCKKK Большой шоколадный орден
Зарегистрирован: 16.09.2009 Сообщения: 1680
|
Добавлено: Вт Апр 21, 2020 13:23 Заголовок сообщения: |
|
|
Мне для проверки на серийной базе все-таки нужен пример .... На уровне "непонятности" в коде рассуждать не получится. |
|
Вернуться к началу |
|
|
NewAge
Зарегистрирован: 11.06.2010 Сообщения: 108
|
Добавлено: Вт Апр 21, 2020 13:33 Заголовок сообщения: |
|
|
Ну над первым тогда подумаем как смоделировать ситуацию на модельной базе.
А в части отсутствия строки j = j + 1; передадите привет разработчикам?)))) |
|
Вернуться к началу |
|
|
DUCKKK Большой шоколадный орден
Зарегистрирован: 16.09.2009 Сообщения: 1680
|
Добавлено: Вт Апр 21, 2020 13:37 Заголовок сообщения: |
|
|
Я уже все передал. Кроме разработчиков - есть тестировщики. Они без "пощупать на цифрах" работать отказываются ... |
|
Вернуться к началу |
|
|
NewAge
Зарегистрирован: 11.06.2010 Сообщения: 108
|
Добавлено: Вт Апр 21, 2020 13:42 Заголовок сообщения: |
|
|
Но вот тут то цифры совсем не причем. Здесь явная ошибка. Отсутствует выражение, которое изменяет переменную цикла j.
Еще в коде:
Код: |
//корректируем
j = 0;
while (j < CountReVo) {
setРасчСтрока(RE_VO[j][0], _i_Сумма_ВО, RE_VO[j][1] + RE_VO[j][2]); /*т.к. CorrSumm изначально с обратным знаком */
};
|
отсутствует:
|
|
Вернуться к началу |
|
|
|