Список форумов BOSSForum.RU - Форум. БОСС-Кадровик
Независимый форум, посвященный системе БОСС-Кадровик
и всему, что с ней связано
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Непонятное поведение Opent

 
Начать новую тему   Ответить на тему    Список форумов BOSSForum.RU - Форум. БОСС-Кадровик -> Z-язык
Предыдущая тема :: Следующая тема  
Автор Сообщение
Antoshes



Зарегистрирован: 17.02.2014
Сообщения: 171
Откуда: Томск

СообщениеДобавлено: Вт Ноя 25, 2014 15:38    Заголовок сообщения: Непонятное поведение Opent Ответить с цитатой

Добрый день!
После обновления до 6.04.01.01. обнаружил следующую проблему
Z формула zrp_БольнСверхНорм

В ней есть следующий код
Opent t
SELECT sum(top_limit), sum(limit_mode), sum(Skidka_FSS), sum(days), sum(Days_Year1), Middle_Sum FROM z_sabsence WHERE idvo = :idvo1 group by Middle_sum;
Fetch t, top_limit_, limit_mode_, Skidka_FSS_, day_all, day_p, m_sum;
close t;

После обновления, в переменную m_sum, ей соответствует MIddle_SUM попадает значение Middle_Year. ЧУДЕСА !!
В базе в поле Middle_sum значение 1479.45, а в поле Middle_year 1534.50. В m_sum = 1534.50
В итоге оплата больничного сверхнормы уменьшается.
На копии базы с предыдущей версией все нормально!
Понимаю, звучит странно, глупо. Но это факт. Как будто Z берет первое попавшееся поле Middle_Year вместо Middle_Sum.
Как можно выкрутиться из данной ситуации ?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DUCKKK
Большой шоколадный орден
Большой шоколадный орден


Зарегистрирован: 16.09.2009
Сообщения: 1681

СообщениеДобавлено: Вт Ноя 25, 2014 18:43    Заголовок сообщения: Ответить с цитатой

С большой долей вероятности запрос ничего не возвращает.

Писать надо так:

Opent t
SELECT sum(top_limit), sum(limit_mode), sum(Skidka_FSS), sum(days), sum(Days_Year1), Middle_Sum FROM z_sabsence WHERE idvo = :idvo1 group by Middle_sum;
Fetch t, top_limit_, limit_mode_, Skidka_FSS_, day_all, day_p, m_sum;
If (teot(t) {
put(“Караул, Украли наши данные”);
// m_sum = 0;
}
close t;
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Antoshes



Зарегистрирован: 17.02.2014
Сообщения: 171
Откуда: Томск

СообщениеДобавлено: Ср Ноя 26, 2014 07:02    Заголовок сообщения: Ответить с цитатой

DUCKKK
В этот раз не могу с вами согласиться!
OpenT без teot присутствует во множестве Базовых Z-объектов .
И мой запрос два года правильно возвращал данные, до обновления..
Попробую закинуть данные этого запроса в темповую таблицу
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Antoshes



Зарегистрирован: 17.02.2014
Сообщения: 171
Откуда: Томск

СообщениеДобавлено: Ср Ноя 26, 2014 09:06    Заголовок сообщения: Ответить с цитатой

В общем, мои чудеса не прекращаются Smile звучит конечно глупо, так как сам в чудеса не верю.. Но очень хочется разобраться до конца, возможно я не прав конечно..
DUCKKK, если у вас будет минутка свободного времени, не могли бы вы проверить наш алгоритм расчета сверхнормы..
Вот наш код

{
var str1[10];
number summa_, nameVO,sredn, top_limit_, top_limit, code_operat, _c, limit_mode_ ,Skidka_FSS_, sym_ = 0, i = 0, pr_p = 0, day_all = 0, day_p = 0, m_sum = 0; m_s=0;
number delta_ = 0 ;

ParamStr(0, str1); strnum(str1, nameVO);
ParamStr(1, str1); strnum(str1, sredn);
ParamStr(2, str1); strnum(str1, top_limit);
ParamStr(3, str1); strnum(str1, code_operat);
var y_rasch_[2], sel[500];

y_rasch_[0]=0;
y_rasch_[1]=0;

idvo1 = Ид_ВО();
idmain = ИдГлавн();
number auto_card_ = ИдФизЛица();


// У кого в комментарии стоит 1, то считаем сверхнормы

Opent sverh
select count(*) from pr_ill where 1 = 1 and auto_ill = :idmain and substring(appl, 1,1)= '1';
fetch sverh, _c;
Close sverh;

if (_c > 0)
{

opent t
select min(tyear), MAX(tyear) from z_sabsence where idmain = :idmain and idvo = :idvo1;
fetch t, y_rasch_[0], y_rasch_[1];
tclose(t);

while (i<2)
{
sput (sel, "SELECT sum(tSumma) " // по справке
"FROM zrptb_fss_sum "
"WHERE tYear = %d and id_firm = @@id_firm and Auto_Card = %d and isnull(check_ill,0) = 0",
y_rasch_[i], auto_card_);

//if (teot(t)) break;
t = topen(sel, 1);
dnp_ = tget(t,pr_p );
tclose(t);
sym_ = sym_ + СуммаФЛ_Вх(310, 1, y_rasch_[i], 12, y_rasch_[i], 2, 1 ,1,2)+pr_p;
i= i+ 1;
}

/* Пробовал скидывать данные в темповую таблицу, результат тот же

DO_SQL("if object_id('tempdb..#t_zsab') is not null then drop table #t_zsab ");

DO_SQL("create table #t_zsab (Skidka_fss numeric(15,4), Days numeric(15,4), Days_Year1 numeric(15,4), Sred numeric(15,4)) " );

sput (sel, "insert into #t_zsab SELECT sum(Skidka_FSS), sum(days), sum(Days_Year1), Middle_Sum FROM z_sabsence WHERE idvo = %d group by middle_sum ", idvo1);

DO_SQL(sel);

sput (sel, "select Skidka_fss, Days, Days_Year1, Sred from #t_zsab ");

if (strlen(sel) > 0)
{
t = topen(sel, 1);
i = tget(t, Skidka_FSS_, day_all, day_p, m_sum);
tclose(t);
};
*/


Opent t
SELECT sum(top_limit), sum(limit_mode), sum(Skidka_FSS), sum(days), sum(Days_Year1), /*Middle_Sum вот так было. И возвращалось значение поля Middle_Year. Пока сделал так... */ sum(Top_limit)/730 FROM z_sabsence WHERE idvo = :idvo1;
Fetch t, top_limit_, limit_mode_, Skidka_FSS_, day_all, day_p, m_sum;
if (teot(t)) {top_limit_ = 0; limit_mode_ = 0; Skidka_FSS_ = 0; day_all = 0; day_p = 0; m_sum = 0;}
close t;

summa_ = sym_ - Skidka_FSS_;
if (day_p== 0) day_p = 731;

summa_ = round(summa_/min(day_all, day_p), 0.01);


delta_ = (summa_- m_sum)*Дни_ВО();

if (delta_< 0) return 0;

добавитьВО(Месяц_ВО(), Год_ВО(), _ВО__200, Дни_ВО(), Часы_ВО(), Процент_ВО(), delta_, 1);
};
return 0;
}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DUCKKK
Большой шоколадный орден
Большой шоколадный орден


Зарегистрирован: 16.09.2009
Сообщения: 1681

СообщениеДобавлено: Ср Ноя 26, 2014 12:01    Заголовок сообщения: Ответить с цитатой

Ну на это точно нет времени ...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Svyatoslav



Зарегистрирован: 14.02.2010
Сообщения: 50

СообщениеДобавлено: Чт Ноя 27, 2014 12:20    Заголовок сообщения: Ответить с цитатой

Ваш запрос:
SELECT sum(top_limit), sum(limit_mode), sum(Skidka_FSS), sum(days), sum(Days_Year1), Middle_Sum FROM z_sabsence WHERE idvo = :idvo1 group by Middle_sum

В селесте все поля являются агрегированными функциямо по группам Middle_sum, кроме поля Middle_Sum. Нужна какая нибудь функция, напрмер AVG.
Вообще-то должна возникать ошибка при выполнении запроса.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Antoshes



Зарегистрирован: 17.02.2014
Сообщения: 171
Откуда: Томск

СообщениеДобавлено: Пт Ноя 28, 2014 07:27    Заголовок сообщения: Ответить с цитатой

Svyatoslav
Ошибки нет. Работало два года без проблем. И на предыдущей версии работает. Сам очень удивлен поведению OpenT.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Svyatoslav



Зарегистрирован: 14.02.2010
Сообщения: 50

СообщениеДобавлено: Пт Ноя 28, 2014 12:52    Заголовок сообщения: Ответить с цитатой

Попробуйте подключить средства отладки. Трассировку X и Z.
В трассировке показываются селекты, в том виде, в каком они передаются на сервер. Дело в том, что переменные Х языка подставляются в операторы SELECT Z процедур.
Чтобы не было подмены, заключите в кавычки имя поля запроса. Вот так "middle_sum".
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Antoshes



Зарегистрирован: 17.02.2014
Сообщения: 171
Откуда: Томск

СообщениеДобавлено: Пн Дек 01, 2014 08:46    Заголовок сообщения: Ответить с цитатой

Svyatoslav
Спасибо, добавил кавычки - результат тот же. Вот трассировка SQL

3610505 276 -- q1435
SELECT sum(top_limit), sum(limit_mode), sum(Skidka_FSS), sum(days), sum(Days_Year1), "Middle_Sum"
FROM z_sabsence
WHERE idvo = 7124149 group by "Middle_Sum"
Go

3610506 276 0ms for Execute q1436 SELECT sum(top_limit), sum(limit_mode), sum(Skidka_FSS), sum(d

3610507 276 Таб.№ 00000000 ФИО Иванова Евгения Александровна

3610508 276 idvo1 = 7124149, m_sum = 1534.09 а это уже sput..

запрос под номеров 3610505 в студии возвращает следующее
1080000.0000 -1998.0000 0.0000 730.0000 704 1479.4500
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Svyatoslav



Зарегистрирован: 14.02.2010
Сообщения: 50

СообщениеДобавлено: Пн Дек 01, 2014 16:39    Заголовок сообщения: Ответить с цитатой

Попробуйте SQL c другими курсорами TOpen, Openselect или Open.
Чтобы повторить пример в SQL студии надо создать курср с вашим запрсом. OpenT это не запрос, а курсор.
Только боюсь, что с другими курсорами будет та же история.
Surprised
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов BOSSForum.RU - Форум. БОСС-Кадровик -> Z-язык Часовой пояс: GMT + 4
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Pоwerеd by рhpВB © 2001, 2005 рhpВB Grouр
Русская поддержка phрВB
Rambler's Top100 Рейтинг@Mail.ru Список форумов BOSSForum.RU