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

Часовой пояс: 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
Сообщения: 1570
Откуда: Пермь
Пол: Мужской
Я, конечно, не разработчик ни разу, но просто очень любопытный)))
Может, вот такое сможет прочитать содержимое?
Предварительно определяется 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
Сообщения: 1570
Откуда: Пермь
Пол: Мужской
Besa написал:
Не то это точно...

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

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


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

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

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

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

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

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


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

Зарегистрирован:
Ср, фев 21 2007, 08:50
Сообщения: 1570
Откуда: Пермь
Пол: Мужской
Ужас) зачем так нервничать? Вы берегите себя.
Пример использования метода можно увидеть в программе 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 часа


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

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


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

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