Текущее время: Пн, июл 21 2025, 19:28

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Динамическое составление названия внутренних таблиц?
СообщениеДобавлено: Вт, мар 08 2005, 12:23 
Гость
Здравствуйте уважаемые!

Хочу поделится следующей проблемкой:
В упрощенном виде, нужно перенести одну запись строки БД из одной системы в другую, одно поле этой строки CLUSTER длиною в 32000 единицы. CLUSTER делим на 32 части и вписываем их в IDOC-и которые так сказать переносим в другую систему. Распаковываем IDOC-и по внутренним таблицам. До этого момента все работает. Теперь нужно опять собрать CLUSTER из таблиц, вот здесь и проблема, вернее не проблема, а охото запрограмировать поэлегантнее чем 32 раза LOOP-ить через каждую таблицу. Все внутренние таблицы имеют назвоние от itab_01 до itab_32.
Попытался сделать что то в роде:

DATA: counter(2) TYPE n ,
tab_name(7).

DO 32 TIMES.

counter = counter + 1.

CONCATENATE 'itab_' counter INTO tab_name.

LOOP AT tab_name.
CONCATENATE cluster tab_name-clustd INTO cluster.
ENDLLOP.

ENDDO.

Это конечно же несработало т.к. tab_name неизвестна как таблица. Пробовал решить это дело через FIELD-SYMBOLS, тоже непрокатывает. Использование SUBROUTINE POOL нежелательно.
Может кто сталкивался с такой ситуацией, подскажите? Может где на форуме это дело уже обсуждалось, я ненашел, буду благодарен за link ...


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

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
А почему field-symbol не прокатывает?
Что-то вроде этого:
Code:
FIELD-SYMBOLS:
  <FS> TYPE ANY,
  <FS_LINE> TYPE ANY,
  <FS_TAB> TYPE ANY TABLE.
CONCATENATE 'itab_' counter '[]' INTO tab_name.
ASSIGN (tab_name) TO <FS_TAB>.

LOOP AT <FS_TAB> ASSIGNING <FS_LINE>.
  ASSIGN COMPONENT 'CLSTD'
              OF STRUCTURE <FS_LINE> TO <FS>.
  CONCATENATE cluster <FS> INTO cluster.
ENDLOOP.

А если таблицы одинаковой структуры, то с одним <FS_TAB> можно обойтись. Хотя, зачем тогда 32 разных таблицы...

_________________
С уважением, Сергей Королев


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, мар 08 2005, 16:23 
Гость
Благодарен за отклик Сергей!

Что то в этом роде с символами я пробовал. Сейчас воткнул твой вариант и ошибка выдается та же самая:
Цитата:
Es wurde versucht, einem typisierten Feldsymbol ein Feld zuzuweisen, das nicht den erforderlichen Typ besitzt.

Что означает типа:
Цитата:
... была попытка типизированному Feldsymbol присвоить значение неподходящего типа.

Вырезка с того места где все завалилось:
Code:
005800         DO 32 TIMES.                                               
005810           zaehler_i = zaehler_i + 1.                               
005820           DATA: tab_name(16).                                       
005830                                                                     
005840           FIELD-SYMBOLS:                                           
005850             <fst> TYPE ANY,                                         
005860             <fs_line> TYPE ANY,                                     
005870             <fs_tab> TYPE ANY TABLE.                               
005880           CONCATENATE 't_contcluster_' zaehler_i '[]' INTO ab_name.
     >           ASSIGN (tab_name) TO <fs_tab>.                           
005900                                                                     
005910           LOOP AT <fs_tab> ASSIGNING <fs_line>.                     
005920             ASSIGN COMPONENT 'CLSTD'                               
005930                         OF STRUCTURE <fs_line> TO <fst>.           
005940             IF zaehler = 0.                                         
005950               CONCATENATE cluster1 <fst> INTO cluster1.             
005960             ENDIF.                                                 
005970             IF zaehler = 1.                                         
005980               CONCATENATE cluster2 <fst> INTO cluster2.             
005990             ENDIF.                                                 
006000             zaehler = zaehler + 1.                                 
006010           ENDLOOP.                                                 
006020           CLEAR zaehler.                                           
                ENDDO.

Цитата:
А если таблицы одинаковой структуры, то с одним <FS_TAB> можно обойтись. Хотя, зачем тогда 32 разных таблицы...


Что ты имеешь ввиду под верхним вариантом? Конечто я непротив обойтись без 32х таблиц.


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

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
Н-да.. Надо про ASSIGN почитать, что-то ведь должно подойти..
Может CASTING, может еще что.. Не в системе я сейчас, посмотреть не могу

_________________
С уважением, Сергей Королев


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, мар 09 2005, 07:23 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, авг 24 2004, 07:19
Сообщения: 3952
Откуда: ECC 6.0, South Kazakhstan
Что-то я не понял: ?
Code:
[quote="gas_hh"]
...
005820   DATA: [b]tab_name[/b](16).                                       
005830                                                                     
005840   FIELD-SYMBOLS:                                           
...
005870    <fs_tab> TYPE ANY TABLE.                               
005880    CONCATENATE 't_contcluster_' zaehler_i '[]' INTO [b]ab_name[/b].
               ASSIGN ([b]tab_name[/b]) TO <fs_tab>.                           
[quote]


объявляется tab_name, симв.строка формируется как ab_name, assign опять tab_name - или это очепятка? :)

и кстати неплохо было бы если б ты показал как объявил zaehler_i да и сами таблицы


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, мар 09 2005, 09:49 
Гость
Нащет tab_name и ab_name это очепятка :) В квеле везде tab_name.

Нащет zaehler_i и таблиц выглядит так:
Code:
DATA:
           zaehler_i(2)                TYPE n,
           cluster1                 TYPE swuocont1-clustd,
           cluster2                 TYPE swuocont1-clustd,
           t_contcluster_01          LIKE /spenet/swuocont1_01
                                             OCCURS 0   WITH HEADER LINE,
           .
           .
           .

           t_contcluster_32          LIKE /spenet/swuocont1_32
                                            OCCURS 0   WITH HEADER LINE.           


zaehler_i TYPE n, если он будет типа i то я несмогу соединить название. swuocont1-clustd это LRAW длиною 32000.
Таблицы от 1 до 32 , /spenet/swuocont1_01...32 являются в свою очередь дикшинари структурами, т.е. это IDOC-SEGMENT-ы, каждый имеет поле размером 1000 единиц, больше айдоки непозволяют.
Наверное я черезчур объясняю. :) Ведь и так все понятно. :) Сори. :)


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

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
Гыы!! :lol:
Дело, дорогие, в том, что переменная для имени таблицы имеет длину 16, и в нее не помещаются квадратные скобки.

Code:
DATA: tab_name(16).   

Так бы еще неделю мучились :lol: :lol:

_________________
С уважением, Сергей Королев


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

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
А насчет 32 таблиц вопрос - может быть можно было оставить всего один вид сегмента в IDOC и записывать несколько экземпляров? Вроде ведь там ограничений таких нет..

_________________
С уважением, Сергей Королев


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, мар 09 2005, 10:28 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, авг 24 2004, 07:19
Сообщения: 3952
Откуда: ECC 6.0, South Kazakhstan
Сергей Королев написал:
Гыы!! :lol:
Дело, дорогие, в том, что переменная для имени таблицы имеет длину 16, и в нее не помещаются квадратные скобки.

Code:
DATA: tab_name(16).   

Так бы еще неделю мучились :lol: :lol:


Да :) ларчик просто открывался ...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, мар 09 2005, 10:41 
Гость
Прежняя ошибка больше не ошибка (спасибо Сергею), теперь заваливается на другом месте:
Code:
005810           DO 32 TIMES.                                               
005820             zaehler_i = zaehler_i + 1.                               
005830             DATA: tab_name(18).                                       
005840                                                                       
005850             FIELD-SYMBOLS:                                           
005860               <fst> TYPE ANY,                                         
005870               <fs_line> TYPE ANY,                                     
005880               <fs_tab> TYPE ANY TABLE.                               
005890             CONCATENATE 't_contcluster_' zaehler_i '[]' INTO tab_name.
005900             ASSIGN (tab_name) TO <fs_tab>.                           
005910                                                                       
005920             LOOP AT <fs_tab> ASSIGNING <fs_line>.                     
005930               ASSIGN COMPONENT 'CLSTD'                               
005940                           OF STRUCTURE <fs_line> TO <fst>.           
005950               IF zaehler = 0.                                         
------->                 CONCATENATE cluster1 <fst> INTO cluster1.             
005970               ENDIF.                                                 
005980               IF zaehler = 1.                                         
005990                 CONCATENATE cluster2 <fst> INTO cluster2.             
006000               ENDIF.                                                 
006010               zaehler = zaehler + 1.                                 
006020               UNASSIGN <fst>.                                         
006030             ENDLOOP.                                                 
006040             CLEAR zaehler.                                           
006050             UNASSIGN <fs_tab>.                                       
006060           ENDDO.                                                     
006070         ENDIF.                                                       


Я правда и сам еще непосмотрел почему? Спешу выставить на обсуждение.

Описание выглядит так.
Code:
Es wurde auf ein noch nicht zugewiesenes Feldsymbol zugegriffen   
(Datensegment Nr. 32775).                                         
                                                                   
Dieser Fehler tritt auf, wenn                                     
- ein typisiertes Feldsymbol angesprochen wird, bevor es mittels   
  ASSIGN gesetzt wird, oder                                       
- ein Feldsymbol angesprochen wird, das auf die Zeile einer       
  internen Tabelle gezeigt hat, die gelöscht wurde, oder           
- ein Feldsymbol angesprochen wird, das vorher mit UNASSIGN       
  zurückgesetzt wurde oder das auf ein lokales Feld gezeigt hat,   
  das nicht mehr existiert oder                                   
- ein Parameter einer globalen Funktionsschnittstelle angesprochen
  wird, obwohl der entsprechende Funktionsbaustein nicht aktiv ist,
  d.h. nicht in der Liste der aktiven Aufrufe steht. Die Liste der
  aktiven Aufrufe kann diesem Kurzdump entnommen werden.

Первое предложение означает:
Попытка обращения к еще неопределенному полю-символу (или что то в этом роде)           


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, мар 09 2005, 10:45 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
Ну если t_contcluster_nn это IDOc сегменты, то там нет поля 'CLSTD', а есть 'SDATA'. Т.е. надо видимо писать

Code:
ASSIGN COMPONENT 'SDATA' OF STRUCTURE <fs_line> TO <fst>.


И все-таки моя не понимать, зачем там 32 разных сегмента... Впрочем, главное, чтоб заработало...

_________________
С уважением, Сергей Королев


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, мар 09 2005, 10:52 
Гость
t_contcluster_nn это тип /SPENET/SWUOCONT1_NN т.е. сегмент имеющий поле CLUSTD ..... вот тут та собака зарыта ---> CLSTD .... щас исправлю...


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, мар 09 2005, 11:04 
Гость
Теперь прокатывает все прекрасно ... без ошибок
Только вот в деббаггере вижу что он кластер всетаки ненаполняет
Code:
CONCATENATE cluster1 <fst> INTO cluster1.


т.е. <fst> заполнено данными, а cluster1 после прохода остается пустым, наверное несоответствие типов?


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, мар 09 2005, 11:38 
Гость
Все работает, зделал таким образом:
Code:
              IF zaehler_i = 1.
                cluster1 = <fst>.
              ELSE.
                CONCATENATE cluster1 <fst> INTO cluster1.
              ENDIF.


Цитата:
А насчет 32 таблиц вопрос - может быть можно было оставить всего один вид сегмента в IDOC и записывать несколько экземпляров? Вроде ведь там ограничений таких нет..


Нда .... я бы тоже обошелся бы без 32 таблиц, только вот пока непредставляю себе как. По крайней мере прм распаковке айдоков сразу бы собирал их в нужный кластер.

Проблема еще в том что на один ключ он вытаскивает два кластера.
Поэтому cluster1 и cluster2, т.е. две строки таблицы swuocont1 последнее поле строки которой и есть этот долбанутый кластер.

В общем я непредставляю себе как?


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, мар 09 2005, 11:50 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
Это проблема отправляющей программы, той, которая создает Idoc. Т.е. проблема начального дизайна. Думаю, если нет ресурсов это переделывать, то и ладно. С точки зрения "чувства прекрасного" выглядит как-то кривовато.. По идее никто не запрещает запихнуть в один idoc пачку сегментов одного и того же типа.

_________________
С уважением, Сергей Королев


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

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


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

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


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

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