Текущее время: Сб, июл 26 2025, 22:13

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 66 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Пн, июн 06 2005, 15:43 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, май 04 2005, 16:29
Сообщения: 687
Откуда: Нижневартовск->Москва
Пол: Мужской
Что будет в сообщении в этом случае:

Code:
REPORT  Z_TMP.

CALL FUNCTION 'Z_TMP'.


Модуль:
Code:
FUNCTION Z_TMP.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     VALUE(I_PARAM) OPTIONAL
*"----------------------------------------------------------------------

  I_PARAM = '1234567890'.

  message i000(38) with I_PARAM.

ENDFUNCTION.


Навеяло после ковыряния BEFORE_LINE_OUTPUT
http://sapboard.ru/forum/viewtopic.php?p=35993#35993
:)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, июн 06 2005, 18:08 
Почетный гуру
Почетный гуру

Зарегистрирован:
Вт, авг 17 2004, 10:45
Сообщения: 550
Откуда: SAP_BASIS 640
Действительно, забавно. Вероятно, если программа не может определить тип формального параметра, то она принимает его как char(4).


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, июн 07 2005, 11:59 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, май 04 2005, 16:29
Сообщения: 687
Откуда: Нижневартовск->Москва
Пол: Мужской
EGF написал(а):
Действительно, забавно. Вероятно, если программа не может определить тип формального параметра, то она принимает его как char(4).


Ну я бы сказал, что не программа, а система, если не разобралась в рантайме, какой тип параметра, то определяет его как char4.
В момент запуска модуля в системной области DATP образуется запись
Code:
Область    DATP                 Элемент                   Строка               
       ACC   OFSG   OFFI   LENG TYPE OLEN ODEC LITL XTYP                       
0      NORM 32769      0      4    C    4    0      TYP.0.282                   


Вообще, конечно, непонятно почему именно 4. К тому же есть системная переменная %_DUMMY$$, которая тоже по какой-то причине Char4.

Да и на 4 сразу включаются аналогии: 4-х символьные имена таблиц, 4-х символьные транзакции, группы функций :lol:
Но это, разумеется, просто совпадение..


ps если подобным образом посмотреть таблицу, она тоже будет иметь ширину 4 знака


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июн 09 2005, 17:04 
Почетный гуру
Почетный гуру

Зарегистрирован:
Вт, авг 17 2004, 10:45
Сообщения: 550
Откуда: SAP_BASIS 640
Раз речь зашла о функциональных модулях...
Тогда вот такая загогулина:
Code:
REPORT  zef_test4                                                   .

TABLES:
  mara
.
FORM write_matnr.
  WRITE / mara-matnr.
ENDFORM.                    "write_matnr

***********************************

FUNCTION zef_test1.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"----------------------------------------------------------------------
TABLES: mara.

  mara-matnr = '000000000000000002'.
  PERFORM write_matnr(zef_test4).
ENDFUNCTION.

***********************************

REPORT zef_test5.

TABLES:
  mara
.
mara-matnr = '000000000000000001'.
PERFORM write_matnr(zef_test4).
CALL FUNCTION 'ZEF_TEST1'.



Вопрос как обычно: что будет на экране при вызове отчёта ZEF_TEST5?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июн 09 2005, 17:37 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, май 04 2005, 16:29
Сообщения: 687
Откуда: Нижневартовск->Москва
Пол: Мужской
Встречный вопрос. Что если запустить так:
Code:
REPORT zef_test5.

TABLES:
  mara
.
mara-matnr = '000000000000000001'.

CALL FUNCTION 'ZEF_TEST1'.
PERFORM write_matnr(zef_test4).



(поменять местами CALL FUNCTION и PERFORM )

:D

Или даже так:

Code:
REPORT zef_test5.

TABLES:
  mara
.

CALL FUNCTION 'ZEF_TEST1'.
mara-matnr = '000000000000000001'.
PERFORM write_matnr(zef_test4).


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, июн 14 2005, 12:11 
Почетный гуру
Почетный гуру

Зарегистрирован:
Вт, авг 17 2004, 10:45
Сообщения: 550
Откуда: SAP_BASIS 640
Главных идеи здесь две:
1. Рабочая область, объявляемая с помощью TABLES, создаётся один раз для группы программ (program group).
2. Вызов формы, описанной в другой программе, загружает эту программу в группу программ вызывающей программе. Причём делается это один раз, т.е. программа, где описана форма, будет загружена в ту группу программ, из которой её вызвали первый раз.

Таким образом, в приведённом примере произойдёт следующее:
При запуске отчёта zef_test5 создаётся главная группа программ (main program group), куда загружается рабочая область MARA, описанная в этом отчёте. При вызове формы write_matnr в главную группу программ загружается программа zef_test4. Поскольку для главной группы программ рабочая область MARA уже создана, то она разделяется для программ zef_test4 и zef_test5, и следовательно строка
Code:
WRITE / mara-matnr.

выведет значение '1'.

Вызов ФМ zef_test1 создаёт дополнительную группу программ (additional program group) и собственную рабочую область MARA для этой группы. Поэтому присвоение
Code:
mara-matnr = '000000000000000002'.

не изменит содержимого рабочей области, загруженной в главную группу программ. Вызов
Code:
PERFORM write_matnr(zef_test4).

не приведёт к загрузке программы zef_test4 в дополнительную группу программ, поскольку эта программа уже загружена в главную группу. Поэтому на экран будет выведено содержимое рабочей области, загруженной в главную группу программ, т.е. '1'.

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


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, июн 14 2005, 12:38 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, май 04 2005, 16:29
Сообщения: 687
Откуда: Нижневартовск->Москва
Пол: Мужской
:oops: Вклинюсь и немножко обобщу..

Interface Work Areas:
1.Screen Interfaces - TABLES <dbtab>.
2.Logical Database Interfaces - NODES <node>.
3.External Subroutine Interfaces - COMMON PART addition of the DATA statement, TABLES <dbtab>, NODES <node>.

http://help.sap.com/saphelp_46c/helpdat ... ameset.htm

http://help.sap.com/saphelp_46c/helpdat ... ameset.htm


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июл 06 2005, 10:27 
Почетный гуру
Почетный гуру

Зарегистрирован:
Вт, авг 17 2004, 10:45
Сообщения: 550
Откуда: SAP_BASIS 640
А вот ещё интересные фенечки...
Code:
  1   REPORT  zef_test4                                                   .
  2   *---------------------------------------------------------------------*
  3   *       CLASS lc_assign_features DEFINITION
  4   *---------------------------------------------------------------------*
  5   CLASS lc_assign_features DEFINITION.
  6     PUBLIC SECTION.
  7       METHODS:
  8         write_matnr
  9           IMPORTING e_matnr TYPE any OPTIONAL
10         .
11     PRIVATE SECTION.
12       METHODS:
13         get_reference
14           EXPORTING e_ref TYPE REF TO mara
15         .
16   ENDCLASS.                    "lc_assign_features DEFINITION
17
18   DATA:
19     gcl_assign_features TYPE REF TO lc_assign_features
20   .
21   FIELD-SYMBOLS:
22     <g_matnr>,
23     <g_matnr1> TYPE ANY
24   .
25   CREATE OBJECT gcl_assign_features.
26   CALL METHOD gcl_assign_features->write_matnr
27     EXPORTING
28       e_matnr = <g_matnr>.
29   CALL METHOD gcl_assign_features->write_matnr
30     EXPORTING
31       e_matnr = <g_matnr1>.
32
33   *---------------------------------------------------------------------*
34   *       CLASS lc_assign_features IMPLEMENTATION
35   *---------------------------------------------------------------------*
36   CLASS lc_assign_features IMPLEMENTATION.
37     METHOD get_reference.
38   *        EXPORTING e_ref TYPE REF TO mara
39       DATA:
40         ls_mara TYPE mara
41       .
42       ls_mara-matnr = '1'.
43       GET REFERENCE OF ls_mara INTO e_ref.
44     ENDMETHOD.                    "set_reference
45
46     METHOD write_matnr.
47   *        IMPORTING e_matnr TYPE any
48       DATA:
49         ls_mara TYPE REF TO mara
50       .
51       CALL METHOD get_reference
52         IMPORTING
53           e_ref = ls_mara.
54       IF ls_mara IS NOT INITIAL.
55         WRITE ls_mara->*-matnr.
56       ELSEIF ls_mara IS BOUND.
57         WRITE ls_mara->*-matnr.
58       ELSE.
59         WRITE e_matnr.
60       ENDIF.
61     ENDMETHOD.                    "write_matnr
62   ENDCLASS.                    "lc_assign_features IMPLEMENTATION

Какие три строчки надо убрать, чтобы программа перестала падать в дамп?
Практического смысла в этом примере нет ровно никакого - он чисто демонстационный.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июл 07 2005, 12:10 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, май 04 2005, 16:29
Сообщения: 687
Откуда: Нижневартовск->Москва
Пол: Мужской
А почему написано именно

54 IF ls_mara IS NOT INITIAL.
..
56 ELSEIF ls_mara IS BOUND.

Ведь вроде, если INITIAL, то заведомо не BOUND => на 57-ю строку не попадём никогда.

Как я понимаю здесь показана попытка доступа к локальной переменной соседнего метода, передача неприсвоенного типизированного field-symbol и то, что нетипизированный field-symbol уже сразу оказывается ASSIGNED..

А насчёт того, что закомментировать.. Я бы убрал 30, 31 (+нужна точка), 55

ЗЫ Блин, код для 4.7..


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, июл 08 2005, 09:41 
Почетный гуру
Почетный гуру

Зарегистрирован:
Вт, авг 17 2004, 10:45
Сообщения: 550
Откуда: SAP_BASIS 640
Вы совершенно правы.
Нетипизированный field-symbol при объявлении связывается системой с константой space. Соответственно, при передаче нетипизированного и не связанного явно field-symbol в качестве параметра экспорта не вызовет ошибки при выполнении. Если же попытаться передать его как параметр импорта, то мы получим дамп, поскольку попытаемся изменить константу space. С типизированным field-symbol неявного связывания не происходит.
Также я пытался - не слишком удачно - показать разницу между операторами IS INITIAL и IS BOUND при операциях со ссылками.
IS INITIAL определяет, содержит ли ссылка какое-либо значение, т.е. ссылается ли она на какой-нибудь объект. При этом не принимается во внимание, существует ли этот объект на момент операции - это определяет оператор IS BOUND. И уж конечно, если оператое IS INITIAL вернет TRUE, то ссылка не указывает ни на какой объект, и оператор IS BOUND просто теряет смысл.

А вот ещё про ASSIGN.
Code:
DATA:
  g_index
.
DATA:
  BEGIN OF gs_figures,
    5,
    4,
    3,
    2,
    1,
  END OF gs_figures
.
FIELD-SYMBOLS:
  <gs_figures> TYPE ANY
.
gs_figures-5 = '1'.
gs_figures-4 = '2'.
gs_figures-3 = '3'.
gs_figures-2 = '4'.
gs_figures-1 = '5'.
ASSIGN COMPONENT sy-index OF STRUCTURE gs_figures TO <gs_figures>.
WRITE / <gs_figures>.
g_index = 1.
DO.
  ASSIGN COMPONENT sy-index OF STRUCTURE gs_figures TO <gs_figures>.
  IF sy-subrc <> 0.
    EXIT.
  ENDIF.
  WRITE / <gs_figures>.
  ASSIGN COMPONENT g_index OF STRUCTURE gs_figures TO <gs_figures>.
  IF sy-subrc <> 0.
    EXIT.
  ENDIF.
  WRITE <gs_figures>.
  ADD 1 TO g_index.
ENDDO.


Что будет выведено на экран?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, июл 08 2005, 10:18 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, май 04 2005, 16:29
Сообщения: 687
Откуда: Нижневартовск->Москва
Пол: Мужской
EGF написал(а):
Нетипизированный field-symbol при объявлении связывается системой с константой space.


А откуда эта информация?
Смотрю на указатели - вроде разные..

Code:
field-symbols <fs>.
field-symbols <space> type any.

data: ptr1 pointer.
data: ptr2 pointer.

assign space to <space>.

SYSTEM-CALL POINTER <fs> TO ptr1.
SYSTEM-CALL POINTER <space> TO ptr2.

write: / ptr1,
       / ptr2.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, июл 08 2005, 12:33 
Почетный гуру
Почетный гуру

Зарегистрирован:
Вт, авг 17 2004, 10:45
Сообщения: 550
Откуда: SAP_BASIS 640
Информация из статьи Horst Keller, Gerd Kluger "Eight Reasons Why Every ABAP Developer Should Give ABAP Objects a Second Look", стр. 49:
Цитата:
"If a field symbol is not explicitly typed, for historical reasons the runtime environment implicitly assigns the predefined data object space to field symbol."
.

А какие именно данные отображает SYSTEM-CALL POINTER? В справке написано довольно туманно:
Цитата:
The data description of the field to which the field symbol<f> is pointed is saved in POINTER ptr.
The 'pointer' ptr must be created using DATA ptr POINTER.


Что можно точно сказать - это то, что нетипизированный field-symbol при объявлении связывается с символом "пробел":
Code:
FIELD-SYMBOLS:
  <g_fs>,
  <g_fs_x> TYPE x
.
ASSIGN <g_fs> TO <g_fs_x> CASTING.
WRITE <g_fs_x>.
UNASSIGN <g_fs_x>.
ASSIGN space TO <g_fs_x> CASTING.
WRITE / <g_fs_x>.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, июл 08 2005, 14:02 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, май 04 2005, 16:29
Сообщения: 687
Откуда: Нижневартовск->Москва
Пол: Мужской
Ну то, что там один константный пробел - это понятно.

А вот с POINTER.. Точно могу сказать, что это указание по какому индексу в какой системной области лежит переменная, параметр, литерал и т.п., какой размер, тип данных и т.д.

Часть формата легче продемонстрировать на литералах.

Code:
field-symbols: <fs>.
data: ptr pointer.

SYSTEM-CALL POINTER <fs> TO ptr.
write: / ptr.

assign space to <fs>.
SYSTEM-CALL POINTER <fs> TO ptr.
write: / ptr.

assign ' ' to <fs>.
SYSTEM-CALL POINTER <fs> TO ptr.
write: / ptr.

assign 'ZZZZZZZZZZZZZZZZ' to <fs>.
SYSTEM-CALL POINTER <fs> TO ptr.
write: / ptr.

assign 'XXXXXXXXXXXXXXXX' to <fs>.
SYSTEM-CALL POINTER <fs> TO ptr.
write: / ptr.


PTR+4(4) - это индекс в области LITL (можно посмотреть в отладке).
Поскольку литералы загружаются в память сразу по загрузке программы (причём с учётом text-symbols и языка входа), не важно в какой момент работы программы лезть в область.

Следующие 4 символа пока не знаю что, но ещё 4 следом - это размер данных.

Ясен перец, что какая-то часть PTR это код системной области.
В общем, если посидеть, то можно выяснить где что..


ЗЫ Все индексы и прочее - в HEX.
ЗЫ PTR+8(4) - это похоже на код системной области..


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, июл 08 2005, 14:40 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, май 04 2005, 16:29
Сообщения: 687
Откуда: Нижневартовск->Москва
Пол: Мужской
Да, забыл спросить, книжка в электронном виде где-нибудь есть? :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, июл 08 2005, 16:18 
Почетный гуру
Почетный гуру

Зарегистрирован:
Вт, авг 17 2004, 10:45
Сообщения: 550
Откуда: SAP_BASIS 640
Это не книжка - это статья, и она есть на sdn.sap.com. Точного адреса не сохранилось, к сожалению.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 66 ]  На страницу Пред.  1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB