Como curiosidad en la nota también habla de la tabla DWINACTIV que es la tabla donde se guardan los objetos pendientes de activación.
Trozos y retales de código de ABAP (SAP)que encuentro de interés. Tanto para tenerlos a mano en cualquier sitio como para compatirlos.
martes, 13 de enero de 2015
Un programa para crear objetos de diccionario y otros objetos de desarrollo.
Estoy aplicando la nota "1997540 - PT: Manual changes flag added to WSPT_LIKP" y me he encontrado la grata sorpresa que aplicando la nota se instala el programa NOTE_1997540 que según pone en la nota "This program generates ABAP dictionary objects and other ABAP development objects in the ERP system" lo cual es un gran que y va en una buena línea por parte de SAP porque siempre me ha costado entender lo de tener que hacer pasoS manuales para crear elementos, dominios y otros objetos de diccionario de la SE11. Agradezco el detalle y habrá que buscar tiempo para mirar el programa y poder readaptarlo para situaciones análogas.
miércoles, 9 de julio de 2014
Notas para rejilla, grid, tabla en un SapScript
Para hacer una tabla (grid, rejilla) con el BOX pero que pueda ir variando de alturas.
wny LIKE wnx,
wx0(5),
wy0 LIKE wx0 .
Por una parte inicializamos
CLEAR: wx0, wy0.
wnx = '0.9'.
wny = '2.2'.
*
CALL FUNCTION 'WRITE_FORM'
EXPORTING
element = 'LINEA_TITLE'
window = 'MAIN'.
*
Y vamos sumando dentro del loop a la tabla que pintamos.
LOOP AT i_tabla.
*
IF sy-tabix = 1.
ADD '0.5' TO wny.
ELSE.
ADD '0.8' TO wny.
ENDIF.
*
wx0 = wnx.
wy0 = wny.
*
" when oper not marked for print
CALL FUNCTION 'WRITE_FORM' "
EXPORTING
element = 'LINEA'
window = 'MAIN'.
*
ENDLOOP.
Declaramos variables en el programa de control:
DATA: wnx TYPE p LENGTH 5 DECIMALS 2,wny LIKE wnx,
wx0(5),
wy0 LIKE wx0 .
Contamos líneas.
En la parte que vamos pintando la línea vamos sumando.Por una parte inicializamos
CLEAR: wx0, wy0.
wnx = '0.9'.
wny = '2.2'.
*
CALL FUNCTION 'WRITE_FORM'
EXPORTING
element = 'LINEA_TITLE'
window = 'MAIN'.
*
Y vamos sumando dentro del loop a la tabla que pintamos.
LOOP AT i_tabla.
*
IF sy-tabix = 1.
ADD '0.5' TO wny.
ELSE.
ADD '0.8' TO wny.
ENDIF.
*
wx0 = wnx.
wy0 = wny.
*
" when oper not marked for print
CALL FUNCTION 'WRITE_FORM' "
EXPORTING
element = 'LINEA'
window = 'MAIN'.
*
ENDLOOP.
En sapscript tenemos elementos en ventana MAIN.
/E LINEA_TITLE
/: BOX XPOS '0.90' CM YPOS '2.2' CM WIDTH '18.5' CM HEIGHT '0.5' CM FRAME 10 TW INTENSITY 20
TT <B2>Título1:</>,,&VLINE&<B2> Título2:</>
/E LINEA
BOX XPOS &WX0& CM YPOS &WY0& CM WIDTH '18.5' CM HEIGHT '0.8' CM FRAME 10 TW
TT <I0><H2>& i_tabla-columna1&</></>,,&VLINE&& i_tabla-columna2&
lunes, 23 de junio de 2014
Imágenes o logos dinámicos en un SapScript
Programación:
TYPES: BEGIN OF ty_logo,
* tdobject TYPE tdobject,
tdname TYPE tdobname, "tdname,
* tdid TYPE tdid,
tdbtype TYPE tdbtype,
tdresolut TYPE tdresolut,
END OF ty_logo.
PERFORM zlogo_get '0300'.
FORM zlogo_get USING p_bukrs TYPE bukrs.
*
CASE p_bukrs.
WHEN '0300'.
gl_logo-tdname = 'LOGO_0300'.
gl_logo-tdbtype = 'BCOL'.
gl_logo-tdresolut = 300.
WHEN '0200'.
gl_logo-tdname = 'LG_0200'.
gl_logo-tdbtype = 'BCOL'.
gl_logo-tdresolut = 200.
WHEN '0400'.
gl_logo-tdname = 'LOG4EX'.
gl_logo-tdbtype = 'BCOL'.
gl_logo-tdresolut = 200.
WHEN '0500'.
gl_logo-tdname = 'LOGONEW'.
gl_logo-tdbtype = 'BCOL'.
gl_logo-tdresolut = 200.
WHEN OTHERS.
ENDCASE.
*
CALL FUNCTION 'WRITE_FORM'
EXPORTING
window = 'LOGO_SOC'.
*
ENDFORM.
En la ventana LOGO_SOC comando /:
BITMAP &GL_LOGO-TDNAME& OBJECT GRAPHICS ID BMAP TYPE &GL_LOGO-TDBTYPE& DPI &GL_LOGO-TDRESOLUT&
TYPES: BEGIN OF ty_logo,
* tdobject TYPE tdobject,
tdname TYPE tdobname, "tdname,
* tdid TYPE tdid,
tdbtype TYPE tdbtype,
tdresolut TYPE tdresolut,
END OF ty_logo.
PERFORM zlogo_get '0300'.
FORM zlogo_get USING p_bukrs TYPE bukrs.
*
CASE p_bukrs.
WHEN '0300'.
gl_logo-tdname = 'LOGO_0300'.
gl_logo-tdbtype = 'BCOL'.
gl_logo-tdresolut = 300.
WHEN '0200'.
gl_logo-tdname = 'LG_0200'.
gl_logo-tdbtype = 'BCOL'.
gl_logo-tdresolut = 200.
WHEN '0400'.
gl_logo-tdname = 'LOG4EX'.
gl_logo-tdbtype = 'BCOL'.
gl_logo-tdresolut = 200.
WHEN '0500'.
gl_logo-tdname = 'LOGONEW'.
gl_logo-tdbtype = 'BCOL'.
gl_logo-tdresolut = 200.
WHEN OTHERS.
ENDCASE.
*
CALL FUNCTION 'WRITE_FORM'
EXPORTING
window = 'LOGO_SOC'.
*
ENDFORM.
En la ventana LOGO_SOC comando /:
BITMAP &GL_LOGO-TDNAME& OBJECT GRAPHICS ID BMAP TYPE &GL_LOGO-TDBTYPE& DPI &GL_LOGO-TDRESOLUT&
viernes, 6 de junio de 2014
Depurar (debugging) un smartform.
Este es un truco personal que también le parece útil a Dani, no sé si otra gente lo hacer o si hay alternativas. Como no deja poner break-points no explícitos en el código de los smartforms.
Lo que hago es en la parte alta de la edición del smartform, voy Entorno->Nombre del módulo de funciones. Copio el nombre del módulo de
funciones, que además en este caso también es el nombre del grupo de funciones. Voy a la SE80 y lo copia allí en grupos de funciones. Busco un
trozo de código en todo el programa que corresponda al sitio donde quieres
debuggar.
A veces no encuentras tu trozo de código... la solución
es ponerse encima del grupo de funciones botón derecho, Otras funciones->
Reestructurar lista de objetos.
miércoles, 4 de junio de 2014
Cómo obtener el flujo de documentos desde un programa ABAP
Muy interesante post de Teknoda sobre el módulo de funciones RV_ORDER_FLOW_INFORMATION y el flujo de documentos comerciales.
miércoles, 28 de mayo de 2014
Guardar campos en tablas Z con el Generador de actualización de tablas. Evento 01.
Situación:
CONSTANTS: LC_ACTION TYPE FIELDNAME VALUE 'ACTION'.
DATA: BEGIN OF ZTABLA_EXTRACT OCCURS 0010.
INCLUDE STRUCTURE ZTABLA_COSTES.
INCLUDE STRUCTURE VIMFLAGTAB.
DATA: END OF ZTABLA_EXTRACT.
DATA LS_DATA_TOTAL LIKE ZTABLA_EXTRACT.
DATA LS_DATA_EXTRACT LIKE ZTABLA_EXTRACT.
DATA LV_ACTION_TOTAL TYPE COMT_BOOLEAN.
DATA LS_TABIX TYPE SY-TABIX.
FIELD-SYMBOLS: <LV_ACTION_TOTAL> TYPE CHAR1,
<LS_DATA_TOTAL> TYPE ANY,
<LS_DATA_EXTRACT> TYPE ANY.
LOOP AT TOTAL.
*
ASSIGN TOTAL TO <LS_DATA_TOTAL> CASTING LIKE ZTABLA.
LS_DATA_TOTAL = <LS_DATA_TOTAL>.
ASSIGN COMPONENT LC_ACTION OF STRUCTURE TOTAL TO <LV_ACTION_TOTAL>.
*
IF SY-SUBRC NE 0.
LV_ACTION_TOTAL = <ACTION>.
ASSIGN LV_ACTION_TOTAL TO <LV_ACTION_TOTAL>.
ENDIF.
*
LV_ACTION_TOTAL = <LV_ACTION_TOTAL>.
CHECK LV_ACTION_TOTAL IS NOT INITIAL.
*
READ TABLE EXTRACT WITH KEY <VIM_XTOTAL_KEY>.
*
IF SY-SUBRC EQ 0.
LS_TABIX = SY-TABIX.
ELSE.
CLEAR LS_TABIX.
ENDIF.
*
IF LS_DATA_TOTAL-PEINH IS INITIAL.
LS_DATA_TOTAL-PEINH = 1.
ENDIF.
*
IF LV_ACTION_TOTAL EQ 'N'." New Entry.
LS_DATA_TOTAL-ERDAT = SY-DATUM.
LS_DATA_TOTAL-ERZET = SY-UZEIT.
LS_DATA_TOTAL-ERNAM = SY-UNAME.
ENDIF.
*
IF LV_ACTION_TOTAL EQ 'U'."Update
LS_DATA_TOTAL-AEDAT = SY-DATUM.
LS_DATA_TOTAL-AEZET = SY-UZEIT.
LS_DATA_TOTAL-AENAM = SY-UNAME.
ENDIF.
<LS_DATA_TOTAL> = LS_DATA_TOTAL.
*
MODIFY TOTAL.
CHECK LS_TABIX GT 0.
EXTRACT = TOTAL.
MODIFY EXTRACT INDEX LS_TABIX.
*
ENDLOOP.
*
SY-SUBRC = 0.
Tengo una tabla ZTABLA a la que le he creado una vista de actualización para la SM30. Y quiero controlar quien y cuando hace cambios en los campos ERDAT, ERZET, ERNAM, AEDAT, AEZET, AENAM.
El código de help.sap no acaba de funcionar tal cual.
Solución: Primero bloqueo en la dynpro de la actualización estas columnas para que sólo sean de salida y añado el evento 01 (Antes de grabar los datos en la base de datos) con la siguiente subrutina:
*&---------------------------------------------------------------------*
*& FORM ZEVENTO01
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM ZEVENTO01.
CONSTANTS: LC_ACTION TYPE FIELDNAME VALUE 'ACTION'.
DATA: BEGIN OF ZTABLA_EXTRACT OCCURS 0010.
INCLUDE STRUCTURE ZTABLA_COSTES.
INCLUDE STRUCTURE VIMFLAGTAB.
DATA: END OF ZTABLA_EXTRACT.
DATA LS_DATA_TOTAL LIKE ZTABLA_EXTRACT.
DATA LS_DATA_EXTRACT LIKE ZTABLA_EXTRACT.
DATA LV_ACTION_TOTAL TYPE COMT_BOOLEAN.
DATA LS_TABIX TYPE SY-TABIX.
FIELD-SYMBOLS: <LV_ACTION_TOTAL> TYPE CHAR1,
<LS_DATA_TOTAL> TYPE ANY,
<LS_DATA_EXTRACT> TYPE ANY.
LOOP AT TOTAL.
*
ASSIGN TOTAL TO <LS_DATA_TOTAL> CASTING LIKE ZTABLA.
LS_DATA_TOTAL = <LS_DATA_TOTAL>.
ASSIGN COMPONENT LC_ACTION OF STRUCTURE TOTAL TO <LV_ACTION_TOTAL>.
*
IF SY-SUBRC NE 0.
LV_ACTION_TOTAL = <ACTION>.
ASSIGN LV_ACTION_TOTAL TO <LV_ACTION_TOTAL>.
ENDIF.
*
LV_ACTION_TOTAL = <LV_ACTION_TOTAL>.
CHECK LV_ACTION_TOTAL IS NOT INITIAL.
*
READ TABLE EXTRACT WITH KEY <VIM_XTOTAL_KEY>.
*
IF SY-SUBRC EQ 0.
LS_TABIX = SY-TABIX.
ELSE.
CLEAR LS_TABIX.
ENDIF.
*
IF LS_DATA_TOTAL-PEINH IS INITIAL.
LS_DATA_TOTAL-PEINH = 1.
ENDIF.
*
IF LV_ACTION_TOTAL EQ 'N'." New Entry.
LS_DATA_TOTAL-ERDAT = SY-DATUM.
LS_DATA_TOTAL-ERZET = SY-UZEIT.
LS_DATA_TOTAL-ERNAM = SY-UNAME.
ENDIF.
*
IF LV_ACTION_TOTAL EQ 'U'."Update
LS_DATA_TOTAL-AEDAT = SY-DATUM.
LS_DATA_TOTAL-AEZET = SY-UZEIT.
LS_DATA_TOTAL-AENAM = SY-UNAME.
ENDIF.
<LS_DATA_TOTAL> = LS_DATA_TOTAL.
*
MODIFY TOTAL.
CHECK LS_TABIX GT 0.
EXTRACT = TOTAL.
MODIFY EXTRACT INDEX LS_TABIX.
*
ENDLOOP.
*
SY-SUBRC = 0.
ENDFORM. "FORM ZEVENTO01
Nota: podemos buscar otras vistas de actualización con eventos en TVIMF para ver como lo hace.
Otras referencias:
http://scn.sap.com/docs/DOC-10318
http://help.sap.com/saphelp_nw04s/helpdata/en/a7/5133ac407a11d1893b0000e8323c4f/frameset.htm
Otras referencias:
http://scn.sap.com/docs/DOC-10318
http://help.sap.com/saphelp_nw04s/helpdata/en/a7/5133ac407a11d1893b0000e8323c4f/frameset.htm
martes, 20 de mayo de 2014
BW: Infopaquete en peticiones vacías.
Al planificar una cadena tengo el problema de que si la fuente de datos no tiene registros y viene vacío se que me queda parado el infopaquete con un aviso (warning) y no continua cuando ya puede ser estemos sin registros.
Solución que me dio en su momento Laura, vamos al infopaquete, y en el menú superior, vamos a Planificador -> Tratamiento de avertencias y ponemos que sea ok. O en este caso casi mejor Planificador-> Color de semáforo en peticiones vacías e indicamos que semáforo verde.
Lo he hecho directamente en producción. Y para que poder continuar ejecutando la cadena, desde el log la cadena he llegado al monitor del infopaquete y le he cambiado el estado de la cabecera a correcto, esto ya no tendré que hacerlo en este caso por que cambio hecho desde el Planificador.
Solución que me dio en su momento Laura, vamos al infopaquete, y en el menú superior, vamos a Planificador -> Tratamiento de avertencias y ponemos que sea ok. O en este caso casi mejor Planificador-> Color de semáforo en peticiones vacías e indicamos que semáforo verde.
Suscribirse a:
Entradas (Atom)

