SAP R/3 форум ABAP консультантов
Russian ABAP Developer's Club

Home - FAQ - Search - Memberlist - Usergroups - Profile - Log in to check your private messages - Register - Log in - English
Blogs - Weblogs News

Как записать длинный текст в таблицу в БД



 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP
View previous topic :: View next topic  
Author Message
cbw07
Старший специалист
Старший специалист



Joined: 30 Nov 2007
Posts: 127

PostPosted: Fri Dec 28, 2007 6:00 pm    Post subject: Как записать длинный текст в таблицу в БД Reply with quote

Столкнулся с такой проблемой...
Создал в базе данных таблицу ZZUT в которой одно из полей ZUT1 было объявлено как CHAR с длиной 255.

В программе объявил в самом начале
Code:
TABLES zzut.

DATA: itab TYPE zzut OCCURS 100 WITH HEADER LINE.


Программа пишет в поле ZUT1 некий текст.
Все работает нормально.

Теперь мне понадобилось писать более длинный текст, напр., 600 знаков. И тут возникла эта проблема.
Если я в таблице ZZUT меняю длину поля ZUT1 с 255 на 600, то при активировании таблицы ZZUT получаю ошибку, что длина не может быть больше 255.

Тогда я меняю тип этого поля с CHAR на STRING. Активирование таблицы ZZUT проходит нормально. Но зато в этом случае при активировании уже моей программы я получаю ошибку в объявлении этой таблицы в программе:
ZZUT не может содержать STRING

Что делать?
Back to top
View user's profile Send private message
vga
Мастер
Мастер


Age: 180
Joined: 04 Oct 2007
Posts: 1218
Location: Санкт-Петербург

PostPosted: Fri Dec 28, 2007 6:14 pm    Post subject: Reply with quote

Наверно надо делать так, как это делается в самом sape.
Записывать в несколько строк в таблице, а потом собирать.

1) например:
Code:
Ключ   Номер сроки     Стринг
номер  1                      строка1
номер  2                      строка2
номер  3                      строка3


2) Обратите внимание на поля для хранения бинарных данных типа RAW и LRAW.
http://help.sap.com/saphelp_nw04/helpdata/en/cf/21f2e5446011d189700000e8322d00/frameset.htm
3) Или используйте кластеры, конструкция EXPORT TO DATABASE/IMPORT FROM DATABASE.
http://help.sap.com/saphelp_47x200/helpdata/en/fc/eb3c05358411d1829f0000e829fbfe/frameset.htm


Last edited by vga on Fri Dec 28, 2007 10:52 pm; edited 1 time in total
Back to top
View user's profile Send private message Blog Visit poster's website
cbw07
Старший специалист
Старший специалист



Joined: 30 Nov 2007
Posts: 127

PostPosted: Fri Dec 28, 2007 6:28 pm    Post subject: Reply with quote

не совсем понял.
Мне надо в таблице сделать поле-ключ к еще одной таблице, в которой создать несколько полей CHAR с длиной 255 под этот ключ? А потом в программе делить текст на куски по 255 знаков?

Или есть решение более простое и изящное?


Last edited by cbw07 on Fri Dec 28, 2007 6:33 pm; edited 1 time in total
Back to top
View user's profile Send private message
vga
Мастер
Мастер


Age: 180
Joined: 04 Oct 2007
Posts: 1218
Location: Санкт-Петербург

PostPosted: Fri Dec 28, 2007 6:32 pm    Post subject: Reply with quote

cbw07 wrote:
не совсем понял.
Мне надо в таблице сделать поле-ключ к еще одной таблице, в которой создать несколько полей CHAR с длиной 255 под этот ключ? А потом в программе делить текст на куски по 255 знаков?

Или есть решение более простое и изященое?


Если использовать вариант 1, и в таблице хранятся другие данные, кроме текста, то да, создавать отдельную таблицу для текстов.

Рассмотрите варианты 2 или 3.
Про другие способы не слышал Sad
Back to top
View user's profile Send private message Blog Visit poster's website
cbw07
Старший специалист
Старший специалист



Joined: 30 Nov 2007
Posts: 127

PostPosted: Fri Dec 28, 2007 6:42 pm    Post subject: Reply with quote

vga wrote:
Рассмотрите варианты 2 или 3.
Про другие способы не слышал Sad


а можно немного поподробнее про эти 2 варианта.
Напр., вар. 2....
Я попробовал заменить тип.
При активировании таблицы при RAW получаю ошибку:
длина поля > 255 позволяется только при НЕ-ДБ таблицах
Back to top
View user's profile Send private message
vga
Мастер
Мастер


Age: 180
Joined: 04 Oct 2007
Posts: 1218
Location: Санкт-Петербург

PostPosted: Fri Dec 28, 2007 10:28 pm    Post subject: Reply with quote

2) Выбрал встроенный тип (Built-in type) LRAW длиной > 255.
Перед необходимо добавить поле типа INT4 для выравнивания.

Quote:
LRAW: Uninterpreted byte string of any length, but has to be declared with a minimum length of 256. Fields of this type must be located at the end of transparent tables (in each table there can be only one such field) and must be preceded by a length field of type INT2. If there is an INSERT or UPDATE in ABAP programs, this length field must be filled with the length actually required. If the length field is not filled correctly, this may lead to a data loss in the LRAW field! A fields of this type cannot be used in the WHERE condition of a SELECT statement.

Data Type in the ABAP Dictionary for byte strings of a predefined lenght . It corresponds to the predefined ABAP Data Type X. LRAW fields are often used for INDX tables, which can be accessed using the IMPORT and EXPORT keywords.


Для конвертации бинарных типов в другие можете использовать функциональные модули группы SCMS_CONV.
SCMS_BINARY_TO_STRING
SCMS_BINARY_TO_TEXT
SCMS_BINARY_TO_XSTRING
SCMS_STRING_TO_XSTRING
SCMS_TEXT_TO_BINARY
SCMS_TEXT_TO_XSTRING
SCMS_XSTRING_TO_BINARY

Пример работы с бинарным полем, программа загружает файл в бинарное поле таблицы:

Code:
REPORT ZARCHIVE.

***

TABLES : ZARCHIVE.

*****************
*** Variables ***
*****************

TYPES : BEGIN OF ty_data,
data type x,
END OF ty_data.

DATA : t_data type standard table of ty_data with header line.

DATA : t_data_tab type standard table of zarchive with header line.

******************
*** Parameters ***
******************

Parameters : p_upload type c radiobutton group rb1,
p_downlo type c radiobutton group rb1,
p_id(15) type n obligatory,
p_file(100) type c.

********************
*** Main Program ***
********************

if not p_upload is initial.
perform f_upload.
else.
perform f_download.
endif.

*************
*** Forms ***
*************

*&---------------------------------------------------------------------
*& Form f_upload
*&---------------------------------------------------------------------
FORM f_upload.

data : l_file type string,
l_c1 type i,
l_c2 type i,
l_data(1000) type x.

delete from zarchive where id = p_id.

l_file = p_file.

CALL FUNCTION 'GUI_UPLOAD'
  EXPORTING
    FILENAME = l_file
    FILETYPE = 'BIN'
  TABLES
    DATA_TAB = t_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
    OTHERS = 17.

IF SY-SUBRC 0.
  MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
             WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

***

DESCRIBE TABLE t_data.

CHECK sy-tfill > 0.

***

t_data_tab-id = p_id.
t_data_tab-filename = l_file.

l_c1 = 0.
l_c2 = 0.
loop at t_data.

l_data+l_c1 = t_data-data.

add 1 to l_c1.

if l_c1 = 1000.
add 1 to l_c2.

t_data_tab-partidx = l_c2.
t_data_tab-data_size = l_c1.
t_data_tab-data = l_data.

append t_data_tab.

clear l_c1.
clear l_data.

endif.

endloop.

add 1 to l_c2.

t_data_tab-partidx = l_c2.
t_data_tab-data_size = l_c1.
t_data_tab-data = l_data.
append t_data_tab.

***

modify zarchive from table t_data_tab.

ENDFORM. " f_upload

*&---------------------------------------------------------------------
*& Form f_download
*&---------------------------------------------------------------------
FORM f_download.

data : l_file type string,
l_c1 type i.

l_file = p_file.

SELECT *
INTO TABLE t_data_tab
FROM ZARCHIVE
WHERE ID = P_ID.

CHECK SY-SUBRC = 0.

***

LOOP AT t_data_tab.
DO t_data_tab-data_size times.
l_c1 = sy-index - 1.
t_data-data = t_data_tab-data+l_c1.
APPEND t_data.
ENDDO.
ENDLOOP.

***

DESCRIBE TABLE t_data.

CALL FUNCTION 'GUI_DOWNLOAD'
  EXPORTING
    BIN_FILESIZE = sy-tfill
    FILENAME = l_file
    FILETYPE = 'BIN'
  TABLES
    DATA_TAB = t_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
    OTHERS = 17.

IF SY-SUBRC 0.
  MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

ENDFORM. " f_download

***************************************************************
*Tabela que guarda os arquivos
***************************************************************
*Tabela transparente : ZARCHIVE
*Descricao breve : Files Achive
*
*Campos :
*
*1) MANDT MANDT CLNT 3 Mandante
*2) ID NUMC15 NUMC 15 Campo numerico do compr. 15
*3) PARTIDX NUMC05 NUMC 5 Campo numerico com compr. 5
*4) FILENAME CHAR255 CHAR 255 Char255
*5) DATA_SIZE INT2 INT2 5 2 Byte Integer (Signed)
*6) DATA LRAW1000 LRAW 1000 Cluster dados, compr.max.1000
*
*******************************************************************
*Tabela exemplo:
*
*
*ID PARTIDX FILENAME DATA_SIZE DATA
*000000000000001 00001 C:\TESTE.DOC 1.000 D0CF11E0...
*000000000000001 00002 C:\TESTE.DOC 1.000 0000A353...
*000000000000001 00003 C:\TESTE.DOC 1.000 00000000...
*000000000000001 00004 C:\TESTE.DOC 1.000 4C494E4B...
*000000000000001 00005 C:\TESTE.DOC 922 33362220...
*
*



table_with_lraw.gif
 Description:
 Filesize:  8.95 KB
 Viewed:  24665 Time(s)

table_with_lraw.gif


Back to top
View user's profile Send private message Blog Visit poster's website
vga
Мастер
Мастер


Age: 180
Joined: 04 Oct 2007
Posts: 1218
Location: Санкт-Петербург

PostPosted: Sat Dec 29, 2007 12:10 am    Post subject: Reply with quote

3) EXPORT TO DATABASE/IMPORT FROM DATABASE.

Если созданная таблица с LRAW полем имеет определенную структуру, соответствующую Cluster Databases, то для чтения/записи можно использовать EXPORT TO DATABASE/IMPORT FROM DATABASE http://help.sap.com/saphelp_470/helpdata/ru/fc/eb3c12358411d1829f0000e829fbfe/content.htm

Для формирования структуры Cluster Databases есть стандарные элементы данных на INDX_*

Code:
TABLES indx.

DATA : itab TYPE TABLE OF syst.

REFRESH itab.
APPEND syst TO itab.

CLEAR indx.
indx-usera = sy-uname.
EXPORT itab TO DATABASE indx(zz) ID sy-uname.


Code:
TABLES indx.

DATA : itab TYPE TABLE OF syst.

REFRESH itab.
CLEAR indx.
IMPORT itab FROM DATABASE indx(zz) ID sy-uname.


http://www.sapnet.ru/viewtopic.php?t=724
Back to top
View user's profile Send private message Blog Visit poster's website
cbw07
Старший специалист
Старший специалист



Joined: 30 Nov 2007
Posts: 127

PostPosted: Mon Jan 07, 2008 11:25 am    Post subject: Reply with quote

Был в отпуске. Всех с Новым годом и Рождеством!
Попробовал вариант 2.

Когда пытаюсь активировать таблицу, получаю ошибку.
В переводе означает, что
поле ZUTATEN не обладает никаким предназначенным полем INT4

Что это означает и что мне надо сделать?


Last edited by cbw07 on Mon Jan 07, 2008 11:33 am; edited 1 time in total
Back to top
View user's profile Send private message
cbw07
Старший специалист
Старший специалист



Joined: 30 Nov 2007
Posts: 127

PostPosted: Mon Jan 07, 2008 11:32 am    Post subject: Reply with quote

скриншот таблицы


Table.JPG
 Description:
 Filesize:  35.2 KB
 Viewed:  24542 Time(s)

Table.JPG


Back to top
View user's profile Send private message
cbw07
Старший специалист
Старший специалист



Joined: 30 Nov 2007
Posts: 127

PostPosted: Mon Jan 07, 2008 11:33 am    Post subject: Reply with quote

скриншот ошибки


Error_Table.JPG
 Description:
 Filesize:  23.55 KB
 Viewed:  24541 Time(s)

Error_Table.JPG


Back to top
View user's profile Send private message
Lord
Профессионал
Профессионал



Joined: 10 Sep 2007
Posts: 168

PostPosted: Mon Jan 07, 2008 11:58 pm    Post subject: Reply with quote

Перед полем типа LRAW для выравнивания необходимо вставить поле типа INT4.
Смотрите пример у vga: поле с именем ZINT4
Back to top
View user's profile Send private message
cbw07
Старший специалист
Старший специалист



Joined: 30 Nov 2007
Posts: 127

PostPosted: Tue Jan 08, 2008 11:06 am    Post subject: Reply with quote

спасибо, теперь нет ошибки. Кто бы знал про такие тонкости? Laughing
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG.
SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG.
Every effort is made to ensure content integrity. Use information on this site at your own risk.