Текущее время: Пт, апр 19 2024, 04:07

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


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


ВНИМАНИЕ!

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



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

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

Ситуация такая:
Есть у меня вызов метода:
Code:
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, 01:29 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 16:25
Сообщения: 3109
Пол: Мужской
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, 07:58 
Специалист
Специалист

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


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

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

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


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

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

Code:
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, 17:21 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

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

Code:
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, 17:41 
Почетный гуру
Почетный гуру
Аватара пользователя

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

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

_________________
Алё, это Пакистан? Нам нужен один килограмм


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

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

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

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

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

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


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

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

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

_________________
Алё, это Пакистан? Нам нужен один килограмм


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

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

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


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


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

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

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


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

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


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

Зарегистрирован:
Чт, окт 26 2017, 13:45
Сообщения: 3
Попробовал, на данном примере, который я вначале предоставил - работает.
Спасибо огромное за помощь. пока буду реализовывать так: ( может код кому-то и поможет)
Code:
 
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  
 
 Заголовок сообщения: Re: Как отделить друг от друга версии файла, отличающиеся только размерами?
СообщениеДобавлено: Чт, фев 03 2022, 23:29 
Начинающий
Начинающий

Зарегистрирован:
Вт, фев 18 2020, 13:22
Сообщения: 1
На моей версии работает.
Вот код.
Сделал так.
1) Находит все.
2) Находит актуальные и удаляет лишние.
3) Находит все с ограничением в таблицах

Code:
DATA:
            p_descr   TYPE zd_tmpl_descr
          , p_clname  TYPE bds_clsnam
          , p_cltype  TYPE bds_clstyp
          , p_objkey  TYPE bds_typeid
        , lt_content       TYPE sbdst_content
        , lt_signatures    TYPE sbdst_signature
        , lt_components    TYPE sbdst_components
, lv_ram_length    TYPE i
.
    FIELD-SYMBOLS
        : <ls_components>  TYPE bapicompon
        , <ls_signatures>  TYPE bapisignat
        .
"получаем все файлы из папки и все версии
            CALL FUNCTION 'TH_REDISPATCH'.

            DO 2 TIMES.

              CALL METHOD cl_bds_document_set=>get_with_table
                EXPORTING
                  classname       = p_clname
                  classtype       = p_cltype
                  client          = sy-mandt
                  object_key      = p_objkey
                CHANGING
                  content         = lt_content
                  signature       = lt_signatures
                  components      = lt_components
                EXCEPTIONS
                  error_kpro      = 1
                  internal_error  = 2
                  nothing_found   = 3
                  no_content      = 4
                  parameter_error = 5
                  not_authorized  = 6
                  not_allowed     = 7
                  OTHERS          = 8.

*           
              IF lines( lt_components ) > 1  .

                CLEAR lt_components.
                CLEAR lt_signatures.
                CLEAR lt_content.

                CALL FUNCTION 'TH_REDISPATCH'.
                "Получаем только актуальные файлы.
                CALL METHOD cl_bds_document_set=>get_info_newest_only
                  EXPORTING
*                   logical_system  =
                    classname       = p_clname
                    classtype       = p_cltype
                    client          = sy-mandt
                    object_key      = p_objkey
*                   check_state     = ' '
*             IMPORTING
*                   connections     =
                  CHANGING
                    components      = lt_components
                    signature       = lt_signatures
                  EXCEPTIONS
                    error_kpro      = 1
                    internal_error  = 2
                    nothing_found   = 3
                    not_allowed     = 4
                    not_authorized  = 5
                    parameter_error = 6
                    OTHERS          = 7.
                IF sy-subrc <> 0.
                ENDIF.
***           COMP_ID = P_DESCR
                lv_ram_length = strlen( p_descr ).

                LOOP AT lt_components ASSIGNING <ls_components>.
                  "исключаем не наши шаблоны
                  IF <ls_components>-comp_id+0(lv_ram_length) NE p_descr.
                    DELETE lt_signatures WHERE doc_count EQ <ls_components>-doc_count.
                    CLEAR <ls_components>.
                  ENDIF.
                ENDLOOP."LOOP AT lt_components ASSIGNING <ls_components>.
                CLEAR lv_ram_length.
                DELETE lt_components WHERE doc_count IS INITIAL.
*                SORT lt_components BY doc_count DESCENDING.

              ENDIF."IF lines( lt_components ) > 1  .
            ENDDO."DO 2 TIMES.



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

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


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

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


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

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