среда, 30 января 2013 г.

Global query variant

Оказалось, что не все знают, что можно создавать глобальные варианты для запуска отчета.
Делается это достаточно просто, при создании варианта надо убрать галку Save as User Variant, задать тех.имя и сохранить.


Объект авторизации - S_RS_PARAM (необходим в случае глобальных вариантов)

Таблицы - RSRPARAMETRIZA (вариант и параметры) и RSRPARAMETRIZAT (тексты)

Интересные поля:

PARENTCOMPONENT - тип объекта
1 Query
2 Workbook
3 Web Application
4 Planning Sequence
5 Planning Function
6 Enterprise Report

ELTUID - тех.имя запроса
PERSONAL - локальный (X) и глобальный (SPACE) вариант
OWNER - user id создателя
CONTENT - содержание варианта в XML формате

Перенос - стандартного (по одной кнопке) способа переноса не существует. Но есть варианты.

Руками в транспорт
PgmID Obj     Object name

R3TR  TABU RSRPARAMETRIZA
R3TR  TABU RSRPARAMETRIZAT

С помощью ведения таблицы *

- SE16
- ‘RSRPARAMETRIZA’
- Нажать кнопку ‘table Contents’ (or F7)
- Провалится в контент (‘F8′)
- Выделить записи для траспортировки
- В меню выбрать ‘table Entry’ -> ‘Transport Entries’
- Выбрать запрос на перенос

* но много на формах сообщений, что способ не работает, закрыт пункт ‘Transport Entries’








понедельник, 28 января 2013 г.

Float

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

Почитал ещё курс BC402, порадовала фраза...
Внимание: Для вычислений в арифметике с плавающей запятой используются операции с плавающей запятой соответствующих процессоров. Поскольку алгоритмы выполняются над двоичными числами, могут возникать погрешности. Степень и эффект таких погрешностей не поддаются оценке.

Теперь, на примере...

DATA:

l_value1 TYPE p DECIMALS 5 value '1.755',
l_value2 TYPE f value '1.755',

l_result1 TYPE p DECIMALS 1,
l_result2 TYPE p DECIMALS 2,
l_result3 TYPE p DECIMALS 3,
l_result4 TYPE p DECIMALS 4.

l_result1 = l_value1. write / l_result1.
l_result2 = l_value1. write / l_result2.
l_result3 = l_value1. write / l_result3.
l_result4 = l_value1. write / l_result4.

l_result1 = l_value2. write / l_result1.
l_result2 = l_value2. write / l_result2.
l_result3 = l_value2. write / l_result3.
l_result4 = l_value2. write / l_result4.

Результат:
[b]l_value1 TYPE p DECIMALS 5 value '1.755'[/b]

0.0 1.8
0.00 1.76
0.000 1.755
0.0000 1.7550

[b]l_value2 TYPE f value '1.755'[/b]
0.0 1.8
0.00 1.75
0.000 1.755
0.0000 1.7550
Получается, что при float округление, делается с учетом размерности приемника + 1.
Т.е. 1,755 которая во представляется внутри как 0.7549999999999999E+00 при преобразовании к 0.00 преобразуют по факту 1.754, а не 1.755

Срочно выкидываем float отовсюду во избежании...