Documentos de Académico
Documentos de Profesional
Documentos de Cultura
-INTRODUCCIN)
INTRODUCCIN 1.1. TRANSACCIONES PRINCIPALES: El Abap/4 es el lenguaje de programacin de SAP R/3. Se llega al editor por men con: Herramientas Workbench Abap 4. Con esto se llega a las transacciones principales del conjunto de herramientas (workbench) del Abap/4:
Object Browser: Se utiliza para localizar y ver los objetos creados por el usuario, datos, programas, Se ven en forma arbrea. Permite editar los objetos, visualizarlos, crearlos, ejecutarlos, moverlos, buscarlos, Hay que activar todos los objetos creados antes de usarlos.
Diccionario de Datos (D.D.): Sirve para crear los tipos y objetos de datos de SAP, estructuras, bases de datos, cada uno identificado con su nombre. Con la transacci n SE11 se visualizan los objetos de Diccionario de Datos. Para entrar por men: Herramientas Workbench Abap 4 Dictionary (F6), o bien la transaccin SE11.
Editor Abap/4: Para codificar los programas. stos se pueden visualizar de distintas formas (se eligen en el men deOpciones). Conviene que el nombre de los objetos nuevos que se creen empiece por Y o por Z, para que as una nueva versin de SAP los respete y no sean machacados.
Para modificar un programa conservando el original, haciendo una copia del mismo. Los programas fuente pueden bajarse a fichero de texto y luego recuperarlos con Utilidades Upload / Download. Con CTRL+Y se puede marcar un rectngulo de la pantalla, y copiarlo.
Todo objeto debe tener asignada una clase de desarrollo (son agrupaciones de objetos), para poder luego transportarlo a la mquina de produccin (con la que trabaja el usuario), desde la mquina de desarrollo (la del programador).
Al crear objetos no locales tambin hay que guardarlos en una orden de transporte, donde se graban. Las rdenes se pueden crear, liberar, bloquear, Los objetos locales (de la clase local $TMP) NO se pueden transportar.
Jerarqua: Los objetos pertenecen a una orden de correccin o tarea, y esta a su vez a una orden de transporte. Se pueden crear (y borrar) nuevos modos de pantalla (hasta un mximo de 6 simultneos. Los modos son nuevas ventanas de Windows), con la opcin de men Sistema crear modo. Para crear nuevas lneas en el editor hay que crearlas partindolas (con el botn Partir o F7), en donde se desea insertar; o bien poniendo In como n de lnea, con n el n lneas a insertar. Desde una palabra de un programa, desde el editor de Abap/4, se puede navegar a cualquier otro sitio haciendo doble clic. Men Painter:Sirve para disear mens, con sus teclas de funcin, botones, iconos, y funciones estndar (save, exit, back, cancel, print, find, ). Biblioteca de funciones: Para testar funciones, editarlas, Las funciones tienen cdigo fuente Abap, parmetros de entrada, parmetros de salida (que pueden ser tablas tambin). Ejemplos de funciones: cuadros de dilogo (popups), rh_get_date_dayname (devuelve el da de la semana de una fecha dada),
Screen Painter:Sirve para disear pantallas y formularios. Hay marcos, botones, iconos, Es de tipo visual. El nmero de dynpro (un dynpro es cada pantalla de un programa, que puede tener varias) identifica el nmero de pantalla. Para ver el diseo de la pantalla ( layout), pulsar el botn Full Screen.
Modelo: Botn que se usa para escribir esqueletos de sentencias, y as no tener que teclearla completamente. Los parmetros que tenga opcionales aparecen como comentarios.
Data Browser: Para ver el contenido de una tabla (por ejemplo, la tabla de mensajes T100). Para llegar por men: Herramientas Workbench Abap/4 Resumen Data Browser, o bien con la transaccin SE16.
Actualizacin de tablas: Para editar y tratar tablas (las que sean modificables).Para llegar por men: Sistema Servicios Actualizar tabla, o bien las transacciones SM30 y SM31(ambas son similares).
Al grabar la tabla, dar orden de transporte. No es necesario indicar la orden de correccin o tarea (como cualquier otro objeto de SAP). Tablas de customizing: Son tablas parametrizables. As SAP tiene ms flexibilidad. Actualizar una vista: Una vista es una forma de visualizar ciertos campos de una tabla o varias relacionadas, slo los que interesen. Una tabla puede tener varias vistas asociadas. Sistema Info: Informe para ver todos los objetos SAP (tabl as, elementos de datos, ) de un tipo (char, fecha, numrico, ). Para llegar por men: Herramientas Workbench Abap/4 Resumen Sistema Info.
Mens de mbito: Para crear un men de mbito para el usuario, con iconos, botones, teclas de funcin, Para llegar por men: Herramientas Workbench Abap/4 Desarrollo Ms herramientas Men de mbito.
Cdigos de transaccin: Para crear transacciones nuevas, usando otras ya existentes (como una macro) o totalmente nuevas. Para llegar por men: Herramientas Workbench Abap/4 Desarrollo Ms herramientas Transacciones.
Bases de datos lgicas:Transaccin para crear, ver, bases de datos lgicas. Para llegar por men:Herramientas Workbench Abap/4 Desarrollo Entorno de programacin Bases de datos lgicas.
Textos breves y explicativos: Sirve para traducir mensajes (se debe indicar el idioma). Ruta de acceso por men: Herramientas Workbench Abap/4 Utilidades Traduccin Textos breves y explicativos.
Documentacin R/3: Para documentar objetos de SAP R/3. Para llegar por men, ir a la opcin: Herramientas Workbench Abap/4 Utilidades Documentacin. Editor Split Screen: Parte la pantalla en dos. Su utilidad principal es comparar el cdigo fuente de dos programas (buscar diferencias, ). Para llegar por men: Herramientas Workbench Abap/4 Desarrollo Entorno de programacin Editor Split Screen.
Mdulos de dilogo: Son similares a los mdulos de funciones. Tienen parmetros de entrada, de salida, y de entrada / salida. Para cuadros de dilogo. Para llegar por men: Herramientas Workbench Abap/4 Desarrollo Entorno de programacin Mdulos de dilogo.
Mensajes de usuario: Los mensajes son objetos SAP. Para mostrar un mensaje (desde un programa) basta con indicar laclase de mensaje, su tipo y su nmero.
La clase de mensaje es una tabla donde se crean y almacenan agrupados todos los mensajes de esa clase. Es el ID, como ZH, por ejemplo. Las clases de mensajes no estndar deben empezar por Z, y su nombre slo tiene 2 caracteres. Hay varias clases estndar, como HB. Tabla de mensajes del sistema: T100.
El tipo de mensaje (se especifica al lanzar el mensaje, no es un atributo propio del mismo). Hay 5 tipos de mensajes: E (Error). El programa se queda bloqueado; hay que salir con /N en la lnea de transacciones. W (Warning). Tras leer el mensaje, si era en el listado bsico, se termina el report; si era en el listado secundario, va al listado primario. I (Informativo). Tras leerse el mensaje, sigue el programa. S (Success): Muestra el mensaje en la siguiente pantalla a la actual. A (Abort). Se muestra el mensaje y su nmero, y tras leerlo acaba el programa.
El nmero del mensaje es su identificador dentro de la clase de mensaje. Los mensajes se almacenan aparte del cdigo fuente del programa (en su clase de mensajes), para reutilizarlos. Para visualizar por pantalla los mensajes, la ruta por men es: Herramientas Workbench Abap/4 Desarrollo Entorno de programacin Mensajes (o bien: transaccin SE91).
Se pueden parametrizar: para ello se escribe dentro del texto del mensaje el carcter & (hasta 4 veces como mximo: se permiten 4 parmetros mximo). Al mostrarlo en pantalla, con MESSAGE WITH pueden darse valores actuales a los &formales: se sustituyen en orden.Ejemplos:
*T: tipo mensaje, num: mensaje nnum de la clase definida en la sentencia REPORT. "F1 F4 son los 4 parmetros posibles. MESSAGE_ID id_clase TYPE T NUMBER num [ WITH F1 F4]. *Abreviatura de la sintaxis anterior MESSAGE Tnum [ WITH F1 F4 ]. *Mensaje n 200, de Error, con un parm MESSAGE E200 WITH sy-uname.
MESSAGE-ID HBTYPE E NUMBER 200. Abreviado: MESSAGE E200(HB). Sistema de correccin y transporte: rbol de rdenes de correccin y transporte. Por men: Herramientas Workbench Abap/4 Resumen Workbench Organizer. (SE09). Jerarqua de aplicacin: rbol de los objetos SAP o de la aplicacin del cliente. Con doble clic en algn nivel de la jerarqua, se muestran los objetos (programas, datos, ) asociados a esa rama. Para llegar por men:Herramientas Workbench Abap/4 Resumen Jerarqua de aplicacin SAP / Cliente (segn corresponda).
Texto fuente:Programa fuente Abap/4. Atributos: Informacin asociada al programa: Creador y Fecha. Ttulo (campoObligatorio).
Tipo de programa:1 para ejecutables (on-line); I para includes (un INCLUDE es un cdigo Abap que se llama desde otros programas, para reutilizarlo. Por s solo no es ejecutable. Ejemplo: un include para guardar los datos globales, que luego es llamado por el programa principal); M para module pools (se llama a travs de una transaccin. Es como un formulario; no es ejecutable). Campo Obligatorio.
Status del programa:P para los estndar SAP, K para cliente, S para programas del sistema, T para test. Aplicacin: Limita el mdulo de SAP en el que puede ejecutarse el programa. Un asterisco indica que el programa sirve para todos los mdulos.CampoObligatorio. Grupo de autorizaciones: Clave para proteger el programa frente a otros usuarios. Checkboxs adicionales en la pantalla de atributos: Maysculas / Minsculas: Fuerza la escritura del texto todo en maysculas o no. Bloqueo del editor: Si est marcado, otro usuario no podr modificar el programa. Ejecucin con variante: Fuerza la ejecucin del programa con cierta variante Clculo en coma fija. Documentacin: Informacin asociada al objeto creado. Se generan campos tipo script que se rellenan con lo que corresponda. Ejemplo: &DESCRIPTION&,&PRECONDITION&(parmetros de entrada), &OUTPUT& (salida del sistema), &EXAMPLE& (ejemplos). Hay que entrar por modificar.
Elementos de texto: Para los distintas etiquetas de texto que puede incluir un programa. Ttulo y cabeceras (de los informes). Para crear una cabecera de un listado. Por men, desde el editor Abap/4: Pasar a Elementos de texto Ttulo y cabeceras. Smbolos de texto: Para poder reutilizar constantes de texto, se crea un smbolo para cada una. Al usarlo, se escribe en el programa el cdigo del smbolo, ej. 001, y luego aparece en pantalla el texto asociado a ese cdigo. Ejemplo: WRITE TEXT-001. Escribe en pantalla el texto asociado al smbolo 001. Se guardan todos en la tabla TEXT (hay una tabla TEXT por programa en ejecucin.), que se accede por programa como cualquier otra tabla: nametable namefield. En el programa no se deben poner textos literales, sino elementos (smbolos) de texto, para mayor reutilizacin. Para crearlos, por men: Pasar a Elementos de texto Smbolos de texto. Escribir su nmero y texto.
Textos de seleccin: Nombres de los campos de entrada de la pantalla de seleccin, para mayor legibilidad del usuario. Por men, desde el editor Abap/4: Pasar a Elementos de texto Textos de seleccin.
Variantes: Almacena valores de determinados campos de la pantalla de seleccin para forzar la ejecucin del programa con dichos valores. Un programa puede ejecutarse solo o con alguna variante grabada. Para grabar una variante, pulsar el botn de ejecutar (F8), rellenar los campos con los valores deseados para la variante, y pulsar Pasar a grabar como variante. Dar un nombre y texto explicativo a la variante. Puede hacerse con esto que algunos campos de la pantalla de seleccin estn ocultos, sean de slo lectura,
Hay 3 tipos principales de comandos: de cabecera, de lnea y del men de opciones. Comandos de cabecera: Se escriben en la barra de comandos del editor (para ello ste debe estar en modo comando). Scroll de pantalla: A(TTACH) n (posiciona el cursor en la lnea especificada), T(OP) (va a la primera pgina del programa), B(OTTON) ++ (va a la ltima pgina del programa), + (pgina siguiente, como AvPag), (Pgina anterior, como RePag).
Bsqueda: FIND c (busca la primera ocurrencia de la cadena c, a partir del cursor), N(EXT) (busca la siguiente ocurrencia), PRE(VIOUS), R(EPLACE) c1 c2 (reemplaza c1 por c2), F(ETCH) prog (abre en el editor el programa especificado).
Almacenamiento
del
el
programa
en
memoria
temporal
intermedia), RES(TORE)(trae el programa de memoria intermedia), RES(TORE) AKTIV, U(PDATE) (graba el programa, como F11),SAVEAS prog (graba el programa con un nuevo nombre), PC(DOWN) (download de programa a fichero local).
Insercin de datos: I (inserta una lnea al final del programa), I(NSERT) n (inserta n lneas), IC patrn (inserta el patrn especificado), IC FUNCTION funcin (inserta el patrn para la funcin dada), IC SELECT tabla (inserta unSELECT para esa tabla).
Otros comandos: CH(ECK) (chequea sintaxis del programa actual, como CTRL+F2), PCF(ETCH) (upload de un programa), (H)ELP palabra (muestra ayuda asociada a esa palabra), PP (PRETTY PRINTER, para hacer el programa ms legible), PRINT (imprime el listado), RENUM(BER) (numera las lneas de 10 en 10), SHOWnombre (para ver ese objeto), SHOW FUNCTION funcin, BACK (como F3).
Comandos del men de opciones: Se accede a ellos pulsando el botn derecho del ratn en la pantalla del editor. Algunos comandos son los mismos que los de lnea. Todos ellos tienen adems una tecla de funcin asociada. La lnea target del comando ser aquella en la que est el cursor. Ejemplos: Ayuda (F1. Se puede obtener ayuda sobre cualquier campo pulsando F1 con el cursor sobre l. Para obtener ms informacin, pulsar el botn Datos Tcnicos. Tambin hay manuales on-line), duplicar (F5), concatenar (F6), partir (F7), ejecutar (F8), grabar (F11), download (MAYS+F8), verificar (CTRL+F2), generar (CTRL+F3),
Comandos de lnea: Son los ms usados. Se escriben en la zona reservada para los nmeros de lnea de las instrucciones de los programas. Insercinde nuevas lneas: S (partir), I (inserta una lnea), In (inserta n lneas). Borrado de lneas: J (concatenar), D (borra esa lnea), DDDD (borra el bloque). Copiado de lneas: C (copia esa lnea), CCCC (copia el bloque), A (inserta After la lnea o lneas copiadas o movidas),B (como A, pero Before). Movimiento de lneas: M (mueve la lnea), MMMM (mueve el bloque). Repeticin de lneas: R(repite esa lnea), Rn (repite n lneas), RRRR (repite el bloque). Copiado de lneas al portapapeles del editor. Hay un portapapeles por usuario (esto permite copiar fcilmente texto entre dos modos del editor, si se ha entrado con el mismo usuario, incluso entre diferentes ordenadores) y por cada uno de estos comandos (todos funcionan igual): XXXX (copia el bloque al portapapeles), X (pega el bloque copiado); YYYY, Y; WWWW, W; ZZZZ, Z.
Otros comandos: CLEAR, RESET (desmarca un bloque, o resetea un comando anterior a medio ejecutar), PRPR (imprime el bloque), N (inserta un prrafo de comentario), * (scroll de pantalla), > (navegar a un include), < (volver de la navegacin a un include), U (slo para includes), O, T+, B, O,SHSH.
Otros comandos: Son las mismas funcionalidades que los comandos principales.
Botones de la barra de men:Botn Visualizar / Modificar (intercambia entre ambos modos de edicin), botnVerificar sintaxis (como CTRL+F2), botn Referencias de utilizacin (para conocer todos los lugares donde es utilizado el objeto dado), botn Insertar lnea, botn Marcar, botn Deshacer, botn Ejecutar programa (como F8), opcin de men de Generar programa (como CTRL + F3. Un programa u otro objeto debe estar generado y activo antes de poder utilizarse), etc.
Teclas
de
funcin:F1 (help),
F2
lneas
del
editor), F7 (partiruna lnea del editor), F8 (ejecutar programa), F9, F11 (grabar), F12 (abandonar el editor), F13 (imprimir. MAYS+F1. Las teclas de funcin de F13 a F24 se pulsan con ayuda del botn MAYS), F14(MAYS+F2), ,F24(MAYS +F12).
Opciones de men:Con la opcin de men Pasar a se puede ir a los objetos parciales asociados a un programa, como sus atributos, elementos de texto, ). C on Utilidades Upload / Download Download puede bajarse a fichero de texto local un cdigo fuente de un programa abap/4. Luego puede recuperarse si se desea con Utilidades Upload / Download Upload. Con Opciones modo editor, puede elegirse el modo del editor, uno de estos 3: modo comando (el ms habitual), modo PC connumeracin de lneas (como el EDIT de MS-DOS, sin los comandos I de insertar lnea, ), modo PC sin numeracin de lneas (anlogo). Tambin puede elegirse escribir en maysculas o en minsculas todo. Hay otras opciones como verificar, generar, ejecutar, visualizar advertencias,
Palabras clave: Cada sentencia empieza por palabra clave (siempre es la 1 palabra de la sentencia) y acaba en punto. Son de 3 tipos: Declarativas: Definen tipos de datos, objetos de datos (constantes y variables. Las constantes alfanumricas van entre comillas simples), tablas internas, Ej.: DATA (para variables locales y tablas internas) TABLESnametable (para tablas del Diccionario de Datos), TYPES (para definir tipos de datos).
De evento: Definen bloques de proceso que se procesan al activarse cierto evento, como TOP-OFPAGE (se dispara al generarse cada nueva pgina de un listado) Controlan el flujo externo. Los programas Abap estn dirigidos a eventos, no son secuenciales.
De control: Unas controlan el flujo interno de programa (como IF,CASE), otras son operacionales (procesan datos, como MOVE, ADD). Campos de una tabla: (interna o del Diccionario de Datos). Se acceden escribiendo nombre_tabla nombre_campo. Ejemplo: SY-SUBRC (en este caso es la tabla del sistema SYST, que se escribe siempre abreviada como SY, con el campo que indica el cdigo de retorno de un programa, funcin, sentencia, Esta tabla contiene otros campos como la fecha actual, hora actual, nombre de usuario, Slo contiene datos en ejecucin).
Comentarios: Los comentarios de lnea completa se hacen poniendo un asterisco en la primera columna, y los de lnea partida con una comilla doble, hasta EOL (fin de la lnea). Escritura de un programa: Pueden escribirse varias sentencias en una lnea (acabadas en punto y separadas por algn blanco), o una sentencia ocupando varias lneas. Se pueden crear cadenas de sentencias, concatenando varias similares, as: palabra_clave : parte_1, parte_2, , parte_n . Se escribe la palabra clave de la sentencia, seguidamente dos puntos, y luego separadas por comas las distintas subsentencias. Ejemplo: WRITE: texto1, texto2. En lugar de WRITE texto1. WRITE texto2.
Desbloqueo de objetos: Un programa, tabla, dato, puede quedar bloqueado a consecuencia de una cada del sistema mientras se estaba tratando dicho objeto. Para desbloquearlo, ir por men a: Herramientas Gestin Monitor Entradas de bloqueo. Dar el nombre del usuario afectado y pulsar el botn de Lista. Borrar (icono de la papelera) la entrada de bloqueo deseada (o bien todas, desde la entrada de men Borrar Borrar todas).
El Diccionario de Datos sirve para crear tipos y objetos de datos en SAP, estructuras y bases de datos globales (accesibles desde todos los programas), cada uno identificado con su nombre. Para entrar en el D.D , por men: Herramientas Workbench Abap 4 Dictionary (tecla de funcin F6), o bien la transaccin SE11.
Los objetos ms importantes del Diccionario de Datos ( D.D.) son las tablas (no confundir con las tablas internas de los programas). Las tablas del Diccionario se pueden crear, editar, borrar, Otros objetos son: estructuras (son como tablas pero sin entradas, no pueden contener datos), vistas, elementos de datos, dominios, objetos matchcode, objetos de bloqueo,
Vistas:Agrupaciones de ciertos campos de tablas, conectados por el mismo objeto, para ver slo esos. Es til para ver en una sola pasada el contenido de varias tablas relacionadas entre s. Elementos de datos: Sirven para crear campos de tablas. Indican qu sentido tiene ese campo. No hace falta crearlos. Se asocian a un dominio, que indica el tipo de dato, valores posibles, Ejemplo: mandt, para el campo del mandante; tambin existen elementos de datos predefinidos para monedas, fechas, idiomas, cantidades, Como todo objeto SAP, antes de poder usarlos hay que activarlos (icono redondo rojo y blanco), para tenerlos disponibles.
Dominios: Indican el formato de los campos de las tablas. Un campo est asociado a un elemento de datos, y ste a un dominio. Se puede dar valores fijos a un dominio, con Pasar a Valores fijos, o bien se le puede dar rangos de valores.
Objetos de bloqueo: Para evitar conflictos de acceso a una tabla por varios usuarios a la vez. Se usan para hacer zonas de exclusin mutua, semforos, Objetos matchcode: No se suelen crear, en cambio s se crean nuevos conceptos de bsqueda ( IDs: Buscar por nombre, por fechas, por NIF, ): se crean dndoles un nmero, descripcin, stos sirven para buscar objetos asociados a un campo. Hay muchos IDs predefinidos. Se pueden definir adems restricciones de bsqueda.
Estructuras: Son similares a tablas, pero no pueden contener datos o entradas., son slo campos. Tablas: Son los objetos ms importantes del Diccionario de Datos. Tipos de tablas: Las tipo A son de aplicacin, las C y G son de Customizing (son para parametrizacin), las Lpara datos temporales o de prueba, y las S y W son del sistema. Datos definidos en cada campo: En cada campo de una tabla est definido un elemento de datos, el tipo del campo, su longitud, opcionalmente una tabla de verificacin (para chequear que el valor del campo est incluido dentro de los posibles definidos en esta tabla), descripcin del campo, mandante (simula varias mquinas lgicas, pero puede ser una nica mquina fsica, o varias. Pero los datos de una tabla dependen y estn slo dentro de un mandante. Por eso este dato es obligatorio en todas las tablas).
Opciones tcnicas de una tabla:clase de datos (se suelen usar APPL0 y APPL1), categora tam. (tamao esperado de la tabla, en n entradas), grabar la tabla en MI (memoria intermedia). Actualizacin de tablas: Hay un flag que permite actualizar la tabla si est marcado. Se puede entrar por men por: Entorno generar actualizacin de tabla. Con esta opcin se pueden usar las transacciones SM30 oSM31 para actualizarlas (no se podra hacer si no tuviera permiso de actualizacin y no estuvieran generadas las vistas necesarias para hacerlo). El campo mandante no es actualizable. Si se aaden campos a una tabla hay que volver a generar las vistas y grupo de funciones para que se tengan en cuenta los cambios.
Creacin de una tabla: Basta pulsar el botn crear e introducir cliente, sociedad, descripcin breve (campo obligatorio), nombre (debe empezar por Z), El resto de caractersticas de la tabla dependern del elemento de datos (de entre los ya predefinidos, como mandt para el mandante. El elemento de datos debe ajustarse al tipo de datos que necesitemos para un campo dado). En el campo de tabla de verificacin el asterisco indica que verifique si se mete dato vlido. Clv en un campo indica que es clave (pueden ser varios. Dos entradas en una tabla nunca pueden tener igual todos los campos clave). Al grabar la tabla meterla en una clase de desarrollo, como si fuera un programa. Y antes de usarla hay que dar primero las opciones tcnicas (clase de datos APPL1 y tamao 0, por ejemplo) y luego activarla (pulsar el icono circular rojo y blanco). Para permitir actualizaciones, hay que ir por men a Entorno generar actualizacin de tablas. El tipo de actualizacin puede ser a un nivel, si es que cabe; si no, a 2 niveles. Finalmente pulsar el botn de Proponer imgenes y dar un grupo de funciones (como el ZT01), que tendr su propia clase de desarrollo. Con esto, haciendo SM31 se pueden meter valores en la tabla (aunque no chequear si son datos vlidossi no est activada la verificacin. Para esto, ir por men a Pasar a Claves externas Propuesta de verificacin, una vez por cada campo a verificar).
El flujo de un programa puede controlarse de forma interna (con las sentencias tpicas de control de flujo) oexterna (con secundario eventos). Flujo: Base de datos lgica programa Abap/4 pantalla de seleccin PBO, PAI e informe bsico de informe
2.2. EXPRESIONES LGICAS Y OPERADORES: Las expresiones lgicas tpicas son de la forma:operando1 operador operando2, y devuelven un valor TRUE o FALSE. Las expresiones lgicas simples se pueden combinar con AND, OR y NOT, parentizando adecuadamente (el primer nivel no es necesario). Los tipos de operadores en Abap/4 son:
Para Para
todo tipos
tipo alfanumricos
de y
datos: numricos:
EQ =, NE <> ><, LT <, LE <=, GT >, GE >=. Se usan para comparaciones, aparte de los anteriores. CO (contiene slo ), CN (no contiene slo ), CA (contiene algn ), NA (no contiene algn ) , CS (contiene el string ), NS (no contiene el string ), CP (contiene el pattern ), NP (no contiene el pattern ).
Para O (los bits son 1), Z (los bits son 0), M (los bits son 0 y 1).
bits:
Operaciones
lgicas
especiales:
Rango: operando1 BETWEEN operando2 ANDoperando3. Los valores lmite del rango[ operando1, operando2 ] son inclusive. Esta operacin lgica devuelve cierto s y slo s operando2 <= operando1 <= operando3.Valor inicial: operando IS INITIAL. Para saber si el valor de operando es el inicial por defecto o no. Para nmeros el valor inicial es 0; para caracteres y cadenas es SPACE(es un string todo en blanco, de la longitud necesaria en cada caso (en particular puede ser cero o uno). til para hacer comparaciones).Criterio de seleccin: operando IN criterio_seleccin. Para saber si el valor de operando est dentro o no del criterio especificado. Muy usado en los CHECKs y en los SELECT WHERE El criterio de seleccin recoge la informacin que el usuario ha introducido en un SELECT-OPTION. 2.3. Sentencias Abap/4 de eventos (CONTROL EXTERNO): Cada evento posible es capturado por la sentencia correspondiente. Un programa Abap/4 no es ms que un conjunto de bloques de proceso, cada uno correspondiente a un evento (por tanto, nose ejecutan secuencialmente). Dichas sentencias son: INITIALIZATION, START-OF-SELECTION,END-OFSELECTION-SCREEN, AT LINESELECTION, GET[LATE], TOP-OF-PAGE, END-OF-PAGE, AT listados interactivos).
SELECTION, AT PFn, AT USER-COMMAND (estos tres ltimos son eventos especficos para reports o
INITIALIZATION. Se ejecuta siempre antes de que aparezca la pantalla de seleccin, una sola vez. Se usa para inicializar parmetros y criterios de seleccin. Ejemplo:
PARAMETERS sy-datum.
fecha
TYPE
DEFAULT
Otro ejemplo:
TABLES kna1.
SELECT-OPTIONS kunnr.
cliente
FOR
kna1-
APPEND cliente.
El select-options permite meter un rango de valores para cliente, en lugar de uno solo. Adicionalmente pueden introducirse varios valores individuales, o varios intervalos. El valor i para el campo sign indica que el valor est incluido; eq indica seleccionar los valores que sean iguales, es decir, los que coincidan con el criterio de seleccin introducido.
START-OF-SELECTION. Bloque de proceso que se ejecutar tras procesar la pantalla de seleccin (despus de INITIALIZATION), y antes de acceder a las tablas de la base de datos lgica, para empezar a escribir la salida (normalmente un programa Abap har uso de una o ms bases de datos lgicas, que son programas estndar que acceden las tablas SAP de forma simple yjerrquica). En este evento tiene lugar la seleccin de datos por parte del usuario.
END-OF-SELECTION. Se activa tras procesar todas las tablas de la base de datos lgica (que se acceden en/con el evento GET), o tras finalizar elSTART-OF-SELECTION si no se usan stas.
[ FIELDS c1
c2
...].
Llama al programa de la base de datos lgica, y devuelve la entrada leda de la tabla especificada. Con LATE, GET se activa cuando se han procesado todas las tablas jerrquicamente inferiores a la dada (las tablas se organizan en rbol, y se van recorriendo pasando por ellas hasta alcanzar el dato a leer). SinLATE, GET se dispara al leer la primeratabla; conLATEespera a recorrer la rama del rbol de tablas. SinFIELDS se leen todos los campos; conFIELDS slo se leen los campos especificados, aparte de los clave.
TOP-OF-PAGE [ DURING
LINE-SELECTION ].
Se activa justo antes de imprimir la pgina actual (antes del primer WRITE). Sirve para escribir
cabeceras de pginas y ttulos. Se ejecuta antes de la primera lnea de cada pgina. Sin la opcin DURING LINE-SELECTION, se activa slo en el informe bsico; con esta opcin, se activa adems en los informes secundarios. La sentencia END-OF-PAGEno activa este evento, peroNEWPAGE s lo activa.
END-OF-PAGE. Se activa si se alcanza el rea de la pgina reservada para este evento (con la opcin LINECOUNT en PROGRAM o REPORT) al final de la pgina; si no hay rea definida, no se activa el evento. Con RESERVE n LINES se reservan n lneas al final de la pgina para escribir el pie de pgina. La sentencia NEW-PAGEno activa este evento.
AT
SELECTION-SCREEN [varios
parmetros
].
Bloque de proceso que se activa mientras se procesa la pantalla de seleccin, o bien despus de sta (PAI). Segn sus parmetros, se activar cuando el usuario realice cierta accin en la pantalla de seleccin, como dar valor a un SELECT-OPTIONS. Por tanto, se usa para controlar los datos que introduce el usuario, y slo tiene sentido en reports. Parmetros: ON RADIOBUTTON END OF criterio_ seleccin, ON GROUP grupo, ON criterio_seleccin, ONBLOCK bloque, ON
VALUE REQUEST FOR criterio_seleccin, ON OUTPUT(se ejecuta el evento cadavez que se pulse Enter en la pantalla de seleccin, mientras que el evento INITIALIZATION slo se ejecuta una vez, esa es la diferencia). 2.4. EVENTOS PARA REPORTS INTERACTIVOS: Los listados interactivos se muestran igual por pantalla que los normales (la lista bsica. Se puede usar un modelo estndar de listado, y adaptarlo a cada report concreto), salvo que en ellos el usuario puede lanzar una(s) lista(s) secundaria(s) en funcin del (los) evento(s) que active. La lista secundaria machaca en pantalla la lista primera. Pueden generarse como mucho 20 nuevos listados, salvo que se use la sentencia WINDOW para crear una ventana nueva para el nuevo listado. Sentencias o eventos propias de estos listados:
AT LINE-SELECTION. Para reports interactivos: el usuario puede seleccionar elementos de la lista mostrada. Se activa si el usuario selecciona (pick-up: doble clic) una lnea del informe (generada por WRITE, ULINE, SKIP, Pueden incluso seleccionarse lneas en blanco o no vlidas: el programa debe discriminarlas), y slo tras mostrar el informe bsico, o bien pulsando F2 o por men Edit Choose. Se usa para ver informacin asociada al elemento seleccionado.
AT PFn. Se activa al ser pulsada la tecla de funcin Fn especificada (n va de 0 a 99), y slo tras mostrar el informe bsico. Sin crear un status especfico, se pueden usar las funciones Fn que no estn ya predefinidas (como son F1 para la ayuda o F3 para back); el cdigo de la tecla Fn pulsada se guarda en SY-UCOMM. Pero este evento debera usarse slo para probar el programa; para su versin final usar AT USERCOMMAND.
AT USER-COMMAND.
Se procesa si el usuario activa un comando, asociado a un icono, botn o elemento de men, en un status especfico, y slo tras mostrar el informe bsico. Una vez disparado el evento es cuando se puede decidir qu comando se ha pulsado, consultando el campo del sistema SY-UCOMM. Para que el evento TOP-OF-PAGE se active en un listado secundario (as como las cabeceras estndar), debe tener el parmetro DURING LINE-SELECTION. En cambio s funciona el END-OF-PAGE. Dentro de uno de estos 3 eventos propios de los listados interactivos, usar IF o CASE para decidir las acciones a realizar, en lugar de intentar activar otros eventos. Los siguientes campos del sistema (tabla SYST) pueden servir para controlar el flujo de programa:
SY-LSIND: Nmero del listado (el bsico es el n 0), aunque est en una ventana diferente. SY-LISTI: N de la lista en la que se activ el evento. SY-LILLI: N de lnea de la lista en la que se activ el evento. SY-LISEL: Contenido de la lnea en la que se activ el evento. SY-CUROW: Posicin de la lnea en la que se activ el evento. SY-UCOMM: Cdigo de funcin que activ el evento. SY-PFKEY: Status de la lista.
Dentro de ellos NO se pueden codificar sentencias / eventos GET para acceder a bases de datos lgicas (deber hacerse con SELECTs), ni hacer SUBMITs (llamadas a otros programas). Se puede volver a la lista anterior con el botn BACK () o bien F3. Tambin se puede fijar un valor para el campo SY-LSIND, y darle el nmero de lista a la que se debe ir (la bsica es la 0). El sistema borra los datos de las listas con nmero mayor al especificado (con lo que con este mtodo slo se puede retroceder), las anteriores no. Debe actualizarse SY-LSIND como ltima sentencia del evento o bloque, para evitar que otras sentencias interfieran y aparezcan problemas. Pueden asignarse distintos status a las listas secundarias, para crearles botones, mens, Para ello usar la sentencia SET PF-STATUS nombre [ EXCLUDING f | tabla ]. Con el parmetroEXCLUDING se desactiva en el status dado uno (f) o ms (los de la tabla) cdigos de funcin. As los status pueden hacerse ms reutilizables. Ejemplos:
"
DATA: BEGIN OF tabla OCCURS 10, declara una tabla interna normal campo1(4). DATA: END OF tabla.
" Se
" Cdigos
APPEND tabla.
Usando directamente los campos del sistema SY-LSIND, SY-UCOMM, Usando sentencias especficas para ello, como HIDE, READ LINE, SET CURSOR FIELD o GET CURSOR LINE. O bien pasando atributos del listado al programa con las sentencias DESCRIBE LIST (NUMBER, LINE o PAGE).
2.5. Sentencias de control DE FLUJO (interno): Estas sentencias son: IF, CASE, DO y WHILE Estn relacionadas con ellas las sentencias para abandonar bloques de proceso, en particular bucles y sentencias de bifurcacin: CONTINUE,CHECK, EXIT.
IF condicin. bloque [ ELSEIF condicin. bloque ] [ ELSE. bloque ] ENDIF. CASE campo. WHEN valor. bloque [WHEN OTHERS.] bloque ENDCASE. WHEN valor. bloque [ VARYING campo FROM v1 NEXT v2 ]. bloque ENDDO.
DO [
n TIMES ]
Con n TIMES, el bucle da n vueltas, de forma incondicional. Sin esta opcin deber salirse del bucle con EXIT,STOP o REJECT (para salir de un bucle que es infinito). La opcin VARYING incrementa el campo, numrico o no, desde el valor inicial v1, con incrementos v2. Ejemplo: (aparece en pantalla: 2, 5, 8, 11, 14:campo1empieza en 2, y avanza de 3 en 3).
WHILE condicin
]. bloque ENDWHILE.
Se repite el cuerpo (bloque) del bucle mientras la condicin sea cierta (tambin se puede salir con EXIT o similar). La opcin VARY es anloga a la VARYING de DO.
SQL:SQL dinmico
Un artculo SQL de Erland Sommarskog, SQL Server MVP.
Traducido por Simon Hayes. Este artculo est disponible tambin en coreano y alemn,gracias al ASP MVP Jongshin Kim, y a Frank Kalis, respectivamente. En los varios newsgroups en los que se discute el SQL Server de Microsoft, mucha gente pregunta cmo ejecutar consultas tales como las siguientes: SELECT * FROM @tabla SELECT @columna FROM tabla SELECT * FROM tabla WHERE x IN (@listado) Frecuentemente, alguien responde diciendo utiliza el SQL dinmico y adjunta un ejemplo sencillo, pero no se suele mencionar los inconvenientes de esta solucin. En este artculo analizo el uso del SQL dinmico en procedimientos almacenados en el SQL Server es una caracterstica potente, pero tienes que utilizarla con cuidado. Empiezo describiendo por qu utilizamos procedimientos almacenados, antes de tratar el uso del SQL dinmico. Examino los conflictos entre los beneficios de los procedimientos almacenados y los efectos del SQL dinmico, incluido el muy conocido problema de seguridad que es la inyeccin de SQL . Propongo unas buenas prcticas para el cdigo SQL, y termino examinando los casos en que la gente suele utilizar el SQL dinmico, por motivos correctos o incorrectos; en los casos dnde el SQL dinmico no es la solucin ms adecuada, ofrezco otras posibilidades.
Contenido:
Por qu utilizar procedimientos almacenados? EXEC() y sp_executesql EXEC() sp_executesql Qu mtodo utilizar Los cursores y el SQL dinmico El SQL dinmico y los procedimientos almacenados La inyeccin de SQL: un problema grave de seguridad Las buenas prcticas de cdigo y el SQL dinmico Cundo utilizar o no el SQL dinmico select * from @tabla select * from ventas + @yymm update tabla set @columna = @valor where keycol = @key select * from @bbdd + ..tabla select * from tabla where columna in (@listado) select * from tabla where @criterios Criterios de bsqueda dinmicos select * from tabla order by @columna select top @n from tabla order by @columna create table @tabla Servidores vinculados
1. Los permisos
Un procedimiento almacenado es la solucin clsica para manejar el acceso de los usuarios a los datos. Un usuario no debera tener los permisos para ejecutar SELECT, INSERT, UPDATE y DELETE directamente mediante una herramienta como el Query Analyzer podra hacer cualquier cosa. Por ejemplo, una persona podra aumentar su salario en la base de datos del departamento d e personal Ya que un procedimiento almacenado se ejecuta con los permisos de su propietario, el usuario no necesita permisos explcitos en las tablas. Pero hoy tenemos ms posibilidades. Desde el SQL Server 7, puedes dar acceso a una funcin de aplicacin que se activa con una contrasea escondida en la aplicacin. An ms seguro sera un servidor intermedio como COM+, puesto que los usuarios ni tendran acceso al servidor MSSQL. Incluso cuando no adoptas una de esas soluciones, los procedimientos siguen siendo importantes para la seguridad.
El uso de la cach es ms importante para pequeos procedimientos o instrucciones que se ejecutan frecuentemente y rpidamente, ya que consagrar 500ms a la creacin de un plan de consultas tendra un impacto notable. Pero si el procedimiento se ejecuta durante veinte minutos, es aceptable dedicar tres segundos a la creacin de un plan. Para quines todava tienen el SQL Server 6.5, cabe destacar que esa versin almacena planes de consulta nicamente para procedimientos almacenados, no para las consultas de SQL ad hoc.
Si envas instrucciones SQL directamente desde tu aplicacin, el problema es mucho ms grande. Debes buscar en una cantidad mayor de cdigo, y si el nombre de la columna tiene un nombre comn como status, pues la tarea puede ser casi imposible. Y en este caso la tabla sysdepends no sirve para nada.
EXEC() y sp_executesql
En el SQL Server, el SQL dinmico de ejecuta con EXEC() o sp_executesql.
EXEC()
Utilizar EXEC() es la manera ms sencilla de ejecutar SQL dinmico: SELECT @tabla = 'ventas' + @ao + @mes EXEC('SELECT * FROM ' + @tabla)
Puede que este ejemplo te parezca extremadamente bsico, pero quiero destacar unos puntos importantes. Primero, son los permisos del usuario actual que estn en vigor al ejecutar la instruccin, incluso cuando la instruccin se halla dentro de un procedimiento almacenado. Segundo, EXEC() es similar al EXEC que se utiliza para ejecutar un procedimiento almacenado, pero ejecuta un lote de instrucciones SQL en lugar de un procedimiento almacenado. Sin embargo, en ambos casos el lote SQL o procedimiento almacenado se ejecuta en otro alcance del procedimiento que lo ejecut, pues hay que notar los puntos siguientes:
Dentro del lote SQL no tienes acceso a las variables locales o a los parmetros del procedimiento almacenado externo Si usas USE en el lote SQL, esto no afecta al procedimiento almacenado externo Si creas tablas temporales en el lote SQL se quitan al acabar el lote como si fuera un procedimiento almacenado pues no las puedes utilizar en el procedimiento almacenado externo. Sin embargo, el lote SQL tiene acceso a las tablas temporales creadas en el procedimiento almacenado externo.
Si cambias las opciones SET en el lote SQL, esto no afecta al procedimiento almacenado externo El plan de consultas para el lote SQL no es parte del plan de consultas para el procedimiento almacenado externo. En cuanto a la cach, el lote SQL es igual a una consulta de SQL ad hoc enviada desde el cliente.
Si sale un error que termina el lote por ejemplo un rollback en un desencadenador se termina el lote, pero tambin el procedimiento almacenado externo, y el procedimiento almacenado que lo ejecut, y as
A diferencia de la ejecucin de un procedimiento almacenado, no puedes utilizar parmetros, y tampoco existe un valor del estado de retorno. El valor de @@ERROR depende de la ltima instruccin en el lote SQL, pues si hay un error en el lote pero luego una instruccin que se ejecuta sin error, @@ERROR tendr el valor 0. EXEC() existe desde el SQL Server 6.0. Nota que EXEC(@sql) no tiene nada que ver con EXEC @sp, lo que ejecuta un procedimiento almacenado cuyo nombre es el valor de @sp.
sp_executesql
sp_executesql existe desde el SQL Server 7, y lleva la ventaja que admite el uso de parmetros de entrada y salida con la cadena de SQL dinmico. El ejemplo siguiente demuestra el uso de un parmetro de salida: DECLARE @col sysname, SELECT @sql = N'SELECT @sql nvarchar(4000), @min = -nvarchar(MAX) en SQL + 2005. +
@min varchar(20)
convert(varchar(20),
Ya ves que es mucho ms fcil asignar un valor de tu instruccin de SQL dinmico a una variable local con sp_executesql que con EXEC() lo puedes hacer mediante una instruccin INSERT EXEC(), pero no es una solucin muy cmoda -. El primer parmetro para sp_executesql es una instruccin SQL. El tipo de datos del parmetro es ntext, pues tienes que utilizar una variable de tipo nvarchar ya que no se admite la declaracin de parmetros ntext -. Si tu instruccin es una cadena literal, pon N antes de la comilla simple para indicar una cadena Unicode. La sentencia puede incluir parmetros que empiezan con una arroba @ - y que no estn relacionados con las variables en al alcance actual. La instruccin SQL es como todas las dems, es decir que los parmetros se admiten nicamente donde la sintaxis SQL los permite. O sea, no puedes utilizar parmetros para los nombres de tablas o columnas , pues si los determinas dinmicamente, tienes que incluirlos en la cadena que ser ejecutada. El segundo parmetro para sp_executesql es un listado de declaraciones de variables en la forma habitual, incluyendo parmetros de salida y valores predeterminados parece que el tema de los parmetros de salida no est en los Books Online del SQL Server -. El listado es de tipo ntexttambin, y debe incluir todas las variables utilizadas en la sentencia SQL. Los dems parmetros para sp_executesql son los que has declarado en el listado de parmetros, en el mismo orden o puedes escribir los nombres explcitamente -. sp_executesql suele ser ms til que EXEC() por varios motivos. Utilizando el sp_executesql no tienes que contar con la autoparametrizacin de SQL Server, ya que t suministras los parmetros. As, es ms probable que el SQL Server utilice un plan de consultas que ya existe en la cach aunque las diferencias en el espacio en blanco todava pueden impedir esto -. Hablar de las otras ventajas de sp_executesql en mi anlisis de inyeccin del SQL y las buenas prcticas de cdigo. Los puntos que destaqu en la seccin sobre EXEC() tambin se aplican en el caso de sp_executesql:
El lote SQL est en su propio alcance, y no tienes acceso a las variables en el procedimiento almacenado exterior Los permisos del usuario actual se aplican El uso de USE no afecta al procedimiento almacenado exterior Tablas temporales creadas por el lote SQL no estn accesibles desde el procedimiento almacenado exterior El uso de opciones SET afecta nicamente al lote SQL Si el lote ejecutado por sp_executesql se termina debido a un error, el procedimiento almacenado exterior tambin se termina El valor de @@ERROR indica el estatus de la ltima sentencia en el lote SQL
Segn dice Books Online, el valor del estado de retorno de sp_executesql puede ser 0 xito o 1 fallo -. Pero parece que en realidad, el valor del estado de retorno es el valor de @@ERROR, por lo menos en el SQL Server 2000. Consulta Books Online para tener todos los detalles sobre sp_executesql. Mira tambin el artculo 262499 en el Microsoft Knowledge Base, donde se explica el uso de parmetros OUTPUT.
Qu mtodo utilizar
Si utilizas el SQL dinmico frecuentemente, pues sp_executesql sera mejor porque el SQL Server puede utilizar el plan de consultas en la cach, y tambin gozas del uso de parmetros. Claro que no lo puedes utilizar si sigues trabajando con la versin el SQL Server 6.5, pero tampoco es posible si tu sentencia SQL es demasiado larga para una variable nvarchar(4000). EXEC() permite concatenar cadenas: EXEC(@sql1 + @sql2)
Al ejecutar sp_executesql puedes utilizar una sola variable, puesto que el TSQL no permite el uso de expresiones como parmetros cuando ejecutas un procedimiento almacenado. Pero si absolutamente necesitas una consulta parametrizado, pues puedes anidar sp_executesqlen una cadena para EXEC():
DECLARE @sql1 nvarchar(4000), SELECT @state = 'CA' @sql2 nvarchar(4000),
@state char(2)
SELECT @sql2 = N'FROM authors WHERE state = @state' N''' + @sql1 + @sql2 + ''', @state = ''' + @state + '''')
Aun es posible anidarlo cuando tienes parmetros de salida, mediante un INSERT-EXEC: CREATE TABLE #result (cnt int NOT NULL) @sql2 @sql2 ''', @cnt ''', @cnt') int OUTPUT'', SELECT @mycnt = cnt FROM #result @cnt = @cnt OUTPUT nvarchar(4000), = N'FROM authors WHERE state SELECT @state = 'CA' EXEC('DECLARE @cnt int DECLARE @sql1 nvarchar(4000), @mycnt int SELECT (cnt) INSERT #result
EXEC sp_executesql N''' + @sql1 + @sql2 + N''@state char(2), SELECT @state = ''' + @state +
Puede que prefieras evitar este laberinto de comillas utilizando solamente EXEC() el cdigo puede ser un poco ms claro como vers cuando presento la funcin definida por el usuario quotestring() -. En el SQL Server 2005, puedes emplear el nuevo tipo de datos nvarchar(max) para la variable @sql, y no tienes que poner sp_executesql dentro de un EXEC().
Nota que aqu no puedes utilizar un cursor local los cursores locales se quitan al terminar el alcance pero Anthony Faull me ha sealado que lo puedes hacer mediante una variable de tipo cursor:
Se declara una variable de tipo cursor, y ya ves que la puedes manipular como cualquier otro parmetro. Debo confesar que nunca haba visto un uso para las variables de tipo cursor, hasta recibir el ejemplo que Anthony Faull me envi muy amablemente.
Pronto vers que este procedimiento no sirve para nada, porque no permite beneficiar de las ventajas de los procedimientos almacenados. Sera igual construir la sentencia SELECT en tu aplicacin y enviarla directamente al SQL Server.
1. Los permisos
Si no puedes permitir que los usuarios accedan directamente a las tablas, no puedes utilizar el SQL dinmico y no hay ms qu decir. En algunos casos, puede ser que los usuarios tengan los permisos para SELECT, pero no utilices el SQL dinmico para sentencias de INSERT/UPDATE/DELETE, salvo cundo ests absolutamente seguro de que los permisos no son un problema. Quiero subrayar que me refiero nicamente a las tablas permanentes; no hay nunca cuestiones de permisos al acceder a tablas temporales. Si utilizas funciones de aplicaciones, o si tienes una capa intermedia como COM+ que no permite que los usuarios accedan directamente a la base de datos, pues probablemente no tienes que preocuparte mucho por los permisos. No obstante, todava existen problemas de seguridad que debes considerar, como veremos en las seccin sobre la inyeccin de SQL. Finalmente, si escribes cdigo para los usuarios sysadmin, pues claro est que no habr problemas de permisos.
consulta una tabla temporal, es muy poco probable que utilice el plan -. Tambin puedes poner la consulta en otro procedimiento separado, pero el cdigo puede ser ms claro siendo todo en un solo procedimiento. Como siempre, esto supone que tu estrategia de permisos admite el uso del SQL dinmico.
SELECT @sql =
@sql = @sql + ' AND custname LIKE ''' + @custname + '''' NULL EXEC(@sql)
IF @prodname IS NOT
SELECT @sql = @sql + ' AND prodname LIKE ''' + @prodname + ''''
Digamos que los valores para @custname y @prodname vienen directamente de un campo de input, y que un atacante suministra el valor siguiente para @custname: ' DROP TABLE orders -La cadena SQL que resulta del input es la siguiente: SELECT * FROM orders WHERE 1 = 1 AND custname LIKE '' DROP TABLE orders--'
Has visto el texto rojo? Este mtodo de atacar la base no tendr xito en todos los casos. Es poco probable que un usuario normal conectado directamente al SQL Server tenga los permisos necesarios para quitar una tabla. Pero si el usuario est conectado a travs de una aplicacin web, y si el servidor web tiene permisos ms amplios, pues el ataque tendr xito. Incluso si el atacante no puede llevar a cabo su primer ataque, todava puede ejecutar instrucciones SQL que no debera. La estrategia del atacante es la siguiente. Primero, intenta una comilla simple en el campo de entrada para ver qu pasa. Si el servidor devuelve un error de sintaxis, el atacante sabe que la vulnerabilidad existe, pues intentar descubrir si se necesita algn carcter o palabra clave para terminar la consulta, antes de aadir su propio comando. Finalmente, aade un carcter que indica un comentario, para que el SQL Server no evale la cadena entera, as evitando un error de sintaxis. El atacante puede intentar tambin un punto y coma, que desde el MSSQL 7 es un terminador de instruccin opcional. Si esto devuelve un error, puede haber encontrado algo como elgeneral_select, y si el valor para el parmetro @tblname viene directamente del valor suministrado por el usuario, el atacante puede crear la cadena siguiente: some_table WHERE keycol = 'ABC' DELETE orders No olvides que existen ms puntos de ataque que los obvios campos de input si tienes parmetros en un URL que sirven como argumentos para procedimientos almacenados, un atacante los utilizar tambin. Si imaginas que un atacante necesita no slo conocimientos tcnicos sino tambin suerte para encontrar una vulnerabilidad de este tipo, recuerda que hay demasiados hackers con demasiado tiempo. La inyeccin de SQL es un problema grave de seguridad, y debes defenderte contra ella: existen dos defensas.
Da slo los permisos ms mnimos a los usuarios en el SQL Server. Si tu aplicacin conecta desde una capa intermedia, utiliza un login normal, que tiene los permisos de SELECT como mximo. As evitas que un desarrollador descuidado o inexperto cree una vulnerabilidad a la inyeccin de SQL.
Hay prcticas de cdigo muy bsicas que puedes utilizar, y las veremos en la prxima seccin del artculo.
Insisto en el hecho de que la inyeccin de SQL afecta no slo los procedimientos almacenados, sino tambin el cdigo en aplicaciones donde generas consultas, lo que puede ser an ms vulnerable ya que muchas veces tus variables de cadena no tienen una longitud fija -. Incluso si utilizas procedimientos almacenados, puede que generes las sentencias EXEC para ejecutarlos, y estas sentencias tambin son vulnerables.
Quizs has visto las mltiples comillas simples, y te has preguntado para qu sirve todo eso? El TSQL es uno de los lenguajes en los que tienes que duplicar un terminador de cadena para que sea evaluado como una cadena normal. Las cuatro comillas consecutivas () son una cadena cuyo valor es una sola comilla (). Y esto es un ejemplo sencillo el asunto puede ser an peor. Un error muy frecuente es el siguiente: EXEC('SELECT col1, col2, col3 keycol = ''' + @key + '''') Has visto que falta un espacio tras la palabra FROM? Al crear el procedimiento no te saldr ningn error, pero al ejecutarlo el SQL Server te dice que no existen las columnas keycol, col1, col2 y col3. Puesto que sabes que s existen en la tabla que indicaste, te quedars muy desconcertado. Pero mira el cdigo que se genera, utilizando los parmetros foo y abc: SELECT col1, col2, col3 FROMfoo WHERE keycol = 'abc' La sintaxis es correcta, porque FROMfoo puede ser un alias para col3. Ya he dicho que no deberas nunca utilizar nombres de tablas o columnas como parmetros, pero ya que estoy hablando de las buenas prcticas, te lo repito. Cuando empiezas escribir los procedimientos almacenados, deben ser el nico cdigo en que te refieres a objetos en la base de datos salvo cuando te refieres a los procedimientos si mismos, claro -. No obstante, aqu te presento una versin revisada de general_select que permite demostrar unas buenas prcticas para utilizar el SQL dinmico: CREATE @key key_type, @sql nvarchar(4000) 1 PRINT @sql ' + quotename(@tblname) + ' PROCEDURE general_select @tblname nvarchar(127), DECLARE FROM IF @debug = FROM' + @tblname + ' WHERE
@debug bit = 0 AS SET @sql = 'SELECT col1, col2, col3 WHERE keycol = @key'
He puesto @tblname dentro de la funcin quotename() para protegerme contra un ataque de inyeccin de SQL mediante esta variable. Hay ms detalles sobre quotename() debajo. He aadido un parmetro @debug, pues si me sale un error extrao es fcil comprobar la cadena que se est ejecutando.
En lugar de meter el valor de @key directamente en una cadena con EXEC(), me sirvo de sp_executesql as que @key es un parmetro. Es otra manera de protegerme contra la inyeccin de SQL.
quotename() es una funcin del sistema que existe desde el SQL Server 7. Devuelve el valor de entrada delimitado por el terminador de cadena que seleccionas y duplica terminadores dentro de la cadena. Por omisin, el terminador es un corchete, ya que la funcin se usa principalmente con los nombres de objetos, pero puedes seleccionar una comilla simple. Pues si prefieres usar EXEC() por motivo alguno, puedes utilizar quotename()para protegerte contra la inyeccin de SQL. Vamos a mirar un ejemplo revisado tirado del procedimientosearch_orders que hemos visto en la discusin sobre la inyeccin de SQL: IF @custname IS NOT NULL quotename(@custname, '''') Nota que el parmetro de entrada para quotename() es nvarchar(128), pues no sirve para cadenas largas. Si tienes el SQL Server 2000, puedes utilizar esta funcin definida por el usuario en su lugar: CREATE FUNCTION quotestring(@str nvarchar(1998)) RETURNS nvarchar(4000) AS BEGIN DECLARE @ret nvarchar(4000), @sq char(1) SELECT @sq = '''' SELECT @ret = replace(@str, @sq, @sq + @sq) RETURN(@sq + @ret + @sq) END - En el SQL Server 2005, reemplaza 1998 y 4000 con MAX -. La utilizas as: IF @custname IS NOT NULL dbo.quotestring(@custname) En el SQL Server 7, tienes que reescribir quotestring en forma de un procedimiento almacenado. El SQL Server 6.5 no tiene la funcin replace(), pues no puedes hacer mucho en este caso. Quiero sealar que fue el SQL Server MVP Steve Kass que me propuso la idea de utilizar quotename() o una funcin definida por el usuario -. Otra posibilidad para evitar un laberinto de comillas anidadas es aprovecharte del hecho de que el T-SQL utiliza dos caracteres para delimitar cadenas. Ms precisamente, si la opcin QUOTED_IDENTIFIER est OFF, tambin puedes usar una comilla doble (). El valor predeterminado de esa opcin depende de la situacin, pero es mejor que est ON, y debe estar ON para utilizar vistas indizadas e ndices en columnas computadas. No es una alternativa perfecta, entonces, pero si eres consciente de estas advertencias, puedes hacer esto: CREATE @key DECLARE SELECT @sql col1, PROCEDURE nvarchar(4000) col2, col3 general_select SET @sql = @tblname @debug 'SET FROM IF @debug = 1 PRINT @sql ' + nvarchar(127), bit = 0 AS OFF + ' @tblname SELECT @sql = @sql + ' AND custname LIKE ' + SELECT @sql = @sql + ' AND custname LIKE ' +
key_type,
QUOTED_IDENTIFIER EXEC(@sql)
Resulta ser ms fcil leer el cdigo cuando hay dos caracteres que delimitan las cadenas la comilla simple para el comando SQL y la comilla doble para los valores.
Sera preferible utilizar sp_executesql y quotename() para protegerte contra la inyeccin de SQL, pero puede una solucin adecuada para tareas de sysadmin ya que la inyeccin de SQL no sera un problema y puede ser la mejor solucin para el SQL Server 6.5. Quiero concluir esta seccin diciendo que seguir las prcticas que he identificado supone aumentar considerablemente la complejidad de tu cdigo SQL, as que deberas pensar dos veces antes de utilizar el SQL dinmico.
col2 = CASE @colname WHEN 'col2' THEN @value ELSE col2 END,
sales_12 money
NULL,
Puede ser mejor crear una segunda tabla para las columnas sales_n: CREATE month tinyint NOT NULL, TABLE product_sales NOT NULL, (prodid prodid_type NOT sales PRIMARY KEY (prodid, month)) NULL, money
Es decir, la @sp contiene el nombre del procedimiento almacenado. Hacer algo en cada base de datos. Esto suena a una tarea de sysadmin, pues el SQL dinmico puede ser una buena solucin ya que no hay que considerar ni los permisos ni la cach. No obstante, existe otra posibilidad, que es usar sp_MSforeachdb: sp_MSforeachdb 'SELECT ''?'', COUNT(*) FROM sysobjects' Como puedes imaginar, sp_MSforeachdb utiliza el SQL dinmico internamente, as que la ventaja es que no tienes que escribir un bucle t mismo, pero debo sealar que sp_MSforeachdb no est documentado en Books Online, y entonces Microsoft no lo apoya. Una base de datos master. De vez en cuando he encontrado gente que tiene muchas bases de datos con la misma estructura: me imagino que tienen una empresa de hosting y cada base de datos sera para un cliente distinto. Las normas de su empresa no permiten que todos los clientes compartan una sola base de datos. Estas personas quieren evitar la tarea de mantener todas las bases, pues imaginan una sola base master donde pueden colocar sus procedimientos almacenados. Pero en este caso, todos los procedimientos almacenados utilizaran el SQL dinmico, que tambin sera una pesadilla. Hay dos alternativas. Puedes servirte de la propia base de datos master del SQL Server, e instalar los procedimientos de tu aplicacin como procedimientos del sistema. Pero Microsoft no apoya esto, y hay problemas de seguridad, pues no te lo aconsejo. La otra solucin sera crear los procedimientos en cada base de datos, y desarrollar un sistema de manejar y distribuir tus objetos SQL. Tienes que hacerlo en todo caso, para poder modificar las tablas, y si los procedimientos estn en todas las bases de datos, puedes proporcionar versiones nuevas a los clientes que las quieren, sin afectar a los clientes que prefieren cambiar ms lentamente, por cautela o por mezquines. Cmo desarrollar un tal sistema es cuestin de la gestin de configuracin, un tema importante que no puedo analizar en este artculo. Pero te ofrezco dos consejos: el SQL Server Resource Kit incluye una herramienta
para crear objetos SQL directamente del Visual SourceSafe. Y yo puedo ofrecerte AbaPerls, unas herramientas que he desarrollado para satisfacer las necesidades de mi propio entorno: es gratis freeware y est disponible aquhttp://www.abaris.se/abaperls/.
Como he dicho antes, si no conoces la expresin CASE, consulta los Books Online. Nota que si las columnas tienen tipos de datos distintos, no puedes utilizarlas juntas en la misma expresin CASE, ya que una expresin CASE tiene slo un tipo de datos. Pero puedes solucionar este problema as: SELECT col1, col2, col3 THEN col1 ELSE NULL END, END, FROM tbl ORDER BY CASE @col1 WHEN 'col1'
El SQL Server MVP Itzik Ben-Gan ha escrito un buen artculo sobre este tema en el ejemplar de marzo 2001 de SQL Server Magazine, en el que propone otras soluciones.
SET ROWCOUNT 0
Quizs hayas odo que el SQL Server no hace caso de SET ROWCOUNT al crear un plan de consultas, y es cierto en el SQL Server 6.5 en todo caso, en esa versin no tienes TOP, pues no hay otra solucin pero s lo hace en el SQL Server 7 y 2000. Pero tienes que utilizar un parmetro no una variable local con SET ROWCOUNT o el optimizador no sabr el valor y puede decidir escnear la tabla. No olvides poner SET ROWCOUNT 0 tras la instruccin SELECT para que las instrucciones siguientes no sean afectadas. Books Online tiene unas advertencias sobre el use de SET ROWCOUNT, y aconseja no utilizar SET ROWCOUNT con instrucciones DELETE, INSERT y UPDATE No s precisamente por qu, pero creo que un INSERT en una tabla temporal con SET ROWCOUNT en vigor est bien. Un INSERT un una tabla que tiene desencadenadores puede sorprenderte, ya que el SET ROWCOUNT afecta el desencadenador tambin. Considera tambin por qu quieres hacerlo. Si quieres limitar los datos que se devuelven a una pgina de Internet, puede ser mejor leer cada vez 500 filas, para no volver siempre a la base de datos cuando el usuario hace clic en Prximo. Y a m me dan asco las pginas que limitan los datos que puedo ver a slo diez o veinte lneas -.
Servidores vinculados
Este caso parece similar a parametrizar el nombre de una base de datos, pero las respuestas no son exactamente las mismas. Si puedes crear un procedimiento almacenado en el servidor vinculado, puedes generar el nombre del procedimiento dinmicamente: SET @sp = @server + 'db.dbo.some_sp' EXEC @ret = @sp @par1, @par2...
Si quieres hacer una combinacin de una tabla local y una tabla en un servidor remoto que no puedes identificar de antemano, el SQL dinmico sera la mejor solucin. Pero hay una alternativa, aunque no es til en todos los casos. Puedes utilizar sp_addlinkedserver para crear un alias temporal: EXEC linksrv_demo_inner sp_addlinkedserver @datasrc=@@SERVERNAME RECOMPILE go AS WITH MYSRV, go @srvproduct='Any', CREATE SELECT EXEC sp_dropserver MYSRV PROCEDURE * FROM go
@provider='SQLOLEDB',
MYSRV.master.dbo.sysdatabases
CREATE PROCEDURE linksrv_demo @server sysname AS master..sysservers WHERE srvname = 'MYSRV') EXEC sp_addlinkedserver go MYSRV, @provider='SQLOLEDB', @datasrc=@server sp_dropserver MYSRV 'Server2'
IF EXISTS (SELECT * FROM EXEC sp_dropserver MYSRV @srvproduct='Any', EXEC EXEC linksrv_demo
EXEC linksrv_demo_inner
Hay dos procedimientos almacenados. El procedimiento externo crea el servidor vinculado MYSRV para acceder al servidor remoto que queremos utilizar en este momento, y lo quita una vez terminada la consulta. El procedimiento interno ejecuta la consulta, y he incluido WITH RECOMPILE para que SQL Server no vuelva a utilizar un plan de consultas viejo creado para otro servidor. Esta solucin slo funciona en estas circunstancias:
La persona que ejecuta el procedimiento debe tener los permisos para crear servidores vinculados por omisin sysadmin y setupadmin tienen esos permisos pues no sirve para los usuarios normales. Ya que los servidores vinculados se definen globalmente al nivel del servidor, varias personas no pueden ejecutar el procedimiento a la vez claro est que deberas utilizar el alias MYSRV solamente dentro de este procedimiento -.
Nota: si lo pruebas, es probable que funcione sin WITH RECOMPILE.. Puedes conseguir que funcione con la ejecucin de sp_addlinkedserver en el mismo procedimiento que la ejecucin de la consulta que utiliza el servidor vinculado, pero si ste no existe cuando SQL Server necesita crear un plan de consultas para el procedimiento pues no funcionar.
OPENQUERY
Muchas veces, el uso de las funciones de conjunto de filas OPENQUERY y OPENROWSET supone el uso del SQL dinmico, ya que su segundo argumento es una cadena de SQL y no admiten los variables. Resulta ser un poco incmodo, ya que puedes necesitar tres niveles anidados de comillas, pues la funcin quotestring() que ya hemos visto es muy til:
nvarchar(4000),
@localsql
nvarchar(4000),
SELECT @state = 'CA' SELECT @remotesql = 'SELECT * FROM dbo.quotestring(@state) * FROM OPENQUERY(MYSRV, ' + PRINT @localsql EXEC (@localsql) = 'SELECT
La funcin del sistema quotename() no es tan til, puesto que la instruccin SQL sobrepasa frecuentemente el lmite de 129 caracteres para el parmetro de entrada de quotename().
Menciones y contacto
Quisiera agradecerles a las personas siguientes que me han proporcionado valiosas sugerencias e ideas para este artculo: los SQL Server MVPs Tibor Karaszi, Keith Kratochvil, Steve Kass, Umachandar Jaychandran y Hal Berenson, adems de Pankul Verma, Anthony Faull, Marcus Hansfeldt, Jeremy Lubich y Simon Hayes. Quiero tambin agradecerles al ASP MVP Jongshin Kim su traduccin coreana del artculo, a Frank Kalis su traduccin alemn, y a Simon Hayes su traduccin espaol. Si tienes sugerencias o correcciones para el contenido, lenguaje o formateo de este artculo, por favor
envame un email: esquel@sommarskog.se . Si tienes preguntas tcnicas que cualquier persona informada puede contestar, te aconsejo preguntarlas en los newgroups microsoft.public.sqlserver.programming o comp.databases.ms-sqlserver.
Bsico
(3.-TIPOS
DE
DATOS
Continuamos con el curso de SAP ABAP ofrecido en www.abap.es. 3.1. TIPOS Y OBJETOS de datos 3.2. Tablas internas 3.3. Sentencias para abandonar bloques de proceso 3.4. SENTENCIAS DECLARATIVAS 3.5. SENTENCIAS DE PROCESAMIENTO DE DATOS
3.5.1. 3.5.2.
Sentencias
de
asignacin
conversin de
de
variables clculo
Sentencias
3.5.3. Sentencias de manejo de strings 3.1. TIPOS Y OBJETOS DE datos: Pueden declararse tipos de datos (son descripciones que definen los objetos de datos que se declaren luego, yno ocupan memoria) y objetos de datos (entidades fsicas que s ocupan memoria: variables. Tienen un tipo asociado, y se procesan segn el tipo que sea).
Tipos de datos:Por su estructura se clasifican en elementales(predefinidos: C, D, F, I, N, P, T, X. Estos nombres son fijos; y definidos por el usuario: a partir de los anteriores. Su nombre es libre) yestructurados(predefinidos: tablas del Diccionario de Datos (se declaran con TABLES); y definidos por elusuario: field-strings y tablas internas (ambos se declaran con DATA)).
TIPOS ELEMENTALES: Alfanumrico (Char, string) Fecha(Date) Coma flotante (Float) Entero (Integer) Numricos (Natural) Empaquetados (Packed) Hora (Time) Hexadecimales (Hex)
Tipo
Long. defecto
Valor inicial
C D F I N
1 8 8 4 1
P T X
8 6 1
0 000000 X00
La longitud se mide en caracteres, NO en bytes. Variables que no sean del mismo tipo exactamente pueden no ser totalmente compatibles, lo que puede provocar errores de conversiones numricas. Por ej., para operaciones de divisin usar el tipo P (packed), al menos para el recoger el resultado.
Internos:Literales (hardcodes de texto y nmeros. No se declaran), variables (se declaran con DATA) y constantes (se declaran con CONSTANTS). Externos: objetos del Diccionario Datos: tablas (se declaran con TABLES), obj. matchcode. Del Sistema: No se declaran, como SPACE, que es un espacio o una cadena en blanco, y campos y variables del sistema (Ej,: SY-SUBRC: cdigo de retorno de una operacin; SY-UNAME: nombre de usuario;SY-REPID: cdigo de report).
Especiales:parmetros (variables que toman su valor en la pantalla de seleccin. Se declaran conPARAMETERS), y criterios de seleccin (Se declaran con SELECT-OPTIONS).
3.2. TABLAS INTERNAS: Las tablas internas son las creadas como locales en un programa; no pertenecen al Diccionario de Datos. Slo son visibles localmente en el programa en el que se declaran. Se declaran con: DATA: BEGIN OF nombre_tabla OCCURS nm_entradas, END OFnombre_tabla.
Con OCCURS se especifica el nmero de lneas, registros o entradas mximo de la tabla. Sin este parmetro se declaran estructuras, que son cabeceras de tablas, es decir, no tienen entradas. Las tablas internas tienen un registro de cabecera, del mismo formato que cada entrada de la tabla, que es como un buffer que sirve para insertar o extraer entradas de ellas. Para insertar datos, se usa un MOVE normal para cada campo, con lo que se rellena la cabecera con los valores adecuados, y luego un APPEND nombretabla. As se inserta dicha cabecera como una nueva entrada en la tabla). Tambin se puede usar la sentencia COLLECT, que es similar a APPEND, salvo que si se inserta una entrada cuya clave ya existe, en lugar de crear una nueva, se suman los contenidos de los campos numricos no clave (si no hay, es como APPEND).
Para extraer datos, se debe recorrer la tabla (con un bucle LOOP AT nombre_tabla, por ejemplo) hasta llegar a la entrada buscada. Entonces, automticamente ya se tendr en el registro cabecera de la tabla dicha entrada, accesible directamente.
Con la sentencia CLEAR se limpia o borra el registro de cabecera (pone todos los campos a su valor inicial), pero no borra ninguna entrada de la tabla. En cambio con REFRESH se borran todas las entradas de la tabla, salvo la cabecera. Con FREE se eliminan la tabla y su cabecera.
Conviene controlar con un IF o un CHECK si la tabla est vaca o no antes de intentar imprimirla. Se puede usar la sentencia DESCRIBE TABLE tabla LINES nr_lneas. para guardar en la variable nr_lneas el nmero de lneas de la tabla, y as ver si es cero o no.
Para ordenar la tabla, usar la sentencia SORT nombre_tabla BY campo [ opciones]. Ej.:
datos
kna1. maestros de
DATA: BEGIN OF ztabla OCCURS 100, "declara una tabla con 2 campos y 100 entradas nombre LIKE kna1-name1,
REFRESH ztabla. " borra todas las entradas de la tabla, para asegurar que est vaca CLEAR ztabla. " borra el registro de cabecera de la tabla, por si era un valor basura
SELECT * FROM kna1. MOVE kna1-kunnr cliente. MOVE nombre. kna1-name1 TO TO ztablaztabla-
IF sy-subrc <> 0. WRITE No ningn dato. ELSE. LOOP AT ztabla. que recorre la imprimirla entera WRITE: cliente. END-LOOP. ENDIF.
3.3. Sentencias para abandonar bloques de proceso: Dichas sentencias son: STOP, EXIT, CHECK y REJECT. Son todas incondicionales salvo CHECK. La sentenciaCONTINUE vale para pasar a la siguiente vuelta de un bucle.
se
ha
encontrado
ztabla-nombre,
STOP. Incondicional. Se debe usar slo en el evento START-OF-SELECTION. Su efecto es cancelar todas las selecciones de las tablas de la base de datos, abandonando el evento, y activar el END-OFSELECTION(siempre lo activa. Si no se desea esto, debe usarse EXIT en lugar de STOP).
EXIT. Incondicional. Abandona totalmente el bloque actual o evento (excepto eventos AT) si no est dentro de ningn bloque, y activa la pantalla de salida. Puede usarse fuera de bucles (acaba subrutinas, acaba eventos, ) o dentro de ellos, para finalizar estos.
CHECK {
condicin
tabla_seleccin
| SELECT-OPTIONS }.
Condicional. Si la condicin es falsa, acaba el bloque de proceso o evento (si no est dentro de ningn bloque) actual; si es cierta, sigue (como si no hubiera ningn CHECK). Es decir, que si no se pasa el chequeo, se salta a la siguiente vuelta del bucle (funciona como un CONTINUE condicional), o abandona la subrutina, (funciona como un EXIT condicional). La opcin SELECT-OPTIONS slo puede usarse para CHECKs que vayan tras eventos GET. Su efecto es comprobar que la entrada leda de la tabla cumpla todos los criterios de seleccin asociados.
REJECT [
tabla_bd
].
Incondicional. Tras REJECT, se procesa el siguiente evento GET para la misma tabla, abandonando la seleccin actual. Opcionalmente se puede indicar una tabla de la base de datos jerrquicamente superior, con lo cual, tras ejecutar REJECT se procesa el siguiente GET de la tabla especificada (la siguiente vuelta del GET; la vuelta actual se abandona).
CONTINUE. Incondicional. Termina la vuelta de un bucle (DO, WHILE), de forma incondicional, pasando a la siguiente vuelta. Normalmente slo se puede usar dentro de un bucle de ese tipo.
TABLES tabla. As se declara el rea de trabajo de la tabla del D.D. especificada, para poder usarla. DATA variable [ (long) ] [ TYPE tipo | LIKE campo ] [ DECIMALS nm ] [ VALUE valor ]. Versin de DATA para declarar variables. El tipo por defecto es C (alfanumrico) y la longitud por defecto es la definida as para cada tipo (para los tipo C, longitud 1: un carcter). Otros tipos de datos simples son: I(integer), P (numrico empaquetado), N (numrico no empaquetado), D (date), Con LIKE, se toma como tipo el mismo que tenga el campo especificado. Con VALUE se inicializa a la vez que se declara. Ejemplo de sentencias DATAencadenadas:
DATA:
BEGIN
OF nombre, END
OF nombre.
Versin de DATA para field-strings: Los campos que se declaren en el field-string (es como un registro de cadenas) van separados por comas, y en cada uno se indica su tipo. Para acceder a ellos se escribe: nombre_registro nombre_campo, de forma anloga a las tablas.
DATA:
BEGIN
OFnombre_tabla.
Versin de DATA para tablas internas (son las creadas como locales en un programa; no pertenecen al
Diccionario de Datos. Slo son visibles en dicho programa. Con OCCURS se indica el nmero mximo de entradas. Si se pone 0, el tamao de la tabla no tiene lmite sintcticamente) o estructuras (no llevan OCCURS. Son como cabeceras de tablas, es decir, tablas sin entradas).
DATA:
BEGIN
OF
COMMON
PART nombre,
END
OF
COMMON
PART.
DATA para bloques de memoria comunes. Esto define una zona comn de memoria que puede ser compartida por varios programas, si se declara en todos ellos (con el mismo nombre). Dentro de la common part se declaran las variables, tablas internas, que deban ser compartidas.
longitud ambos se
| LIKE campo
] puede
]. forma
Para definir tipos de datos internos al programa. Para tipos estructurados (como registros o tablas. A los accede nombre campo) encadenada: TYPES: BEGIN OF nombre, END OF nombre. Tambin vale para tipos especficos de usuario. Ejemplo: TYPE cadena(30)TYPE C. Declara un string de 30 caracteres.
CONSTANTS cons
long
[ TYPE tipo
] VALUE valor
| IS
INITIAL [ DECIMALS nm
].
Sintaxis similar a la de DATA, pero para constantes simples. El parmetro VALUE es obligatorio. Con IS INITIAL, las constantes alfabticas se inicializan a blanco, y las numricas a cero.
CONSTANTS: BEGIN
OF nombre,
END
OF nombre.
Versin de CONSTANTS para registros constantes (como tablas constantes). Se accede a las componentes de un registro constante como si fuera una tabla interna.
FIELD-GROUPS nombre. Un field-group es una agrupacin de campos (es un registro interno de strings). Con esta sentencia se declara el nombre del grupo (conjunto) de campos. Se crea un field-group, an sin campos. Despus, con la sentencia INSERT se declaran los campos de que constar el conjunto (que deben existir previamente), y con la sentencia EXTRACT se dan valores a esos campos. No se reserva espacio de memoria para dichos campos, pues slo sern punteros a las variables correspondientes. No confundir esta sentencia con FIELD-SYMBOLS.
INCLUDEnombre. Inserta el cdigo fuente especificado (debe ser un programa tipo I de Include, no puede ser un programa on-line) en el lugar del programa principal donde est esta sentencia INCLUDE. Normalmente habr uno para las declaraciones globales (llamado include TOP) que usen varios programas, otro(s) para los procesos PBO(Process Before Output: se ejecutan antes de mostrar la pantalla de seleccin), otro(s) para los procesos PAI(Process After Input: se ejecutan despus de que el usuario haya hecho las selecciones de dicha pantalla, y haya lanzado el programa), como en un module pool tpico. Para usar en el programa estructuras ya definidas antes, se usa INCLUDE STRUCTUREpara definir as tablas internas.Ejemplo:
tabla
LIKE
DATA: BEGIN OF tabla OCCURS n. INCLUDE namestruct. DATA: END OF tabla. STRUCTURE
LOCAL variable. Se usa para declarar variables locales dentro de subrutinas (FORM ENDFORM). Si existe una variable global de mismo nombre, se salva su valor al entrar en la subrutina, y se restaura al salir, es decir, que la variable local deja de existir fuera de la subrutina.
STATICS var
long
[ TYPEtipo
[ VALUE valor
| IS
].
Tambin para variables locales. Se usa slo dentro de FORMs (subrutinas). Funciona como LOCAL, pero con la diferencia de que conserva a la salida de la subrutina el valor que se le d dentro de sta, en lugar de restaurar el valor previo: pero la variable slo ser visible en los procesos en los que est definida.
STATICS:
BEGIN
OF nombre,
, END
OF nombre.
Se usa para declarar un field string dentro de una subrutina o mdulo de funcin. Es similar a un DATA, pero es local al subprograma en el que se defina, y en sucesivas llamadas al mismo conserva su valor (no es destruido como ocurre con las variables locales; es esttico).
RANGES tabla_seleccin FOR campo. Define una tabla interna con igual estructura que la de un select-options. Permite usar IN (puede recoger un intervalo de valores). La diferencia es que en la pantalla de seleccin no aparece esta tabla de seleccin, cosa que ocurrira con un SELECT-OPTIONS(as puede drsele valor por programa, en lugar de que lo haga el usuario). Formato de esta tabla:
Tiene 4 campos: El campo SIGN indica si los valores frontera del intervalo (campos LOW y HIGH) estn incluidos (I) o excluidos. El campo OPTION puede ser: EQ (=), NE (<>), CP (contiene pattern), NP (no contiene pattern), BT (between), GT (>), LT (<), GE (>=), LE (<=). Los campos LOW y HIGH definen el intervalo o rango de valores (si es un valor individual slo se rellena (en) LOW). Esta tabla tendr una entrada por cada intervalo o valor individual definido. Todos estos campos son accesibles y modificables como los de cualquier otra tabla.
TYPE-POOL nombre_tipo. Para declarar grupos de tipos. Se acceden con la transaccin SE11 (Diccionario de Datos, que es donde se guarda la estructura del TYPE-POOL). En ellos slo pueden definirse constantes y tipos (con TYPE), y deben nombrarse empezando con el nombre del grupo de tipos seguido de _. Al ser objetos del D.D. podrn ser visibles en todos los programas SAP. Para llamarlos o acceder a ellos desde un programa se usa la sentencia (distinta) TYPE-POOLS. Ejemplo de declaracin:
* Se define el 'TIPO1' como agrupacin de un P y de un I. TYPE-POOL tipo1. TYPES: tipo1_packed TYPE P, tipo1_entero TYPE I.
TYPE-POOLS nombre_tipo. Sentencia Ejemplo: que sirve para acceder o llamar a un TYPE-POOL almacenado ya en el D.D.
como
cualquier
DESCRIBE FIELD var [ LENGTH long ] [ TYPE tipo ] [ COMPONENTS comps ] [ OUTPUT-LENGTH long ] [ DECIMALSdecimales ] [ EDIT MASK mascara ]. Sirve para determinar los atributos del objeto dado. Si al intentar acceder a l, ste existe, SYSUBRC valdr cero; en otro caso, distinto de cero. No confundir esta sentencia con DESCRIBE TABLE, que es anloga pero para tablas internas en lugar de variables simples.
CREATE
OBJECT objeto
clase
[ LANGUAGE lenguaje
].
Crea un objeto de la clase especificada. Se usa para declarar objetos OLE (por ejemplo, para asociar un fichero EXCEL a un report Abap/4).
FIELD-SYMBOLS<nombre_smbolo> [ STRUCTURE estructura DEFAULT valor ] [ TYPE [ LINE OF ] tipo ] pueden ser de [ LIKE [LINE asignrseles cualquier campos tipo. concretos, tarde de en OF ] forma el con dinmica, en tipo lugar haber de los ]. campos sentencia tipo (hay Con esta sentencia se pueden declarar campos simblicos. En ejecucin, con la sentencia ASSIGN, simblicos. Sintaxis: ASSIGNcampo1 TO<nombre_smbolo>. (los < >son obligatorios). campo1 puede Ms programa campo2 puede de otra otro como: ASSIGN campo2 TO<nombre_smbolo>., cualquier
un polimorfismo de datos en ejecuc.). Con la opcin STRUCTURE se asignarn estructuras al fieldsymbol. Sus campos se accedern con <fs>_campo. Con LINE OF se puede dat una tabla interna. No confundir Ejemplo: esta sentencia con FIELD-GROUPS.
* Con esto ya est declarado el campo simblico FIELD_SYMBOLS < mi_smbolo >.
DATA: campo1(2) TYPE C VALUE 'AA', campo2(2) TYPE P VALUE 34. ASSIGN campo1 TO < mi_smbolo >. "Aqu mi_smbolo es de tipo C y vale 'AA' ASSIGN campo2 TO < mi_smbolo >. "Ahora mi_smbolo es de tipo P y vale 34 (polimorfismo)
SELECTION-SCREEN, PARAMETERS, Son sentencias declarativas de la pantalla de seleccin. DESCRIBE Son sentencias Native SQL. 3.5. Sentencias de procesamiento de datos: MOVE campo1[offset1] TO campo2[offset2] [ PERCENTAGE nr ].
3.5.1. Sentencias de asignacin y conversin de variables: MOVEcopia el contenido del campo1 en campo2. Los offset permiten especificar slo una parte del campo origen y/o destino, y se escriben as: +nmero, todo pegado al nombre del campo. En PERCENTAGE puede especificarse un %, es decir, 0 < nr < 100 (si se usa esta opcin, campo1 y campo2 deben ser tipo C. El resultado es que el nr % de campo1 se mueve a campo2 justificado a la izquierda.MOVE hace conversiones de formato, si origen y destino no tienen igual tipo, lo que puede dar lugar a resultados errneos.
MOVECORRESPONDING tabla1 TO tabla2. Sentencia similar a MOVE, pero de un registro o cabecera de una tabla a otra igual (o no) en estructura. Si origen y destino no coinciden en todos los campos (en la estructura) slo se mueven aquellos campos quecoincidan (por nombre, no por posicin. Por tanto, para evitar errores de conversin, ambos campos de mismo nombre tambin deberan tener el mismo tipo y tamao).
WRITE campo1[offset1] TO campo2[offset2]. Similar a MOVE, salvo que el campo2 (destino) siempre debe ser de tipo texto. Por tanto, si el origen no es de texto, ser convertido. Pueden especificarse offsets a la hora de hacer estas conversiones. Con WRITE (campo1) TO no se mueve campo1 (va entre parntesis), sino su contenido (es una indireccin).
Convierte ese campo a su forma empaquetada, por ejemplo, nmeros sin ceros a la izquierda. Puede escribirse el resultado sobre la misma variable, o en otra distinta. UNPACK campo TO campo. La operacin inversa a PACK (es decir, convierte el campo a su forma desempaquetada). Ejemplo, rellenar con ceros a la izquierda un nmero, hasta completar la longitud del campo. CONVERT DATE e INVERT DATE Sentencias de conversin de fechas a formato interno de SAP (poco til). CONVERT TEXT campo1 INTO SORTABLE CODE campo2.
Sentencia que transforma un campo de texto simple a un campo tal que es ms rpidamente ordenable, insertando ndices, claves,
ADD campo2 TO campo1. Hace la operacin: campo1 := campo1 + campo2. Las dems sentencias de clculo son similares: en campo1 se almacenar el resultado de la operacin.
ADD n1 THEN n2 UNTIL ni GIVING | TO m. Hace la operacin: m := m + n1 + n2 + + ni. Se incluye m como sumando o no dependiendo de si se usaGIVING o TO.
ADD-CORRESPONDING tabla2 TO tabla1. Suma los campos que se correspondan (por su nombre) de 2 registros o tablas, y deja los nuevos valores en el segundo de ellos (tabla1).
SUBSTRACT campo2 FROM campo1. SUBSTRACT-CORRESPONDING tabla2 FROM campo1. MULTIPLY campo1 BYcampo2. MULTIPLY-CORRESPONDING tabla1 BY tabla2. DIVIDE campo1 BY campo2. DIVIDE-CORRESPONDING tabla1 BY tabla2. COMPUTEn = expresin. Permite realizar cualquiera de las operaciones aritmticaspermitidas:
Operaciones bsicas: +, -, *, /, MOD, ** (exponenciacin). Cubren las sentencias anteriores. Para todo dato numrico: ABS, CEIL (funcin techo), FLOOR (funcin suelo), SIGN (devuelve el valor del signo: -1, 0, 1), TRUNC (devuelve la parte entera), FRAC (devuelve la parte fraccionaria). Para coma flotante: COS, SEN, TAN, ACOS, ASEN, ATAN, COSH, SENH, TANH, EXP (en base e), LOG (en base e), LOG10 (en base 10), SQRT.
CONCATENATE c1
cn
[ SEPARATED
BY separador
] INTO campo.
Concatena los strings c1 cn (deben ser todos de tipo C), sin conversin de tipos. Devuelve SYSUBRC 0 si la operacin se ha completado correctamente, y 4 si el campo destino es demasiado pequeo para guardar la concatenacin.
CONDENSE campo
[ NO-GAPS].
El campo debe ser tipo C (una cadena), o bien lo trata como si lo fuera (por ejemplo, no incluye en los nmeros el carcter blanco inicial). Junta las palabras de campo dejando entre ellas slo un blanco. Con NO-GAPS se eliminan todos los blancos.
[ LENGTH long
].
el valor de campo.
REPLACE campo.
'B'
WITH
'hola'
INTO
Si campo era ABCB, el resultado ser AholaCB (reemplaza slo la primera ocurrencia). Devuelve cdigo de retorno 0 si la operacin fue correcta, y 4 si hubo algn error. SPLIT campo AT separador INTO c1 cn | INTO TABLE tabla. Parte campo en n partes, delimitadas por el separador dado, como / por ejemplo. Devuelve SYSUBRC 0 si los campos c1 cn tienen espacio suficiente, y 4 en caso contrario (los trunca).
SHIFT campo [ BY n PLACES ] [ UP TO campo1 ] [ LEFT | RIGHT ] [ CIRCULAR ][ LEFT DELETING LEADING campo1 ] [ RIGHT DELETING TRAILING campo1 ]. Desplaza campo n posiciones (1 por defecto) a la izquierda o derecha, de forma circular o no (segn se especifique) Rellena con blancos al desplazar.
TRANSLATE campo [TO UPPER CASE | TO LOWER CASE ] [ USING campo1 ][FROM CODE PAGE g1 TO CODE PAGE g2 ] [ FROM NUMBER FORMAT n1TONUMBER [ ONLY campo3 FORMAT n2 ]. ]. Segn se especifique, pasa el campo dado a maysculas o a minsculas.
El contenido de campo2 sobreescribe a campo1 en todas las posiciones donde campo1 tenga blancos, reemplazndolos por los caracteres de campo2 de las posiciones respectivas (por defecto se reemplazan blancos. Se puede especificar el carcter o caracteres a reemplazar en campo3. Se sustituyen todos los caracteres que se especifiquen en este campo, y se encuentren en campo1, pero sueltos, no formando un string). Devuelve 0 si al menos un carcter ha sido sobrescrito, y 4 en otro caso. Ejemplo:
WITH
SEARCH { campo | tabla } FOR criterio [ ABBREVIATED ][ STARTING AT inicio ][ ENDING AT final ] [ AND MARK ]. Busca en el campo dado el string criterio. Con ABBREVIATED se busca algo que empiece por las mismas letras que criterio. Se puede delimitar la bsqueda especificando las posiciones de inicio y fin con STARTING AT y ENDING AT. Con AND MARK se seala en maysculas la palabra en la que se encontr el string. Devuelve 0 si encontrado (estar en la posicin SY-FDPOS), y 4 en otro caso.
Rate This
4.1.SENTENCIAS PARA CREAR EL LISTADO 4.2.SENTENCIAS PARA LISTADOS INTERACTIVOS 4.3.SENTENCIAS PARA IMPRESIN EN PAPEL 4.1. SENTENCIAS PARA CREAR EL LISTADO: Generacin de listados para salida de datos mediante sentencias Abap/4.
WRITE [ AT ] [ / ] [ columna ] [ long ] campo [ opciones_de_formato ][ opciones_de_salida ][ AS CHECKBOX[INPUT OFF ] ] [ AS SYMBOL] [ ASICON ] [ AS LINE ]. Con la barra / se salta de lnea. El siguiente nmero ( columna) indica la columna donde empieza a escribirse. En long se indica la longitud de salida del campo (que puede diferir de la suya real) para su mejor visualizacin. Ejemplos: Para lneas, smbolos e iconos es obligatorio incluir en el programa el include correspondiente.
WRITE caja AS CHECKBOX. "Vale 'X' si est marcado, y ' ' si no lo est. INCLUDE < SYMBOL >. SYM_PHONE AS SYMBOL. INCLUDE < ICON >. ICON_ALARM AS ICON. WRITE WRITE
Para todos los tipo de datos:LEFT-JUSTIFIED, CENTERED, RIGHT-JUSTIFIED, UNDER campo (escribe en la lnea siguiente, justo bajo el campo dado), NO-GAP(omite el blanco posterior al
campo), USING
EDIT
MASK mscara
(forma
especial
de
presentar
un
campo), USING
NO
EDITMASK (desactiva la mscara definida en el Diccionario de Datos para ese tipo de campo), NOZERO (si el campo es todo ceros, los cambia por blancos).
Para
campos
numricos:NO-SIGN (no
escribe
el
signo), DECIMALS nr
(n
de
P), CURRENCYmoneda (formato de moneda. Todos los formatos estn almacenados en la tabla del sistema TCURX), UNIT unidad (unidad en la cual se mide un valor; tabla T006).
Para fechas: Las posibles maneras (automticas) de escribir una fecha son: DD/MM/AA, MM/DD/AA, DD/MM/AAAA, MM/DD/AAAA, DDMMAA, MMDDAA, AAMMDD. ULINE [ offset ] [ (long) ]. Con ULINE a secas se dibuja una lnea horizontal completa de subrayado. Puede hacerse sta ms corta. Ejemplo: ULINE /5 (50): Escribe una nueva lnea (por la /) a partir de la columna 5, de 50 caracteres de _ (este nmero debe ir entre parntesis).
VLINE. Dibuja una lnea vertical. SKIP [ SKIP TO n ]. LINE lnea. Saltan lneas (aparecen en blanco). Por defecto, con SKIPsin nmero salta 1 lnea. Salta a la lnea indicada (la primera del texto es la 1, y estn numeradas internamente). Se debe cumplir la condicin: 1 <= lnea <= mximo lneas por pgina.
SET
BLANK
LINES
ON | OFF.
Se activa o desactiva la posibilidad de escribir lneas en blanco (OFF por defecto), sin SKIP. NEW-LINE [ NO-SCROLLING | SCROLLING ]. Genera una nueva lnea en el listado, acabando la anterior y moviendo el cursor. Se consigue lo mismo con / en WRITE. NEW-PAGE y CALL SCREEN llevan implcita una NEW-LINE. Con NOSCROLLINGno se hace scroll de la lnea en el informe (bsico o secundarios). Esta opcin se desactiva con SCROLLING.
] ].
Genera una nueva pgina, pero no debe estar en blanco (pues sera ignorada). Se incrementa el contador de pginas SY-PAGNO. NEW-PAGE se ejecuta automticamente al alcanzar el n de lneas por pgina, o con la sentencia RESERVE (que reserva lneas al final de la pgina para el evento END-OFPAGE). El TITLE de la pgina es el ttulo, fecha y nmero de pgina. El HEADING es el elemento de texto de cabecera de las tabla del listado. LINE-COUNT indica el n de lneas de la pgina. LINE-SIZE indica el n de columnas de la pgina.
FORMAT [ COLOR color[ ON ]| COLOR OFF ][ INTENSIFIED [ ON ]| INTENSIFIED OFF ][ HOTSPOT [ ON ]| HOTSPOT
Esta sentencia da formato a los textos y listados que se muestran por pantalla, como colores e intensidad. Deja fijo el formato hasta un RESET (opcin de FORMAT) o hasta la siguiente sentencia FORMAT, mientras Ejemplo: que las opciones de formato de un WRITE slo afectan a dicho WRITE.
para
DETAIL. Equivale a la opcin INTENSIFIED OFF de la sentencia FORMAT. SUMMARY. Equivale a la opcin INTENSIFIED ON de la sentencia FORMAT. POSITION col. Posiciona el cursor en la columna especificada, para sobreescribir luego en ella con WRITE. BACK. Pone el cursor en la primera lnea de la pantalla, o bien tras las escritas por TOP-OF-PAGE o reservadas por la sentencia RESERVE.
RESERVEnLINES. Reserva espacio de n lneas al final de la pgina para el pie de pgina que escribe el END-OF-PAGE (si no se hace esto, no aparecer el pie de pgina).
SET
LEFT
].
Al generar un listado la posicin actual del cursor (columna SY-COLNO) se deja como lmite izquierdo del rea mvil (zona de la pantalla que puede tener scroll mediante barras de desplazamiento). El ancho de esta rea mvil se puede modificar. En col se puede especificar la posicin del nuevo lmite izquierdo de esta rea, de forma que las columnas a la izquierda de sta sern fijas, no sern desplazadas al hacer scroll horizontal.
SET
COUNTRY pas.
La escritura en pantalla de las fechas y de cantidades monetarias sale formateada de acuerdo con lo acostumbrado en el pas especificado. Se toman estos datos de la tabla T005X. Devuelve SY-SUBRC 0 si existe ese identificador de pas, y 4 en otro caso. 4.2. SENTENCIAS PARA LISTADOS INTERACTIVOS:
HIDE f1
[,
f2,
fn].
Almacena en memoria interna (rea hide) el contenido de una lnea de un listado interactivo (la lnea actual, la del cursor), mientras sta es mostrada. Se puede hacer incluso con lneas que no sean visualizadas en pantalla. Se usa en el evento AT LINE-SELECTION, que es el momento en el que el usuario hace doble clic sobre alguna lnea del listado interactivo. As, con esta sentencia se puede conocer (leer) la lnea que el usuario ha elegido. Los f1 fn son los camposque se estn imprimiendo en pantalla, susceptibles de que el usuario los seleccione (los que deben recordarse ).HIDE debe codificarse justo despus del WRITE que muestra el campo o variable a guardar en memoria, o bien el WRITE que muestra la lnea correspondiente (si concretamente esa variable no se va a visualizar). El rea hide es una tabla con tantas filas como lneas tiene el listado, y 2 campos o columnas por lnea (y por campo a almacenar): variable contenido. Aqu se guarda el valor de la variable dada, para cada lnea del listado.
WINDOW
STARTING
AT x1
y1 ENDING
AT x2
y2.
Muestra el listado secundario (detallado) en una ventana nueva aparte. (x1, y1) son las coordenadas (en(columnas, lneas), no en pixels) de la esquina superior izquierda de la ventana, y (x2, y2) son las coordenadas de la esquina inferior derecha. Se pueden crear status (mens, botones, ) especficos
para las ventanas, pero entonces no aparecer el men estndar ni la barra de herramientas (esas funciones bsicas quedarn desactivadas) salvo que se definan de nuevo. El status a crear para una ventana debe ser del tipo ventana de dilogo, no lista. Soporta todas las funciones de los listados secundarios.
Uso:Activa un nuevo status en pantalla. Un status es un conjunto de puntos de men, botones, iconos, teclas de funcin que se definen de forma especfica para una(s) pantalla(s) de un programa o informe. Algunos de estos elementos existen siempre activos en todo status de forma predefinida, pero pueden desactivarse. Cada punto de men, botn, debe tener definido su propio cdigo, distintos todos entre s, para que por programa pueda saberse cul se ha pulsado (mediante eventos como AT PFn, AT USER-COMMAND). Se pueden incluir funciones estndar, iconos, Para la barra de men se pueden adems incorporar normas.
Creacin de un status, por men: Herramientas Workbench Abap 4 Menu Painter Status (o bien haciendo doble clic sobre el nombre del status a crear, una vez escrita la sentencia SET PFSTATUS). Al finalizar el diseo del status, grabarlo y activarlo. En el programa, antes de mostrar el listado, poner la sentencia SET PF-STATUS name_status (8 caracteres mximo) para que ste aparezca en pantalla.
Desactivacin o exclusin de funciones (aparecern en gris y no se podrn pulsar): para ello se usa la opcin EXCLUDING. Tras EXCLUDING puede especificarse, o bien un cdigo concreto, o bien una tabla en la cual en cada entrada se ha guardado uno de los cdigos a desactivar (para el caso de que haya que excluir varios). Esto hace los status creados mucho ms reutilizables. Con INMEDIATELY se activa el status slo en la pantalla actual, y tras pasar a otra vuelve a activarse el status principal.
SET
TITLEBAR nmero_de_ttulo
[ WITH g1
g9].
Inserta un ttulo de pantalla, para la barra de ttulos de la ventana de Windows. Para crearlo, por men:Herramientas Workbench Abap 4 Menu Painter Lista Ttulos. Dar el nombre del programa asociado, crear, escribir el ttulo, grabar y activar (pues es un objeto SAP autnomo, no es un atributo interno del programa). Para que aparezca en pantalla, escribir: SET TITLEBAR nmero_de_ttulo. (es un cdigo de 3 caracteres que se refiere a una lnea de texto almacenado en la Lista de Ttulos). Esta sentencia debe ir antes del primer WRITE que constituya el listado. Con WITH se pueden introducir hasta 9 parmetros actuales g1 g9, que sustituirn a los actuales &1 &9.
READ LINE linea [ INDEX ndice ] [ FIELD VALUE f1 [ INTO g1 ] fn [ INTO gn ] ][ OF CURRENT PAGE | OF PAGE p]. En su forma bsica, lee el contenido de una lnea del listado: por defecto es la actual (SY-LILLI), donde se activ el evento AT LINE-SELECTION (esta sentencia debe usarse tras seleccionar una lnea); o la de nmero de lnea indicado en el parmetro INDEX. Dicho contenido se almacena como string en el campo del sistemaSY-LISEL. Adems, pone ese valor en el ledo en el campo f de un HIDE f, si hay. Devuelve un valor de retorno en SY-SUBRC (0 si la lectura fue correcta, 4 si hubo algn error, como que no haya lnea para leer). Con FIELD-VALUE, en lugar de recorrer la lnea como un string, la lee partida en las variables especificadas fi, o en las gi si se usa INTO. Con OF CURRENT PAGE se indica leer de la pgina actual, y con OF PAGE p se especifica la pgina donde est la lnea a leer.
MODIFY
LINE n
[ INDEX ndice
| OF
CURRENT
PAGE | OF
PAGE
OF p
modifics.
].
Modifica el contenido de la lnea n del listado, poniendo su contenido en el campo del sistema SY-
LISEL (que tambin puede modificarse con asignaciones). Devuelve cdigo de retorno 0 si la operacin fue correcta, y distinto de cero en otro caso. Enmodificadores puede especificarse un nuevo color, nuevo formato, Ejemplo:
* INPUT OFF indica campo de slo lectura MODIFY LINE 3 OFF COLOR = c. LINE FORMAT INPUT
SCROLL
LIST [
parmetros
].
Realiza el scroll de parte o de todo un listado, mediante programa. Permite desplazarnos por la lista, mediante unas barras de desplazamiento. Devuelve cdigo de retorno cero si el desplazamiento fue correcto, y distinto de cero en otro caso. Esta sentencia tiene muchas variantes, como: TO FIRST PAGE, TO LAST PAGE, TO PAGEpag, TO COLUMN col, FORWARD, BACKWARD, LEFT, RIGHT. Tambin tiene muchos parmetros, como INDEXn lista y LINE n lnea (todas las variantes de scroll los admiten).
DESCRIBE
LIST
NUMBER
OF
[ INDEX ndice
].
Esta sentencia es til para conocer el nmero total de pginas del listado, nmero de lneas, Con el parmetro INDEX se especifica de qu listado se leen esos datos.
DESCRIBE
] PAGE pag
[ INDEX ndice
opciones
].
Devuelve el nmero de lnea y de la pgina (actuales) del listado dado. Las opciones pueden ser: LINESIZE n cols, LINE-COUNT n filas,
SET
CURSOR
FIELD f
[ OFFSET var
[ LINE lnea
[ VALUE val
[ LENGTH long
].
Posiciona el cursor sobre una lnea dada del listado interactivo. Transfiere a la variable f el nombre ( no el valor) de la variable donde se posicion el cursor en el listado. Devuelve 0 en SY-SUBRC si la operacin fue correcta, y distinto de cero en otro caso. Si el cursor no se posiciona en una variable, sino en una constante, variable local o literal, SY-SUBRC sigue valiendo cero, pero en la variable f se guarda SPACE(un blanco).
Parmetros: Todos usan variables de salida (para recoger informacin). Con OFFSET se recoge la posicin del cursor en un campo concreto. Con LINE se obtiene la lnea donde se posicion el cursor, conVALUE el valor de ese campo, y con LENGTH la longitud de salida del campo (la longitud del substring mostrado, no la longitud de la definicin del mismo).
Uso:Esta sentencia se usa si el cursor queda dentro del rea visible del listado (normalmente ste ser mayor que lo que cabe en pantalla). Si no, no tiene efecto (se debera usar antes SCROLL LIST para mover el rea de visualizacin). El cursor puede posicionarse en lneas WRITE y SKIP, pero no sobre ULINEs.
col
line.
]. " posicionarse
col:
columna
GET
CURSOR
LINE f
[ OFFSET variable
[ VALUE val
[ LENGTH long
].
Devuelve la posicin del cursor, en pantallas o listados. Se obtiene el nmero de lnea en la que se posicion el cursor, para prevenir la seleccin de lneas no vlidas del listado. Los parmetros son como en la sentenciaSET CURSOR FIELD.
SET
USER-COMMAND cdigo.
Slo para listados interactivos. Se usa para forzar la ejecucin de un comando, definido en un men o status,sin que el usuario lo desencadene. Mueve dicho cdigo al campo SY-UCOMM. 4.3. SENTENCIAS PARA IMPRESIN EN PAPEL:
Llama al report especificado con un listado de salida a la base de datos (con n de copias, n de lista, ttulo, autorizacin, ). Para acceso al spool de la impresora se puede ir por el men: Sistema Servicios Control de impresin.
PARAMETERS parmetro [ (longitud) ] [ TYPE tipo | LIKE var ] [ DECIMALS num ][ DEFAULT valor ] [ MEMORY IDparm ] [ MODIF ID clave] [ FOR TABLE tabla][ NO-DISPLAY ] [ AS CHECKBOX ] [ LOWER CASE ] [ OBLIGATORY ][RADIOBUTTON GROUP grupo ] [ MATCHCODE OBJECT objeto ][ AS MATCHCODE STRUCTURE ] [ VALUE REQUEST ] [ HELP-REQUEST ].
Con esta sentencia se declara un parmetro en la pantalla de seleccin (es aquella, al principio de un programa, en la cual el usuario elige los criterios y condiciones con las que se va a ejecutar el programa). UnPARAMETERS permite que el usuario d un valor nico y concreto a un campo o variable del programa.Parmetros de esta sentencia:
TYPE tipo | LIKE var: Definicin del tipo del parmetro (deben tener un tipo, como las variables) de forma esttica (TYPE, dando un tipo) o dinmica (LIKE, toma el tipo de var). DECIMALS num: N de decimales a mostrar (slo para PARAMETERS de tipo numrico). DEFAULT se utiliza para asignar un valor por defecto al parmetro, antes del evento INITIALIZATION. Dicho valor aparecer en pantalla. El usuario puede cambiarlo si quiere. MEMORY ID parm: Permite iniciar un parmetro con el contenido de una var. de memoria. MODIF ID clave: La clave (de 3 caracteres mximo) es un grupo de modificacin. Esta opcin asocia unPARAMETERS a un grupo de modificacin que podr ser utilizado por las sentencias de modificacin de pantalla (como MODIFY SCREEN). Se da una clave a cada campo de la pantalla, y todos los campos que tengan igual clave (forman el grupo de modificacin) se tratarn conjuntamente, usando el campo del sistema SCREEN-GROUP1 = clave. Esto es muy til para module pools. Ejemplo:
test1 test2
(10) (10)
MODIF MODIF
ID ID
todos
los
NO-DISPLAY: Este PARAMETERSno ser visible, pero existe. Puede drsele valor usando la opcin DEFAULT, el evento INITIALIZATION, o al llamar al programa con SUBMIT (esta sentencia tiene opciones para dar valor a los parmetros del prog. llamado).
AS CHECKBOX: Crea el parmetro con la apariencia y funcionalidad de un checkbox. LOWER-CASE: Permite distinguir en el parmetro caracteres en mayscula y minscula. Si no se especifica esta opcin, al pulsar ENTER se pasa el valor introducido a todo maysculas. OBLIGATORY: Este campo o parmetro ser obligatorio (debe drsele algn valor).
RADIOBUTTON GROUPgrupo: Crea el parmetro como un botn de seleccin. Los botones van agrupados, de forma que en el mismo grupo de ellos slo se puede seleccionar 1. MATCHCODE OBJECT objeto. Asigna un objeto de matchcode a un parmetro, para que aparezca unmatchcode que, al desplegarlo, nos muestre valores posibles para el campo. (mediante tabla de valores asociada). Como valor para el campo, se puede incluir como comodn el asterisco. Con F4 el efecto es el mismo.
5.2. SELECT-OPTIONS:
[ DEFAULT v1
[ TO v2
[ OPTION o SIGN s]
][ MEMORY [ VALUE
ID parm ] [ MODIF ID clave] [ NO-DISPLAY ] [ LOWER CASE ][ OBLIGATORY ] [ NO-EXTENSION ] DATABASESELECTION ] [ MATCHCODE OBJECT objeto] REQUEST [ FOR LOW| HIGH ] ] [ HELP-REQUEST [ FOR LOW | HIGH ] ].
Con esta sentencia se declara un criterio de seleccin en la pantalla de seleccin. El nombre de dicho criterio debe tener 8 caracteres como mximo. Un SELECT-OPTIONS permite que el usuario d un rango de valores para un campo o variable, o bien varios intervalos, o bien uno o ms valores individuales, todo ello entremezclado como se desee. En las condiciones (en IF, opciones WHERE, CHECK, ) que involucrenSELECT-OPTIONS se usa el operador IN, ya que chequea si un valor dado est o no en el(los) rango(s) del criterio de seleccin. (para ] [ OPTION o SIGN s ]: Para La sentencia CHECK SELECT-OPTIONS equivale a CHECK var IN rango Parmetros de esta sentencia: el SELECT-OPTIONS correspondiente). indicar valores por defecto. v1 es el
DEFAULT v1
[ TO v2
valor LOW, v2 es el valorHIGH. Para valores de seleccin simples, las OPTIONs vlidas son: EQ, NE, GE, GT, LE, LT, CP o NP (la opcin por defecto es EQ). Para intervalos de seleccin, las OPTIONs vlidas son BT (between) y NB (la opcin por defecto es BT). Los valores vlidos para SIGN son I (inclusive), E (exclusive). El valor por defecto es I.
CASE, OBLIGATORY y MATCHCODE OBJECTobjeto: Igual que en PARAMETERS. NO-EXTENSION: Limita el criterio de seleccin a una nica entrada en la tabla (o bien 1 valor individual, o 1 rango). Para ello elimina el icono que posibilita las entradas mltiples. NO INTERVALS: Limita el criterio de seleccin a valores simples, es decir, no admite rangos, aunque se pueden poner varios valores individuales. NO DATABASE SELECTION: El criterio de selec. no es utilizado en la base datos lgica.
5.3. SELECTION-SCREEN:
SELECTION-SCREEN [ POSITION pos ] [ FUNCTION KEY i] [ SKIP [ n ]][ BEGIN OF BLOCKbloque [WITH FRAME [TITLEttulo ] ] [NO INTERVALS ] ][ END OF BLOCKbloque] [ BEGIN OF LINE ] [ END OF LINE][ PUSHBUTTON [/] pos (long) nombre USER-COMMAND code [ MODIF ID clave ] ][ COMMENT [ / ] pos (long) nombre [ FOR FIELD f ] [MODIF ID clave ]][ ULINE [ [ / ] pos (long) ] [ MODIF ID clave ] ].
Esta sentencia se usa para cambiar la apariencia de la pantalla de seleccin. Permite colocar marcos, bloques, reorganizar los distintos elementos, No es el evento AT SELECTION-SCREEN. Slo se puede usar uno de sus parmetros a la vez, es decir, que para cada nuevo cambio hay que escribir una sentenciaSELECTION Parmetros: SCREEN nueva. Slo se puede usar en reports (programas tipo 1).
POSITION pos: Sirve para colocar el cursor en una posicin determinada. Slo se puede usar anidado entre sentencias SELECTION-SCREEN BEGIN OF LINE y END OF LINE. FUNCTION KEY i se usa para crear iconos en el men o barra de herramientas. Se pueden activar hasta 5 de ellos. Se decide cul ha pulsado el usuario chequeando el campo del sistema SYUCOMM en el eventoAT SELECTION-SCREEN.
SKIP [ n ]: Produce n lneas en blanco (una por defecto). BEGIN OF BLOCK bloque : Sirve para crear bloques de elementos de pantalla (para agruparlos), los cuales se pueden anidar. La opcin WITH FRAME se usa para crear un marco visible que englobael bloque. Con TITLE se aade un ttulo identificativo en el marco creado. Con NO INTERVALSno se permite al usuario introducir intervalos en ningn campo de entrada del bloque (as no hace falta indicarlo por separado en cada uno de ellos). El bloque se cierra con END OF BLOCK, poniendo el mismo nombre para el bloque.
BEGIN OF LINE y END OF LINE: Estas dos opciones engloban un bloque de sentencias declarativas (PARAMETERS, SELECT-OPTIONS y/o SELECTION-SCREEN) que aparecern en la misma lnea de la pantalla de seleccin, en lugar de en columna.
PUSHBUTTON : Sirve para crear iconos en la propia pantalla de seleccin. Con la opcin USERCOMMAND se le asocia un cdigo de funcin. Para asociar texto a un icono debe usarse una sentenciaTABLES sscrfields. (tabla que contiene los campos de la pantalla). Para el botn llamado XX poner:sscrfields-flnctxrt-0x.x.
COMMENT : Permite incluir comentarios en la pantalla de seleccin (textos, labels). ULINE : Permite dibujar lneas horizontales (con subrayados). Se puede asociar la lnea a un grupo de modificacin (como el resto de elementos de la pantalla de seleccin.