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

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


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

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


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

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