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

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


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

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


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

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