Текущее время: Пт, мар 29 2024, 10:36

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


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

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


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

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