Текущее время: Пт, июл 18 2025, 19:19

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


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

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


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

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