Текущее время: Вт, мар 19 2024, 12:52

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Определить, что два указателя указывают на один объект
СообщениеДобавлено: Пт, ноя 17 2017, 09:07 
Специалист
Специалист

Зарегистрирован:
Пт, июл 27 2007, 13:06
Сообщения: 137
Всем привет.

Собсна вопрос в теме - как? можно ли просто сравнивать указатели? Типа так:
Code:
DATA v1 TYPE REF TO if_ixml_node.
DATA v2 TYPE REF TO if_ixml_node.

IF v1 = v2.

ENDIF.


Я уперся в то, что один узел полученный разными способами имеет разные указатели.
Есть такая портянка
Code:
<List name="Bla">
  <Table>
    <Row></Row>
    <Row></Row>
    <Row></Row>
  </Table>
</List>


Передаю в метод 2 объекта - <List> и <Row>. Оба идут как if_ixml_node. В результате мучений по неотработке кода после тестов пришел к следующему:
Code:
Параметры на вход: List, Row
METHOD m1.
  DATA node TYPE REF TO if_ixml_node.
  node = Row->get_parent( ). " получили узел Table
  node = node->get_parent( ). " получили узел List

  IF node = List.
    !!!не заходит!!!
  ENDIF.
ENDMETHOD.

При том, что если прочитать атрибут name у node и List - возвращается одно и то же значение.

Где у меня косяк в логике или что я упустил? Система 4.6, если важно.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить, что два указателя указывают на один объект
СообщениеДобавлено: Пт, ноя 17 2017, 10:24 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Пт, янв 18 2008, 10:34
Сообщения: 716
Откуда: Moscow
Пол: Мужской
Sam Stone написал(а):
Всем привет.
Code:
Параметры на вход: List, Row
METHOD m1.
  DATA node TYPE REF TO if_ixml_node.
  node = Row->get_parent( ). " получили узел Table
  node = node->get_parent( ). " получили узел List

  IF node = List.
    !!!не заходит!!!
  ENDIF.
ENDMETHOD.

При том, что если прочитать атрибут name у node и List - возвращается одно и то же значение.


То, что аттрибуты одинаковые еще не говорит о том что это одна и таже инстанция. Приведите код как вы формируете инстанции List и Row.

С уважением,
Руслан

_________________
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. (Э. Йодан)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Определить, что два указателя указывают на один объект
СообщениеДобавлено: Пт, ноя 17 2017, 11:08 
Специалист
Специалист

Зарегистрирован:
Пт, июл 27 2007, 13:06
Сообщения: 137
Цитата:
Приведите код как вы формируете инстанции List и Row.

List я получаю через if_ixml_node->clone( ) c шаблонного узла и после работаю только с ним.
Row я получаю перебором всех нижестоящих узлов List по условию if_ixml_node->get_name( ) = 'Row' AND if_ixml_node->get_value( ) = 'Искомый текст' или просто порядковый номер узла:
Code:
DATA table TYPE REF TO if_ixml_node.
table = List->get_first_child( ).
WHILE NOT table IS INITIAL AND table->get_name( ) <> 'Table'. "<Table> строго 1 узел, но на одном с ним уровне могут быть другие
  table = table->get_next( ).
ENDWHILE.

DATA row TYPE REF TO if_ixml_node.
DATA index TYPE i.
row = table->get_first_child( ).
WHILE NOT row IS INITIAL.
  IF row->get_name( ) = 'Row'. "Могут быть другие узлы на одном уровне
    ADD 1 TO index.
    IF index = ИСКОМЫЙ_НОМЕР_УЗЛА.
      result = row.
      EXIT.
    ENDIF.
  ENDIF.
  row = row->get_next( ).
ENDWHILE.


Цитата:
То, что аттрибуты одинаковые еще не говорит о том что это одна и таже инстанция

100% атрибут Name уникальный в пределах файла с которым я работаю.

Самое интересное, что если сымитировать отработку условия и продолжить обработку, то новые узлы/данные добавятся куда надо. Т.е. по факту обе ссылки все-таки указывают на один объект.

Сейчас еще вот что проверил:
Code:
...
METHODS m1 IMPORTING list TYPE REF TO if_ixml_node
                                      row TYPE REF TO if_ixml_node.
...
METHOD m1.
  DATA node TYPE REF TO if_ixml_node.

  node = list->get_first_child( ).
  node = node->get_parent( ).
  IF node = list.
    "нифига не входит
  ENDIF.
ENDMETHOD.

Изображение
Т.е. беру у узла ZZZ первого потомка, потом у этого потомка беру родителя. То есть должен получить снова узел ZZZ.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить, что два указателя указывают на один объект
СообщениеДобавлено: Пт, ноя 17 2017, 11:15 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, дек 20 2007, 18:21
Сообщения: 1613
В xml нормально сравнивать чтобы надо смотреть Xpath.

_________________
я твой сап эфай внедрял
BAdI-позитив
Взять немножечко абопу, сунь туда кошачью *опу, RFC лапки, БТ старой бабки, на медленном базиснике переносить, тестовое окружение материть, снимать SAT пенку, биться головой о стенку, охапка тайм-шитов, отчет готов!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить, что два указателя указывают на один объект
СообщениеДобавлено: Пт, ноя 17 2017, 11:24 
Специалист
Специалист

Зарегистрирован:
Пт, июл 27 2007, 13:06
Сообщения: 137
Вот пример, в котором я не понимаю логику. Суть та же - у узла взял потомка, у этого потомка взял родителя. Должен получить исходный узел. Но нет.
Code:
REPORT zzz.

START-OF-SELECTION.
DATA xml TYPE REF TO if_ixml.
DATA xml_doc TYPE REF TO if_ixml_document.

xml = cl_ixml=>create( ).

xml_doc = xml->create_document( ).

DATA(root) = xml_doc->get_root( ).

WRITE:/ ''.

data(list) = xml_doc->create_simple_element(
  EXPORTING
    name      = 'List'
    parent    = root
).

DO 5 TIMES.
  data(node) = xml_doc->create_simple_element(
                 name      = 'Row'
                 parent    = list
                 value     = conv #( sy-index )
             ).
ENDDO.

DATA(zzz) = list->get_first_child( ).
zzz = zzz->get_parent( ).
IF zzz = list.
  WRITE:/ 'same objects'.
ELSE.
  WRITE:/ 'different objects'.
ENDIF.

DATA SIZE          TYPE I.
DATA data_tab TYPE SWXMLCONT.
CALL FUNCTION 'SDIXML_DOM_TO_XML'
  EXPORTING
    document            = xml_doc
   PRETTY_PRINT        = 'X'
IMPORTING
*   XML_AS_STRING       = XML_AS_STRING
   SIZE                = SIZE
TABLES
   XML_AS_TABLE        = data_tab
EXCEPTIONS
   NO_DOCUMENT         = 1
   OTHERS              = 2
          .
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.

cl_gui_frontend_services=>gui_download(
  EXPORTING
    bin_filesize              = size
    filename                  = 'C:\SAPWorkDir\debug.xml'
    filetype                  = 'BIN'
  CHANGING
    data_tab                  = data_tab
  EXCEPTIONS
    others                    = 24
).
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить, что два указателя указывают на один объект
СообщениеДобавлено: Пт, ноя 17 2017, 11:55 
Специалист
Специалист

Зарегистрирован:
Пт, июл 27 2007, 13:06
Сообщения: 137
Групповое мышление пришло к такому решению, надеюсь правильному:
Code:
IF cast CL_IXML_UNKNOWN( node1 )->m_pointee = CAST CL_IXML_UNKNOWN( node2 )->m_pointee.
  WRITE:/ 'Это тот же объект'.
ELSE.
  WRITE:/ 'Это разные объекты'.
ENDIF.


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

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


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

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


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

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