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

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Динамические структуры
СообщениеДобавлено: Пт, дек 15 2006, 17:32 
Младший специалист
Младший специалист

Зарегистрирован:
Пн, окт 03 2005, 10:16
Сообщения: 74
Здравствуйте.
Посмотрел несколько связанных тем, но не особо продвинулся в понимании решения! :((

У меня задача написать программу, которая будет менять значение (убирать ведущие нули) одного поля в нескольких таблицах БД.

Я хотел сделать это так:

1. Скидываем БД-таблицу во внутреннюю той же структуры.
2. Во внутренней проводим все изменения.
3. UPDATE-им обратно в БД.

Но табличек таких много. Т.е. кода и переменных получится много.

Можно ли как-нить универсально это сделать? Чтобы на вход шло название таблицы. И по нему строилась внутренняя таблица аналогичной структуры. Ну и алгоритм один на всех! :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамические структуры
СообщениеДобавлено: Пт, дек 15 2006, 17:52 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
Damager написал(а):
Здравствуйте.
Посмотрел несколько связанных тем, но не особо продвинулся в понимании решения! :((

Плохо. Очень плохо. Может тогда ещё рано такими вещами заниматься? Там ведь не так и много вариантов решения и они не очень сложны.
Кстати - неплохо было бы указывать ещё и версию системы, т.к. решиния сильно зависят и от этого.
Цитата:
У меня задача написать программу, которая будет менять значение (убирать ведущие нули) одного поля в нескольких таблицах БД.

Я хотел сделать это так:

1. Скидываем БД-таблицу во внутреннюю той же структуры.
2. Во внутренней проводим все изменения.
3. UPDATE-им обратно в БД.

Но табличек таких много. Т.е. кода и переменных получится много.

...

Вы уверены что правильно поняли задание?

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамические структуры
СообщениеДобавлено: Пт, дек 15 2006, 19:28 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, дек 20 2004, 16:05
Сообщения: 1080
Откуда: 4.0B
Пол: Мужской
Damager написал(а):
Здравствуйте.
Посмотрел несколько связанных тем, но не особо продвинулся в понимании решения! :((

У меня задача написать программу, которая будет менять значение (убирать ведущие нули) одного поля в нескольких таблицах БД.

Я хотел сделать это так:

1. Скидываем БД-таблицу во внутреннюю той же структуры.
2. Во внутренней проводим все изменения.
3. UPDATE-им обратно в БД.

Но табличек таких много. Т.е. кода и переменных получится много.

Можно ли как-нить универсально это сделать? Чтобы на вход шло название таблицы. И по нему строилась внутренняя таблица аналогичной структуры. Ну и алгоритм один на всех! :)


посмотрите в сторону:

data: ItabRef type ref to data.
field-symbols: <it_tab> type standard table.
data: tabname(4) value 'BKPF'.


CREATE DATA ItabRef TYPE STANDARD TABLE OF (tabname).
ASSIGN ItabRef->* TO <it_tab>.

select * into table <it_tab> from (tabname).


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамические структуры
СообщениеДобавлено: Пн, дек 18 2006, 08:46 
Младший специалист
Младший специалист

Зарегистрирован:
Пн, окт 03 2005, 10:16
Сообщения: 74
Lars написал:

посмотрите в сторону:

data: ItabRef type ref to data.
field-symbols: <it_tab> type standard table.
data: tabname(4) value 'BKPF'.


CREATE DATA ItabRef TYPE STANDARD TABLE OF (tabname).
ASSIGN ItabRef->* TO <it_tab>.

select * into table <it_tab> from (tabname).


Спасибо. Но у меня на строку
Code:
CREATE DATA ItabRef TYPE STANDARD TABLE OF (tabname).


выдает ошибку:
Unable to interpret "TABLE". Possible causes of error: Incorrect spelling or comma error.

У меня 4.6C.


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

Зарегистрирован:
Пн, дек 20 2004, 16:05
Сообщения: 1080
Откуда: 4.0B
Пол: Мужской
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
...
i_structure_name = <tabname>
...
CHANGING
ct_fieldcat = fieldcat[]
EXCEPTIONS
INCONSISTENT_INTERFACE = 1
PROGRAM_ERROR = 2
OTHERS = 3
.

...
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = fieldcat
IMPORTING
ep_table = ItabRef.

...


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, дек 18 2006, 10:53 
Младший специалист
Младший специалист

Зарегистрирован:
Пн, окт 03 2005, 10:16
Сообщения: 74
В итоге получилось такое:

Code:
data: ItabRef type ref to data.
data: tabname like DD02L-TABNAME value 'ZSD_WEBLOG'.
data fieldcat type LVC_S_FCAT occurs 0.

field-symbols: <it_tab> type standard table, <pole>, <line>, <value>.

DATA fld(8) VALUE 'DEST'.
Assign fld to <pole>.

CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = tabname
CHANGING
ct_fieldcat = fieldcat[]
EXCEPTIONS
INCONSISTENT_INTERFACE = 1
PROGRAM_ERROR = 2
OTHERS = 3.

CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = fieldcat
IMPORTING
ep_table = ItabRef.

ASSIGN ItabRef->* TO <it_tab>.

select * into table <it_tab> from (tabname).


Чтобы достать данные, я использую assign.
Code:
loop at <it_tab> assigning <line>.
  assign component <pole> of structure <line> to <value>.
  write <value>.
endloop.


Подскажи, плз., как можно данные в таблице поменять?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, дек 18 2006, 11:32 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, дек 20 2004, 16:05
Сообщения: 1080
Откуда: 4.0B
Пол: Мужской
Ну, внутри лупа:

<value> = 'XXX'.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, дек 18 2006, 14:40 
Младший специалист
Младший специалист

Зарегистрирован:
Пн, окт 03 2005, 10:16
Сообщения: 74
По поводу сброса данных:

Code:
select * into table <it_tab> from (tabname).


Админы говорят, такие вещи надо делать порциями, т.к. если таблицы большие, то много ресурсов уйдет.

Т.е. придется использовать SELECT .. ENDSELECT и по sy-dbcnt отпускать порции.
В этом случае into table не подойдет и мне нужна wrok area той же структуры, что и таблица.
Как ее описать? Или может есть другой способ?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, дек 18 2006, 15:36 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, июн 16 2005, 10:29
Сообщения: 336
Откуда: Минск->Москва
Пол: Мужской
Code:
SELECT <field_names>
   FROM <DDIC_table>
   INTO CORRESPONDING FIELDS OF TABLE <itab1>
   PACKAGE SIZE <size>


есть вот такая конструкция


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, дек 18 2006, 16:22 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, дек 20 2004, 16:05
Сообщения: 1080
Откуда: 4.0B
Пол: Мужской
Можно еще предложить

OPEN CURSOR ...

do.
FETCH NEXT CURSOR ...
enddo.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, дек 20 2006, 10:06 
Младший специалист
Младший специалист

Зарегистрирован:
Пн, окт 03 2005, 10:16
Сообщения: 74
Я считываю данные в основной программе, потом передаю их в ФМ в виде набора строк длины 4000 (для универсальности) и там уже делаю Update.

Основная программа:

Code:

...

DATA: BEGIN OF tline OCCURS 0.
        INCLUDE STRUCTURE zsd_char4000.
DATA: END OF tline.

FIELD-SYMBOLS: <it_tab> TYPE STANDARD TABLE.

...

      SELECT *
         FROM (tab_name)
         INTO CORRESPONDING FIELDS OF TABLE <it_tab>
         PACKAGE SIZE tcount.

        LOOP AT <it_tab> ASSIGNING <line>.

*      изменение данных
        ...

        ENDLOOP.

        REFRESH tline[].
        tline[] = <it_tab>[].

        CALL FUNCTION 'Z_SD_COM_UPDATE' IN UPDATE TASK
             EXPORTING
                  tabname         = tab_name
             TABLES
                  tline           = tline
             EXCEPTIONS
                  table_not_found = 1
                  OTHERS          = 2.

      ENDSELECT.

      COMMIT WORK AND WAIT.


ФМ апдейта Z_SD_COM_UPDATE:

Code:

CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
       EXPORTING
            i_structure_name       = tabname
       CHANGING
            ct_fieldcat            = fieldcat[]
       EXCEPTIONS
            inconsistent_interface = 1
            program_error          = 2
            OTHERS                 = 3.

  CALL METHOD cl_alv_table_create=>create_dynamic_table
  EXPORTING
  it_fieldcatalog = fieldcat
  IMPORTING
  ep_table = itabref
  EXCEPTIONS
   generate_subpool_dir_full = 1
   OTHERS                    = 2.

     ASSIGN itabref->* TO <it_tab>.

    REFRESH <it_tab>[].
    <it_tab>[] = tline[].

    UPDATE (tabname) FROM TABLE <it_tab>.
  ENDIF.



т.к. данные обновляю порциями, то ФМ запускается несколько раз.
При 37-м запуске метод cl_alv_table_create=>create_dynamic_table
выдает Exception generate_subpool_dir_full.
Именно при 37-м. Если всего будет 36 вызовов, то все пройдет нормально!

Подскажите, плз, что это за ошибка?
Я не освобождаю какие-то ресурсы?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, дек 20 2006, 10:10 
Младший специалист
Младший специалист

Зарегистрирован:
Пн, окт 03 2005, 10:16
Сообщения: 74
порылся в доках, нашел такое:

GENERATE SUBROUTINE POOL <itab> NAME <prog> [<options>].

This statement creates a subroutine pool in the main memory area of the running program. You pass the source code of the subroutine pool in internal table <itab>. The statement returns the name of the generated subroutine pool in field <prog> that should have type C of length 8. You use the name in <prog> to call the external subroutines defined in table <itab> through dynamic subroutine calls as explained in Specifying the Subroutine Name at Runtime.

The subroutine pool only exists during the runtime of the generating program and can only be called from within this program. You can create up to 36 subroutine pools for one program.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, дек 20 2006, 12:09 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Вт, авг 17 2004, 14:35
Сообщения: 1519
Откуда: В ВЕЧНОМ БАНЕ
Damager написал(а):
порылся в доках, нашел такое:
GENERATE SUBROUTINE POOL <itab> NAME <prog> [<options>].

А надо было в форуме сначала... об этот генерейт пул уже расписано по самое нехочу...


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, дек 20 2006, 18:00 
Почетный гуру
Почетный гуру

Зарегистрирован:
Вт, авг 17 2004, 10:45
Сообщения: 550
Откуда: SAP_BASIS 640
Уважаемый Damager! Обновление таблиц БД, даже собственных - это более чем серьёзная операция. И не думаю, что здесь уместна какая бы то ни было динамика, поскольку программы такого рода - щедрая почва для ошибок и несовместимостей с последующими изменениями.
Если же требуется выполнять множество обновлений однотипных таблиц, то это верный признак, что что-то не то с постановкой.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Динамические структуры
СообщениеДобавлено: Чт, дек 21 2006, 10:20 
Менеджер
Менеджер

Зарегистрирован:
Вт, авг 17 2004, 13:14
Сообщения: 664
Откуда: Москва
Пол: Мужской
sy-uname написал(а):
Вы уверены что правильно поняли задание?


Солидарен с sy-uname. Задача очень подозрительна. Если пользователи не хотят видеть нули на экране, то в field-каталоге ALV есть поле NO_ZERO. При вводе значиний о нулях беспокоится не надо, в домене указывается программа преобразования ALPHA, которая добавит ведущие нули.
Я когда-то свою небольшую функциональность написал, так потом клял тот день, когда от ведущих нулей отказался.


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

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


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

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


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

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