PDA

Ver la Versión Completa : Copiar/pegar en un ALV Grid


Abapor
03/06/08, 13:43:55
Hola, tengo un ALV Grid al que le quiero poner el icono de pegar. Lo que intento es copiar desde excel unos 400 registros y pegarlos a la vez para guardarlos despues .
No se si me he explicado lo suficiente :) .
muchas gracias de antemano :)

ibecerra
03/06/08, 22:55:08
Hola, no lo tengo muy claro, podrias explicarlo un poco mas.
saludos

Abapor
04/06/08, 07:43:02
Hola ibecerra,
a ver si puedo explicar muy bien :) .
tengo un ALG Grid , y tengo un fichero Excel donde hay casi 400 registros
(los campos del AVL Grid son los mismos en el fichero Excel). lo que quiero hacer es , guardar todos los datos del Excel en mi ALV Grid , por eso necesito como puedo hacer un (" Select all "+ Copy) desde el Excel para pegar todos los registros a la vez en el ALV Grid.

muchas gracias por tu respuesta :)

pmarinab
04/06/08, 07:59:32
Hola Abapor,

no tengo ni idea de si eso que dices puede hacerse o no, pero no sería mucho más facil crear un boton en el ALV que te permita subir el fichero excel y que tú te encargues por programación de leerlo y copiar cada registro a la tabla interna de tú ALV??

Yo pienso que es mucho más sencillo de hacer.

Un saludo

Abapor
04/06/08, 11:17:22
Hola pmarinab ,
si tienes razon es mucho más facil subir el fichero excel ... pero si el usuario elegi solo unos registros ? en este caso todo depende de su selección .
lo que intento hacer es usar el concepto de Ctrl + C / V.

robert_milan
04/06/08, 11:24:06
hazlo en dos paso uno donde carguen el fichero de excel y lo vean y otro que seleccione cual quiere en el alv.

Jonathan Barrio Rodriguez
04/06/08, 12:35:26
BUENO, no te puedo ayudar, pero a ver si

al construir el ALV , al hacer el catalogo
se informa un campo que creo que se llama "EDIT"
(compruebalo en la tabla "slis_t_fieldcat_alv")
si lo marcas con una "X" este campo coge calidad imput,
osea puedes escribir sobre él y luego -no me acueerdo como se hacía-
se lo pasas a la tabla interna para que al volverse a mostrar el ALV, salga
así, ya actualizado con los valores qeu le habías introducido. Luego ademas
podrías hacer un UPDATE o INsert y pasarlos a una tabla Z o Standard.

Lo que no sé es si al hacer ctr + v sobre la ALV, cogerá en cada campo el
valor correspondiente o solo lo cogerá en la primera, pero prueba (al ira a pegar sobre el ALV) primero hacer ctr + y , seleccionar la ALV entera, y luego
ctr + v.

:S no sé si me sé explicar bien.... Te pegaría un ejemplo pero no lo encuentro
:$, bueno, si lo pruebas, nos comentas si no te importa.

Saludos

FORM F_ALV_FIELD_CONFIGURATION.

* For each column to be displayed in the reprot,
* append a line in I_ALV_FIELDCAT *
I_ALV_FIELDCAT-ROW_POS = '1'.
I_ALV_FIELDCAT-COL_POS = '1'.
I_ALV_FIELDCAT-TABNAME = 'IT_DATA'.
I_ALV_FIELDCAT-FIELDNAME = 'CARRID'.
I_ALV_FIELDCAT-REF_TABNAME = 'SBOOK'.
I_ALV_FIELDCAT-REF_FIELDNAME = 'CARRID'.
I_ALV_FIELDCAT-SELTEXT_L = 'X'. " Long text

I_ALV_FIELDCAT-EDIT = "X".

APPEND I_ALV_FIELDCAT.
CLEAR I_ALV_FIELDCAT.

ibecerra
04/06/08, 13:14:07
hola como dice yonyxxl, habiliita los campos de tu alv grid con la sentencia
1. gs_layout-edit = 'X'. osea q lo habilitas todos sin excepcion
2. la otra seria q tengas un boton q habilita y deshabilidta los campos para copiar eso lo haces con objetos..
ejemplo
ls_celltab-fieldname = 'ICON'.
ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.
INSERT ls_celltab INTO TABLE pt_celltab.
ls_celltab-fieldname = 'ZUONR'.
ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.
INSERT ls_celltab INTO TABLE pt_celltab.
ls_celltab-fieldname = 'GJAHR'.
ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.
INSERT ls_celltab INTO TABLE pt_celltab.

Jonathan Barrio Rodriguez
04/06/08, 14:06:13
1. gs_layout-edit = 'X'. osea q lo habilitas todos sin excepcion
2. la otra seria q tengas un boton q habilita y deshabilidta los campos para copiar eso lo haces con objetos..
ejemplo
ls_celltab-fieldname = 'ICON'.
ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.
INSERT ls_celltab INTO TABLE pt_celltab.
ls_celltab-fieldname = 'ZUONR'.
ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.
INSERT ls_celltab INTO TABLE pt_celltab.
ls_celltab-fieldname = 'GJAHR'.
ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.
INSERT ls_celltab INTO TABLE pt_celltab.[/QUOTE]

SOLO POR CURIOSIDAD, la verdad que esto me queda muy grande,
podrías decirnos que tabla standard correspond "ls_celltab" (xq imagino que
esa es una tablaInterna creada con un LIKE), supongo que no es pt_celltab.

Y SI no es mucho molestar... que hace las sentencia
"cl_gui_alv_grid=>mc_style_disabled." pues no veo porqué así
el icono habilita o desahabilita,

Muchas gracias poir el aporte del gs_layout-edit = X. ;)

ibecerra
04/06/08, 14:18:17
ok, es un alv orientado a objetos , hay veces el codigo con objetos es medio marciano pero te acostumbraras.
te explico
ls_celltab = lvc_t_styl.

habilita y deshabilita las columnas de un grid.
cl_gui_alv_grid=>mc_style_disabled
cl_gui_alv_grid=>mc_style_enabled
te explico lo del icon(q vendria ser una columna mas)
, lo q pasa es q por defecto al inicio todos los campos estan habilidatos(disponibles para editar) , para luego deshabilitar y habilitar solo los campos q por configuracion(en forma dinamica) deseo modificar.
saludos.

Jonathan Barrio Rodriguez
04/06/08, 15:26:32
OK :D MUCHAS GRACIAS.

La verdad... que sí, esto del Orientado Objetos es un tedioso follon :S

Espero que tu profecía de que solo requiere tiempo se cumpla...

Gracias de nuevo

Abapor
04/06/08, 15:49:52
hola y gracias amigos por vuestras respuestas,

tengo una idea pero no se si vas a funcionar , he encontrado un metodo en internet que te permite recupera lo que has copiado en el clipboard.


CALL METHOD cl_gui_frontend_services=>clipboard_import .

lo que voy a hacer es recuperar mi seleccion con este metodo y rellenar mi tabla interna con los datos ( antiguos y seleccionados desde el execl ) luego mostrar el ALV con la tabla interna actualizada :) .

que os parece :confused:

muchas gracias
Saludos.

Jonathan Barrio Rodriguez
04/06/08, 15:57:23
bUENO, había oido hablar de esa sentencia pero no sé como funciona.

Peró si que sería la solución, decirle mediante estatus que se ejecute
al presionar el boton, podrás recuperar esos datos por una tabla interna
que cree esa sentencia, y luego hacer insert o append en la tabla interna,
(para que no borre los anteriores).

Me parece una idea muy buena y limpia, ¿nos cuentas como va?

pmarinab
04/06/08, 16:01:36
De todas formas, cuando en un ALV OO al menos uno de los campos es modificable (campo edit = 'X' en el catalogo de campos), aparece en el boton de Pegar un listbox que te permite escoger entre pegar sobreescribiendo o pegar insertando. El funcionamiento es exactamente igual al de la SE16N cuando entras a una tabla con permisos de escritura.

No te sirve con eso??

ibecerra
04/06/08, 16:11:14
CALL METHOD cl_gui_frontend_services=>clipboard_import .
Interesante ,hazlo y nos avisas como te fue.. ahhh y no olvidar de pegar el codigo.

Abapor
05/06/08, 09:42:31
Hola amigos ,
creo que funciona queda solo algunas dudas , a ver si alguien tiene una solucion:)
el codigo es :

DATA : BEGIN OF i_tabla OCCURS 0,
nombre(50) TYPE c ,
apll(50) TYPE c ,
END OF i_tabla.

DATA:
* Tabla para recuperar los datos que estan en el clipboard
file_table_clip TYPE STANDARD TABLE OF file_table.

DATA: wa_file(1024).
CONSTANTS : hexa1 TYPE x VALUE '09'.

CALL METHOD cl_gui_frontend_services=>clipboard_import
IMPORTING
data = file_table_clip
* LENGTH =
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4
.
IF sy-subrc <> 0.
EXIT.
ENDIF.

LOOP AT file_table_clip INTO wa_file.

SPLIT wa_file AT hexa1 INTO i_tabla-nombre
i_tabla-apll .
APPEND i_tabla.
ENDLOOP.


he podido recuperar los datos que he copiado desde Excel en la tabla file_table_clip .
ahora queda solo hacer un SPLIT en los campos de mi tabla interna.
El separador es '#' ( que significa '09' en hexadecimal ).
pues el problema ahora es : cuando declaro el separado de esa manera :
CONSTANTS : hexa1 TYPE x VALUE '09'.
el sistema me da un error : "HEXA1" must be a character-type data object (data type C, N, D, T or STRING ) , la solucion de este error es :
1- ir a: Pasar a / Atributos
2- Os saltará una pantalla, pues abajo a la izquierda hay que quitar el flag Verif.unicode activas.

pero cuando quito ese flag , el sistma me da otro error :eek: :D : The program "Y_PROG" is not Unicode-compatible, according to its program attributes.
por eso he cambiado la declaracion del separador :
CONSTANTS : hexa1(1) TYPE c VALUE '#'..
Ahora en el debuger veo que no funciona muy bien el SPLIT , todo los datos se almacenan en el primer campo de la tabla interna i_tabla-nombre :( .

NB : la forma del fichero Excel es :
Nombre Apellido
***** *****
***** *****

espero que lo explico bien :)
muchas gracias de antemano

pmarinab
05/06/08, 09:56:02
Yo no creo que el caracter de separación sea '#', lo que ocurre es que seguramente se trate de un retorno de carro o algo parcido, que no se puede representar y por eso te aparece así.

Yo probaría con la clase CL_ABAP_CHAR_UTILITIES, en la que están definidos los caracteres especiales más habituales. Prueba por ejemplo con este (tabulador horizontal), y si no funciona prueba con otros.

CONSTANTS : hexa1(1) TYPE c VALUE CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB.

Abapor
05/06/08, 11:16:16
Hola todos ,
si tienes razon pmarinab :) con esa declaracion el programa funciona muy bien , exactamente como lo queria.

DATA : BEGIN OF i_tabla OCCURS 0,
nombre(50) TYPE c ,
apll(50) TYPE c ,
END OF i_tabla.

DATA:
* Tabla para recuperar los datos que estan en el clipboard
file_table_clip TYPE STANDARD TABLE OF file_table.

DATA: wa_file(1024),
mystring(300) TYPE c.
CONSTANTS :
hexa1(1) TYPE c VALUE CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB.


CALL METHOD cl_gui_frontend_services=>clipboard_import
IMPORTING
data = file_table_clip
* LENGTH =
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4
.
IF sy-subrc <> 0.
EXIT.
ENDIF.

LOOP AT file_table_clip INTO mystring.

SPLIT mystring AT hexa1 INTO i_tabla-nombre
i_tabla-apll .
APPEND i_tabla.
ENDLOOP.

con este codigo podemos hacer Copy / Paste en ALV .
espero que va a ayudar a alguien :) .

muchismas gracias a todos por sus ayuda