Текущее время: Пт, янв 19 2018, 15:31

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Как отделить друг от друга версии файла, отличающиеся только размерами?
СообщениеДобавлено: Чт, окт 26 2017, 15:02 
Начинающий
Начинающий

Зарегистрирован:
Чт, окт 26 2017, 14:45
Сообщения: 3
Помогите пожалуйста.

Ситуация такая:
Есть у меня вызов метода:
Код:
cl_bds_document_set=>get_with_table(
    EXPORTING
      classname       = gl_c_clsname
      classtype       = gl_c_clstype
      object_key      = l_curr_obj_key
    CHANGING
      content         = l_t_content
      components      = l_t_components
      signature       = l_t_signature
    EXCEPTIONS
      OTHERS          = 8
  ).


Этот метод возвращает таблицу l_t_components - где содержатся данные о файле и о его версиях.
В данный момент у меня есть 2 версии файла (в последствии версий планируется больше)

00000001 00000001 Приказ о возложении обязанностей СПК.docx application/msword 000000137977
00000002 00000001 Приказ о возложении обязанностей СПК.docx application/msword 000000158115

Где последний столбец, это размер каждого файла в байтах.

Вся проблема заключается в том, что в таблице l_t_content - содержатся эти обе версии друг за другом, и как отделить одну от другой, зная только размеры в байтах - не понятно.

Таблица l_t_content имеет такой вид.

ADE8E6F9AFC4EEBDB3FD22AFF977C3ED7D8C7E80540CD7E2775ED9FE9157FCBBE1F6BEC63F402D6FC44D79ACAF8227CB1CCE157C58B01D98E95F02D3CE3316.....
...166C3A9CF703DDC2935FE5E267A656445076FC31676F3C73B6590BA27078070D0969AF556E6757CEB1B07CCCFB5710C8FB0E772F7029899925C99F7


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Добрый день, коллеги.
СообщениеДобавлено: Пт, окт 27 2017, 02:29 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 17:25
Сообщения: 2867
Пол: Мужской
https://help.sap.com/doc/saphelp_nw70ehp2/7.02.16/en-US/91/ff96e2700311d3aed60000e82deb58/frameset.htm
Цитата:
Content Table
In the table CONTENT (the binary table), document contents are transferred directly. Transfer is via an internal table. The relevant field is LINE :
Field
Data Element
Data Type
Length
Description
LINE
SDOK_SDATX
RAW
1022
Line for binary document content, length for upload
If a caller transfers the content of a document in the binary table and at the same time defines that the mime type is text/Subtyp , the document is handled as a text document, that is, it is converted into the current R/3 code page and stored as text.
Several components of various documents can be transferred in a content table: A new row is started for each component. The size of the individual components (table COMPONENTS) indicates the beginning and end (row x) in the content table.

Да, ни этот cl_bds_document_set=>get_with_table ни другой стандартный из функционала bds метод/ФМ не предоставит данные как Вам надо (я не нашел по крайней мере).
Длина строки у Вас есть 1022, размер компонента у Вас есть, в хелпе написано что каждый новый компонент будет начинается с новой строки(то есть одна строка не будет содержать контент двух файлов), ничего не мешает порезать content на группы строк(по содержимому файлов).

p.s. называйте пож корректно тему топика и оформляйте код тэгами [code][/code]


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Добрый день, коллеги.
СообщениеДобавлено: Пт, окт 27 2017, 08:58 
Специалист
Специалист

Зарегистрирован:
Пн, мар 12 2012, 10:38
Сообщения: 117
Либо самому читать содержимое прям из BDS для каждого файла.
Там есть ФМники которые позволяют все это сделать(гр. функций BDS_METHODS), но это получится массивнее, нежели парсинг таблички.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Добрый день, коллеги.
СообщениеДобавлено: Пт, окт 27 2017, 17:00 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 17:25
Сообщения: 2867
Пол: Мужской
Saperx писал(а):
Либо самому читать содержимое прям из BDS для каждого файла.
Там есть ФМники которые позволяют все это сделать(гр. функций BDS_METHODS), но это получится массивнее, нежели парсинг таблички.

А где там такой ФМ? я не увидел, покажите.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Добрый день, коллеги.
СообщениеДобавлено: Пт, окт 27 2017, 18:08 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, фев 21 2007, 09:50
Сообщения: 827
Откуда: Москва
Пол: Мужской
Я, конечно, не разработчик ни разу, но просто очень любопытный)))
Может, вот такое сможет прочитать содержимое?
Предварительно определяется size = comp_size из таблицы компонентов.

Код:
CALL METHOD VIEWER->VIEW_DOCUMENT_FROM_TABLE
                  EXPORTING TYPE = TYPE
                      SUBTYPE = SUBTYPE
                      SIZE = SIZE
                      SHOW_INPLACE = INPLACE
                  CHANGING DOCUMENT_TABLE = CONTENT_TABLE
                  EXCEPTIONS CNTL_ERROR = 1
                             NOT_INITIALIZED = 2
                             DP_ERROR_GENERAL = 3
                             INVALID_PARAMETER = 4
                             DP_INVALID_PARAMETER = 5.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Добрый день, коллеги.
СообщениеДобавлено: Пт, окт 27 2017, 18:21 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 17:25
Сообщения: 2867
Пол: Мужской
Yozhhhhh писал(а):
Я, конечно, не разработчик ни разу, но просто очень любопытный)))
Может, вот такое сможет прочитать содержимое?
Предварительно определяется size = comp_size из таблицы компонентов.

Код:
CALL METHOD VIEWER->VIEW_DOCUMENT_FROM_TABLE
                  EXPORTING TYPE = TYPE
                      SUBTYPE = SUBTYPE
                      SIZE = SIZE
                      SHOW_INPLACE = INPLACE
                  CHANGING DOCUMENT_TABLE = CONTENT_TABLE
                  EXCEPTIONS CNTL_ERROR = 1
                             NOT_INITIALIZED = 2
                             DP_ERROR_GENERAL = 3
                             INVALID_PARAMETER = 4
                             DP_INVALID_PARAMETER = 5.

Что это? :)

Не то это точно...


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Добрый день, коллеги.
СообщениеДобавлено: Пт, окт 27 2017, 18:41 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, фев 21 2007, 09:50
Сообщения: 827
Откуда: Москва
Пол: Мужской
Besa писал(а):
Не то это точно...

Аргументы?
Система обращается в этом методе к таблице с содержимым по заранее установленному размеру файла. При этом использует еще пару управляющих параметров для этого.
То есть делает то же самое, что предлагалось выше.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Добрый день, коллеги.
СообщениеДобавлено: Пт, окт 27 2017, 19:48 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 17:25
Сообщения: 2867
Пол: Мужской
Yozhhhhh писал(а):
Besa писал(а):
Не то это точно...

Аргументы?
Система обращается в этом методе к таблице с содержимым по заранее установленному размеру файла. При этом использует еще пару управляющих параметров для этого.
То есть делает то же самое, что предлагалось выше.

Какие аргументы, Вы о чем? :)
В каком этом методе? Что это за класс не понятно из Вашего поста.
Где там на вход параметры определяющие контент файла (ИД дока, ИД счетчика док, ИД версии и тд)?
Цитата:
Система обращается в этом методе к таблице с содержимым по заранее установленному размеру файла. При этом использует еще пару управляющих параметров для этого.

Поясните, о чем тут идет речь? Для чего обращается? Вы это содержимое туда передавать хотите?
Цитата:
То есть делает то же самое, что предлагалось выше.

Что предлагалось и кем?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как отделить друг от друга версии файла, отличающиеся только размерами?
СообщениеДобавлено: Пт, окт 27 2017, 20:21 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, фев 21 2007, 09:50
Сообщения: 827
Откуда: Москва
Пол: Мужской
Ужас) зачем так нервничать? Вы берегите себя.
Пример использования метода можно увидеть в программе SAPRDEMOVIEWING "Интерфейс просмотра документа".
Besa писал(а):
Где там на вход параметры определяющие контент файла (ИД дока, ИД счетчика док, ИД версии и тд)?

Там есть обработка и таблицы signature, и чтение таблицы components.
На просмотр откройте программу и посмотрите, просто не хотел бомбить тут простынь.
Я лишь предложил вариант, который показался мне похожим на правду. Он не претендует на то, чтобы быть прямо готовым решением. Нет и нет.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Добрый день, коллеги.
СообщениеДобавлено: Пн, окт 30 2017, 10:09 
Начинающий
Начинающий

Зарегистрирован:
Чт, окт 26 2017, 14:45
Сообщения: 3
Besa писал(а):
Длина строки у Вас есть 1022, размер компонента у Вас есть, в хелпе написано что каждый новый компонент будет начинается с новой строки(то есть одна строка не будет содержать контент двух файлов), ничего не мешает порезать content на группы строк(по содержимому файлов).

p.s. называйте пож корректно тему топика и оформляйте код тэгами [code][/code]


Прошу прощения за неправильно оформленный текст.
Правильно ли я понял, что Вы имели ввиду поделить размер файлов на 1022, и получить количество занимаемых строк каждым файлом с округлением до целых в большую сторону. Затем просто порезать таблицу по строкам?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Добрый день, коллеги.
СообщениеДобавлено: Пн, окт 30 2017, 10:32 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 17:25
Сообщения: 2867
Пол: Мужской
a.shtin писал(а):
Besa писал(а):
Длина строки у Вас есть 1022, размер компонента у Вас есть, в хелпе написано что каждый новый компонент будет начинается с новой строки(то есть одна строка не будет содержать контент двух файлов), ничего не мешает порезать content на группы строк(по содержимому файлов).

p.s. называйте пож корректно тему топика и оформляйте код тэгами [code][/code]


Прошу прощения за неправильно оформленный текст.
Правильно ли я понял, что Вы имели ввиду поделить размер файлов на 1022, и получить количество занимаемых строк каждым файлом с округлением до целых в большую сторону. Затем просто порезать таблицу по строкам?

Да, я это имел ввиду.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Добрый день, коллеги.
СообщениеДобавлено: Пн, окт 30 2017, 14:04 
Начинающий
Начинающий

Зарегистрирован:
Чт, окт 26 2017, 14:45
Сообщения: 3
Попробовал, на данном примере, который я вначале предоставил - работает.
Спасибо огромное за помощь. пока буду реализовывать так: ( может код кому-то и поможет)
Код:
 
DATA:
     BEGIN OF ls_vers,
       doc_count  TYPE bds_dcount, " Номер версии шаблона
       date       TYPE sy-datum, " Дата начала действия данного шаблона
       row_b      TYPE i, - индекс строки, с которой начинается файл шаблона
       row_e      TYPE i, - индекс строки, на которой заканчивается
     END OF ls_vers,
     l_doc           TYPE bds_dcount,
     l_col_row       TYPE i,
     l_end           TYPE abap_bool,
     lr_vers LIKE REF TO ls_vers,
     lt_vers LIKE STANDARD TABLE OF ls_vers,
     l_t_components  TYPE STANDARD TABLE OF bapicompon,

...

*--------------------------------------------------------------------*
  " Получение дат из KEYWORD  - не во всех версиях заполнено
  LOOP AT l_t_signature REFERENCE INTO l_r_signature
    WHERE prop_name = 'BDS_KEYWORD'.

    IF strlen( l_r_signature->prop_value ) = 10.

      CONCATENATE l_r_signature->prop_value+6(4) l_r_signature->prop_value+3(2) l_r_signature->prop_value(2)
        INTO l_date_content.

      ls_vers-doc_count = l_r_signature->doc_count.
      ls_vers-date     = l_date_content.
      APPEND ls_vers TO lt_vers.
      CLEAR: ls_vers.
    ENDIF.
  ENDLOOP.
" В случае первой версии (дата не заполняется)  - поэтому добавляем ее вручную
  READ TABLE lt_vers
    TRANSPORTING NO FIELDS
    WITH KEY doc_count = '1'.

  IF sy-subrc <> 0.
    ls_vers-doc_count = '1'.
    APPEND ls_vers TO lt_vers.
    CLEAR: ls_vers.
  ENDIF.

  SORT lt_vers BY doc_count ASCENDING.
 
  " Заполнение данных о начале и конце каждого файла - получение номера строки начала файла и конца
  LOOP AT lt_vers REFERENCE INTO lr_vers.

    READ TABLE  l_t_components REFERENCE INTO l_r_components
      WITH KEY doc_count = lr_vers->doc_count.

    l_col_row = trunc( l_r_components->comp_size / 1022 ).

    " Первый файл в списке
    IF lr_vers->doc_count = '1'.
      lr_vers->row_b  = 1.
      lr_vers->row_e  = l_col_row + 1.

    ELSE. " НЕ первый файл в списке

      l_doc = lr_vers->doc_count - 1.
      READ TABLE  lt_vers INTO ls_vers
        WITH KEY doc_count = l_doc.

      IF sy-subrc = 0.
        lr_vers->row_b  = ls_vers-row_e + 1.
      ENDIF.

      " Индекс строки конца файла
      l_doc = lr_vers->doc_count + 1.
      READ TABLE l_t_components
        TRANSPORTING NO FIELDS
        WITH KEY doc_count = l_doc.

      IF sy-subrc = 0. " Не последний файл
        lr_vers->row_e  = lr_vers->row_b + l_col_row.
      ELSE. " Последний файл
        lr_vers->row_e  = lines( l_t_content ).
      ENDIF.
    ENDIF.

  ENDLOOP.

" Получение актуалной версии из таблицы
  SORT lt_vers BY date DESCENDING.

  LOOP AT lt_vers INTO ls_vers
    WHERE date <= im_date_order.
    EXIT.
  ENDLOOP.

  IF sy-subrc <> 0.
    RETURN.
    MESSAGE s000(zhr725) WITH 'Не найдена версия документа для даты приказа' DISPLAY LIKE 'E'.
  ENDIF.

*--------------------------------------------------------------------*
  l_end = abap_false.
  LOOP AT l_t_content INTO ls_content
    FROM ls_vers-row_b.

    IF sy-tabix = ls_vers-row_e.
      l_end = abap_true.
    ENDIF.

    APPEND ls_content TO l_t_content_ext. "- контент содержащий нужный файл шаблона из всей таблицы
    CLEAR: ls_content.

    IF l_end = abap_true.
      EXIT.
    ENDIF.
  ENDLOOP.


  READ TABLE l_t_components REFERENCE INTO l_r_components
    WITH KEY doc_count = ls_vers-doc_count.

  l_filename = l_r_components->comp_id.
  l_lenght   = l_r_components->comp_size.

  CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
    EXPORTING
      input_length = l_lenght
    IMPORTING
      buffer       = l_docx_content
    TABLES
      binary_tab   = l_t_content_ext.



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

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


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

Сейчас этот форум просматривают: dsb66 и гости: 21


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

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