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

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Прочитать DBF
СообщениеДобавлено: Ср, янв 19 2005, 17:39 
Ассистент
Ассистент

Зарегистрирован:
Ср, янв 19 2005, 17:36
Сообщения: 27
Кто знает как открыть и прочитать DBFку в ABAP коде?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, янв 19 2005, 17:45 
Гость
можно с помощью функции
ALSM_EXCEL_TO_INTERNAL_TABLE

эта функция откроет DBF-ку через EXCEL
и перенесет ее содержимое во внутреннюю таблицу.

Однако здесь есть ограничение на значение поля - 50 символов,
если этого мало - то скопируй эту функцию в свою и измени там параметры


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, янв 20 2005, 06:42 
Ассистент
Ассистент

Зарегистрирован:
Ср, янв 19 2005, 17:36
Сообщения: 27
Большое спасибо Я ИДИЁТ, УБЕЙТЕ МИНЯ КТО-НИБУДЬ!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, янв 05 2006, 11:54 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Вт, дек 06 2005, 11:22
Сообщения: 72
Откуда: Krivoy Rog
Есть еще более приемлимый вариант через OLE2.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, янв 05 2006, 13:16 
Модератор
Модератор

Зарегистрирован:
Пт, ноя 12 2004, 11:40
Сообщения: 542
Откуда: Москва
Пол: Мужской
SergiK написал(а):
Есть еще более приемлимый вариант через OLE2.


не подскажете?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: re
СообщениеДобавлено: Чт, янв 05 2006, 14:35 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
вероятно через adodb или oledb


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, янв 05 2006, 16:35 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Ср, июн 22 2005, 09:51
Сообщения: 208
Пол: Мужской
http://www.sapfans.com/forums/viewtopic.php?t=131468
http://www.sapfans.com/forums/viewtopic.php?t=96

_________________
С уважением, В.Ш.
4.6C


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, янв 06 2006, 09:24 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Вт, дек 06 2005, 11:22
Сообщения: 72
Откуда: Krivoy Rog
Code:
REPORT  Z_SELECT2                                                   .
INCLUDE ole2incl.
data:
connection type ole2_object,
rs type ole2_object,
connectionstring(500),
state type i,
sql(1000) ,
eof.
data : time_begin like sy-uzeit,
      time_end like sy-uzeit.

*примеры строк коннекта
ConnectionString = 'Provider=vfpoledb;Data Source=c:\1sblob.dbf;Exclusive=No;BackgroundFetch=Yes;Collate=Machine;Null=Yes;Deleted=Yes;'.





sql = 'SELECT block as a1 From 1sblob '.


create object connection 'adodb.connection'.
if sy-subrc ne 0.
PERFORM end_program.
endif.

set property of connection 'ConnectionString' = ConnectionString.
if sy-subrc ne 0.
PERFORM end_program.
endif.


call method of connection 'Open'.
if sy-subrc ne 0.
PERFORM end_program.
endif.

create object rs 'adodb.recordset'.
if sy-subrc ne 0.
PERFORM end_program.
endif.

get property of rs 'State' = state.
if sy-subrc ne 0.
PERFORM end_program.
else.
if state = 1.
call method of rs 'Close'.
if sy-subrc ne 0.
PERFORM end_program.
endif.
endif.
endif.

set property of rs 'CursorType' = 1. "3
*gdbExtDBConcurAuto
* Автоматический подбор режима.
*
*gdbExtDBConcurLock
* Блокировка модифицированное записи в наборе записей
*
*gdbExtDBConcurReadOnly
* Курсор только на чтение
*
*gdbExtDBConcurRowVer
* Оптимистическая стратегия, сравнение версий записей
*
*gdbExtDBConcurValues
* Оптимистическая стратегия, сравнение полей



if sy-subrc ne 0.
PERFORM end_program.
endif.

set property of rs 'LockType' = 1. "1
*1. gdbLckNoLock - блокировка отсутствует
*
*2. gdbLckSLock  - блокировка совместного доступа
*
*3. gdbLckXLock  - эксклюзивная блокировка
*
*4. gdbLckClosed - сеанс закрыл ГБД/общую библиотеку
*
*5. gdbLckTerminated - сеанс принудительно завершен


if sy-subrc ne 0.
PERFORM end_program.
endif.

set property of rs 'CursorLocation' = 2. "2
if sy-subrc ne 0.
PERFORM end_program.
endif.

set property of rs 'ActiveConnection' = connection.
if sy-subrc ne 0.
PERFORM end_program.
endif.




call method of rs 'Open' exporting #1 = sql.

if sy-subrc ne 0.
PERFORM end_program.

endif.

call method of rs 'MoveFirst' .
if sy-subrc ne 0.
PERFORM end_program.
endif.
DATA:
a1 type ole2_object,
a2 type ole2_object.

DATA: BEGIN OF itab OCCURS 100,
a1(100) TYPE C,
a2(100) TYPE C.
DATA: END OF itab.


get property of rs 'EOF' = eof.
if sy-subrc ne 0.
PERFORM end_program.
endif.

call method of rs 'Fields' = a1
exporting #1 = 'a1'.

if sy-subrc ne 0.
PERFORM end_program.
endif.



WHILE eof = '0'.

get property of a1 'Value' = itab-a1.
write itab-a1.

if sy-subrc ne 0.
PERFORM end_program.
endif.



call method of rs 'MoveNext'.
if sy-subrc ne 0.
PERFORM end_program.
endif.

get property of rs 'EOF' = eof.
if sy-subrc ne 0.
PERFORM end_program.
endif.
APPEND itab.
ENDWHILE.

call method of rs 'Close'.
call method of connection 'Close'.

form end_program.

endform.



Для коректной работы мне пришлось ставить на клиентскую машину
vfpoledb.exe
:?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: re
СообщениеДобавлено: Пт, янв 06 2006, 13:50 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
можно provider-а на стандартный сменить
Provider=Microsoft.Jet.OLEDB.4.0;DataSource=C:\whatever.dbf;Extended Properties=dBase IV


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, мар 22 2007, 14:52 
Специалист
Специалист

Зарегистрирован:
Чт, мар 22 2007, 14:40
Сообщения: 142
Пол: Мужской
столкнулся с той же проблемой прочитать dbf файл, потратил на поиски стандарта дня два, все в пустую, кроме решения через OLE стандартных нету., плюнул и написал за пол-дня собственный парсер dbf дабы он простой. (не учитывая поля MEMO). до сих пор не понятно почему SAP не сделал того же самого. :(

кому надо, юзайте ;)

тестировал на 5.0. на другом не знаю, но в целом там все можно дописать для себя.

Code:
FORM upload_dbf_file
  TABLES   pt_file
  USING    p_fpath.

  DATA l_fpath  TYPE string.

  TYPES: BEGIN OF ty_data
    , row(1024) TYPE x
    , END OF ty_data.

  DATA lt_data  TYPE STANDARD TABLE OF ty_data.
  DATA lwa_data  LIKE LINE OF lt_data.

  l_fpath = p_fpath.


  CALL METHOD cl_gui_frontend_services=>gui_upload
    EXPORTING
      filename                = l_fpath
      filetype                = 'BIN'
    CHANGING
      data_tab                = lt_data
    EXCEPTIONS
      file_open_error         = 1
      file_read_error         = 2
      no_batch                = 3
      gui_refuse_filetransfer = 4
      invalid_type            = 5
      no_authority            = 6
      unknown_error           = 7
      bad_data_format         = 8
      header_not_allowed      = 9
      separator_not_allowed   = 10
      header_too_long         = 11
      unknown_dp_error        = 12
      access_denied           = 13
      dp_out_of_memory        = 14
      disk_full               = 15
      dp_timeout              = 16
      not_supported_by_gui    = 17
      error_no_gui            = 18.

  IF sy-subrc NE 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

* Parse Dbf File Into Internal Table
  PERFORM read_dbf
    TABLES lt_data
           pt_file.



ENDFORM.                    "upload_dbf_file
*&---------------------------------------------------------------------*
*&      Form  read_dbf
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM read_dbf
  TABLES pt_xdata
         pt_dbf.

* Dbf Header
  DATA: BEGIN OF ls_dbf_head
    , date              LIKE sy-datum
    , rows              TYPE int4
    , start_offset      TYPE int2
    , row_len           TYPE int2
    , END OF ls_dbf_head.

* Fields Catalog
  DATA: BEGIN OF lt_dbf_fields  OCCURS 0
    , name              TYPE char10
    , type              TYPE c
    , pos               TYPE int4
    , len               TYPE int1
    , digits            TYPE int1
    , END OF lt_dbf_fields.

  DATA l_xdbf          TYPE xstring.
  DATA l_xstring       TYPE xstring.
  DATA l_xfield        TYPE xstring.
  DATA l_xrow          TYPE xstring.
  DATA l_len           TYPE i.
  DATA l_fields_len    TYPE i.
  DATA l_offset        TYPE i.
  DATA l_field_offset  TYPE i.

  FIELD-SYMBOLS <fs_x>       TYPE ANY.
  FIELD-SYMBOLS <fs_any>     TYPE ANY.
  FIELD-SYMBOLS <fs_value>   TYPE ANY.


* All Table into X string
  CLEAR l_xdbf.

  LOOP AT pt_xdata ASSIGNING <fs_any>.
    ASSIGN COMPONENT 1 OF STRUCTURE <fs_any> TO <fs_x>.
    CHECK sy-subrc EQ 0.

    l_xstring = <fs_x>.
    CONCATENATE l_xdbf l_xstring INTO l_xdbf IN BYTE MODE.
  ENDLOOP.

* Fill Dbf Header
  CLEAR ls_dbf_head.


* Count of Rows
  l_xstring = l_xdbf+4(4).
  PERFORM convert_from_x
    USING     l_xstring
    CHANGING  ls_dbf_head-rows.

* Start Offset
  l_xstring = l_xdbf+8(2).
  PERFORM convert_from_x
    USING     l_xstring
    CHANGING  ls_dbf_head-start_offset.

* Row Len
  l_xstring = l_xdbf+10(2).
  PERFORM convert_from_x
    USING     l_xstring
    CHANGING  ls_dbf_head-row_len.


* Fill Dbf Fields
  REFRESH lt_dbf_fields[].

  l_offset = 32.

  l_fields_len = ls_dbf_head-start_offset - 1.

  WHILE l_offset LT l_fields_len.

    l_xfield = l_xdbf+l_offset(32).
    CLEAR lt_dbf_fields.

*   Field Name
    l_xstring = l_xfield(10).
    PERFORM convert_from_x
      USING     l_xstring
      CHANGING  lt_dbf_fields-name.

*   Field Type
    l_xstring = l_xfield+11(1).
    PERFORM convert_from_x
      USING     l_xstring
      CHANGING  lt_dbf_fields-type.

*   Field Position
    l_xstring = l_xfield+12(4).
    PERFORM convert_from_x
      USING     l_xstring
      CHANGING  lt_dbf_fields-pos.

*   Field Length
    l_xstring = l_xfield+16(1).
    PERFORM convert_from_x
      USING     l_xstring
      CHANGING  lt_dbf_fields-len.

*   Digits
    l_xstring = l_xfield+17(1).
    PERFORM convert_from_x
      USING     l_xstring
      CHANGING  lt_dbf_fields-digits.

    APPEND lt_dbf_fields.
    ADD 32 TO l_offset.

  ENDWHILE.

* Fill Data
  REFRESH pt_dbf[].

  l_offset = ls_dbf_head-start_offset.

  DO ls_dbf_head-rows TIMES.
    l_xrow = l_xdbf+l_offset(ls_dbf_head-row_len).
    CLEAR pt_dbf.

*   Not Deleted
    CHECK l_xrow(1) EQ '20'.

    l_field_offset = 1.

*   For All Fields
    LOOP AT lt_dbf_fields.

      ASSIGN COMPONENT lt_dbf_fields-name OF STRUCTURE pt_dbf TO <fs_value>.
      CHECK sy-subrc EQ 0.

      l_len     = lt_dbf_fields-len.
      l_xstring = l_xrow+l_field_offset(l_len).

*     Read Value
      PERFORM convert_from_x
        USING     l_xstring
        CHANGING  <fs_value>.

      ADD l_len TO l_field_offset.
    ENDLOOP.

    ADD l_field_offset TO l_offset.

    APPEND pt_dbf.
  ENDDO.

ENDFORM.                    " read_dbf
*&---------------------------------------------------------------------*
*&      Form  convert_from_x
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_L_XDBF+4(4)  text
*      <--P_LS_DBF_HEAD_ROWS  text
*----------------------------------------------------------------------*
FORM convert_from_x  USING    p_xstring TYPE xstring
                     CHANGING p_value.

  DATA l_type        TYPE c.
  DATA l_x00         TYPE x VALUE '00'.
  DATA l_x20         TYPE x VALUE '20'.

* Convert From XString
  DATA lc_conv     TYPE REF TO cl_abap_conv_in_ce.
  DATA l_len       TYPE i.
  DATA l_xstring   TYPE xstring.

  l_xstring = p_xstring.

  DESCRIBE FIELD p_value TYPE l_type.

  IF l_type CA 'Cg'.
    REPLACE ALL OCCURRENCES OF l_x00 IN l_xstring WITH l_x20  IN BYTE MODE.
  ENDIF.


  CALL METHOD cl_abap_conv_in_ce=>create
    EXPORTING
      input       = l_xstring
      encoding    = '1504'
      replacement = space
      ignore_cerr = abap_true
    RECEIVING
      conv        = lc_conv.

  TRY.
      CALL METHOD lc_conv->read
        IMPORTING
          data = p_value
          len  = l_len.

*   Should ignore errors in code conversions
    CATCH cx_sy_conversion_codepage.
    CATCH cx_sy_codepage_converter_init.
    CATCH cx_parameter_invalid_type.
    CATCH cx_parameter_invalid_range.
  ENDTRY.

ENDFORM.                    " convert_from_x



Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, ноя 28 2007, 11:54 
Начинающий
Начинающий
Аватара пользователя

Зарегистрирован:
Пн, мар 12 2007, 07:04
Сообщения: 15
Откуда: Пермь
Pokusannoe_Zubilo написал:
тестировал на 5.0. на другом не знаю, но в целом там все можно дописать для себя.


Крутая штука. Тестировал в 4.7. Работает без исправлений. Большое спасибо!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, ноя 29 2007, 16:18 
Начинающий
Начинающий
Аватара пользователя

Зарегистрирован:
Пн, мар 12 2007, 07:04
Сообщения: 15
Откуда: Пермь
Рано порадовался. В виндовой системе работает нормально. А на юниксовой падает в дамп.

Invalid access to a string (negative offset).

На строке
Code:
024630     DO ls_dbf_head-rows TIMES.
     >       l_xrow = l_xdbf+l_offset(ls_dbf_head-row_len).
024650       CLEAR pt_dbf.


Может кто подскажет из-за чего такая напасть?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, ноя 29 2007, 17:02 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
Может это классический случай?
Под Windows конец строки из двух байт, а под Unix — один.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, ноя 29 2007, 18:20 
Специалист
Специалист

Зарегистрирован:
Вс, мар 13 2005, 13:59
Сообщения: 201
Откуда: Moscau
DBF - бинарный формат и никаких концов строк там нет и не может быть. Только оффсеты.
Цитата:
На строке
Code:
024630     DO ls_dbf_head-rows TIMES.
     >       l_xrow = l_xdbf+l_offset(ls_dbf_head-row_len).
024650       CLEAR pt_dbf.


Может кто подскажет из-за чего такая напасть?

а чему равен ls_dbf_head-rows и sy-tabix или sy-index. не помню что точно в do. enddo. заполняется.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, фев 20 2008, 12:54 
Специалист
Специалист

Зарегистрирован:
Чт, сен 30 2004, 13:50
Сообщения: 177
sibrin написал:
Может это классический случай?
Под Windows конец строки из двух байт, а под Unix — один.
Это действительно классический случай, только не тот. Windows и UNIX тут ни при чём. Это фича процессора, а не OS. У разных процессоров по разному адресуются байты в числах. На интеловской солярке или линуксе будет нормально работать. Чтоб нормально работало везде нужно явно передать параметр endian в вызов:
Code:
  CALL METHOD cl_abap_conv_in_ce=>create
    EXPORTING
      input       = l_xstring
      encoding    = '1504'
      endian      = 'L'
      replacement = space
      ignore_cerr = abap_true
    RECEIVING
      conv        = lc_conv.
Ну и ещё, к сожалению, этот код не работает, если у ДБФ-ки русские буквы в именах полей. Для такого случая нужно заменить
Code:
ASSIGN COMPONENT lt_dbf_fields-name OF STRUCTURE pt_dbf TO <fs_value>.
на
Code:
ASSIGN COMPONENT SY-TABIX OF STRUCTURE pt_dbf TO <fs_value>.
Это наложит жёсткое условие на порядок полей, но зато будет работать.


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2  След.

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


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

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


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

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