A veces cuando necesitamos hacer tareas de upgrade o mantenimiento en SAP es necesario que solo determinados usuarios se pueda logear al sistema. Para esto una de las formas en que podemos deshabilitar los ingresos al sistema es de la siguiente forma.
Ingresamos a la transacción SECPOL.
Creamos una nueva Security Policy:
Hacemos click en “New Entries”
Ingresamos un texto y la descripción y hacemos click en guardar.
Seleccionamos la entrada que creamos y hacemos doble click en “Attributes”.
Creamos una nueva entrada.
Ingresamos los siguientes valores:
SERVER_LOGON_PRIVILEGE en name y el valor 1 en Attribute Value.
Damos click a guardar.
Próximo paso es asignarle esta Policy a los usuarios que queremos que PUEDAN logearse al sistema.
Para esto vamos a la transacción SU01 e ingresamos al usuario en modo modificación.
En el tab “Logon Data” en el campo Security Policy le asignamos la Policy que creamos y guardamos.
Por último, debemos ir a la transacción RZ11 y buscar el parámetro:
login/server_logon_restriction
A este parámetro debemos asignarle el valor 1 para que no se pueden logear los usuarios que no tengan esta Policy.
Nos aparecerá la siguiente pantalla:
Hacemos click en “Change Value”
Ingresamos 1 en “New value” y guardamos.
En este momento si algún usuario intenta ingresar le aparecerá el siguiente mensaje.
Para volver a habilitar el ingreso, simplemente volvemos a la RZ11 y seteamos el valor del parametro a 0.
En las ultimas instalaciones del SAP GUI un componente para ver la representación grafica del formulario (SAP SCRIPT) fue removida por SAP, lo que causa un error al hacer click en el boton Layout en la transacción SE71.
El error es:
Graphical Form Painter could not be called (FORMPAINTER_CREATE_WINDOW, )
Para solucionar este error hay que bajar un archivo desde la pagina de soporte de SAP ( https://launchpad.support.sap.com/#/softwarecenter ), desde ahí buscamos SAPSLTESP00_0-70001053.EXE y nos mostrara algo como
Una vez bajado simplemente lo instalamos (Hay que cerrar completamente el SAP GUI) y ya podremos ver la representación grafica del formulario (SAP SCRIPT).
Después de mucho tiempo investigando problemas en unas de mis paginas que surgieron luego de actualizar los certificados SSL, encontré que el problema estaba porque era necesario usar un certificado wildcard, esto es necesario si queremos que no aparezcan errores de certificados al intentar acceder a un sitio web usando por ejemplo www.dominio.com o solo dominio.com.
Para realizar esto, simplemente desde el servidor debemos utilizar el siguiente comando:
Una ves que usemos este comando, certbot nos pedirá incluir en nuestros registros DNS un texto especifico para validar que efectivamente somos nosotros los dueños del dominio. Una ves que hicimos esto entonces se emitirán los certificados.
El texto a agregar en nuestros DNS es del tipo TXT con el texto: _acme-challenge.domain.com y el valor que nos muestre certbot en la pantalla, por ejemplo:
AJS6dkfjskAasidju_aksjdhauOIsyh-asjkYasdK39
Es un valor inventado por razones de seguridad 😀
Es importante luego de esto configurar apache, dovecot, postfix o los servicios que usemos para que apunten a estos nuevos certificados.
Los Change Pointers de IDOCs, se usan para generar IDOCs que luego mediante un programa se enviaran cuando se modifica algún registro, en este caso por ejemplo características.
El primer paso es activar los Change Pointers de la transacción BD61. Para hacer esto tildamos el checkbox (si no esta tildado ya) y guardamos.
El 2do paso es activar los Change Pointers para el Message Type desde la transacción BD50. En el caso que no este el que necesitamos lo podemos agregar. Hay que acordarse de tildarle el checkbox de activo y guardar.
El 3er paso es definir los registros para el Change Pointer de la transacción BD52.
Ingresamos el Message Type y hacemos click en OK.
En la próxima pantalla nos aparecerá para elegir los campos que cuando se modifique hara que se active el Change Pointer, los ingresamos y guardamos.
El 4to paso es configurar la WE20 tanto en el sistema de origen como en el destino, en el caso que no este configurada.
Sistema Origen:
Agregamos el message type y basic type, por ejemplo:
Y en el sistema destino, hacemos lo mismo para la WE20, pero al ser de inbound se usa un process code.
El paso 5, es la configuración del modelo de distribución en la transacción BD64.
Primero se crea un modelo:
Y luego se agrega un message type:
Debería verse de la siguiente forma:
Para probar si todo funciona OK para este caso vamos en el SAP de origen a la transacción CT04 y creamos una característica.
Completamos los datos:
Al darle guardar nos aparecerá un mensaje similar al siguiente
Si vamos a la tabla BDCP2, de ahi podemos ver los cambios que están pendiente de change pointers. La columna process indica los que fueron procesados.
Para procesar los cambios es necesario correr un programa ABAP, que normalmente estaría corriendo como JOB, pero también se puede correr a mano. El programa es el RBDMIDOC. En el mismo, en la pantalla de selección debemos especificarle el Message Type a procesar.
Al ejecutarlo nos debería mostrar mensajes similares a los siguientes:
Si volvemos a consultar la tabla BDCP2, ahora vemos que el registro que antes estaba vació ahora tiene una X.
Si consultamos la WE02 para ver los IDOCs de salida vemos lo siguiente:
Si ahora vamos al sistema destino ala transacción CT04, deberíamos ver el mismo registro que dimos de alta, también podemos verificar la WE02 para ver IDOCs de entrada.
Es un Formato SAP estándar para el intercambio electrónico de datos entre sistemas.
La sigla IDOC es “documento intermedio“ o “Intermediate Document”.
Los IDOCs permiten intercambiar información entre distintos sistemas. Se lo puede ver como un archivo de texto plano con registros.
Un IDOC esta compuesto por un “IDOC Basic Type” o “Tipo Básico” y “Segments” o “Segmentos”.
Composición de un IDOC:
Un segmento define el formato y estructura de un registro de datos. Los segmentos son reusables con lo cual se pueden usar en mas de un tipo básico de IDOC.
Un segmento consiste de varios campos que representan el dato a enviar.
En el ejemplo anterior si hacemos doble click sobre el segmento veremos lo siguiente:
El nombre, un campo indicando si es mandatorio o no, y un Máximo y Mínimo de cantidad de veces que se puede repetir el registro en el segmento.
Si hacemos click en “Segment Editor” podemos ver en mas detalle la composición.
En el editor de segmentos vemos como esta compuesto.
Vemos que tiene los campos con sus correspondientes tipo.
Un IDOC tiene los siguientes atributos técnicos:
•Dirección: Puede ser de Salida (Outbound) o de Entrada (Inbound)
•Status: El status actual del IDOC, OK, Error, etc.
•Tipo Básico: El tipo básico con el cual se definió el IDOC.
•Extensión (Opcional): Un IDOC ya existente se puede extender con campos de otro.
•Partner No: Un partner representa a un sistema, ya sea el que envía o recibe.
•Partner Type: Representa el tipo de sistema, por ejemplo, Sistema Lógico.
•Port: Un puerto es un nombre lógico que se usa en combinación con el Partner para definir a donde enviar o recibir un IDOC.
Por lo general un message type describe un documento de negocio, por ejemplo:
INVOIC –> Factura
ORDERS –> Sales / Purchase Orders
WHSORD –> Stock Order
Los message types se crean de la transacción WE81
Con un Message Type y Basic Type definidos debemos asociarlos.
Esto se hace de la transacción WE82
Definir sistemas lógicos:
Un sistema lógica representa un ambiente al cual nos queremos conectar.
Se definen desde la transacción BD54.
En la imagen de abajo tenemos definidos dos sistemas lógicos, para este caso como solo tenemos un solo sistema, vamos a asumir que cada mandante representados por los sistemas lógicos A4HCLNT001 y A4HCLNT002 son sistemas diferentes.
Creación de un sistema Lógico:
1)Hacemos click en editar
2)Hacemos click en New Entries
3) Ingresamos los datos y hacemos click en guardar (Nos pedirá una orden de transporte)
Definimos los puertos:
Se definen desde la transacción WE21. En la imagen de abajo tenemos definidos dos puertos, como vimos antes simulando sistemas separados.
Creación de un nuevo puerto:
1)Nos paramos sobre el tipo de puerto a crear, por ejemplo “Transactional RFC” y hacemos click en Nuevo.
2)En la siguiente ventana tenemos la opción de elegir un nombre para el puerto o que el mismo sea autogenerado.
3)Completamos la descripción, le asignamos una RFC y lo grabamos.
Las RFC o Remote Function Call, básicamente son modulos de funciones común y corrientes con la particularidad de que estos se pueden llamar desde otro SAP.
Las RFC se crean y modifican desde la transacción SM59, por lo general la creación o modificación de una RFC es tarea del equipo de BASIS, pero se pueden dar casos donde también lo hagan los ABAPers.
Para configurar una RFC mínimamente debemos llenar los siguientes campos:
Usamos el Process Code para determinar a que modulo de función llamar en la WE20.
Los Process Code se pueden definir de dos transacciones diferentes dependiendo de si son de Inbound u Outbound
WE41 –> Outbound Process Code
WE42 –> Inbound Process Code
Partners:
Los partners se crean desde la transacción WE20.
Un partner puede tener asociado (Entre otras cosas) un sistema lógico, y a su vez, este sistema lógico tiene asociado:
Para Outbound: -Message Type: Un identificador. -Message Code/Variant: Son también identificadores que sirven para segregar mas la funcionalidad. -Message Function: Idem Anterior. -Port: El puerto del sistema remoto al que nos estaremos conectando. –
Para Inbound: -Message Type: Idem anterior. -Message Code/Variant: Idem anterior. -Message Function: Idem anterior -Process Code: Idem anterior. –
Ejemplo:
Podemos tener:
Message Type: INVOIC
Message Code: CRE
Message Function: FACT
Process Code: PR1
Message Type: INVOIC
Message Code: MOD
Message Function: FACT
Process Code: PR2
Partners:
Para ver o buscar IDOCs podemos usar las transacciones WE02 / WE05, desde la pantalla de selección podemos filtrar, por numero de IDOC, estado, fecha / hora, message type, etc.
Para copiar y procesar un IDOC ya existente podemos usar la transacción WE19, entre algunos de los parámetros que podemos usar esta el numero de IDOC, basic type, etc.
Dependiendo de si queremos procesar un Outbound o Inbound hacemos click en el botón correspondiente y confirmamos el popup que nos aparece.
Para reprocesar un IDOC se usa la transacción BD87, ingresando con un numero de IDOC.
Ejemplo de codigo de programa para enviar IDOCs:
REPORT zcrear_banco.
PARAMETERS: p_pais TYPE bnka-banks,
p_key TYPE bnka-bankl.
DATA: lwa_idoc_ctrl TYPE edidc,
lt_idoc_comm TYPE TABLE OF edidc,
lt_idoc_Data TYPE TABLE OF edidd,
lwa_idoc_data TYPE edidd,
lwa_E1BANK_CREATE TYPE e1bank_create,
lwa_dir TYPE e1bp1011_address.
lwa_idoc_ctrl-direct = 1. "Outbound.
lwa_idoc_ctrl-outmod = 1. "Transferir el IDOC inmediatamente.
lwa_idoc_ctrl-rcvpor = 'A000000002'. "Puerto de recepcion.
lwa_idoc_ctrl-rcvprt = 'LS'. "Partner type de recepcion.
lwa_idoc_ctrl-rcvprn = 'A4HCLNT002'. "Partner de recepcion.
lwa_idoc_ctrl-stdmes = 'BANK_CREATE'. "Message Type.
lwa_idoc_ctrl-mescod = 'BCR'. "Message Variant.
lwa_idoc_ctrl-mesfct = 'CRT'. "Message Function.
lwa_idoc_ctrl-sndprt = 'LS'. "Partner Type de envio.
lwa_idoc_ctrl-SNDPRn = 'A4HCLNT001'. "Partner de envio.
lwa_idoc_ctrl-mestyp = 'BANK_CREATE'. "Message Type.
lwa_idoc_ctrl-idoctp = 'BANK_CREATE01'. "Basic Type.
lwa_idoc_data-segnam = 'E1BANK_CREATE'. "Nombre del segmento.
lwa_e1bank_create-bank_ctry = p_pais.
lwa_e1bank_create-bank_key = p_key.
lwa_idoc_data-sdata = lwa_e1bank_create.
APPEND lwa_idoc_data TO lt_idoc_data.
CLEAR lwa_idoc_Data.
CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE'
EXPORTING
master_idoc_control = lwa_idoc_ctrl
TABLES
communication_idoc_control = lt_idoc_comm
master_idoc_data = lt_idoc_data
EXCEPTIONS
error_in_idoc_control = 1
error_writing_idoc_status = 2
error_in_idoc_data = 3
sending_logical_system_unknown = 4
OTHERS = 5.
IF sy-subrc EQ 0.
COMMIT WORK.
ENDIF.
END-OF-SELECTION.
Hacemos click en Rotulación de etiquetas y agregamos una nueva entrada:
Volvemos a la SPRO y vamos a:
Creamos una nueva implementación:
Implementamos el método CHECK_ADD_ON_ACTIVE:
Volvemos a la SPRO:
Creamos una nueva implementación:
Creamos el filtro:
Creamos un grupo de función y le creamos una DynPro (La que especificamos anteriormente)
En la dynpro Agregamos el campo que queremos mostrar:
Implementamos el método GET_TAXI_SCREEN de la BADI:
En este punto ya podríamos ir a la transacción XD01 / 02 / 03 y ver nuestro campo.
Ahora hay que agregar una APPEND STRUCTURE a la tabla KNA1.
Ahora hay que hacer que en modo visualización el campo aparezca no editable, para esto vamos al grupo de función que creamos y agregamos el siguiente código:
Ahora debemos agregar la lógica para cargar y guardar el dato de nuestro campo Z.
Cargar:
Guardar:
Implementamos el método de la BADI (La de la subscreen).
Vamos a la TRX SSC4 y agregamos una nueva entrada:
Completamos los siguientes datos según nuestra necesidad:
Grabamos.
Vamos a la TRX SCCLN y la ejecutamos como test.
Nos muestra el resultado:
Si esta todo bien entonces podemos ejecutarlo sin modo test.
Si al ejecutarlo nos da el siguiente error:
Puede ser que haya quedado un registro en la tabla LMSEMAPHORE, de alguna ejecución anterior que no termino, podemos borrarlo de la tabla y volver a ejecutarlo o buscar la ejecución previa y terminarla.
El generador de tablas de mantenimiento o del ingles Table Maintenance Generator, sirve para crear vistas de actualización de tablas, las cuales son servirán entre otras cosas para ingresar datos a nuestras tablas en el sistema.
Lo primero que tenemos que tener es una tabla transparente. Para nuestro ejemplo usaremos la siguiente.
El próximo paso es la creación de la vista de actualización en si, para esto vamos al siguiente menu.
Nos aparecerá la siguiente ventana
El primer paso es ingresar el grupo de autorización, esto nos servirá para restringir el acceso, para nuestro caso, como no necesitamos esto ingresamos &NC&, que significa, Sin grupo de autorización.
En function group, ingresamos el nombre que le vamos a dar al Function Group, una vista de actualization de tabla, básicamente por detrás es un grupo de función, yo por lo general uso el mismo nombre que de la tabla. En este caso ZAEROLINEAS.
En Maintenance Type, tenemos dos opciones: 1) One step: Nuestra vista de actualización de tabla constara de solo una pantalla 2) Two step: Nuestra vista de actualización de tabla constara de dos pantallas. Para este caso seleccionaremos One Step.
Siguiente, hacemos click en Find Scr. Number(s)
Automáticamente nos completara lo siguiente
Finalmente hacemos click en la Hoja blanca
Nos pedirá ingresar un paquete o objeto local, en el caso que seleccionemos paquete también nos pedirá una orden de transporte.
Cuando termine, nos debería mostrar el siguiente mensaje.
A este punto ya tenemos la vista de actualización de tabla creada, si vamos a la transacción SM30 podemos usarla.
Aca ingresamos el nombre de nuestra vista de actualización de tabla y dependiendo de que queremos hacer, podemos hacer click en Display o Maintain. Para continuar con nuestro ejemplo, le hacemos click en Maintain.
Nos debería aparecer una pantalla similar a la siguiente.
Al hacer click en New Entries se nos habilitara la opción de ingresar datos. Si nos posicionamos en la celda Airline (La primera), vemos que nos da la opción de seleccionar un Match Code.
Sin embargo, si nos paramos en la siguiente columna, vemos que no nos muestra el icono para seleccionar un valor.
Hay varias formas de agregar el Match Code, pero la mas simple en mi opinion. es buscar un Search Help que ya exista para ese campo. En este caso por ejemplo, Sabemos que el nombre de la aerolínea se guarda en la tabla SCARR, entonces lo que podríamos hacer, es ir a la transacción SE11 a la parte de Search Help y buscar algo similar a *SCARR*
Hacemos click en el Match Code o apretamos F4 (Que es un atajo) y vemos que automáticamente nos completa el campo a H_SCARR, si con este valor seleccionado le damos click a display. Vemos que esta ayuda de búsqueda, contiene los campos que queremos.
Ya con este nombre, entonces volvemos a la SE11 a nuestra tabla, y vamos a la solapa Input/Help Check
Nos paramos en la linea del campo a la que queremos agregarle el Match Code en la vista de mantenimiento y hacemos click en el botón “Search Help” (Tenemos que estar en modo edición).
Nos aparecerá la siguiente pantalla donde ingresamos la ayuda de búsqueda que encontramos en el paso anterior.
En la siguiente pantalla verificamos que los campos de la ayuda de búsqueda coincidan con los de nuestra tabla y hacemos click en Copy.
Nuestra tabla ahora debería verse algo similar a lo siguiente.
Ahora debemos activar nuestra tabla haciendo click en el botón de activar. Con la tabla activa, ahora debemos regenerar nuestra vista de actualización de tablas, dado que si ingresamos ahora, podemos ver que no cambio nada.
Para regenerarla, debemos volver al menu.
Una buena practica, antes de regenerar nuestra vista de actualización de tabla, es revisar si esta tiene eventos. Los eventos son acciones que podemos realizar en ciertos momentos en nuestra vista de actualización, como por ejemplo para validar los datos ingresados. Si nosotros borramos la vista de actualización de tabla corremos el riesgo de borrar los eventos también, por lo cual nos conviene hacernos un backup por las dudas. Para esto vamos al siguiente menu.
Si nos aparece vació, como en el ejemplo de abajo, entonces la podemos regenerar tranquilamente.
En el caso de que haya algún evento, debemos entrar al mismo y copiarnos el código, haciendo click en el botón que aparecerá en la columna “Editor” de la captura de arriba.
Para regenerar nuestra vista, simplemente hay que hacer click en el siguiente botón.
Nos aparecerá la siguiente ventana con opciones a seleccionar de lo que queremos borrar. Si sabemos en que sección se encuentra lo que modificamos podemos seleccionar específicamente una. Para este caso seleccionamos todas.
Ahora volveremos a la pantalla donde debemos volver a generar la vista de actualización al igual que lo hicimos la primera ves.
Con nuestra vista de actualización regenerada, podemos volver a la SM30 (Por las dudas se recomienda salir de la transacción y volver a entrar si no salieron ya) e ingresar de nuevo a nuestro objeto.
Al ingresar de nuevo e ir a agregar una nueva entrada podemos ver que ahora nos aparece el Match Code.
Tambien podemos ver que si seleccionamos un valor del nuevo Match Code automáticamente nos llena el primero de la tabla.
Por ultimo, supongamos que por alguna razón, queremos que el campo Airline URL quede griseado, para hacer esto, primero tenemos que volver a la SE11 a nuestra tabla e ir de nuevo al Table Maintenance Generator. Y vamos al menu Environment–>Modification–>Maintenance Screen.
Nos aparecerá la siguiente pantalla en la que hacemos doble click en la screen a modificar.
Esto nos llevara al screen painter, en donde hacemos click en el botón Layout.
Se nos abrirá la siguiente ventana. En donde vemos los campos que se muestran en la pantalla de la vista de actualización de tablas.
Hacemos doble click en el campo marcado en la captura de arriba y se nos debería abrir otra ventana, en donde debemos des-tildar la opción Input Field, en el tab Program, para hacer que este campo sea NO editable.
Podemos ver que el campo se encuentra griseado, hacemos click en activar y back.
Si ahora volvemos a la transacción SM30 e ingresamos de nuevo para agregar un valor nuevo a nuestra tabla, veremos que el campo se encuentra griseado. (Es posible que tengan que salir y volver a entrar a la SM30 si ya la tenían abierta).
Uno de los problemas que encontré al querer usar mi Raspberry PI 4 (con Ubuntu) es que al desconectarle monitor, teclado y mouse, lo que se le llama headless, es que linux no creaba el entorno gráfico.
Después de mucho googleo encontré una forma que les voy a compartir.
Instalar el desktop que mas nos guste, si estan usando Ubuntu Desktop para ARM entonces esto ya lo tienen.
Instalar el paquete XRDP usando “sudo apt install xrdp”
Agregar el usuario al grupo usando “sudo adduser xrdp ssl-cert”
Reiniciamos el servicio para que tome los cambios usando “sudo systemctl restart xrdp”
Finalmente para conectarnos tenemos que usar algún cliente de RDP como nRemoteNG (si están en windows)
Creamos una nueva conexión y le damos un nombre
Ingresamos el Hostname, nombre de usuario y password que usamos para logearnos en nuestro Raspberry. Tambien nos aseguramos de que este seleccionado RDP como protocolo.
Hacemos doble click en la nueva entrada para logearnos y nos debería aparecer la siguiente pantalla
Ya podemos usar nuestro Raspberry desde el entorno gráfico normalmente.