Diccionario de Datos

Anuncio
DICCIONARIO DE
DATOS
Diccionario de datos
El diccionario de datos es la “fuente” de información centralizada de todo el sistema SAP, allí se
encuentra (y almacena) todos los datos que se procesan en el sistema; es, digamos, el corazón de
SAP.
En el Diccionario de Datos (de ahora en adelante el diccionario), encontramos la siguiente
estructura de objetos, ordenados desde su capa más inferior:
•
•
•
•
•
Dominio.
Elemento de Datos.
Campo.
Estructura de Datos.
Tablas.
El DOMINIO describe el campo de valores posibles, es de un carácter técnico, es el nivel más bajo
que existe para determinar el tipo de dato de un objeto. Ejemplo; un dominio denominado
<S_PLANE> tiene un tipo de dato CHAR de tamaño 10 (una cadena de caracteres de 10
posiciones).
Diccionario de Datos – RichardRey.com - 2
El ELEMENTO DE DATOS describe el significado de un campo independientemente de las tablas
donde se utilice. Tiene un carácter semántico. Un elemento de datos está asociado a un dominio, y
puede ser utilizado en múltiples tablas, incluso ser referenciado directamente desde un programa
al momento de declarar una nueva variable.
Siguiendo el ejemplo anterior, tenemos un elemento de datos llamado <S_PLANETYE>, que hace
referencia al tipo de avión, y está formado por el dominio <S_PLANE>, mostrado antes.
NOTA: Desde el editor de un programa ABAP, podemos declarar una variable que haga referencia
a un elemento de datos; de esta forma, la variable tomará el tipo de datos del dominio asociado a
dicho elemento de datos. Siguiendo con el ejemplo:
DATA: var TYPE S_PLANETYE.
En este caso, la variable denominada <var> será una cadena de caracteres de 10 posiciones, o
dicho de otra manera, un campo tipo texto de 10 posiciones; porque le indicamos que tome las
propiedades del elemento de datos <S_PLANETYPE>, y ese elemento de datos tiene como dominio
el objeto <S_PLANE>, que como vimos arriba, se trata de un tipo CHAR de 10 posiciones.
Si te confunde un poco, lo siguiente lo esclarecerá.
DATA: var TYPE S_PLANETYE.
DATA: var TYPE char10.
Diccionario de Datos – RichardRey.com - 3
Las dos instrucciones escritas arriba obtienen exactamente el mismo resultado, la variable <var>
será un tipo CHAR de 10 posiciones.
La ventaja de esta forma de estructurar el diccionario es que si cuentas con una serie de tablas,
con campos del mismo tipo, por ejemplo CHAR10, si bien se permite asignarle a cada campo
directamente el tipo de datos CHAR de 10 posiciones; hacerlo de esta manera implica que, al
momento de ser solicitado un cambio del tipo de datos, (digamos que piden cambiarlo a un CHAR
de 12 posiciones), te corresponde modificar tabla por tabla para ajustar todos los campos
afectados. Si en su lugar, se crea un elemento de datos cuyo dominio sea un objeto de tipo
CHAR10, pongámosle por nombre <ED>; y le asignamos el ED a los campos de cada tabla; al
momento de requerir el ajuste a CHAR12, bastará con cambiar el dominio del elemento de datos
<ED> para que el cambio se replique en TODAS las tablas que lo contengan; es decir, haríamos el
cambio una sola vez, y éste se replica en todas las tablas que hacen referencia al elemento de
datos.
EL CAMPO, como su nombre lo indica, es el renglón o columna de una estructura de datos. Si
recuerdas del capítulo anterior el momento en que mencionábamos la creación de una estructura
de datos, cuya sentencia sería la siguiente:
DATA: BEGIN OF nombre_estructura,
var1 TYPE i,
var2 TYPE i,
END OF nombre_estructura.
Las variables <var1> y <var2> serán campos de la estructura de datos creada.
Lo mismo ocurre con el diccionario de datos, el campo es el espacio o columna única de cada tabla
o estructura de datos; y a cada campo se le asigna un elemento de datos existente, absorbiendo el
campo las propiedades del elemento de datos.
Diccionario de Datos – RichardRey.com - 4
Como vemos en la gráfica, un campo llamado <PLANETYPE> perteneciente a la tabla SFLIGHT y
está formado por el elemento de datos <S_PLANETYE > que vimos anteriormente.
La ESTRUCTURA DE DATOS la vimos un poco en el capítulo anterior (Tipos de Datos en ABAP), se
trata de un conjunto de campos relacionados lógicamente entre sí en un único objeto, que recibe
por nombre Estructura de Datos.
Lo que en ABAP se conoce como Estructura de Datos, en otros lenguajes de programación podrían
conocerse como Arreglos o Registros, sería de manera general una analogía válida.
En el capítulo de los Tipos de Datos, pudimos ver cómo se pueden crear estructuras de datos
directamente desde el editor ABAP.
Diccionario de Datos – RichardRey.com - 5
a) Declarando las variables (campos) en el mismo editor.
DATA: BEGIN OF nombre_estructura,
var1 TYPE i,
var2 TYPE i,
END OF nombre_estructura.
b) Tomando como referencia una estructura de datos ya creada en el Diccionario.
DATA BEGIN OF sociedad.
INCLUDE STRUCTURE SYST.
DATA END OF sociedad.
También, las estructuras de datos pueden crearse en el Diccionario, como la estructura <SYST>
usada en el ejemplo anterior, que contiene las variables del sistema.
Una Estructura de Datos contiene un único registro; si deseamos guardar múltiples registros con la
misma estructura, tendremos que pasar a crear una tabla basada en dicha estructura de datos.
Diccionario de Datos – RichardRey.com - 6
Las TABLAS son objetos, basados en estructuras de datos, capaces de almacenar gran cantidad de
información en múltiples líneas de registros. Un ejemplo de tablas en el Diccionario de Datos lo
vimos en la imagen que reflejaba la tabla SFLIGHT; y si en un programa quisiéramos crear una
tabla cuya forma sea similar a la estructura de datos <SYST>; lo podríamos hacer de la siguiente
manera:
DATA: itab TYPE TABLE OF SYST.
Tipos de tablas.
Existen diversos tipos de tablas:
•
•
•
Tablas TRANSP (transparentes): Tablas normales relacionales (SQL).
Tablas POOL: Tablas SAP que se guardan junto a otras tablas SAP en una única tabla física
de Base de Datos. Mejorando el acceso a los registros.
Tablas CLUSTER: Varias tablas que se guardan en un cluster de Base de Datos. Se guardan
registros de varias tablas SAP con la misma clave cluster, en el mismo cluster físico de la
base de datos.
Las que usaremos cada día serán las tablas transparentes, que es el nombre que le da SAP a las
tablas de Base de Datos relacionales. De hecho, los dos términos más comunes utilizados en el día
a día de un Consultor ABAP son “tablas transparentes” y “tablas internas”; ya comprendimos que
las primeras son las tablas del Diccionario de Datos, y las segundas son espacios de memoria que
se utilizan dentro de un programa, cuya existencia es únicamente en tiempo de ejecución del
programa en cuestión.
Los datos en SAP.
Los datos en SAP se pueden clasificar de la siguiente manera:
•
•
•
Datos maestros: Son datos que no se modifican muy a menudo. Ejemplo: Materiales,
Cuentas, Bancos, Clientes. Se almacenarán en tablas transparentes.
Datos de movimientos: Datos muy volátiles y con gran volumen de generación. Ejemplo:
Facturas, Pedidos. Se suelen guardar en tablas tipo CLUSTER todos ellos con formato
parecido (documentos).
Datos del sistema o de control: Muchas tablas con pocos datos. Se suelen guardar en
tablas de tipo POOL.
Diccionario de Datos – RichardRey.com - 7
Instrucciones SQL de ABAP.
El lenguaje ABAP tiene un conjunto de sentencias SQL para su aplicación sobre tablas de la base de
datos SAP.
Algo muy interesante de este entorno de programación, es que, a diferencia de otros lenguajes, no
se requiere realizar ningún tipo de protocolo de conexión con la base de datos; escribimos
directamente las sentencias SQL y el sistema se encarga de comunicarse con el diccionario de
datos de manera implícita para nosotros.
Éstas son las instrucciones SQL permitidas:
•
•
•
•
•
•
•
SELECT
INSERT
UPDATE
MODIFY
DELETE
COMMIT WORK
ROLLBACK WORK
Adicionalmente, contamos con las siguientes variables del sistema:
•
•
SY-SUBRC: Código de retorno de una operación. El valor 0 indica que la instrucción fue
satisfactoria y se cumplió el objetivo, bien sea obtener datos de una tabla, o
insertar/modificarlos; un retorno con valor 4 indica que la consulta no arrojó datos, o bien
no se pudo insertar/modificar en un tabla del diccionario.
SY-DBCNT: Cantidad de registros afectados por la operación procesada si se trata de una
modificación/inserción, o bien la cantidad de registros encontrados en una consulta.
SELECT: Instrucción fundamental para leer información de la base de datos.
Lectura de un único registro:
SELECT SINGLE * FROM <tab> WHERE <cond>.
Si SY-SUBRC = 0.
Registro encontrado. Resultado en <tab>.
Si SY-SUBRC = 4.
No existe el registro buscado.
Lectura Iterativa: Selección de un grupo de registros.
SELECT * FROM <tab> (WHERE <cond>). ENDSELECT.
Diccionario de Datos – RichardRey.com - 8
Selecciona cada uno de los registros que cumplan la condición de la cláusula WHERE, (o todos en
caso de no utilizarla). El resultado lo tendremos en el área de trabajo <tab>. En cada iteración del
ciclo SELECT - ENDSELECT se procesa un único registro encontrado, y el ciclo se repetirá tantas
veces como registros se consigan. Es útil si se desea realizar algún tratamiento a cada registro
encontrado de una vez.
Si SY-SUBRC = 0.
Algún registro encontrado.
Si SY-SUBRC = 4.
No existe ningún registro que cumpla la condición del WHERE.
Ejemplo:
SELECT *
FROM mara
WHERE matnr = itab-matnr.
WRITE: mara-matnr.
ENDSELECT.
Por cada registro encontrado, se imprime en pantalla el valor de dicho registro y se sigue leyendo
en la tabla en búsqueda de más registros.
Otras posibilidades del WHERE:
SELECT * FROM <tab> WHERE <campo>... BETWEEN <var1> AND <var2>.
Si <campo> está entre los valores <var1> y <var2>.
LIKE <literal condición>. Si <campo> cumple la condición.
También se pueden utilizar:
•
•
•
‘_’ como caracter cualquiera.
‘%’ como una cadena de caracteres.
IN (<var1>, <var2>...). Si <campo> esta en el conjunto de valores <var1>, <var2>...
Otras lecturas:
Podemos leer una tabla de base de datos y simultáneamente llenar una tabla interna con el
resultado de la lectura.
SELECT * FROM <tab> INTO TABLE <intab> (WHERE <cond>).
Diccionario de Datos – RichardRey.com - 9
Esta instrucción lee la base de datos, obtiene todos los registros que cumplan con la condición, y
los almacena en una tabla interna llamada <itab>.
A diferencia del ciclo SELECT – ENDSELECT, en el que por cada acierto se procede a leer en la base
de datos; aquí se realiza un único acceso a las tablas para extraer todos los registros que cumplan
con la condición.
Si bien ambas opciones cumplen con el mismo resultado, por temas de rendimiento recomiendo
utilizar esta última ya que se consumen menos recursos con un único acceso a BD, para obtener
todas las coincidencias en una tabla interna, y luego procesar esos resultados desde la tabla
interna, que como ya sabemos, es un objeto propio del programa en ejecución.
Veamos cómo queda el mismo ejemplo del caso anterior:
SELECT *
INTO TABLE itab
FROM mara
WHERE matnr = itab-matnr.
LOOP AT itab.
WRITE: itab-matnr.
ENDLOOP.
NOTA: En un capítulo posterior veremos que es un LOOP.
Podemos indicar un orden en el proceso de selección de registros.
SELECT *...ORDER BY <campo1> <campo2>.
No requiere mayor explicación salvo que el criterio de ordenamiento siempre es prevaleciendo el
campo de la izquierda.
Diccionario de Datos – RichardRey.com - 10
INSERT: Permite introducir registros sencillos o el contenido de una tabla interna en una base de
datos SAP.
INSERT <tab>.
Grabará en la BD el contenido de la estructura <tab>.
Si SY-SUBRC = 0.
Registro insertado.
Si SY-SUBRC > 0.
La clave del registro que queríamos insertar ya existía en la tabla.
También es posible introducir datos desde una tabla interna.
INSERT <tab> FROM TABLE <itab>.
Si SY-SUBRC = 0.
Registros insertados.
Si existe algún registro en la BD (base de datos) con clave igual a algún registro de la tabla interna,
se producirá un error de ejecución del programa. (Por registro duplicado).
UPDATE: Permite modificar el contenido de uno o varios registros.
UPDATE <tab>.
Modifica el registro de la base de datos que está especificado en la estructura <tab>.
Si queremos modificar el contenido de más de un registro a la vez:
UPDATE <tab> SET <campo>=<valor> WHERE <cond>.
Con este UPDATE, todos los registros que cumplan <cond> modificarán el contenido del <campo>
por <valor>.
Es posible modificar registros desde una tabla interna:
UPDATE <tab> FROM TABLE <intab>.
Si el sistema no puede actualizar un registro, el proceso no finalizará sino que continuará con el
siguiente registro.
Diccionario de Datos – RichardRey.com - 11
Si SY-SUBRC = 0.
Todos los registros modificados.
Si SY-SUBRC = 4.
No todos los registros han sido modificados.
En SY-DBCNT Tendremos la cantidad de registros modificados.
MODIFY: Se utiliza cuando no se sepa con certeza si un registro existe o no, para modificarlo o
añadirlo.
MODIFY <tab>.
MODIFY <tab> FROM TABLE <intab>.
NOTA: En caso de que conocerse la existencia o no de un registro, se recomienda utilizar INSERT o
UPDATE.
DELETE: Se utiliza para realizar borrados de datos en una BD del Diccionario.
DELETE <tab>. Borrará el registro que especifiquemos en el área de trabajo.
DELETE FROM <tab> WHERE <cond>.
cumplan la condición <cond>).
Para borrar más de un registro (todos los que
DELETE FROM <tab> FROM TABLE <itab>.
Para borrar en la tabla transparente <tab>,
todos los registros contenidos en la tabla interna <itab>.
Si SY-SUBRC = 0.
Todos los registros han sido borrados.
Si SY-SUBRC = 4.
No todos los registros han sido borrados.
En SY-DBCNT tendremos la cantidad de registros borrados.
Diccionario de Datos – RichardRey.com - 12
Otros aspectos del Diccionario de Datos.
El control de mandante (ese numerito que representa el sistema al que estamos conectados), es
automático. Siempre se procesará el mandante en uso; en caso de requerir procesar datos de otro
cliente/mandante diferente al que estamos conectados, utilizaremos la instrucción CLIENT
SPECIFIED en nuestras consultas al Diccionario.
Debemos evitar el uso de las instrucciones INSERT, DELETE, MODIFY y UPDATE sobre las tablas del
Diccionario; si requerimos hacer un cambio a nivel de datos, éstos se harán vía transacciones
estándar, módulos de funciones (BAPI) o Bath Input; ya que los datos que se guardan en una
transacción suelen estar replicados en diferentes tablas, y si modificamos el contenido de una
tabla en particular, podríamos generar inconsistencias importantes en el sistema.
Actualización de la Base de Datos.
Si deseamos forzar un cambio que afecta alguna tabla de la Base de Datos, debemos ejecutar la
sentencia COMMIT WORK en nuestros programas, esta sentencia realiza un UPDATE físico en la
BD, haciendo irrevocable cualquier modificación.
Si deseamos deshacer los cambios hechos luego del último COMMIT WORK, utilizaremos la
sentencia ROLLBACK WORK, esta sentencia nos reversa los cambios hasta el estado en que se
encontraban tras el último COMMIT WORK ejecutado.
Chequeo de autorizaciones.
Todas las consultas SQL en SAP no realizan verificación alguna sobre autorizaciones de usuarios,
siendo esto es algo que debemos controlar para evitar que todos los usuarios puedan acceder a
determinado tipo de información.
Este control es responsabilidad del consultor ABAP, determinar si un usuario tiene o no
autorización a nuestros desarrollos.
Para determinar la autorización de los usuarios en nuestros desarrollos se utilizará el siguiente
trozo de código:
Diccionario de Datos – RichardRey.com - 13
AUTHORITY-CHECK.
AUTHORITY-CHECK OBJECT <objeto_de_autorización>
ID <Campo1> FIELD <f1>
ID <Campo2> FIELD <f2>
ID <Campo3> DUMMY.
...
Esto se conoce como OBJETO DE AUTORIZACIÓN o AUTHORITY-CHECK, en el uso diario solemos
escucharlo de ambas maneras, veamos los campos que contiene:
<CampoX> son los campos de autorización del objeto. (se le indica sobre que campos del sistema
se va a evaluar la autorización).
<fX> son los valores posibles de autorización de dichos campos. (leer, modificar, ambos, ninguno).
DUMMY es un parámetro que indica que no es necesario verificar este campo.
Si al procesar el objeto, el campo del sistema SY-SUBRC es igual a 0, es que el usuario está
autorizado a ver/procesar la información, de lo contrario, indica que no tiene los permisos para
ello.
Lo común es que en nuestros desarrollos, indiquemos este objeto al comienzo del mismo, y luego
verifiquemos el SY-SUBRC, permitiendo continuar con la ejecución solo si el valor del campo es 0.
Veamos un ejemplo de cómo se llenan los campos para el objeto de autorización:
Vamos a verificar el authority check “Acreedor: Autorizaciones para Sociedades” para saber si un
usuario puede visualizar proveedores en la sociedad 0001.
Este objeto de autorización estándar se llama ‘F_LFA1_BUK’.
La operación visualizar responde al código ‘01’ y el campo sobre el cual queremos evaluar la
propiedad de visualización se llama ‘ACTVT’. El campo sociedad, por su parte, se llama ‘BUKRS’.
Diccionario de Datos – RichardRey.com - 14
Así quedaría el authority check:
AUTHORITY CHECK OBJECT ‘F_LFA1_BUK’
ID ‘ACTVT’ FIELD ‘01’
ID ‘BUKRS’ FIELD ‘0001’.
Con esto cubrimos el apartado del Diccionario de Datos, el siguiente tema a estudiar serán las
Tablas Internas.
Te saluda,
Richard Rey
http://aprendeabap.com
Diccionario de Datos – RichardRey.com - 15
Descargar