You are on page 1of 51

SAP: ABAP Manual Bsico (1.

-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.

1.2. Otras transacciones:

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:

REPORT name MESSAGE-ID clase_mensaje.

"Clase por defecto en ese report.

*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).

1.3. Objetos parcialesDEL EDITOR Abap/4:

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,

1.4. COMANDOS DEL EDITOR:

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

programa: S(AVE) (almacena

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

(mouse), F5 (duplicar lnea), F6 (concatenar dos

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,

1.5. Elementos y componentes del lenguaje:

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).

1.6. OBJETOS DEL DICCIONARIO DE DATOS:

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).

SAP: ABAP Manual Bsico (2.-FLUJO DEL PROGRAMA)


FLUJO DE UN PROGRAMA ABAP/4 2.1. Control interno y externo 2.2. Expresiones lgicas y operadores 2.3. Sentencias Abap/4 de eventos (CONTROL EXTERNO) 2.4. Eventos para reports interactivos 2.5. Sentencias de control de flujo (INTERNO) 2.1. Control INTERNO Y externo:

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

INITIALIZATION. fecha+6(2) = '01'. fecha = fecha 1.

START-OF-SELECTION. WRITE fecha.


El tipo D indica tipo fecha (8 caracteres. En este caso con el formato aaaammdd); con DEFAULT se indica el valor inicial por defecto (en este caso es la fecha de hoy, que se obtiene del campo del sistema SY-DATUM).Offsets: fecha+6(2) selecciona desde el carcter 6 de la cadena fecha, los 2 siguientes (el primer carcter es el 0). As selecciona el da dentro de la fecha. Tambin, con fecha(n) se obtiene el carcter n-simo de ese string. La funcin STRLEN (campo) devuelve la longitud de salida de campo (no el mximo declarado, sino el valor relleno). Por tanto, este progra ma devuelve la fecha del ltimo da del mes anterior a la actual (el cual se calcula bien, ya sea 30, 31 28).

Otro ejemplo:

TABLES kna1.

SELECT-OPTIONS kunnr.

cliente

FOR

kna1-

INITIALIZATION. MOVE 'I' MOVE option. 'EQ' TO cliente-sign. TO cliente-

MOVE 'I56000' TO cliente-low.

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.

GET tabla[ LATE ]

[ 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:

SET PF-STATUS menu EXCLUDING 'CODE'. Exclusin de un nico cdigo de funcin

"

DATA: BEGIN OF tabla OCCURS 10, declara una tabla interna normal campo1(4). DATA: END OF tabla.

" Se

MOVE 'CODE' TO tabla-campo1. a excluir

" Cdigos

APPEND tabla.

MOVE 'BACK' TO tabla-campo1. APPEND tabla.

SET PF-STATUS menu2 EXCLUDING tabla.

Hay 3 formas para pasar datos del listado secundario al programa:

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).

DO 5 TIMES VARYING campo1 FROM 2 NEXT 3. WRITE campo1. ENDDO.

WHILE condicin

[ VARY campoFROMv1 NEXT v2

]. 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

OPENQUERY() Longitud de columna dinmica Menciones y contacto Historia de cambios

Por qu utilizar procedimientos almacenados?


Antes de examinar el SQL dinmico, quiero aclarar por qu utilizamos procedimientos almacenados, ya que podramos desarrollar una aplicacin que enva consultas de SQL ad hoc directamente del cliente o de la capa intermedia en lugar de ejecutar procedimientos. No utilizamos los procedimientos almacenados para divertirnos, sino porque llevan varias ventajas.

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.

2. Almacenar los planes de consulta en la cach


Otra ventaja importante de los procedimientos almacenados es el rendimiento. Cuando un procedimiento almacenado se ejecuta por la primera vez, el SQL Server crea un plan de consulta y lo almacena en la cach para poder reutilizarlo en el futuro. El SQL Server quita el plan de la cach cundo sea demasiado viejo, o cundo sea necesario crear un nuevo plan esto puede ocurrir durante la ejecucin del mismo procedimiento, pero no describo el proceso en este artculo -. SQL Server almacena planes de consulta para instrucciones SQL que no estn en un procedimiento almacenado, y es capaz de parametrizar la consulta: SELECT * FROM pubs..authors WHERE state = 'CA' pubs..authors WHERE state = 'WI' La segunda consulta utiliza el plan de consulta generado para la consulta anterior, ya que internamente SQL Server lo almacena as: SELECT * FROM pubs..authors WHERE state = @1 El SQL Server no puede parametrizar consultas complejas, y he observado que puede ser que no se encuentre un plan en la cach cuando la nica diferencia entre las dos consultas reside en el espacio blanco. Claro est que aunque el SQL Server utiliza parametrizacin de una manera eficaz, es ms probable que vuelva a utilizar el plan de consulta para un procedimiento almacenado. go SELECT * FROM

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.

3. Reducir el trfico en la red


El trfico en la red tambin afecta el rendimiento. Digamos que tienes una consulta compleja que alcanza 50 lneas de cdigo, pero cambias slo un par de valores en la clusula WHERE para cada ejecucin. Poner esta consulta en un procedimiento reduce la cantidad de bytes que se transmite por la red, lo que puede mejorar el rendimiento si hay mucho trfico. La diferencia es an ms evidente cuando tienes una serie de instrucciones SELECT/INSERT/UPDATE interrelacionadas. Un procedimiento almacenado te permite utilizar tablas temporales o variables de tabla para procesar todos los datos en el servidor. Si utilizas instrucciones de SQL ad hoc, tienes que enviar todos los datos entre el servidor y el cliente o la capa intermedia. En realidad, esto no es cierto, ya que puedes crear tablas temporales sin un procedimiento almacenado, pero en este caso puedes tener problemas con el connection pooling y los recordsets -.

4. Utilizar parmetros de salida


Si quieres ejecutar una consulta de SQL ad hoc que devuelve una sola fila, debes utilizar un conjunto de resultados. Un procedimiento almacenado ofrece la posibilidad de utilizar parmetros de salida, lo que resulta ser mucho ms rpido. Si ejecutas slo una consulta, no notars la diferencia, pero si ejecutas la consulta siguiente 2000 veces, es probable que ganes mucho devolviendo @key como parmetro de salida en lugar de un conjunto de resultados: INSERT tbl (...) VALUES (...) SET @key = @@identity

5. Establecer bloques de lgico


Ahora, no hablo de seguridad ni de rendimiento, sino de manejar bien tu cdigo. Los procedimientos almacenados permiten evitar la tarea de generar instrucciones SQL en tu cdigo cliente. Pero sera igualmente posible crear funciones en tu aplicacin que generan el cdigo SQL segn tus parmetros aunque puede que el cdigo SQL quede escondido en las profundidades de tu cdigo cliente -. Existe un caso especial: escribes procedimientos almacenados para administradores y DBAs, y por lo cual siempre sern ejecutados desde el Analizador de Consultas. En este caso, no hay otra manera de agrupar tu cdigo en bloques de lgico.

6. Manejar las dependencias


En un sistema complejo que incluye unos centenares de tablas, muchas veces quieres saber dnde se usa una tabla o columna determinada, por ejemplo si quieres cambiar una columna de alguna manera. Si todo el cdigo est en procedimientos almacenados, slo tienes que buscar en el texto de los procedimientos para encontrar las referencias. O puedes recrear la base de datos sin la columna o tabla, para ver qu efecto tiene el cambio. Existen tambin la tabla de sistema sysdepends y el procedimiento almacenado de sistema sp_depends que lo utiliza. Pero es difcil conseguir que los datos en sysdepends sean siempre correctos.

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)

SELECT @col = N'au_fname' MIN(' @col

convert(varchar(20),

N')) FROM authors' OUTPUT SELECT @min

EXEC sp_executesql @sql, N'@min varchar(20) OUTPUT', @min

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 @sql1 = N'SELECT COUNT(*)' EXEC('EXEC sp_executesql N''@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

@state char(2), SELECT @sql1 = N'SELECT @cnt = COUNT(*)' = @state'

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().

Los cursores y el SQL dinmico


Normalmente, deberas evitar los cursores, pero la gente suele preguntar cmo utilizar el SQL dinmico con los cursores, por lo cual presento un ejemplo. No es posible decir DECLARE CURSOR EXEC(), pues tienes que incluir la sentencia entera en una cadena para usar el SQL dinmico: SELECT @sql = 'DECLARE my_cur CURSOR FOR SELECT col1, col2, col3 FROM ' + @tabla EXEC sp_executesql @sql

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:

DECLARE @my_cur CURSOR cursor OUTPUT', @my_cur OUTPUT

EXEC sp_executesql FETCH NEXT FROM @my_cur

N'SET @my_cur = N'@my_cur

CURSOR FOR SELECT name FROM dbo.sysobjects; OPEN @my_cur',

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.

El SQL dinmico y los procedimientos almacenados


Ahora podemos examinar los motivos por los cuales utilizamos procedimientos almacenados, y el impacto del SQL dinmico. Vamos a servirnos del procedimiento siguiente como ejemplo: CREATE @key PROCEDURE general_select @tblname nvarchar(127),

key_type AS -- key_type is char(3)

EXEC('SELECT col1, col2, col3

FROM ' + @tblname + '

WHERE keycol = ''' + @key + '''')

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.

2. Almacenar los planes de consulta en la cach


Ya hemos visto que el SQL Server almacena y reutiliza planes de consulta para las consultas de SQL ad hoc y tambin para los procedimientos almacenados, aunque suele ser ms eficaz utilizar procedimientos. En el SQL Server 6.5 estaba claro que el SQL dinmico era ms despacio, ya que el SQL Server tena que compilar cada consulta dinmica, pero en las versiones ms recientes la cuestin no es tan clara. Por ejemplo, al revisar el procedimiento general_select mencionado arriba, se nota que el plan de consulta ser almacenado en la cach, y puede ser parametrizado para los valores de @tblname. Pero sera exactamente igual si generaras la consulta dentro de tu aplicacin. A pesar de todo eso, cabe destacar el hecho de que el uso apto del SQL dinmico puede mejorar el rendimiento. Supongamos que tienes una consulta compleja en un procedimiento almacenado muy largo, y el mejor plan de consulta depende mucho de la cantidad y valores de los datos en tus tablas. Puedes convertir esta consulta en SQL dinmico, esperando que el SQL Server no utilice el plan de la cach si hay en tu

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.

3. Reducir el trfico en la red


En las dos secciones anteriores, hemos visto que el SQL dinmico dentro de un procedimiento almacenado no tiene ninguna ventaja sobre una consulta de SQL puro elaborado dentro de una aplicacin. Pero desde el punto de vista de la red, es cierto que hay una ventaja: el SQL dinmico en un procedimiento almacenado no tiene ningn impacto en al red. En el caso de general_select, no ganas mucho, ya que el nmero de bytes en la consulta dinmica es casi igual al nmero que se necesita para ejecutar el procedimiento. Pero digamos que tienes una consulta compleja en que seis tablas se estn combinando con condiciones complejas, y que una de las tablas se llama algo as como ventas0101, ventas0102 etc., segn la demanda del usuario. El diseo de las tablas no es bueno, como pronto veremos, pero supongamos que no lo puedes cambiar por el momento. Si utilizas un procedimiento almacenado, slo envas un parmetro con el ao y mes al servidor, en lugar de enviar la consulta entera. Si se ejecuta la consulta una vez cada hora, no ganas mucho, pero si se ejecuta todos los cinco segundos y si la red no tiene la capacidad adecuada, es muy probable que ganes algo.

4. Utilizar parmetros de salida


Si escribes un procedimiento nicamente para poder utilizar un parmetro de salida, no afectas nada sirvindote del SQL dinmico. Pero tambin puedes aprovecharte de parmetros de salida sin escribir tu propio procedimiento ejecutando sp_executesql directamente desde tu aplicacin.

5. Establecer bloques de lgico


No puedo aadir mucho sobre este tema, pero quiero sealar que cuando utilizas los procedimientos almacenados, es mejor esconder los detalles de tu base de datos dentro de tus procedimientos, as que se convierten en una capa de abstraccin. Hacindolo as, tener nombres de tablas como parmetros no es una buena idea, salvo en el caso de herramientas para los sysadmins.

6. Manejar las dependencias


El SQL dinmico impide el mantenimiento eficaz de las dependencias, ya que siempre esconde una referencia que luego no existe en sysdepends. La dependencia tampoco se revela al crear una nueva base de datos sin el objeto referenciado. Pero si puedes evitar el uso de tablas o columnas como parmetros, todava puedes buscar en tu cdigo SQL para saber si hay referencias a una tabla o columna determinada. Por lo tanto, si utilizas el SQL dinmico, intenta siempre referirte a las tablas y columnas en el cdigo de los procedimientos.

La inyeccin de SQL: un problema grave de seguridad


La inyeccin de SQL es una tcnica que permite que un atacante manipule tu cdigo SQL para ejecutar algo que t no quieres ejecutar. Te expones a ataques mediante la inyeccin de SQL cuando pasas algo directamente del cliente a tu cdigo SQL, o sea SQL dinmico en un procedimiento, o sea SQL generado en tu aplicacin. La inyeccin de SQL afecta todas las bases de datos relacionales, no slo SQL Server. Consideramos este ejemplo: CREATE PROCEDURE search_orders @custname varchar(60) = NULL, SELECT

@prodname varchar(60) = NULL AS 'SELECT * FROM orders WHERE 1 = 1 '

DECLARE @sql nvarchar(4000) IF @custname IS NOT NULL

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.

Las buenas prcticas de cdigo y el SQL dinmico


Escribir cdigo para ejecutar el SQL dinmico puede parecer fcil, pero en realidad debes tener cierta disciplina para no perder el control del cdigo. Si no tienes cuidado, tu cdigo acaba siendo complicado, as que es muy difcil leerlo, detectar problemas, y mantenerlo. Miramos de nuevo el procedimiento almacenado horroroso que esgeneral_select: CREATE @key PROCEDURE general_select @tblname nvarchar(127),

key_type AS -- key_type is char(3)

EXEC('SELECT col1, col2, col3

FROM ' + @tblname + '

WHERE keycol = ''' + @key + '''')

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'

EXEC sp_executesql @sql, N'@key key_type', @key = @key

Como ya ves, he hecho varios cambios:

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)

WHERE keycol = "' + @key + '"'

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.

Cundo utilizar o no el SQL dinmico


Mientras leyendo los newsgroups dedicados al SQL Server, se ve casi todos los das alguien que responde a una pregunta diciendo utiliza el SQL dinmico sin mencionar el impacto en los permisos y el uso de la cach. Aunque muchas de estas preguntas parecen no tener otra solucin si se entiende bien la pregunta muchas veces existe un problema de lgico o diseo que tiene una mejor solucin que es absolutamente diferente. En esta seccin, examino unos casos donde podras servirte del SQL dinmico en algunos, puede ser la solucin ms adecuada, pero en otros es una mala solucin, y en otros casos la pregunta viene de un concepto bsico completamente equivocado.

select * from @tabla


Se pregunta muy frecuentemente por qu lo siguiente no funciona: CREATE PROCEDURE my_proc @tablename sysname AS @tablename Ya hemos visto que se puede escribir un procedimiento almacenado para hacer esto, pero tambin hemos visto que ese procedimiento no tendra sentido. Si esto te parece la buena manera de programar el SQL, pues olvida completamente los procedimientos almacenados. Parece que la gente quiere hacer esto por varios motivos. Hay personas poco experimentadas en la programacin SQL que tiene mucha experiencia en otros lenguajes como C++, VB etc. En aquellos lenguajes, la parametrizacin es una buena idea, ya que tener cdigo muy genrico para facilitar el mantenimiento es una virtud. Pero resulta que cuando hablamos de objetos en una base de datos, este principio no se aplica debes considerar cada tabla y columna como un objeto nico y constante. Por qu? Pues porque al crear un plan de consultas, cada tabla tiene sus propias estadsticas y relaciones, y el SQL Server debe tratarlas individualmente. Adems, si tienes un modelo complejo, es importante saber qu tablas y columnas estn en uso. Sin lugar a dudas, al empezar utilizar nombres de tablas y columnas como parmetros, es el momento en que pierdes el control. Pues si quieres escribir algo como el procedimiento sobredicho para no teclear tanto, has malentendido. Es mucho mejor escribir diez o veinte procedimientos almacenados, aunque sean muy similares. No obstante, si tienes muchas consultas complejas, puede que ganes mucho tiempo manteniendo un slo procedimiento en lugar de varios. En este caso, puedes considerar el uso de un pre-processor como en C/C++: el cdigo reside en un include file, que luego se utiliza para crear mltiples procedimientos almacenados para las varias tablas. SELECT * FROM

select * from ventas + @yymm


Este caso es algo similar al caso anterior, pero mientras que antes se supona que exista una cantiadad fija de tablas, parece que hay gente cuyos sistemas crean tablas dinmicamente, p.ej. cada mes una nueva tabla para los datos de ventas. Tener un procedimiento para cada tabla no es una solucin prctica, ni siquiera con la ayuda de un pre-processor. No hay otra solucin que el SQL dinmico? Pues tenemos que distanciarnos un poco para ver que el concepto bsico es incorrecto, ya que el modelo es defectuoso. En sistemas basados en Access o en archivos de datos muy simples, puede ser necesario tener una tabla para cada mes, pero en SQL Server u otro sistema de base de datos de alto rendimiento, no suele ser necesario. El SQL Server y sus competidores fueron diseados para manejar grandes cantidades de datos, y para acceder a los data mediante las columnas claves. Es decir, el ao y el mes son parte de la restriccin PRIMARY KEY en una sola tabla denominada ventas. Si tienes un sistema de legado, disear de nuevo la base de datos puede costar mucho pero mantener el cdigo ms complejo basado en el SQL dinmico tambin to costar -. Si ests desarrollando un nuevo sistema, ni pienses en crear tablas dinmicamente: ser muy difcil mantener el cdigo para utilizar las tablas, y si creas las tablas muy frecuentemente por ejemplo una tabla para cada carrito en una tienda web corres el riesgo de crear un punto de contencin en las tablas del sistema, lo que perjudica el rendimiento. Quiz no ests convencido, y ests pensando pero tengo millones de filas, la base no funcionar si estn todas en la misma tabla. Bueno, si tienes muchas filas pues s tienes que preocuparte, pero no hablo de unos millones de filas, lo que representa una tarea bsica para el SQL Server, siempre que has bien escogido tus ndices. Pero si tienes unos centenares de millones de filas, puede que tengas que considerar otras opciones: el SQL Server 2000 ofrece posibilidades como vistas dividas e incluso vistas dividas distribuidas que te permiten dividir tus datos en varias tablas pero seguir accedindoles como si estuvieran en una sola tabla. (Nota que aunque he hablado del nmero de filas, para simplificar el tema, pero lo que realmente importa es el tamao total de la tabla, lo que depende de la longitud de las filas.)

update tabla set @columna = @valor where keycol = @key


Aqu, quieres cambiar los datos en una columna que seleccionas en el momento de la ejecucin. La sintaxis de la sentencia arriba es correcta en T-SQL, pero lo que ocurre es que el valor de @valor se asigna a @colname una vez para cada fila afectada en la tabla. En este caso, utilizar el SQL dinmico supone que el usuario tiene los permisos de UPDATE en la tabla, lo que se suele evitar, pues sera mejor no utilizarlo. Aqu hay otra solucin que no es nada complicado: UPDATE tbl END, ... Si no conoces la expresin CASE, por favor consulta los Books Online. Es una caracterstica muy potente del lenguaje SQL. Pero hay que preguntarse otra vez por qu la gente quiere hacer esto. Quiz sus tablas sean algo como ste: CREATE sales_1 TABLE products NOT NULL, NULL, sales_2 money (prodid prodid_type NOT NULL, ... NULL, SET col1 = CASE @colname WHEN 'col1' THEN @value ELSE col1

col2 = CASE @colname WHEN 'col2' THEN @value ELSE col2 END,

prodname name_type money

... PRIMARY KEY (prodid))

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

select * from @bbdd + ..tabla


En este caso la tabla reside en otra base de datos cuyo nombre se determina dinmicamente. Por lo visto, la gente tiene varios motivos para querer hacer esto, y cada motivo tiene una solucin distinta. Acceder a datos en otra base de datos. Si por algn motivo tu aplicacin necesita dos bases de datos, deberas evitar fijar los nombres en tu cdigo, ya que tendrs un problema si quieres crear un entorno de prueba en el mismo servidor. Se suele pensar a sacar el nombre de la otra base de una tabla de configuracin, y generar una consulta dinmicamente. Pero hay otra solucin, si puedes poner tu cdigo en un procedimiento en la otra base de datos: SET @sp = @dbname + '..some_sp' EXEC @ret = @sp @par1, @par2...

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/.

select * from tabla where columna in (@listado)


Una pregunta muy frecuente, y la respuesta utiliza el SQL dinmico es demasiado comuna. El SQL dinmico es una mala solucin: no deberas necesitar permisos SELECT para hacer esto, y si la lista tiene muchos elementos, el rendimiento ser fatal con el SQL dinmico. Qu es la solucin? Conviertes la cadena en filas en una tabla con una funcin definida por el usuario o un procedimiento almacenado. Aqu no doy ningn ejemplo, ya que he escrito otro artculo en el que analizo muchos mtodos para solucionar este problema, e incluyo los datos de rendimiento para cada uno. El SQL dinmico llega ltimo! Es un artculo muy largo, pero hay vnculos a la solucin ms adecuada para cada versin de SQL Server:Arrays and Lists in SQL Server.

select * from tabla where @criterios


Si piensas escribir un procedimiento almacenado como ste, olvdalo: CREATE PROCEDURE search_sp @condition varchar(8000) AS tbl WHERE @condition Si haces esto, todava ests generando las consultas SQL en tu aplicacin en lugar de adoptar los procedimientos almacenados. Ve tambin la prxima seccin. SELECT * FROM

Criterios de bsqueda dinmicos


Muy frecuentemente, un usuario debe poder ejecutar una consulta seleccionando varios criterios distintos. Cualquier desarrollador se da cuenta de que escribir una consulta esttica para cada combinacin de parmetros es imposible, y la mayor parte de los desarrolladores creen que poner todas las posibles condiciones en una sola consulta compleja no proporcionar un buen rendimiento. Aqu, s, el SQL dinmico debe ser la mejor solucin. Siempre que los permisos no sean un problema, utiliza el SQL dinmico, que es lo mejor para el rendimiento y el mantenimiento. He escrito otro artculo Dynamic Search Conditions en el que tengo ejemplos de escribir este tipo de consulta mediante el SQL dinmico y esttico.

select * from tabla order by @columna


Es fcil evitar el SQL dinmico as: SELECT col1, col2, col3 END FROM tbl ORDER BY CASE @col1 WHEN

WHEN 'col1' THEN col1 'col3' THEN col3

WHEN 'col2' THEN col2

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'

CASE @col1 WHEN 'col2' THEN col2 ELSE NULL

CASE @col1 WHEN 'col3' THEN col3 ELSE NULL END

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.

select top @n from tabla order by @columna


Una solucin bsica sin utilizar el SQL dinmico: CREATE PROCEDURE get_first_n @var int WITH RECOMPILE AS SELECT * FROM authors ORDER BY au_id SET ROWCOUNT @var

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 -.

create table @tabla


En este caso, no hay problemas ni de seguridad ni de la cach no hay un problema de permisos, puesto que el usuario necesita los permisos de CREATE TABLE incluso cuando el comando est esttico y en un procedimiento almacenado -. Y adems, tampoco hay problemas con las dependencias, pues al parecer no existen razones contra el SQL dinmico. Pero s hay una pregunta importante: Por qu? Qu motivo puedes tener? Quiz sea razonable en un script de sysadmin si necesitas crear un par de tablas similares, pero si vas creando tablas dinmicamente en tus aplicaciones pues te has saltado todas las reglas de diseo de los bases de datos. En una base de datos relacional, el conjunto de tablas y columnas debera ser fijo. Puede cambiar al instalar una nueva versin, pero no durante la ejecucin de tu aplicacin. Hay ms detalles en esta seccin: select * from ventas + @yymm A veces parece que la gente quiere crear nombres nicos para tablas temporales, pero es absolutamente innecesario puesto que el SQL Server ya tiene esta caracterstica. Puedes crear una tabla temporal con la sintaxis siguiente: CREATE TABLE #nisse (a int NOT NULL) El nombre real de la tabla ser ms largo, y slo la conexin actual puede ver esta instancia de #nisse. Si quieres crear una tabla permanente para cada conexin quizs utilices conjuntos de resultados desconectados y entonces no puedes utilizar las tablas temporales -, puede ser mejor crear una sola tabla para todos las conexiones, cuya primera columna es una clave nica generado para cada conexin.

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

EXEC linksrv_demo 'Server1'

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:

DECLARE @state SELECT

@remotesql char(2) @localsql

nvarchar(4000),

@localsql

nvarchar(4000),

SELECT @state = 'CA' SELECT @remotesql = 'SELECT * FROM dbo.quotestring(@state) * FROM OPENQUERY(MYSRV, ' + PRINT @localsql EXEC (@localsql) = 'SELECT

pubs.dbo.authors WHERE state = ' + dbo.quotestring(@remotesql) + ')',

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().

Longitud de columna dinmica


Digamos que tienes un procedimiento almacenado que devuelve unos datos, y se ejecutar directamente en el Query Analyzer probablemente esun procedimiento para los sysadmins -. Para formatear los resultados, quieres cambiar la longitud de las columnas para que no haya ningunos espacios en blanco a finales de los resultados, pero tampoco quieres truncar los datos. Puedes realizar esta tarea con el SQL dinmico, y ya que se suele utilizar una tabla temporal, no hay problemas de permisos. No doy un ejemplo, pero te aconsejo mirar cdigo existente, en el procedimiento almacenado popular pero no documentado sp_who2. Puedes visualizar el cdigo ejecutando exec master..sp_helptext sp_who2, o con el Object Browser en Query Analyzer o Enterprise Manager. Hay otro ejemplo en mi website, en el procedimiento aba_lockinfo.

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.

SAP: ABAP Manual OTRAS SENTENCIAS)

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

Long. Mx. (n char) de 1 65535 8 8 4 de 1 65535 de 1 a 16 6 de 1 65535 a a a

Valor inicial

C D F I N

1 8 8 4 1

SPACE 00000000 0.0 0 00

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.

Objetos de datos:Se clasifican en los siguientes grupos:

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.:

TABLES "tabla de los los clientes.

datos

kna1. maestros de

DATA: BEGIN OF ztabla OCCURS 100, "declara una tabla con 2 campos y 100 entradas nombre LIKE kna1-name1,

cliente LIKE kna1-kunnr. DATA: END OF ztabla.

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-

APPEND ztabla. " para insertar efectivamente en la tabla END-SELECT.

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

" bucle tabla, para ztabla-

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.

3.4. SentenCIAS DECLARATIVAS:

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: texto1 TYPE C VALUE 'X', texto2(4) 'HOLA'. TYPE C VALUE

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

OF nombre_tabla OCCURS nm_entradas, END

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.

TYPES tipo campos de

longitud ambos se

[ TYPE tipo con

| LIKE campo

] puede

[ DECIMALS nmero usarse TYPES de

]. 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:

* Equivale a DATA namestruct OCCURS n.

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

INITIAL ][ DECIMALS num

].

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:

DATA: BEGIN OF tabla OCCURS 0, SIGN(1) TYPE C,

OPTION(2) TYPE C, LOW HIGH LIKE campo, LIKE campo.

DATA: END OF 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.

* Con esto ya es visible en el programa el 'TIPO1' antes creado. TYPE-POOLS tipo1.

* Se usa 'TIPO1' otro predefinido

como

cualquier

DATA: campo TYPE tipo1_entero.

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 ].

y SELECT-OPTIONS TABLE, WRITE TO INDEX, CLEAR y FREE

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).

PACK campo TO campo.

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,

3.5.2. Sentencias de clculo:

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.

3.5.3. Sentencias de manejo de strings:

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.

SET LOCALE LANGUAGE lenguaje [ COUNTRY pas ][ MODIFIER modificador].

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.

REPLACE string1 WITH string2 INTO campo Ejemplo:

[ LENGTH long

].

Reemplaza (slo la primera ocurrencia) de string1 por string2 en

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.

OVERLAY campo1 WITH campo2

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:

OVERLAY 'AAAMMBBCCA' 'ZXCVBNMASS' ONLY 'AB'. *Resultado --> 'ZXCMMNMCCS'

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.

SAP: ABAP Manual Bsico (4.-GENERACIN DE LISTADOS)


ENERO 24, 2012 DEJA UN COMENTARIO

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

INCLUDE < LINE >. WRITE LINE_TOP_LEFT_CORNER AS LINE.

Las opciones de formato son como las de la sentencia FORMAT:

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

decimales), EXPONENT exp

(slo se define para el tipo F), ROUND redondeo (para el tipo

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.

NEW-PAGE [NO-TITLE | WITH-TITLE ] [ LINE-SIZEcolumnas

[ NO-HEADING | WITH-HEADING ][ LINE-COUNT lneas

] ].

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

OFF ][ INPUT [ ON ]| INPUT OFF ][INVERSE [ ON ]| INVERSE OFF ][ RESET].

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.

*Color predeterminado encabezados. FORMAT COLOR COL_HEADING.

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

SCROLL-BOUNDARY [ COLUMN col

].

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.

SET PF-STATUS status EXCLUDING cdigo | tabla [ INMEDIATELY ].

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

LINES lneas PAGES pags

[ 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

LIST [ LINE lnea

] 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.

Ejemplos (otras variaciones de la sentencia):

SET CURSOR " no tiene 'FIELD'

col

line.

SET CURSOR LINE line [ OFFSET col

]. " 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:

NEW-PAGE PRINT SET MARGIN PRINT-CONTROL SUBMIT TO SAP-SPOOL report.

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.

SAP: ABAP Manual Bsico (5.-PANTALLA DE SELECCIN)


5.1.PARAMETERS 5.2.SELECT-OPTIONS 5.3.SELECTION-SCREEN 5.1. PARAMETERS:

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:

PARAMETERS: sc1, sc2.

test1 test2

(10) (10)

MODIF MODIF

ID ID

AT SELECTION-SCREEN OUTPUT. "Evento PBO (por el OUTPUT)

* Bucle que recorre campos de la pantalla LOOP AT SCREEN.

todos

los

IF SCREEN-GROUP1 = 'SC1'. SCREEN-INTENSIFIED = '1'. MODIFY SCREEN. ENDIF. ENDLOOP.

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:

SELECT-OPTIONS criterio FOR campo [ NO INTERVALS ] [ NO

[ 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.

MEMORYID parmetro, MODIF

ID clave, NO-DISPLAY, LOWER-

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.

You might also like