Текущее время: Пн, авг 04 2025, 01:42

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Динамический ABAP
СообщениеДобавлено: Вт, авг 17 2004, 04:39 
Гость
Уважаемые коллеги, подскажите реально ли в ABAP динамически сформировать SELECT. Т.е. имется список таблиц и ключей к ним, в программе необходимо сформировать SELECT, из этих данных и получить результат.
Заранее спасибо.


Пометить тему как нерешенную
Вернуться к началу
  
 
 Заголовок сообщения: *
СообщениеДобавлено: Вт, авг 17 2004, 08:02 
Гость
не такое случайно?
изобретал тут вытяжку информации по контрагентам (они по 4м табличкам оказались раскиданы)...

Code:
*---------------------------------------------------------------------*
*       FORM GetPmt                                                   *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  TABNAME                                                       *
*  -->  FIELDNAME                                                     *
*---------------------------------------------------------------------*
*ищет 1 запись контрагента в BSIK,BSAK,BSID,BSAD (динам.SQL-запрос),
*подтягивает доп.информацию, текстовки и т.п. из связанных справочников,
*имя поля FieldName можно указывать с алиасом 't~имя_поля as алиас'
form Get1Pmt
  tables
    iDest structure idocs
  using
    TabName like sy-repid
    FieldName like sy-repid
  .
* динамический список полей (для sql-запросов)
  data:
    begin of TabFields occurs 0,
       Item(72) TYPE C,
    end of TabFields.

  if ( iDest-KAGENT is initial ).

    TabFields-Item = FieldName.
    append TabFields.
*   динамический запрос
    select single (TabFields)
      into corresponding fields of iDest
      from (TabName) as t where
      t~BUKRS = '1000' "iDest-BUKRS
      and
      t~GJAHR = iDest-GJAHR and
      t~BELNR = iDest-BELNR and
      t~SHKZG = debt     "дебетные
      .
  endif.
endform.


Пометить тему как нерешенную
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, авг 17 2004, 09:16 
Гость
Code:
DATA: TABNAM(16) VALUE 'BKPF',
      VR TYPE REF TO DATA.

FIELD-SYMBOLS: <p> TYPE STANDARD TABLE.

   CREATE DATA VR TYPE STANDARD TABLE OF (TABNAM).
   ASSIGN VR->* TO <p>.
   CLEAR <p>. REFRESH <p>.
   SELECT * FROM (TABNAM) APPENDING TABLE <p>.


Пометить тему как нерешенную
Вернуться к началу
  
 
 Заголовок сообщения: Спасибо за ответы
СообщениеДобавлено: Вт, авг 17 2004, 10:20 
Гость
Вилимо не совсем ясно написал, или совсем не ясно. :D
Мне нужна динамическая фраза where.
Строится она оказывантся примерно так:
TYPE-POOLS RSDS.
DATA: where_tab type RSDS_WHERE_TAB.
DATA: tblName(30).
....
SELECT * FROM (tblName) INTO itblName where (where_tab).

Всем спасибо за ответы. :D


Пометить тему как нерешенную
Вернуться к началу
  
 
 Заголовок сообщения:   Тема решена
СообщениеДобавлено: Вт, авг 17 2004, 10:34 
Гость
Code:
DATA: TABN TYPE TABNAME16,
          begin of st occurs 0,
            stroka(200),
         end of st.
concatenate  'SELECT * FROM' tabn 'WHERE'
      into st-stroka separated by space.
append st.
*....
st-stroka = '______________'.  append st.
*....
st-stroka = '______________'.  append st.
*....
st-stroka = '______________'.  append st.
*....
st-stroka = 'ENDSELECT'. append st.

INSERT REPORT 'Z00001_SE1' FROM st  STATE 'A'.
submit  Z00001_SE1 VIA SELECTION-SCREEN AND RETURN.
delete report 'Z00001_SE1'.


Пометить тему как нерешенную
Вернуться к началу
  
 
 Заголовок сообщения: Dynamic Conditions
СообщениеДобавлено: Вт, авг 17 2004, 10:38 
Гость
А Help слабо посмотреть ? :shock:

To specify a condition dynamically, use:
SELECT ... WHERE (<itab>) ...
where <itab> is an internal table with line type C and maximum length 72 characters...


:arrow: Пример из жизни:

Code:
FORM FillTableTitle.

  DATA:       WTAB(72) OCCURS 100 WITH HEADER LINE,
              AND(3).

  REFRESH WTAB.
  IF NOT pBukrs IS INITIAL.
    CONCATENATE 'BUKRS = ''' pBukrs '''' INTO WTAB.
    APPEND WTAB.
    AND = 'AND'.
  ENDIF.
  IF NOT pSTATUS IS INITIAL.
    CONCATENATE AND ' STATUS = ''' pSTATUS '''' INTO WTAB.
    APPEND WTAB.
  ENDIF.

  SELECT * FROM ZGRP_NKS_TITLE
           INTO TABLE it_TITL
           WHERE (WTAB)
           ORDER BY PRIMARY KEY.

ENDFORM.


Пометить тему как нерешенную
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, авг 17 2004, 11:30 
Гость
Stenj, такой способ, конечно, допустим, но не лучше ли использовать SELECT-OPTIONS вместо параметров?


Пометить тему как нерешенную
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, авг 17 2004, 13:48 
Гость
Я показал принцип создания динамического WHERE. А уж логика формирования itab зависит от конкретной задачи.


Пометить тему как нерешенную
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, авг 17 2004, 14:31 
Гость
Принципы на хороших примерах показывать надо :wink:


Пометить тему как нерешенную
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, авг 17 2004, 15:30 
Гость
Простите, но если Вам неизвестна постановка задачи, алгоритм работы программы, из которой взят пример, то на основании чего Вы можете судить о преимуществе SELECT-OPTIONS ? Хотя-бы, например, pBukrs, pStatus могли элементарно передаваться как параметры в FillTableTitle и для динамического WHERE вообще неважно на основании чего Вы сформировали itab :roll:


Пометить тему как нерешенную
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, авг 18 2004, 09:54 
Гость
Ну, как видно из приведенного Вами примера pBukrs, pStatus не передаются как параметры в FillTableTitle и преимущества select-options, по-моему, очевидны и без постановки задачи:

select-options sBUKRS for ... NO-EXTENSION NO INTERVALS.
select-options sSTATUS for ... NO-EXTENSION NO INTERVALS.
....
SELECT * FROM ZGRP_NKS_TITLE
INTO TABLE it_TITL
WHERE BURKS IN sBUKRS AND STATUS IN sSTATUS
ORDER BY PRIMARY KEY.


А если, нужно впихнуть динамические условия, то это могло выглядеть так:

FORM FillTableTitle USING p1.
DATA: where_cond TYPE STRING.
CONCATENATE 'FLD =' P1 INTO where_cond SEPARATED BY space.
SELECT * FROM ZGRP_NKS_TITLE
INTO TABLE it_TITL
WHERE BURKS IN sBUKRS AND STATUS IN sSTATUS AND (where_cond).
ORDER BY PRIMARY KEY.
ENDFORM. "FillTableTitle


Пометить тему как нерешенную
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, авг 18 2004, 10:10 
Специалист
Специалист

Зарегистрирован:
Вт, авг 17 2004, 08:47
Сообщения: 222
Пол: Мужской
А возможно ли cделать динамический джойн?

Пример:
Code:
select a~fil2 b~fil3 from (tab) as a
  join (j_tab) as b on b~fil1 eq a~fil1
  into table itab.


Например эта ситуация может возникнуть с таблицами BKPF, BSID, BSAD. И чтобы два селекта на два случая не писать, написать один динамический селект с джойном.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, авг 18 2004, 11:49 
Гость
data: tab type string,
tab1(30) VALUE 'BKPF',
tab2(30) VALUE 'BSID'.
concatenate tab1 'AS A JOIN' tab2 'AS B on b~fil1 eq a~fil1'
into tab separated by space.
select a~fil2 b~fil3 from (tab) into table itab.


Пометить тему как нерешенную
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, авг 18 2004, 12:44 
Гость
Во избежание выяснения преимуществ использования IN в условии WHERE команды SELECT предлагаю самому протестировать на предмет скорости выполнения два варианта, указав в параметрах ввода несколько БЕ и побольше счетов :
Вариант 1.
Code:
REFRESH: iBSIS.
* BSIS
SELECT * FROM BSIS
APPENDING CORRESPONDING FIELDS OF TABLE iBSIS
WHERE BUKRS IN SD_BUKRS AND HKONT IN SO_HKONT.
* BSAS
SELECT * FROM BSAS
APPENDING CORRESPONDING FIELDS OF TABLE iBSIS
WHERE BUKRS IN SD_BUKRS AND HKONT IN SO_HKONT.
Вариант 2.
Code:
* SKB1 - Основные записи основных счетов (БЕ)
SELECT BUKRS SAKNR FROM SKB1
INTO CORRESPONDING FIELDS OF TABLE iSKB1
WHERE BUKRS IN SD_BUKRS AND SAKNR IN SO_HKONT.
REFRESH: iBSIS.
LOOP AT iSKB1 INTO waSKB1.
* BSIS
SELECT * FROM BSIS
APPENDING CORRESPONDING FIELDS OF TABLE iBSIS
WHERE BUKRS = waSKB1-BUKRS AND HKONT = waSKB1-SAKNR.
* BSAS
SELECT * FROM BSAS
APPENDING CORRESPONDING FIELDS OF TABLE iBSIS
WHERE BUKRS = waSKB1-BUKRS AND HKONT = waSKB1-SAKNR.
ENDLOOP.
P.S. первичный индекс по BSIS, BSAS: BUKRS+HKONT+...


Пометить тему как нерешенную
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, авг 19 2004, 08:53 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 08:36
Сообщения: 182
Откуда: Russia
Пол: Мужской
Может и не в тему, но динамическое условие WHERE из кучи разных SELECT-OPTIONS очень удобно формировать с помошью ФМ FREE_SELECTIONS_RANGE_2_WHERE
И вообще в этой группе функций SSEL много разных функций для динамической обработки

_________________
С Уважением Серега


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

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


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

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


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

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