Текущее время: Сб, июл 19 2025, 02:32

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Удаление непечатаемых символов
СообщениеДобавлено: Ср, янв 22 2014, 12:47 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, янв 29 2010, 06:15
Сообщения: 58
Добрый день! Возникла проблема: есть программа, которая должна обновлять таблицу(справочник) в SAP из файла Excel (запускается при поступлении нового файла)
В файле Excel некоторые ячейки содержат непечатаемые символы, которые в Excel можно удалить при помощи ф-ции =ПЕЧСИМВ(текст) Нужно, чтобы в таблицу SAP загружались данные без этих символов.
Как мне применить эту функцию ко всем строкам файла excel из SAPa? Если бы это был шаблон, можно было бы написать макрос и вызывать его из SAP, но файл приходит каждый раз новый
Можно конечно создать пустой шаблон с макросом, потом копировать туда данные из полученного файла, а потом запускать макрос, но хочется что-нибудь поизящнее.
Можно ли это сделать через OLE-объекты? Или может есть какие-нибудь SAPовские ф-ции по удалению непечатаемых символов? Я нашла только как удалить символы возврата каретки (ENTER)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Удаление непечатаемых символов
СообщениеДобавлено: Ср, янв 22 2014, 13:33 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
Code:
replace all occurrences of regex `[^[:print:]]+` in str with ``.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Удаление непечатаемых символов
СообщениеДобавлено: Чт, янв 23 2014, 05:35 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, янв 29 2010, 06:15
Сообщения: 58
trop написал(а):
Code:
replace all occurrences of regex `[^[:print:]]+` in str with ``.

Дело в том, что некоторые непечатаемые символы при загрузке из Ecxel в SAP приняли вид кавычек, например ", в результате эта команда убрала только символы возврата строки, а остальные нет. Т.е. получается, что в SAPe эти символы стали печатаемые, но они все равно не нужны, так что скорей всего от них надо избавляться на стороне Excel


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Удаление непечатаемых символов
СообщениеДобавлено: Чт, янв 23 2014, 07:05 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
julia.mat написал(а):
Если бы это был шаблон, можно было бы написать макрос и вызывать его из SAP

А кто вам мешает использовать свой шаблон?
Копируете средствами OLE данные из файла в свой шаблон и запускаете макрос.
Затем читаете из SAP свой шаблон с подготовленными данными.
julia.mat написал(а):
но хочется что-нибудь поизящнее
С такой постановкой задачи боюсь, что ничего изящнее не получится :?

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Удаление непечатаемых символов
СообщениеДобавлено: Чт, янв 23 2014, 07:14 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, янв 29 2010, 06:15
Сообщения: 58
Может можно как-нибудь средствами OLE применить эту ф-цию =ПЕЧСИМВ() к нужным ячейкам Excel прямо из SAP, а потом загрузить этот уже исправленный файл без использования шаблона и макроса.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Удаление непечатаемых символов
СообщениеДобавлено: Чт, янв 23 2014, 07:27 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Это будет значительно менее изящно.
Хотя бы потому, что в этом случае придется работать с каждой ячейкой Excel-файла отдельно.

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Удаление непечатаемых символов
СообщениеДобавлено: Чт, янв 23 2014, 07:48 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, янв 29 2010, 06:15
Сообщения: 58
В макросе тоже придется из преобразовывать в цикле, не знаю, быстрее ли это будет, но наверное придется <я не знать русский языка>


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Удаление непечатаемых символов
СообщениеДобавлено: Чт, янв 23 2014, 09:24 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
julia.mat написал(а):
не знаю, быстрее ли это будет

Как вы думаете, что быстрее: цикл в Excel или цикл в ABAP с "дерганьем" OLE для каждого шага? :wink:

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Удаление непечатаемых символов
СообщениеДобавлено: Пт, янв 24 2014, 07:19 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, янв 29 2010, 06:15
Сообщения: 58
Да, наверное вы правы.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Удаление непечатаемых символов
СообщениеДобавлено: Чт, фев 27 2014, 16:56 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пт, июл 16 2010, 09:57
Сообщения: 106
Откуда: СПб
Пол: Мужской
Мы у себя применяем обработку функцией ПЕЧСИМВ файлов Excel из ABAP. Ниже я надергал иллюстрирующих фрагментов. Законченный пример предоставить не могу - по техническим и этическим причинам. Но эти фрагменты кода вполне успешно работают в продуктиве и по ним вполне можно освоиться с подходом.

Общая схема такова. Есть файл Excel с данными, которые надо загрузить в SAP. В первой строке файла находятся технические имена полей. Список полей (столбцов), которые надо подвергнуть обработке функцией ПЕЧСИМВ, задается внутренней таблицей gt_cleanedfields. В цикле бежим по этой таблице, находим по имени колонку на листе Excel и выполняем для нее VB-процедуру processColumn. Выполняем при помощи ActiveX MSScriptControl (просьба самостоятельно погуглить по форуму - я уже выкладывал несколько законченных примеров на эту тему). Все эти манипуляции делаются перед собственно передачей данных из Excel в ABAP.

Code:
======================================================
ФРАГМЕНТ 1. Инициализация MSScriptControl
======================================================

    "общая часть для двух обработок
    IF LINES( gt_fields2revival ) > 0 OR
       LINES( gt_cleanedfields  ) > 0.

      "поднимаем скрипт-контрол для выполнения ПЕЧСИМВ или оживления
      CREATE OBJECT sc 'MSScriptControl.ScriptControl' NO FLUSH.
      SET PROPERTY OF sc 'Language' = 'vbscript' no flush.

      CALL METHOD cl_gui_cfw=>flush.

      "загружаем код VB
      PERFORM build_vbcode.
      CALL METHOD OF sc 'AddCode' NO FLUSH
        EXPORTING #1 = vbcode.

      CALL METHOD cl_gui_cfw=>flush.

      rnga1 =
      zclut=>cm( obj = wks
                  m1 = 'Range' p11 = 'A1' ). "для указания 2-го параметра поиска

      rng =
      zclut=>cm( obj = wks
                  m1 = 'Range' p11 = '1:1' ). "первая строка - строка заголовков

    ENDIF.


======================================================
ФРАГМЕНТ 2. Цикл перебора полей, для которых ЭТО надо
======================================================

    "блок применения функции ПЕЧСИМВ -----------------------------------
    "для обработки текстовых полей,
    "к которым в файле Excel применяется функция ПЕЧСИМВ
    "(для удаления непечатных символов)

    IF LINES( gt_cleanedfields ) > 0.

      LOOP AT gt_cleanedfields INTO gs_cleanedfields.

        rngfnd =
        zclut=>cm( obj = rng
                    m1 = 'Find' p11 = gs_cleanedfields-namef
                                p12 = rnga1 "ActiveCell
                                p13 = -4163 "xlValues
                                p14 = 1     "xlWhole
                                ). "ищем...

        IF sy-subrc = 0.

          "проигрываем" код VB
          CALL METHOD OF sc 'Run' NO FLUSH
            EXPORTING #1 = 'processColumn'
            #2 = rngfnd.

          CALL METHOD cl_gui_cfw=>flush.

        ENDIF.
      ENDLOOP.

    ENDIF.


======================================================
ФРАГМЕНТ 3. Код VB c процедурой processColumn
======================================================

FORM build_vbcode.

  CONCATENATE
  `Option Explicit`

  `Public Sub processColumn(rngfnd)`
  `   Dim rng     'As Range`
  `   Dim col     'As Integer`
  `   Dim varr    'As Variant`
  `   Dim i       'As Integer`

  `   col = rngfnd.Column`

  `   With rngfnd.Parent`
  `       Set rng = .Range(.Cells(1, col), .Cells(.Rows.Count, col).End(-4162))`
  "-4162 = xlUp
  `   End With`

  `   varr = rng.Value`
  `   For i = LBound(varr) + 1 To UBound(varr)`
  `       If Not IsEmpty(varr(i, 1)) Then`
  `           varr(i, 1) = "'" & _`
  `               rng.Application.WorksheetFunction.Clean( _`
  `               rng.Application.WorksheetFunction.Trim( _`
  `               Replace(Replace(Replace( _`
  `               varr(i, 1), _`
  `               vbTab, Chr(32)), vbCr, Chr(32)), vbLf, Chr(32))))`
  `       End If`
  `   Next`
  `   rng.Value = varr`

  `End Sub`

  INTO vbcode
  SEPARATED BY cl_abap_char_utilities=>cr_lf.

ENDFORM.                    "build_vbcode

======================================================
ФРАГМЕНТ 4. Статический метод CM класса утилит ZCLUT
======================================================

METHOD cm.

*  ----- Имитатор "многоточечного" CALL METHOD OF для объектов OLE ----

*  НАЗНАЧЕНИЕ:
*  предназначен для быстрой и наглядной перекладки кода VBA в код ABAP
*  без использования многочисленных утомительных CALL METHOD OF и SET PROPERTY OF
*  под "многоточечным" понимается оператор VBA примерно следующего вида
*  Application.Workbooks(1).Worksheets(3).Range("B2:D4").Interior.ColorIndex = 6

*  ОГРАНИЧЕНИЯ:
*  1. помимо ведущего объекта - не более 6 вложенных методов
*  (в примере выше их 4, ColorIndex это свойство)
*  и не более 4 параметров у каждого метода
*  2. при вызове параметры p... должны заполняться без "пустот",
*  т.е. например нельзя указать у метода m1 параметры только p11 и p14 без указания промежуточных p12 и p13

*  ПРИМЕР ИСПОЛЬЗОВАНИЯ И ОФОРМЛЕНИЯ КОДА:
*  ----------------------------------------
*  REPORT ....
*  INCLUDE ole2incl.
*  DATA: xlapp TYPE ole2_object, "Excel.Application
*        wks   TYPE ole2_object. "Worksheet
*  START-OF-SELECTION.
*
*    CREATE OBJECT xlapp 'Excel.Application'.
*
*    zclut=>cm( obj = xlapp
*               prp = 'Visible' val = 'true ' ). "эквивалент VBA-оператора: xlapp.Visible = True
*
*    zclut=>cm( obj = xlapp
*                m1 = 'Workbooks'
*                m2 = 'Add' ).                    "эквивалент VBA-оператора: xlapp.Workbooks.Add
*
*    zclut=>cm( obj = xlapp
*                m1 = 'Range' p11 = 'A10:E20'
*                m2 = 'Select' ).                 "эквивалент VBA-оператора: xlapp.Range("A10:E20").Select
*
*    zclut=>cm( obj = xlapp
*                m1 = 'Selection'
*                m2 = 'Interior'
*               prp = 'ColorIndex' val = 6 ).     "эквивалент VBA-оператора: xlapp.Selection.Interior.ColorIndex = 6
*
*    wks =
*    zclut=>cm( obj = xlapp
*                m1 = 'Worksheets' p11 = 2 ).     "эквивалент VBA-оператора: Set wks = xlapp.Worksheets(2)
*
*    zclut=>cm( obj = wks
*               prp = 'Name' val = 'ВторойЛист' )."эквивалент VBA-оператора: wks.Name = "ВторойЛист"
*  ------------------------------------------

*  ЗАМЕЧАНИЕ: c NO FLUSH этот метод не захотел работать

* sy-subrc не проверяется, поэтому все передаваемые конструкции следует заранее отладить в VBA

  ret = obj.

  IF m1 IS SUPPLIED.
    IF p14 IS SUPPLIED.
      CALL METHOD OF ret m1 = ret EXPORTING #1 = p11 #2 = p12 #3 = p13 #4 = p14.
    ELSEIF p13 IS SUPPLIED.
      CALL METHOD OF ret m1 = ret EXPORTING #1 = p11 #2 = p12 #3 = p13.
    ELSEIF p12 IS SUPPLIED.
      CALL METHOD OF ret m1 = ret EXPORTING #1 = p11 #2 = p12.
    ELSEIF p11 IS SUPPLIED.
      CALL METHOD OF ret m1 = ret EXPORTING #1 = p11.
    ELSE.
      CALL METHOD OF ret m1 = ret.
    ENDIF.
  ENDIF.

  IF m2 IS SUPPLIED.
    IF p24 IS SUPPLIED.
      CALL METHOD OF ret m2 = ret EXPORTING #1 = p21 #2 = p22 #3 = p23 #4 = p24.
    ELSEIF p23 IS SUPPLIED.
      CALL METHOD OF ret m2 = ret EXPORTING #1 = p21 #2 = p22 #3 = p23.
    ELSEIF p22 IS SUPPLIED.
      CALL METHOD OF ret m2 = ret EXPORTING #1 = p21 #2 = p22.
    ELSEIF p21 IS SUPPLIED.
      CALL METHOD OF ret m2 = ret EXPORTING #1 = p21.
    ELSE.
      CALL METHOD OF ret m2 = ret.
    ENDIF.
  ENDIF.

  IF m3 IS SUPPLIED.
    IF p34 IS SUPPLIED.
      CALL METHOD OF ret m3 = ret EXPORTING #1 = p31 #2 = p32 #3 = p33 #4 = p34.
    ELSEIF p33 IS SUPPLIED.
      CALL METHOD OF ret m3 = ret EXPORTING #1 = p31 #2 = p32 #3 = p33.
    ELSEIF p32 IS SUPPLIED.
      CALL METHOD OF ret m3 = ret EXPORTING #1 = p31 #2 = p32.
    ELSEIF p31 IS SUPPLIED.
      CALL METHOD OF ret m3 = ret EXPORTING #1 = p31.
    ELSE.
      CALL METHOD OF ret m3 = ret.
    ENDIF.
  ENDIF.

  IF m4 IS SUPPLIED.
    IF p44 IS SUPPLIED.
      CALL METHOD OF ret m4 = ret EXPORTING #1 = p41 #2 = p42 #3 = p43 #4 = p44.
    ELSEIF p43 IS SUPPLIED.
      CALL METHOD OF ret m4 = ret EXPORTING #1 = p41 #2 = p42 #3 = p43.
    ELSEIF p42 IS SUPPLIED.
      CALL METHOD OF ret m4 = ret EXPORTING #1 = p41 #2 = p42.
    ELSEIF p41 IS SUPPLIED.
      CALL METHOD OF ret m4 = ret EXPORTING #1 = p41.
    ELSE.
      CALL METHOD OF ret m4 = ret.
    ENDIF.
  ENDIF.

  IF m5 IS SUPPLIED.
    IF p54 IS SUPPLIED.
      CALL METHOD OF ret m5 = ret EXPORTING #1 = p51 #2 = p52 #3 = p53 #4 = p54.
    ELSEIF p53 IS SUPPLIED.
      CALL METHOD OF ret m5 = ret EXPORTING #1 = p51 #2 = p52 #3 = p53.
    ELSEIF p52 IS SUPPLIED.
      CALL METHOD OF ret m5 = ret EXPORTING #1 = p51 #2 = p52.
    ELSEIF p51 IS SUPPLIED.
      CALL METHOD OF ret m5 = ret EXPORTING #1 = p51.
    ELSE.
      CALL METHOD OF ret m5 = ret.
    ENDIF.
  ENDIF.

  IF m6 IS SUPPLIED.
    IF p64 IS SUPPLIED.
      CALL METHOD OF ret m6 = ret EXPORTING #1 = p61 #2 = p62 #3 = p63 #4 = p64.
    ELSEIF p63 IS SUPPLIED.
      CALL METHOD OF ret m6 = ret EXPORTING #1 = p61 #2 = p62 #3 = p63.
    ELSEIF p62 IS SUPPLIED.
      CALL METHOD OF ret m6 = ret EXPORTING #1 = p61 #2 = p62.
    ELSEIF p61 IS SUPPLIED.
      CALL METHOD OF ret m6 = ret EXPORTING #1 = p61.
    ELSE.
      CALL METHOD OF ret m6 = ret.
    ENDIF.
  ENDIF.

  IF prp IS SUPPLIED AND val IS SUPPLIED.
    SET PROPERTY OF ret prp = val.
  ENDIF.

ENDMETHOD.


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

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


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

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


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

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