Текущее время: Вс, июл 27 2025, 06:33

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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