Кодирование/декодирование структурированных данных в/из внутреннюю "бинарную "таблиц(у)/(ы).
Обычно буффер пишут в бинарный файл в какой нибуть из каталогов в AL11.
Сделал такое. Не понравилось.. типа нам не нужын файловый буффер. нам нада только читать из экселя.
Подумал а чебы не впиихнутъ в бинар без файла.. оказывается довольно легко
Удобно при многоуровевой древовидной буфферизации..
в примере A, B, C - уровни;
Таблица со структурой в которой одно поле уровень, другое XSTRING.
1.
2.
3.
4.
5.
6.
TYPES: BEGIN OF ty_itabx,
satzart(1) TYPE c,
hex TYPE xstring,
END OF ty_itabx.
DATA gt_itabx TYPE STANDARD TABLE OF ty_itabx.
DATA gs_itabx LIKE LINE OF gt_itabx.
Два экземпляра класса "Codepage- und Endian Konvertierung (Systemformat -> Extern)" : 1й - на вход, 2й - на выход
DATA(o_conv) = cl_abap_conv_out_ce=>create( encoding = 'UTF-8' endian = 'L' ). " IN
DATA(o_convo) = cl_abap_conv_in_ce=>create( encoding = 'UTF-8' endian = 'L' ). " OUT
Вход: инициализация "легаси" view со стуктурой с данными для входа.
копирование в бинар, присвоение бинарной структуре, добавление в таблицу .
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
clear lv_buffer.
DATA(o_viewA) = cl_abap_view_offlen=>create_legacy_view( wa_komfkgn ).
o_conv->convert_struc( EXPORTING
data = wa_komfkgn
view = o_viewA
IMPORTING
buffer = lv_buffer ).
gs_itabx-satzart = satzart.
gs_itabx-HEX = lv_buffer.
APPEND gs_itabx TO gt_itabx.
Выход - обратный процесс легаси для выхода. копирование в буффер, декодирование
1.
2.
3.
4.
5.
6.
7.
8.
9.
LOOP AT gt_itabx INTO gs_itabx.
DATA(o_viewF) = cl_abap_view_offlen=>create_legacy_view( wa_komfkgn ).
DATA(lv_bufferF) = gs_itabx-HEX.
o_convo->convert_struc( EXPORTING
input = lv_bufferF
view = o_viewF
IMPORTING
data = wa_komfkgn ).
endloop.
Таким образом кодировал чтобы импортировать "ворох" SD фактур с экселя. куски кода:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
TYPES: BEGIN OF ty_itabx,
satzart(1) TYPE c,
hex TYPE xstring,
END OF ty_itabx.
DATA gt_itabx TYPE STANDARD TABLE OF ty_itabx.
DATA gs_itabx LIKE LINE OF gt_itabx.
* ENCODING
form daten__anlegen USING gt_data type standard table CHANGING cnt TYPE i.
data: ls_pos type ty_pos.
data: lv_bp type bu_partner.
data: lv_bp_alt type bu_partner.
"data cnt type i.
data cnt_str type string.
data : lv_numberofcolumns type i,
lv_zeileart(1) type c,
lv_date_string type string,
lv_target_date_field type datum.
DATA: lv_buffer type xstring.
DATA(o_conv) = cl_abap_conv_out_ce=>create( encoding = 'UTF-8' endian = 'L' ).
DATA(o_convo) = cl_abap_conv_in_ce=>create( encoding = 'UTF-8' endian = 'L' ).
field-symbols : <ls_data> type any,
<ls_datak> type any,
<lv_field> type any.
lv_numberofcolumns = p_ncol.
LOOP at gt_data ASSIGNING <ls_data> from 2.
clear: ls_pos.
ls_pos-auart = 'TA'.
ls_pos-spart = '01'.
ls_pos-pstyv = 'DLN'. " 'TAD'. "Positionstyp Vertr.beleg
ls_pos-fkara = inv_type. "'FX'. "Vorschlag Fakturaart
ls_pos-taxm1 = '1'.
ls_pos-taxk1 = '1'.
ls_pos-versg = '2'.
do lv_numberofcolumns times.
assign component sy-index of structure <ls_data> to <lv_field>.
case sy-index.
when 1.
ls_pos-zlart = <lv_field>.
if ls_pos-zlart = 'N'.
cnt = cnt + 1.
cnt_str = cnt.
clear a1_vgbel.
move cnt_str to a1_vgbel.
move sy-uzeit to a1_vgbel+1.
endif.
ls_pos-vgbel = a1_vgbel.
when 2.
ls_pos-VKORG = <lv_field>.
when 3.
ls_pos-VTWEG = <lv_field>.
when 4.
ls_pos-WERKS = <lv_field>.
when 5.
ls_pos-vgpos = <lv_field>.
when 6.
lv_date_string = <lv_field> .
perform date_convert using lv_date_string changing lv_target_date_field .
ls_pos-fkdat = lv_target_date_field.
when 7.
call function 'CONVERSION_EXIT_ALPHA_INPUT'
exporting
input = <lv_field>
importing
output = lv_bp.
ls_pos-kunag = lv_bp.
ls_pos-kunrg = lv_bp.
ls_pos-kunre = lv_bp.
ls_pos-kunwe = lv_bp.
when 8.
ls_pos-kbetr = <lv_field>.
when 9.
ls_pos-matnr = <lv_field>.
select single maktx from makt into wa_komfkgn-arktx where matnr = <lv_field>.
when 10.
ls_pos-kwmeng = <lv_field>. "Auftragsmenge
endcase.
enddo.
if ls_pos is not initial.
satzart = 'A'.
wa_komfkgn-mandt = sy-mandt.
wa_komfkgn-auart = ls_pos-auart.
wa_komfkgn-vkorg = ls_pos-vkorg.
wa_komfkgn-vtweg = ls_pos-vtweg.
wa_komfkgn-spart = ls_pos-spart.
wa_komfkgn-fkdat = ls_pos-fkdat.
wa_komfkgn-prctr = 'PC9999'.
wa_komfkgn-VKBUR = '1000'.
wa_komfkgn-kunag = ls_pos-kunag.
wa_komfkgn-kunrg = ls_pos-kunrg.
wa_komfkgn-kunre = ls_pos-kunre.
wa_komfkgn-kunwe = ls_pos-kunwe.
wa_komfkgn-kwmeng = ls_pos-kwmeng.
wa_komfkgn-matnr = ls_pos-matnr.
wa_komfkgn-vrkme = 'ST'.
wa_komfkgn-pstyv = ls_pos-pstyv.
wa_komfkgn-kwmeng = ls_pos-kwmeng.
wa_komfkgn-werks = ls_pos-werks.
wa_komfkgn-vgbel = ls_pos-vgbel.
wa_komfkgn-vgpos = ls_pos-vgpos.
wa_komfkgn-fkara = ls_pos-fkara.
wa_komfkgn-taxm1 = ls_pos-taxm1.
wa_komfkgn-taxk1 = ls_pos-taxk1.
wa_komfkgn-versg = ls_pos-versg.
clear lv_buffer.
DATA(o_viewA) = cl_abap_view_offlen=>create_legacy_view( wa_komfkgn ).
o_conv->convert_struc( EXPORTING
data = wa_komfkgn
view = o_viewA
IMPORTING
buffer = lv_buffer ).
gs_itabx-satzart = satzart.
gs_itabx-HEX = lv_buffer.
APPEND gs_itabx TO gt_itabx.
"transfer satzart to ds_name.
"transfer wa_komfkgn to ds_name.
* Preisteile
clear wa_komfkko.
satzart = 'B'.
wa_komfkko-mandt = sy-mandt.
wa_komfkko-knumv = wa_komfkgn-vgbel.
wa_komfkko-kposn = wa_komfkgn-vgpos.
wa_komfkko-kschl = 'PR00'.
wa_komfkko-kbetr = ls_pos-kbetr.
clear lv_buffer.
DATA(o_viewB1) = cl_abap_view_offlen=>create_legacy_view( wa_komfkko ).
o_conv->convert_struc( EXPORTING
data = wa_komfkko
view = o_viewB1
IMPORTING
buffer = lv_buffer ).
gs_itabx-satzart = satzart.
gs_itabx-HEX = lv_buffer.
APPEND gs_itabx TO gt_itabx.
"transfer satzart to ds_name.
"transfer wa_komfkko to ds_name.
* Positionstexte
clear wa_komfktx.
satzart = 'C'.
wa_komfktx-mandt = sy-mandt.
wa_komfktx-vgbel = wa_komfkgn-vgbel.
wa_komfktx-vgpos = wa_komfkgn-vgpos.
wa_komfktx-tdobject = 'VBBP'.
wa_komfktx-tdid = '0002'.
wa_komfktx-tdspras = 'DE'.
wa_komfktx-tdformat = '*'. " 'U1', 'AS'
wa_komfktx-tdline = 'Das ist ein Text'.
clear lv_buffer.
DATA(o_viewC) = cl_abap_view_offlen=>create_legacy_view( wa_komfktx ).
o_conv->convert_struc( EXPORTING
data = wa_komfktx
view = o_viewC
IMPORTING
buffer = lv_buffer ).
gs_itabx-satzart = satzart.
gs_itabx-HEX = lv_buffer.
APPEND gs_itabx TO gt_itabx.
endif.
endloop.
endform.
*DECODING
form externer_faktura_sammellauf_x
using "ds_name
ds_check
fakliste.
*---------------------------------------------------------------------*
* Ermitteln Sammelgangsnummer *
*---------------------------------------------------------------------*
check rv50s-sammg is initial.
select single * from tvsa where smart = 'F'.
if sy-subrc = 0.
call function 'NUMBER_GET_NEXT'
exporting
nr_range_nr = tvsa-numki
object = 'RV_SAMMG'
importing
number = rv50s-sammg.
else.
perform add_msg_to_appl_log1 using sammelgangsart gc_msgty_e.
endif.
*---------------------------------------------------------------------*
* Füllen Sammelgangsverwaltungssatz
*---------------------------------------------------------------------*
clear vbsk.
vbsk-mandt = sy-mandt. "Mandant
vbsk-ernam = sy-uname. "Name des Sachbearbeiters
vbsk-erdat = sy-datum. "Datum des Hinzufügens
vbsk-uzeit = sy-uzeit. "Uhrzeit -"-
vbsk-smart = 'F'. "Gruppenart
vbsk-sammg = rv50s-sammg. "Gruppennummer
*-------- Mappendaten: Dynpro RVAFS900 900
clear bdc_tab.
" move: 'ZRVAFSS00' to bdc_tab-program,
move: 'Z_REP_SD_FAKTURA_IMP' to bdc_tab-program,
'0900' to bdc_tab-dynpro,
'X' to bdc_tab-dynbegin.
append bdc_tab.
clear bdc_tab.
write: 'bdc_okcode' to bdc_tab-fnam,
' ' to bdc_tab-fval.
append bdc_tab.
*------- validate filename -------------------------------------------
* call function 'FILE_VALIDATE_NAME'
* exporting
* logical_filename = gc_filename
* changing
* physical_filename = ds_name
* exceptions
* others = 1.
* if sy-subrc <> 0.
* message id sy-msgid type sy-msgty number sy-msgno
* with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
* endif.
*------- File öffnen / lesen -----------------------------------------
* open dataset ds_name for input in binary mode.
*
* if sy-subrc ne 0.
* perform add_msg_to_appl_log
* using ds_name gc_msgty_i '511' 'VF' space space.
* exit.
* endif.
clear i.
"-------------------
"DATA lv_vgbel_alt TYPE vgbel.
DATA lv_fill_head TYPE abap_bool.
clear lv_fill_head.
LOOP AT gt_itabx INTO gs_itabx.
* read first record
*READ TABLE gt_itabx INTO gs_itabx INDEX 1.
* if gs_itabx-satzart <> 'A' and gs_itabx-satzart <> 'B' and gs_itabx-satzart <> 'C' and gs_itabx-satzart <> 'X' .
* exit.
* endif.
satzart = gs_itabx-satzart.
if satzart <> 'A' and satzart <> 'B' and satzart <> 'C' and satzart <> 'X' .
exit.
endif.
if satzart = fakturasatz.
DATA(o_viewF) = cl_abap_view_offlen=>create_legacy_view( wa_komfkgn ).
"DATA(lv_buffer) = CONV xstring( gs_itabx-HEX ).
DATA(lv_bufferF) = gs_itabx-HEX.
o_convo->convert_struc( EXPORTING
input = lv_bufferF
view = o_viewF
IMPORTING
data = wa_komfkgn ).
" read dataset ds_name into wa_komfkgn.
elseif satzart = preisteilsatz.
DATA(o_viewP) = cl_abap_view_offlen=>create_legacy_view( wa_komfkko ).
DATA(lv_bufferP) = gs_itabx-HEX.
o_convo->convert_struc( EXPORTING
input = lv_bufferP
view = o_viewP
IMPORTING
data = wa_komfkko ).
" read dataset ds_name into wa_komfkko.
elseif satzart = textteilsatz.
DATA(o_viewT) = cl_abap_view_offlen=>create_legacy_view( wa_komfktx ).
DATA(lv_bufferT) = gs_itabx-HEX.
o_convo->convert_struc( EXPORTING
input = lv_bufferP
view = o_viewP
IMPORTING
data = wa_komfktx ).
"read dataset ds_name into wa_komfktx.
elseif satzart = eof_satz.
xeof = x.
else.
* MESSAGE A512 WITH DS_NAME.
"perform add_msg_to_appl_log1 using ds_name gc_msgty_e.
endif.
if sy-subrc eq 4.
*------- End of File erreicht --> Exit ------------------------------
xeof = x.
endif.
if sy-subrc eq 8.
*------- Datei kann nicht geöffnet werden -----------------------------
* MESSAGE A512 WITH DS_NAME.
" perform add_msg_to_appl_log1 using ds_name gc_msgty_e.
exit.
endif.
check satzart is not initial.
if xeof = 'X'.
exit.
endif.
"-------------------------
"LOOP AT gt_itabx INTO gs_itabx FROM 2.
" while xeof ne x.
"check satzart is not initial.
if satzart eq fakturasatz.
"perform xkomfkgn_fuellen.
* on change of wa_komfkgn-vkorg or
* wa_komfkgn-vtweg or
* wa_komfkgn-kunag or
* wa_komfkgn-fkdat.
on change of wa_komfkgn-vgbel.
if i > 0 and xkomfkgn is not INITIAL.
perform gn_invoice_create
using "ds_name
ds_check
fakliste.
clear i.
clear lv_fill_head.
refresh xkomfkgn.
refresh xkomfkko.
refresh xkomfktx.
endif.
endon.
ELSEif satzart <> fakturasatz.
perform fakturasatz_bearbeiten_x USING gs_itabx
"ds_name
ds_check
fakliste
CHANGING lv_fill_head.
i = i + 1.
endif.
"endif.
* if i > max_zahl.
** ---------- maximale Anzahl Sätze erreicht --------------------------
" perform gn_invoice_create
" using ds_name
" ds_check
" fakliste.
" clear i.
" refresh xkomfkgn.
" refresh xkomfkko.
" refresh xkomfktx.
* endif.
ENDLOOP.
if i <> 0.
perform gn_invoice_create
using "ds_name
ds_check
fakliste.
clear i.
refresh xkomfkgn.
refresh xkomfkko.
refresh xkomfktx.
endif.
endform. "externer_faktura_sammellauf
Базисный FM не BAPI sondern 'GN_INVOICE_CREATE'.. also keiin BAPI_COMMIT am Endeffekt.