Está en la página 1de 8

SENTENCIAS SQL

6.1. Sentencias Open SQL 6.1.1. Sentencia SELECT 6.1.2. Sentencia INSERT 6.2. Sentencias Native SQL 6.3. Sentencias AT

6.1. SENTENCIAS OPEN SQL: Se llaman sentencias Open SQL a aquellas propias de Abap/4 que simulan un subconjunto de sentencias SQL (Structured Query Language). En general, las sentencias SQL (del tipo que sean) se usan para el acceso a datos en tablas. Las Open SQL tratan tablas de bases de datos (es decir, las tablas del Diccionario de Datos) mientras que las Native SQL tratan tablas internas). Las sentencias Open SQL son: SELECT (lectura de registros de una tabla), INSERT (insercin de un registro en una tabla), UPDATE(modificacin de un registro), OPEN CURSOR (abre un cursor), FETCH (avanza una posicin el cursor), CLOSE CURSOR (cierra un cursor),COMMIT WORK (actualiza los ltimos cambios de la BD, confirmando que se hacen las modificaciones), ROLLBACK WORK (deshace las modificaciones hechas a la BD volviendo al ltimo checkpoint).

6.1.1. Sentencia SELECT: o SELECT [ SINGLE ]campos FROM tabla[ I NTO | APPENDING ] [ WHERE ] [ GROUP BY campos][ ORDER BYcriterio]. [ ENDSELECT ]. o Con SELECT se leen registros de una tabla del Diccionario de Datos (no vale para leer de una tabla interna). La tabla se indica tras FROM. Se pueden especificar los campos a leer (si se desean leer todos los campos de la tabla, poner

un * como campos) y si se trata de una lectura individual o mltiple (con SINGLE slo se lee el primer registro que cumpla los criterios WHERE de bsqueda, acabando el SELECT. En este caso no se debe cerrar ste con ENDSELECT. Y sin SINGLE se leen todas las entradas que concuerden con dichos criterios). Devuelve SY-SUBRC 0 si encuentra algo (y en SY-DBCNT el n de entradas ledas); y si no, 4. Parmetros: [ SINGLE [ FOR UPDATE ]] [DISTINCT] { * | campos | MAX(c) AS m | MIN(c) AS m | AVG(c) AS m | SUM(c) ASm | COUNT(c) AS m | COUNT DISTINCT(c) AS m | COUNT(*) AS m }: Con DISTINCT se excluyen automticamente las lneas duplicadas. Se puede especificar, en lugar de campos a leer, un parmetro AS para que el SELECT simplemente calcule un valor numrico, como el mximo, mnimo, media, suma, de todas las entradas (numricas) encontradas. FROM tabla | vista | (tabla) [ CLIENT SPECIFIED ] [ BY PASSING BUFFER ] [ UP TO n ROWS ]: Este parmetro es obligatorio. Especifica la tabla de la base de datos a leer. La tabla o vista debe existir en el D.D. y debe estar declarada con TABLES en el programa. Con (tabla) puede especificarse la tabla o vista dinmicamente (aqu tabla es una variable). El mandante se especifica con CLIENT SPECIFIED. Con BY PASSING BUFFER se lee directamente de la base de datos sin pasar por el buffer de SAP. Se usa UP TO nROWS para leer hasta una lnea determinada (si n = 0, se leen todas; si n < 0, es un error). APPENDING[ CORRESPONDING FIELDS OF ] TABLE tabla[ PACKAGE SIZE n] Aade (INTO machaca)

directamente los registros ledos en la tabla interna especificada. INTO[ CORRESPONDING FIELDS OF ] { field-string | TABLE tabla } [ PACKAGE SIZE n ]: Se usa para indicar al sistema el lugar donde debe dejar el dato ledo (en una tabla interna o en un registro), y si guarda todos los campos o bien slo los iguales en nombre. De esta forma no hace falta moverlos con un MOVE de la tabla de la BD a la tabla interna, basta hacer directamente el APPEND o COLLECT. WHERE campo_BD operador campo: En las clusulas WHERE se definen los criterios de seleccin. Sern seleccionadas todas las entradas (si existen) de la tabla que cumplan estos criterios (o slo la primera si es unSELECT SINGLE). SinWHERE se lee toda la tabla. Primero se escribe siempre el campo de la tabla de la BD(slo el nombre del campo, sin el nombre de la tabla) y luego el campo o variable con el que se compara. Losoperadores pueden ser: EQ, NE, LT, LE, GT, GE, =, <> o bien ><, <, <=, >, >=. Hay otros operadores especiales: [ NOT ] BETWEEN c1 AND c2, [ NOT ] LIKE c [ ESCAPE e ], [ NOT ] IN (c1, , cn), [ NOT ] INcriterio_seleccin,IS [ NOT ] N ULL (tabla_condiciones). GROUP BY campo1 campon (tabla): Esta opcin permite combinar el contenido de un grupo de entradas de una tabla de la BD, en una nica lnea. Los campos a agrupar pueden especificarse de forma esttica (en tiempo de compilacin) o dinmica (en ejecucin). ORDER BY[ PRIMARY KEY ] campo1 [ ASCENDING | DESCENDING ] campon [ ASCENDING | DESCENDING](tabla):

Este parmetro sirve para definir el orden de tratamiento (criterio de ordenacin) de las lneas seleccionadas por el SELECT. Con PRIMARY KEY la tabla se ordena por la clave primaria. Se puede ordenar por varios campos, de forma ascendente (por defecto) o descendente. Tambin puede especificarse el criterio de ordenacin a travs de una tabla (definida con entradas de 72 caracteres mximo. En cada lnea de la tabla se especifica un criterio de ordenacin). Ejemplo: SELECT * FROM name WHERE campo1 = 'valor1' AND campo2 = 'valor2'. WRITE: / name-campo1, namecampo2. ENDSELECT. 6.1.2. Sentencia INSERT: INSERT [ INTO ] { tabla | (c) } [ CLIENT SPECIFIED ] [ VALUES field-string | FROMfield-string ] | FROM TABLEtabla_interna[ ACCEPTINGDUPLICATE KEYS ] ]. o Con INSERT se aaden nuevas entradas a una tabla del Diccionario de Datos (para una tabla interna se hara conAPPEND o COLLECT). Dicha tabla puede especificarse de forma directa, con tabla (debe estar declarada conTABLES), o indirecta, con (c). En ambos casos sta debe existir en el D.D. Con FROM TABLE inserta en una sola operacin todas las entradas de la tabla_interna. Con CLIENTSPECIFIED se pueden insertar registros en la base de datos sobre otro mandante. El rea de
o

trabajo especificada en el field-string de VALUES debe ser tan ancha como el rea de trabajo de la tabla de la base de datos. Con la opcin ACCEPTING DUPLICATE KEYS, si una lnea no puede ser insertada no se aborta la sentencia, aunque sigue devolviendo SYSUBRC = 4. 6.2. SENTENCIAS NATIVE SQL: Las sentencias Native SQL a aquellas tomadas directamente tal cual del lenguaje SQL. Todas estas sentencias tratan tablas internas. Son:LOOP, READ TABLE, DESCRIBE TABLE, MODIFY, WRITE TO, DELETE, SORT, CLEAR, REFRESH, FREE. LOOP AT tabla_interna [ INTO rea_trabajo ] [ FROM ndice1 ] [ TO ndice2 ][ WHERE condicin ] [ TRANSPORTING NO FIELDS ]. ENDLOOP. Lee entradas de una tabla interna, recorrindola en un bucle. Cada entrada se lee y se enva a un rea de trabajo. Con INTO se indica un rea de trabajo distinta a la cabecera de la tabla (el rea por defecto). Si no hay entradas en la tabla no se entra en el bucle, y se tendr SY-SUBRC = 4 (tambin si ninguna entrada cumple las condiciones del WHERE). En cada vuelta, el campo SY-TABIX contiene el ndice de la entrada actual. Con FROM y TO se delimita el rango de entradas a procesar, de una inicial a otra final. Con TRANSPORTING NO FIELDSno se copia la entrada procesada en el rea de trabajo (se gana velocidad si por ejemplo slo se desea contar el nmero de entradas, no procesarlas). Esta opcin se puede usar junto con WHERE pero nunca con INTO. Con la sentencia CONTINUE puede pasarse a la vuelta siguiente, y con EXIT se abandona el bucle. READ TABLE tabla_interna [ INTO at ] { INDEXi | WITH KEY c1 = v1 ... cn = vn |WITHKEY = valor | WITH KEY clave } [ BINARY SEARCH ] [ COMPARING c1 ... cn | COMPARING ALL FIELDS ] [ TRANSPORTING c1 ... cn | TRANSPORTING NO FIELDS ]. Lee una lnea de una tabla interna, a travs de un ndice o una clave (es ms rpido que la bsqueda mediante LOOP WHERE). Si se encuentra una entrada,

devuelve SY-SUBRC = 0 y en SY-TABIX el ndice de esa entrada; y SY-SUBRC = 4 en otro caso. Ocurre un error en ejecucin si el ndice a buscar es negativo; si es mayor que el nmero de entradas, se retorna SY-SUBRC = 4. Con INTO puede especificarse un rea de trabajo distinta a la cabecera de la tabla. DESCRIBE TABLE tabla_interna [ LINES nr_lneas ] [ OCCURS occ ]. Pregunta informacin al sistema respecto a la tabla interna especificada. Con LINES se actualiza en la variable nr_lneas el nmero de lneas de dicha tabla (esto es til por ejemplo para saber si la tabla est vaca o no, antes de intentar mostrarla por pantalla). ConOCCURS, guarda en occ el nmero de entradas con que est definida la tabla. MODIFY tabla_interna [ FROM rea_trabajo ] [INDEX ndice ] [ TRANSPORTING c1 ... cn | (campos) [ WHEREcondicin ] ]. Modifica el contenido de una entrada de una tabla interna, a partir de la informacin del rea de trabajo especificada con FROM, o por defecto de la cabecera. Con INDEX se especifica la entrada a modificar (entonces no es necesario escribir el MODIFY dentro de unLOOP), o bien se busca dicha entrada con la condicin del WHERE. Con TRANSPORTINGslo se actualizan los campos especificados (que se pueden dar de forma dinmica). WRITE campo[offset1] TO tabla_interna[offset2] IND EX ndice. Actualiza la entrada de ndice especificado de la tabla interna dada. Los offset permiten escribir en slo una parte de la entrada de la tabla, y se escriben as: +nmero, todo pegado al nombre del campo. La sentencia similar WRITE TO pero sinINDEX slo sirve para variables simples. DELETE tabla_interna [ INDEX ndice ] [ FROM ndice1 TO ndice2 ] [ WHERE cond ][ ADJACENT DUPLICATES FROM itab [ COMPARING{ f1...fn | ALL FIELDS } ] ]. Borra entradas de una tabla interna. Sin INDEX se usa dentro de un LOOP, y con INDEX fuera. Con ADJACENT DUPLICATESborra las entradas duplicadas conservando la primera. Dos lneas son consideradas duplicadas si sus campos clave son iguales, o bien si los campos f1 ... fn son iguales (si se especifican estos), o bien si todos sus campos son iguales (con ALL FIELDS).

SORT tabla_interna [ ASCENDING | DESCENDING ] [ AS TEXT ][ BY campo1 [ASCENDING | DESCENDING ] AS TEXT ] [ BY campon [ASCENDING | DESCENDING ] AS TEXT ]. Ordena una tabla interna por los criterios especificados. Por defecto, de forma ascendente respecto a los campos clave. Para ordenar por otro(s) campo(s), indicarlo con BY. CLEAR tabla_interna | campo. Limpia o borra el rea de trabajo de la tabla (la cabecera), pero no modifica ninguna entrada de la misma. Tambin es aplicable a una variable simple (CLEAR est sobrecargado), y su efecto es borrarla (la pone a su valor inicial: SPACE o cero). REFRESH tabla_interna. Limpia el contenido de la tabla interna, borrando todas sus entradas, pero preservando el valor de su cabecera. FREE tabla_interna | campo. Libera el espacio ocupado en memoria por la tabla interna. Tambin es aplicable a variables simples, destruyndolas.

6.3. SENTENCIAS AT: Las sentencias AT permiten controlar el procesamiento de una tabla interna, dentro de un LOOP. Slo se usan por tanto dentro de bucles LOOP. Permiten ejecutar condicionalmente un bloque de sentencias, dentro del bucle, segn se cumpla o no una u otra condicin. Son: ATNEW, AT END OF, AT FIRST, AT LAST. AT NEW campo. ENDAT. Con ATNEW se ejecuta el bloque cuando el campo especificado tiene un nuevo valor, es decir, que se activa al cambiar el campo su valor (se activa tambin en la primera vuelta, pues el campo pasar de INITIAL a su primer valor, pero no en la ltima vuelta, pues el campo no variar su valor). Puede convenir o no ordenar la tabla respecto ese campo. AT END OF campo. ENDAT. Con AT END OF se ejecuta el bloque cuando el campo especificado alcanza su ltimo valor. Puede convenir o no ordenar la tabla por ese campo. AT FIRST.ENDAT. Con AT FIRST se ejecuta el bloque en la primera vuelta del LOOP.

AT LAST.ENDAT. Con AT LAST se ejecuta el bloque en la ltima vuelta del LOOP. Dentro de ATNEW y ATEND OF, la sentencia SUM suma todos los campos numricos de las entradas procesadas en estos bloques de proceso. Dentro de AT FIRST y AT LAST, suma los campos numricos de todas las entradas de la tabla.

Ejemplo: * Suma el subtotal para cada 'cliente' AT END OF cliente SUM importe. * Suma todas las entradas de la tabla, tras recorrerla AT LAST SUM.

También podría gustarte