Posted: Fri Dec 28, 2007 6:00 pm Post subject: Как записать длинный текст в таблицу в БД
Столкнулся с такой проблемой...
Создал в базе данных таблицу 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
не совсем понял.
Мне надо в таблице сделать поле-ключ к еще одной таблице, в которой создать несколько полей CHAR с длиной 255 под этот ключ? А потом в программе делить текст на куски по 255 знаков?
Или есть решение более простое и изящное?
Last edited by cbw07 on Fri Dec 28, 2007 6:33 pm; edited 1 time in total
Age: 165 Joined: 04 Oct 2007 Posts: 1218 Location: Санкт-Петербург
Posted: Fri Dec 28, 2007 6:32 pm Post subject:
cbw07 wrote:
не совсем понял.
Мне надо в таблице сделать поле-ключ к еще одной таблице, в которой создать несколько полей CHAR с длиной 255 под этот ключ? А потом в программе делить текст на куски по 255 знаков?
Или есть решение более простое и изященое?
Если использовать вариант 1, и в таблице хранятся другие данные, кроме текста, то да, создавать отдельную таблицу для текстов.
Рассмотрите варианты 2 или 3.
Про другие способы не слышал
Рассмотрите варианты 2 или 3.
Про другие способы не слышал
а можно немного поподробнее про эти 2 варианта.
Напр., вар. 2....
Я попробовал заменить тип.
При активировании таблицы при RAW получаю ошибку:
длина поля > 255 позволяется только при НЕ-ДБ таблицах
Age: 165 Joined: 04 Oct 2007 Posts: 1218 Location: Санкт-Петербург
Posted: Fri Dec 28, 2007 10:28 pm Post subject:
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
Пример работы с бинарным полем, программа загружает файл в бинарное поле таблицы:
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.
*&---------------------------------------------------------------------
*& 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.
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.