2013-03-08 2 views
1

noobie learning abap here. У меня есть метод, который импортирует структуру, создает внутреннюю таблицу из структуры и возвращает эту таблицу.как полностью указать тип возвращаемого параметра abap

Я реализовал его как метод экспорта, но теперь я хочу сделать это как возвращаемый параметр. Часть идеи состоит в том, что я ничего не знаю о структуре, которая передается до времени выполнения, поэтому я использую довольно много дженериков. Однако методы «Возврат» не нравятся дженерикам.

method Parameters: 
    Importing struct_data TYPE any 
    Returning table_data TYPE STANDARD TABLE 

method STRUCT_TO_TABLE_R. 

    FIELD-SYMBOLS: 
    <f_fs> TYPE any, 
    <table> TYPE STANDARD TABLE . 

    DO. 

    ASSIGN COMPONENT sy-index OF STRUCTURE struct_data TO <f_fs>. 

    IF NOT sy-subrc EQ 0. 
     EXIT. 
    ENDIF. 

    APPEND <f_fs> TO <table>. 

    ENDDO. 

    table_data = <table>. 

endmethod. 

Что мне нужно изменить, чтобы исправить это?

+1

Ваш пример кода на самом деле не имеет никакого смысла (кроме вопросов форматирования) - параметры не имеет ничего общего с методами, поэтому метод подписи отсутствует. Кроме того, для формата Q & A не имеет значения, что вы являетесь «noobie learning abap». Не могли бы вы попытаться немного прояснить проблему? – vwegert

+0

Вы, скорее всего, ответили на свой вопрос, хотя, чтобы полностью указать параметр, который вы должны указать точному типу, вы не можете использовать тип ANY, CLIKE или любой другой общий тип. Таким образом, вы не можете использовать общий тип в качестве возвращаемого параметра. – Esti

ответ

1

Возвращаемые параметры передаются значением. Другими словами, когда этот метод выполняется, вы всегда можете получить доступ к возвращаемому параметру, но ваши вызывающие могут вообще не принимать значения из метода, но метод все еще должен использовать этот параметр. Это было бы причиной, по которой вам нужно указать полный тип TYPED для возврата.

В качестве альтернативы вы можете преобразовать таблицу в ссылку Объект и передать ее обратно вызывающему абоненту.

class lcl_Test DEFINITION. 
    PUBLIC SECTION. 
    methods: to_Table 
      returning value(ro_tab) type ref to data . 
ENDCLASS. 
* 
class lcl_Test IMPLEMENTATION. 
    method to_Table. 
    ENDMETHOD. 
ENDCLASS. 

С уважением,

8

Может быть, это поздно для правильного ответа, но я столкнулся с той же проблемой минут назад.

Чтобы отправить внутреннюю таблицу в качестве параметра RETURNING, вам необходимо определить таблицу, полностью заполненную классом. Ниже приведен пример кода из публичной части класса:

PUBLIC SECTION. 
    TYPES: 
     type_table_A TYPE STANDARD TABLE OF T001, //<----- NOT FULLY SPECIFIED 
     type_table_B TYPE STANDARD TABLE OF T001 WITH DEFAULT KEY. //<---- FULLY SPECIFIED 

В терминах стандартной таблицы:

TYPE_TABLE_A может быть в качестве параметра только для экспорта, импорта и изменения параметров.

TYPE_TABLE_B может использоваться во всех возможных видах параметра в сигнатуре метода, в основном ВОЗВРАЩЕНИЕ.

В качестве хорошей практики вы можете принять решение об объявлении полностью определенных стандартных типов таблиц.

С наилучшими пожеланиями,

Сезар Scheck

+0

ЭТО - единственный действительно правильный ответ, спасибо большое! – Zordid

+0

Спасибо! Я получаю «Символ поля должен быть полностью типизирован или иметь ошибку типа C, N, P или X» при выполнении операции «ASSIGN ... CASTING». Я не знал, что случилось; но, конечно, как указывает ваш ответ, мне нужно было определить ключи, чтобы получить «полностью типизированный символ поля». – KurzedMetal

+0

Большое вам спасибо! Это невозможно было найти в другом месте –

Смежные вопросы