MUNDOSAP

Regresar   MUNDOSAP > DESARROLLO > Programación ABAP IV
Nombre de Usuario
Contraseña
Home Descargas Registrar FAQ Miembros Calendario Buscar Temas de Hoy Marcar Foros Como Leídos




 
Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Viejo 29/12/14, 18:00:23
jamiguel77 jamiguel77 is offline
Junior Member
 
Fecha de Ingreso: jun 2011
Mensajes: 21
separar una cadena en base a un delimitador en varios campos

Hola amigos, estoy teniendo problemas con algo muy sencillo:

Tengo un archive: prueba.csv

UD00000000;0090000000;50.26
UD00000000;0090000002;45.56
UD00000000;0090000004;300.25-
UD00000000;0090000005;45.26
UD00000000;0090000024;48.15
UA00000000;0090000025;11.17
UA00000000;0090000027;200.58-
UD00000000;0090000030;600.25
UD00000000;0090000031;123.95
UA00000000;0090000032;-201.63

quiero agarrar cada linea y separarla en base al separador ';' y meter el resultado en una table interna, les dejo mi codigo:

Código:
REPORT Z_JE_CC. *Definimos el tipo de tabla(la estructura) TYPE-POOLS: truxs. types: begin of t_tabla, f1(20) type c, f2(20) type c, f3(20) type c, * f3 type p decimals 3, end of t_tabla. types: begin of t_tabla2, f1(100) type c, * f3 type p decimals 3, end of t_tabla2. data: it_tabla type table of t_tabla, it_tablauncampo TYPE TABLE OF t_tabla2. field-symbols: <fs_tabla> type standard table, <fs_wa> like line of it_tabla, <fs_wa2> like line of it_tablauncampo. SELECTION-SCREEN BEGIN OF BLOCK Pant_Capt WITH FRAME TITLE Text-001. Parameters: p_arch LIKE RLGRAP-FILENAME Obligatory DEFAULT 'c:\temp\prueba.csv'. SELECTION-SCREEN END OF BLOCK Pant_Capt. At Selection-Screen On Value-Request For p_arch. CALL FUNCTION 'F4_FILENAME' EXPORTING PROGRAM_NAME = SY-REPID DYNPRO_NUMBER = SY-DYNNR FIELD_NAME = 'PATH' IMPORTING FILE_NAME = P_arch. *BREAK-POINT. if sy-subrc = 0. clear it_tabla. unassign <fs_tabla>. "Cargamos la tabla de un solo campo. perform Load_Archivo_itab tables it_tablauncampo using p_arch. ASSIGN it_tablauncampo to <fs_tabla>. perform Separar_Tabla tables it_tabla it_tablauncampo. assign it_tabla to <fs_tabla>. BREAK-POINT. else. MESSAGE E398(00) WITH 'Error no se selecciono Archivo'. endif. *&---------------------------------------------------------------------* *& Form LOAD_ARCHIVO_ITAB *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_IT_TABLA text * -->P_P_ARCH text *----------------------------------------------------------------------* FORM LOAD_ARCHIVO_ITAB TABLES P_IT_TABLA "Insert correct name for <...> USING P_P_ARCH. data: lv_xi type i. REFRESH P_IT_TABLA. CALL FUNCTION 'WS_UPLOAD' EXPORTING filename = P_P_ARCH filetype = 'ASC' TABLES data_tab = P_IT_TABLA EXCEPTIONS conversion_error = 1 file_open_error = 2 file_read_error = 3 invalid_table_width = 4 invalid_type = 5 no_batch = 6 unknown_error = 7 OTHERS = 8. IF sy-subrc NE 0. WRITE : ' Error in opening file : ' , P_P_ARCH. STOP. ENDIF. DESCRIBE TABLE P_IT_TABLA lines lv_xi. * BREAK-POINT. ENDFORM. "LOAD_ARCHIVO_ITAB " LOAD_ARCHIVO_ITAB *&---------------------------------------------------------------------* *& Form SEPARAR_TABLA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_IT_TABLE text *----------------------------------------------------------------------* FORM SEPARAR_TABLA TABLES P_IT_TABLA P_it_tablauncampo . "Insert correct name for <...>. field-symbols: <fs_xtabla> type STANDARD TABLE, <fs_xwa> type any. constants: separator(1) type c value ';'. * data: lv_aux(100) type c. data: lv_aux type string, lv_aux2 type string, gt_raw_data TYPE truxs_t_text_data, go_table TYPE REF TO cl_salv_table. * assign p_it_tablauncampo to <fs_xtabla>. assign it_tablauncampo to <fs_xtabla>. break-point. CALL FUNCTION 'TEXT_CONVERT_TEX_TO_SAP' EXPORTING I_FIELD_SEPERATOR = ';' i_tab_raw_data = it_tablauncampo[] TABLES I_TAB_CONVERTED_DATA = it_tabla[] EXCEPTIONS CONVERSION_FAILED = 1 OTHERS = 2. IF SY-SUBRC <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. break-point. loop at <fs_xtabla> ASSIGNING <fs_wa2>. lv_aux2 = <fs_wa2>-f1. * SPLIT lv_aux2 AT CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB INTO TABLE it_tabla. * lv_aux2 = <fs_wa2>-f1. * lv_aux2 = 'aa;bb;cc;dddd;ee;'. * SPLIT lv_aux2 at separator into lv_aux. * BREAK-POINT. endloop. TRY. CALL METHOD cl_salv_table=>factory * EXPORTING * LIST_DISPLAY = IF_SALV_C_BOOL_SAP=>FALSE * R_CONTAINER = * CONTAINER_NAME = IMPORTING r_salv_table = go_table CHANGING t_table = it_tabla. CATCH cx_salv_msg . ENDTRY. break-point. go_table->display( ). ENDFORM. " SEPARAR_TABLA

Lo que he intentado:

1) al mandar llamado:

CALL FUNCTION 'TEXT_CONVERT_TEX_TO_SAP'
EXPORTING
I_FIELD_SEPERATOR = ';'
i_tab_raw_data = it_tablauncampo[]

TABLES
I_TAB_CONVERTED_DATA = it_tabla[]
EXCEPTIONS
CONVERSION_FAILED = 1
OTHERS = 2.

tambien lo intente sin los [] me marca este error:


Short Text
Type conflict when calling the function module "TEXT_CONVERT_TEX_TO_SAP".

no se por que, si sigo la documentacion.

2) Intente tambien esto:

loop at <fs_xtabla> ASSIGNING <fs_wa2>.
lv_aux2 = <fs_wa2>-f1.
SPLIT lv_aux2 AT CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB INTO TABLE it_tabla.
* BREAK-POINT.
endloop.

Esto me funciono un poco mas, pero el problema es que: mi archive (cada linea) tiene separacion con un punto y coma, no con un # entonces me lo separa bien raro.

No encontre como indicarle a la function que el separador era ';'

3) Quise hacerlo manualmente:

loop at <fs_xtabla> ASSIGNING <fs_wa2>.
lv_aux2 = <fs_wa2>-f1.
SPLIT lv_aux2 AT separator INTO lv_aux.
* SPLIT lv_aux2 AT CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB INTO TABLE it_tabla.
* lv_aux2 = <fs_wa2>-f1.
* lv_aux2 = 'aa;bb;cc;dddd;ee;'.
* SPLIT lv_aux2 at separator into lv_aux.
* BREAK-POINT.
endloop.

La variable lv_aux esta declarada como string pero aun asi me marca el siguiente error al checker el codigo (f2) antes de activar:

Unable to interpret "LV_AUX". Possible causes: Incorrect spelling or comma error.

Algun consejo?


Les agradezco, se que es un problema sencillo, pero no me sale.

Gracias.
Responder Con Cita
  #2  
Viejo 29/12/14, 19:08:42
Esteban Dueñas Avalos Esteban Dueñas Avalos is offline
Junior Member
 
Fecha de Ingreso: sep 2006
Mensajes: 4
Smile Separar caracteres

hola jamiguel77

el Split deberías de utilizarlo de esta manera, pruébalo espero que te sirva:
loop at <fs_xtabla> ASSIGNING <fs_wa2>.

Split <fs_wa2> at ';' into t_tabla
...
....
endloop
QUOTE=jamiguel77]Hola amigos, estoy teniendo problemas con algo muy sencillo:

Tengo un archive: prueba.csv

UD00000000;0090000000;50.26
UD00000000;0090000002;45.56
UD00000000;0090000004;300.25-
UD00000000;0090000005;45.26
UD00000000;0090000024;48.15
UA00000000;0090000025;11.17
UA00000000;0090000027;200.58-
UD00000000;0090000030;600.25
UD00000000;0090000031;123.95
UA00000000;0090000032;-201.63

quiero agarrar cada linea y separarla en base al separador ';' y meter el resultado en una table interna, les dejo mi codigo:

Código:
REPORT Z_JE_CC. *Definimos el tipo de tabla(la estructura) TYPE-POOLS: truxs. types: begin of t_tabla, f1(20) type c, f2(20) type c, f3(20) type c, * f3 type p decimals 3, end of t_tabla. types: begin of t_tabla2, f1(100) type c, * f3 type p decimals 3, end of t_tabla2. data: it_tabla type table of t_tabla, it_tablauncampo TYPE TABLE OF t_tabla2. field-symbols: <fs_tabla> type standard table, <fs_wa> like line of it_tabla, <fs_wa2> like line of it_tablauncampo. SELECTION-SCREEN BEGIN OF BLOCK Pant_Capt WITH FRAME TITLE Text-001. Parameters: p_arch LIKE RLGRAP-FILENAME Obligatory DEFAULT 'c:\temp\prueba.csv'. SELECTION-SCREEN END OF BLOCK Pant_Capt. At Selection-Screen On Value-Request For p_arch. CALL FUNCTION 'F4_FILENAME' EXPORTING PROGRAM_NAME = SY-REPID DYNPRO_NUMBER = SY-DYNNR FIELD_NAME = 'PATH' IMPORTING FILE_NAME = P_arch. *BREAK-POINT. if sy-subrc = 0. clear it_tabla. unassign <fs_tabla>. "Cargamos la tabla de un solo campo. perform Load_Archivo_itab tables it_tablauncampo using p_arch. ASSIGN it_tablauncampo to <fs_tabla>. perform Separar_Tabla tables it_tabla it_tablauncampo. assign it_tabla to <fs_tabla>. BREAK-POINT. else. MESSAGE E398(00) WITH 'Error no se selecciono Archivo'. endif. *&---------------------------------------------------------------------* *& Form LOAD_ARCHIVO_ITAB *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_IT_TABLA text * -->P_P_ARCH text *----------------------------------------------------------------------* FORM LOAD_ARCHIVO_ITAB TABLES P_IT_TABLA "Insert correct name for <...> USING P_P_ARCH. data: lv_xi type i. REFRESH P_IT_TABLA. CALL FUNCTION 'WS_UPLOAD' EXPORTING filename = P_P_ARCH filetype = 'ASC' TABLES data_tab = P_IT_TABLA EXCEPTIONS conversion_error = 1 file_open_error = 2 file_read_error = 3 invalid_table_width = 4 invalid_type = 5 no_batch = 6 unknown_error = 7 OTHERS = 8. IF sy-subrc NE 0. WRITE : ' Error in opening file : ' , P_P_ARCH. STOP. ENDIF. DESCRIBE TABLE P_IT_TABLA lines lv_xi. * BREAK-POINT. ENDFORM. "LOAD_ARCHIVO_ITAB " LOAD_ARCHIVO_ITAB *&---------------------------------------------------------------------* *& Form SEPARAR_TABLA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_IT_TABLE text *----------------------------------------------------------------------* FORM SEPARAR_TABLA TABLES P_IT_TABLA P_it_tablauncampo . "Insert correct name for <...>. field-symbols: <fs_xtabla> type STANDARD TABLE, <fs_xwa> type any. constants: separator(1) type c value ';'. * data: lv_aux(100) type c. data: lv_aux type string, lv_aux2 type string, gt_raw_data TYPE truxs_t_text_data, go_table TYPE REF TO cl_salv_table. * assign p_it_tablauncampo to <fs_xtabla>. assign it_tablauncampo to <fs_xtabla>. break-point. CALL FUNCTION 'TEXT_CONVERT_TEX_TO_SAP' EXPORTING I_FIELD_SEPERATOR = ';' i_tab_raw_data = it_tablauncampo[] TABLES I_TAB_CONVERTED_DATA = it_tabla[] EXCEPTIONS CONVERSION_FAILED = 1 OTHERS = 2. IF SY-SUBRC <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. break-point. loop at <fs_xtabla> ASSIGNING <fs_wa2>. lv_aux2 = <fs_wa2>-f1. * SPLIT lv_aux2 AT CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB INTO TABLE it_tabla. * lv_aux2 = <fs_wa2>-f1. * lv_aux2 = 'aa;bb;cc;dddd;ee;'. * SPLIT lv_aux2 at separator into lv_aux. * BREAK-POINT. endloop. TRY. CALL METHOD cl_salv_table=>factory * EXPORTING * LIST_DISPLAY = IF_SALV_C_BOOL_SAP=>FALSE * R_CONTAINER = * CONTAINER_NAME = IMPORTING r_salv_table = go_table CHANGING t_table = it_tabla. CATCH cx_salv_msg . ENDTRY. break-point. go_table->display( ). ENDFORM. " SEPARAR_TABLA

Lo que he intentado:

1) al mandar llamado:

CALL FUNCTION 'TEXT_CONVERT_TEX_TO_SAP'
EXPORTING
I_FIELD_SEPERATOR = ';'
i_tab_raw_data = it_tablauncampo[]

TABLES
I_TAB_CONVERTED_DATA = it_tabla[]
EXCEPTIONS
CONVERSION_FAILED = 1
OTHERS = 2.

tambien lo intente sin los [] me marca este error:


Short Text
Type conflict when calling the function module "TEXT_CONVERT_TEX_TO_SAP".

no se por que, si sigo la documentacion.

2) Intente tambien esto:

loop at <fs_xtabla> ASSIGNING <fs_wa2>.
lv_aux2 = <fs_wa2>-f1.
SPLIT lv_aux2 AT CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB INTO TABLE it_tabla.
* BREAK-POINT.
endloop.

Esto me funciono un poco mas, pero el problema es que: mi archive (cada linea) tiene separacion con un punto y coma, no con un # entonces me lo separa bien raro.

No encontre como indicarle a la function que el separador era ';'

3) Quise hacerlo manualmente:

loop at <fs_xtabla> ASSIGNING <fs_wa2>.
lv_aux2 = <fs_wa2>-f1.
SPLIT lv_aux2 AT separator INTO lv_aux.
* SPLIT lv_aux2 AT CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB INTO TABLE it_tabla.
* lv_aux2 = <fs_wa2>-f1.
* lv_aux2 = 'aa;bb;cc;dddd;ee;'.
* SPLIT lv_aux2 at separator into lv_aux.
* BREAK-POINT.
endloop.

La variable lv_aux esta declarada como string pero aun asi me marca el siguiente error al checker el codigo (f2) antes de activar:

Unable to interpret "LV_AUX". Possible causes: Incorrect spelling or comma error.

Algun consejo?


Les agradezco, se que es un problema sencillo, pero no me sale.

Gracias.[/quote]
Responder Con Cita
  #3  
Viejo 30/12/14, 23:59:15
jamiguel77 jamiguel77 is offline
Junior Member
 
Fecha de Ingreso: jun 2011
Mensajes: 21
Red face

Listo, Funciono!!!



Código:
loop at ASSIGNING . lv_aux2 = -f1. SPLIT lv_aux2 AT ';' into it_table-f1 it_table-f2 it_table-f3. append it_table. endloop.

tuve que declarer mi table WITH HEADER LINE

tambien lo solucione mandando llamar la FM:

'TEXT_CONVERT_TEX_TO_SAP'

quedando:


Código:
CALL FUNCTION 'TEXT_CONVERT_TEX_TO_SAP' EXPORTING I_FIELD_SEPERATOR = ';' i_tab_raw_data = gt_raw_data[] TABLES I_TAB_CONVERTED_DATA = it_table[] EXCEPTIONS CONVERSION_FAILED = 1 OTHERS = 2. IF SY-SUBRC <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF.


Gracias Felices Fiestas.

Saludos.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Reglas de Mensajes
no puedes crear nuevos temas
no puedes responder temas
no puedes adjuntar archivos
no puedes editar tus mensajes

El código vB está On
Las caritas están On
Código [IMG] está On
Código HTML está Off
Saltar a Foro


Husos Horarios son GMT. La hora en este momento es 00:39:03.


www.mundosap.com 2006 - Spain
software crm, crm on demand, software call center, crm act, crm solutions, crm gratis, crm web