PDA

Ver la Versión Completa : Problema al introducir un texto en un campo 'CREATE_TEXT'


gambitworms
09/09/08, 08:59:14
Hola a todos:confused:
Estoy intentando introducir un texto en un aviso en el módulo 'PM'. Total estoy usando la función CREATE_TEXT. El problema es que si entro desde el standar y escribo algo en el texto y guardo, si luego lanzo mi programa, introduce el texto sin problemas. Pero si no entro en el aviso y no modifico el texto, no introduce nada. Totalmente desesperado!! LLevo ya una semana con esto!!:mad:
Os pongo el código que utilizo:


* DEFINICIÓN DE TABLAS INTERNAS
DATA: it_header TYPE TABLE OF thead WITH HEADER LINE.
DATA: it_lines TYPE TABLE OF tline WITH HEADER LINE.

*DEFINICION DE VARIABLES
DATA: texto(264) TYPE c VALUE 'TEXTO QUE QUIERO INTRODUCIR',
longitud TYPE i VALUE 0,
contador TYPE i VALUE 0,
lineas TYPE i VALUE 0,
desplazamiento TYPE i VALUE 0.


*INTRODUCIMOS EL TEXTO POR LINEAS
it_lines-tdformat = '*'.
it_lines-tdline = texto.
append it_lines.


CALL FUNCTION 'CREATE_TEXT'
EXPORTING
FID = 'LTXT'
FLANGUAGE = 'S'
FNAME = '000010046949' "nº del aviso donde introduzco el texto
FOBJECT = 'QMEL'
FFORMAT = '*'
TABLES
FLINES = IT_LINES
EXCEPTIONS
NO_INIT = 1
NO_SAVE = 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.


**HACEMOS EL COMMIT
CALL FUNCTION 'COMMIT_TEXT'
EXPORTING
OBJECT = IT_HEADER-TDOBJECT
NAME = IT_HEADER-TDNAME.

COMMIT WORK.
*******************************************************

gambitworms
09/09/08, 10:22:52
La verdad que he comprobado que el CREATE_TEXT funciona!!. Es decir si luego despues de lanzar mi programa ejecuto la función READ_TEXT me devuleve el texto que he introducido con mi programa, pero si entro en el aviso no se ve el texto...estoy loco loco ya!!

bisonye
09/09/08, 11:16:41
Esto del create_text es espinoso....

Parece que todo está bien aunque las pocas veces que he utilizado la función no le he puesto el * ni en la llamada ni en la tabla con las líneas. Aunque sinceramente no creo que sea el problema pruebalo, por probar...

Otra cosa, supongo que lo habrás comprobado pero revisa bien el número de 0 del FNAME.

Para comprobar que realmente funciona crea el texto a mano y revisa los parametros, borralo e intenta crearlo por código con los mismos parámetros (con copy paste para que no se escape nada)

A ver si encontramos el fallo!!

FranCone
09/09/08, 18:32:35
Te comento que recientemente yo tuve problemas con dicha función, y a final de cuentas pude resolverlo de acuerdo a lo que yo estaba manejando dentro de mi programa. Debido a que yo necesitaba insertar/actualizar los textos, dependiendo del momento de ejecución del programa, tuve que optar por la funcion CREATE_TEXT y SAVE_TEXT, dependiendo de lo requerido. Para esto, utilizaba de inicio la función READ_TEXT, para comprobar la existencia del texto, y entonces si determinar si iba a crear o insertar el texto en cuestión. Posteriormente aplicaba el commit, y por ultimo, tuve q poner un wait, ya que por alguna razón, y debido a que estaba dentro de un ciclo para barrer las posiciones de mi material, no "alcanzaba" a actualizarse mi texto en cada pasada, y en la siguiente pasada eliminaba lo escrito previamente (aparte el wait del commit, no me funcionó :S). Te incluyo parte de mi codigo, esperando que te sirva de algo.

v_name = 'TEXTOPOSICION' aqui iria tu texto a buscar
v_texto = 'TEXTO A ESCRIBIR'

ti_header-tdname = v_name.
ti_header-tdid = 'B01'.
ti_header-tdspras = sy-langu.
ti_header-tdobject = 'EBAN'.
ti_header-mandt = sy-mandt.

call function 'READ_TEXT'
exporting
client = sy-mandt
id = 'B01'
language = sy-langu
name = v_name
object = 'EBAN'
tables
lines = ti_lines
exceptions
not_found = 4.

ti_lines-tdformat = '*'.
ti_lines-tdline = v_texto.
append ti_lines to ti_lines.

if sy-subrc eq 4.

call function 'CREATE_TEXT'
exporting
fid = 'B01'
flanguage = sy-langu
fname = v_name
fobject = 'EBAN'
save_direct = 'X'
tables
flines = ti_lines
exceptions
no_init = 1
no_save = 2
others = 3.

else.

call function 'SAVE_TEXT'
exporting
client = sy-mandt
header = ti_header
insert = ' '
savemode_direct = 'X'
tables
lines = ti_lines
exceptions
id = 1
language = 2
name = 3
object = 4
others = 5.

endif.

call function 'BAPI_TRANSACTION_COMMIT'
exporting
wait = 'X'.

* Obligamos a que espere un segundo, y libere objetos
call function 'DEQUEUE_ALL'.
wait up to 1 seconds.

aldape
09/09/08, 22:18:01
yo una vez tuve que hacer eso tambien, lo que hice fue hacer un batch-input a la transaccion y que agegara el texto desde ahi... me funciona muy bien
y ademas le agrega la linea de fecha-hora-usuario que lo hace por default el SAP...

te dejo el codigo del batch que utilice... saludos...


data name like stxl-tdname.
name = cliente_grid_info-qmnum.

perform bdc_dynpro using 'SAPLIQS0' '0100'.
perform bdc_field using 'BDC_CURSOR'
'RIWO00-QMNUM'.
perform bdc_field using 'BDC_OKCODE'
'/00'.
perform bdc_field using 'RIWO00-QMNUM'
cliente_grid_info-qmnum.
perform bdc_dynpro using 'SAPLIQS0' '7200'.
perform bdc_field using 'BDC_OKCODE'
'=TXQM'.
perform bdc_dynpro using 'SAPLSTXX' '1100'.
perform bdc_field using 'BDC_OKCODE'
'=TXBA'.

" change position
perform bdc_field using 'BDC_OKCODE'
'=EDPO'.
perform bdc_dynpro using 'SAPLSTXX' '1155'.
perform bdc_field using 'BDC_CURSOR'
'RSTXT-TXLINENR'.
perform bdc_field using 'BDC_OKCODE'
'=EDWE'.

refresh u_data.
call function 'READ_TEXT'
exporting
client = sy-mandt
language = 'S'
object = 'QMEL'
id = 'LTXT'
name = name
tables
lines = u_data
exceptions
others = 1.

data linec type i.
data linet(3) type c.
describe table u_data lines linec. linec = linec + 2.
write linec to linet left-justified.
perform bdc_field using 'RSTXT-TXLINENR'
linet.
perform bdc_dynpro using 'SAPLSTXX' '1100'.
perform bdc_field using 'BDC_OKCODE'
'=TXBA'.

data n type i value 2.
data field(20) type c.

loop at t_data into s_data.
data nc(3) type c.
write n to nc left-justified.
concatenate 'RSTXT-TXLINE(' nc ')' into field.
perform bdc_field using field s_data-tdline.
n = n + 1.
endloop.

perform bdc_dynpro using 'SAPLIQS0' '7200'.
perform bdc_field using 'BDC_OKCODE'
'=BUCH'.
perform bdc_field using 'BDC_CURSOR'
'VIQMEL-QMTXT'.

gambitworms
10/09/08, 07:00:36
Muchas gracias a todos por el interés!!
He revisado bien los ceros del tdname....he quitado y puesto el '*' y he echo la llamada call function 'BAPI_TRANSACTION_COMMIT' exporting wait = 'X' tambíen call function 'DEQUEUE_ALL'.
wait up to 1 seconds. y nada de nada

He mirado en las tablas STXH y STXL y allí da de alta el texto correctamente.

Lo curioso es que si despues de este código ejecuto solo la función READ_TEXT me devuelve el código que he introducido pero cuando voy a mirarlo no aparece escrito. Cosa que si que ocurre cuando antes entro y modifico yo a mano....Me encantaría evitar el Bach imput por ahora ya que sería todo muy lento.

¿Alguna idea más? :confused:

bisonye
10/09/08, 07:19:10
El lenguaje lo estas poniendo a piñon...

¿Puede ser eso?

Está claro que el texto te lo crea, si has revisado el ID, NAME y OBJECT la única variable que te queda es el lenguaje.

gambitworms
10/09/08, 08:47:21
Aquí os mando el código que tengo completo. También he puesto el lenguaje con sy-langu....

De verdad no se que carajo puede ser....Negro estoy ya!!!
Y encima es urgente así que... Insisto si luego hago un text con la funcion READ_TEXT y con los paramétros que le paso me rescata el texto pero cuando entro a mirarlo no esta!!...o está y no lo muestra....
En fin.... ¿Alguna idea más?

Gracias

CODIGO:

* DEFINICIÓN DE TABLAS INTERNAS
DATA: it_header TYPE TABLE OF thead WITH HEADER LINE.
DATA: it_lines TYPE TABLE OF tline WITH HEADER LINE.

*DEFINICION DE VARIABLES
DATA: texto(264) TYPE c VALUE 'TEXTO A INTRODUCIR',

**Limpiamos las tablas que hemos definido
CLEAR it_lines.
CLEAR it_header.
***************************************************
**************************************************
it_header-tdobject = 'QMEL'.
it_header-tdid = 'LTXT'.
it_header-tdspras = sy-langu.
it_header-tdform = 'PM_QMEL'.
it_header-mandt = sy-mandt.
it_header-tdname = '000010046946'.


*MIRAMOS SI HAY TEXTO
call function 'READ_TEXT'
exporting
client = sy-mandt
id = 'LTXT'
language = sy-langu
name = '000010046946'
object = 'QMEL'
tables
lines = it_lines
exceptions
not_found = 4.

**INTRODUCIMOS EL TEXTO POR LINEAS
it_lines-tdformat = '*'.
it_lines-tdline = texto.
append it_lines.
******************************

if sy-subrc eq 4.


*SI NO EXISTE EL TEXTO LO CREAMOS
call function 'CREATE_TEXT'
exporting
fid = 'LTXT'
flanguage = sy-langu
fname = '000010046946'
fobject = 'QMEL'
save_direct = 'X'
tables
flines = it_lines
exceptions
no_init = 1
no_save = 2
others = 3.

else.

*SI EXISTE INSERTAMOS
call function 'SAVE_TEXT'
exporting
client = sy-mandt
header = it_header
insert = ' '
savemode_direct = 'X'
tables
lines = it_lines
exceptions
id = 1
language = 2
name = 3
object = 4
others = 5.

endif.

****HE REALIZADO TODOS LOS COMMIT QUE CONOZCO Y NADA DE NADA
***

CALL FUNCTION 'COMMIT_TEXT'.
COMMIT WORK.
call function 'BAPI_TRANSACTION_COMMIT'
exporting
wait = 'X'.

call function 'DEQUEUE_ALL'.
wait up to 1 seconds.

gambitworms
12/09/08, 06:36:09
Es un indicador que tiene la tabla QMEL y que para que lo muestre bien tenemos que meterle una 'X'.

UPDATE QMEL SET INDTX = 'X'
WHERE QMNUM = tdname.

Vamos solucionado
Muchas gracias a todos por el interés:D :D :D

lau_azul19
09/06/09, 00:29:04
Oye ese update donde lo haces? al final de todo lo que hiciste ... podrías ayudarme, tengo el mismo problema ...
Es un indicador que tiene la tabla QMEL y que para que lo muestre bien tenemos que meterle una 'X'.

UPDATE QMEL SET INDTX = 'X'
WHERE QMNUM = tdname.

Vamos solucionado
Muchas gracias a todos por el interés:D :D :D

lau_azul19
09/06/09, 01:16:15
Hola chicos!!!

Buscando ayuda para salir de un problema ...

Sucede que intento agregar un texto largo a la CS01, pero con la función CREATE_TEXT, de alguna manera no me funciona para crear un texto nuevo, sin embargo si para modificar, si crea en tablas los registros, pero desde la CS03, Cs02 no puedo visualizar esa información.

Alguien ha tenido este problema ??

O alguien sabrá que puede estar ocurriendo ??

Se los agradecere mucho

HernanGN
24/06/09, 17:32:33
Gracias, me estaba sucediendo lo mismo

Saludos, Hernán
www.hernangn.com.ar

Es un indicador que tiene la tabla QMEL y que para que lo muestre bien tenemos que meterle una 'X'.

UPDATE QMEL SET INDTX = 'X'
WHERE QMNUM = tdname.

Vamos solucionado
Muchas gracias a todos por el interés:D :D :D

HernanGN
24/06/09, 20:24:58
En ciertas ocasiones fallaba, por lo que terminé haciéndolo con la Bapi BAPI_ALM_NOTIF_DATA_ADD, y de paso evito el update directo a la tabla.

Saludos, Hernán González Navas
www.hernangn.com.ar

Gracias, me estaba sucediendo lo mismo

Saludos, Hernán
www.hernangn.com.ar