SAP BO. SAP Business One. Procedimiento de aprobación para filas de un documento de marketing.

     Como les había dicho estaré aquí ya mas seguido y este post va con una dedicatoria especial para Maria Constanza que ayer se comunico conmigo para hacerme preguntas de respecto a unas dudas que tiene claro, que como buena consultora que debe de ser no le daremos la respuesta directa, pero si dejaremos una guía para que resuelva si problemática. 

    Lo que vamos hacer es sencillo, hasta cierto punto de vista, pero eso si algo laborioso. Nuestro caso es el siguiente: "Se requiere definir un procedimiento para aprobar descuentos no mayores otorgados  un artículos de una orden de venta de acuerdo al descuento que le corresponde a su grupo de articulo definido en la lista de precios especiales". ¿Les quedo claro? ¿No?. Espero que con la solución quede mas claro; la solución a este problema planteado sera: "Tener un mecanismo para detectar la diferencia entre el descuento definido para el grupo de artículos y el descuento que otorga el vendedor al preparar una orden de venta, luego emplear este mecanismo para validar cada descuento de cada uno de los artículos de la orden de venta para poder disparar un procedimiento de aprobación mediante una consulta ". No les quedo aun claro?. Vamos a hacer el ejercicio pata dejarnos de antagonismos estériles.
      Lo primero que vamos ha hacer es crear dos campos definidos por el usuario. Uno a nivel cabecera del documento y otro a nivel linea. Quedaran algo así.
  • Titulo = DscItmT. Descripción = Descuento Total. Tipo = Alfanumérico(10). 
  • Titulo = DscItmR. Descripción = Descuento Total. Tipo = Alfanumérico(10). 

      Debido a que no se pueden referenciar desde la cabecera, a través de una consulta, los datos del detalle de un documento en SAP Business One mientras estos datos no existan físicamente en la Base de Datos, y como el procedimiento de aprobación debe dispararse antes de que el documento sea guardado, entonces, vamos a requerir almacenar los datos del detalle en una tabla auxiliar para poder evaluar las líneas de ítem a través de una consulta de usuario.

     Lo segundo que vamos hacer a pero antes una pantalla de lo que llevamos hecho: 
     
     Bueno continuando con lo segunda parte es crear una base de datos auxiliar para validar el documento que aun no ha sido escrito en memoria para esto vamos a crear una base de datos, una tabla y un store procedure(que se guardara en la compañía de producción) para guardar y evaluar cada una de las lineas del documento, el código esta a continuación; 

-- Creación de BD auxiliar o temporal
IF EXISTS (SELECT *
         FROM   master..sysdatabases
         WHERE  name = 'SBOTemp')
   DROP DATABASE SBOTemp
GO

CREATE DATABASE SBOTemp
GO


-- Creación de Tabla temporal para las líneas de la Orden de Venta
USE SBOTemp
GO
IF EXISTS(SELECT name FROM sysobjects
      WHERE name = 'SBO_RDR1_TMP' AND type = 'U')
   DROP TABLE SBO_RDR1_TMP
GO
CREATE TABLE SBO_RDR1_TMP (
   DocNum   Integer,       -- Número de Documento
   DocDate  DateTime,      -- Fecha del documento
   RowNum   SmallInt,      -- Número de línea
   ItemCode Varchar(20),   -- Código de artículo
   Result   Varchar(10) )  -- Resultado de validación
GO


-- Para Validar el descuento por Línea de la orden de venta

USE [NOMBRE DE SU COMPAÑIA] 
GO
IF EXISTS(SELECT name FROM sysobjects
      WHERE name = 'SP_SBO_VAL_DISCOUNT_SO_ITEM' AND type = 'P')
   DROP PROCEDURE SP_SBO_VAL_DISCOUNT_SO_ITEM
GO
-- Store Procedure para validar el descuento por articulo  de la Orden de venta
CREATE PROCEDURE SP_SBO_VAL_DISCOUNT_SO_ITEM
@CardCode Varchar(20),  --   $[$4.0.0] BP Code
@DocNum   Integer    ,  --   $[$8.0.0] Document Number
@DocDate  DateTime   ,  --  $[$10.0.0] Posting Date
@RowNum   SmallInt   ,  --  $[$38.0.0] Row Number (order detail)
@ItemCode Varchar(20),  --  $[$38.1.0] Item Code (order detail)
@ItemDsct Decimal(9,6)  -- $[$38.15.0] % Discount (order detail)
AS
SET NOCOUNT ON
DECLARE @ItmGrpDsct Decimal(9,6)  -- % Item Group Discount
DECLARE @Result Varchar(10)       -- Valid o Invalid result
SET @Result = ' '
-- Verificación de parámetros
IF @CardCode != '' AND @ItemCode != ''
   BEGIN
      -- Consulta de descuento para socio de negocios
      SELECT
         @ItmGrpDsct = OSPP.Discount
      FROM
         OSPP
      WHERE
        OSPP.CardCode = @CardCode
        AND OSPP.ItemCode = @ItemCode
      -- Evaluation for Result
      IF @ItemDsct > @ItmGrpDsct
         SET @Result = 'INVALIDO'
      ELSE
         SET @Result = 'VALIDO'
      -- Tabla temporal
      ---- Verifica si existe el dato en tabla temporal,
      ---- si existe lo actualiza, sino lo inserta
      IF EXISTS( SELECT 'X'
                 FROM SBOTemp.dbo.SBO_RDR1_TMP
                 WHERE DocNum = @DocNum
                   AND RowNum = @RowNum )
         BEGIN
            -- Actualiza el registro existente
            UPDATE SBOTemp.dbo.SBO_RDR1_TMP SET
               ItemCode = @ItemCode,
               Result   = @Result
            WHERE DocNum = @DocNum
              AND RowNum = @RowNum
         END
      ELSE
         BEGIN
            -- Inserta un nuevo registro en la tabla temporal
            INSERT INTO SBOTemp.dbo.SBO_RDR1_TMP VALUES (
               @DocNum,
               @DocDate,
               @RowNum,
               @ItemCode,
               @Result )
         END
      ---- Elimina los registros que no son de la fecha DocDate
      DELETE FROM SBOTemp.dbo.SBO_RDR1_TMP
       WHERE DocDate < @DocDate
          OR RowNum = 0
   END
-- Show Result
--------------
SELECT @Result
GO


     Ahora vamos a pasar a nuestro cliente SAP Business One y vamos a definir una consulta que llame a nuestro store procedure. Que sera algo así: 

Donde:
$[$4.0.0]            à Código socio de negocios. 
$[$8.0.0]            à Número de documento
$[$10.0.0]          à Fecha de documento.
$[$38.1.0]          à Código de articulo.
$[$38.15.0]        à % de descuento otorgado al articulo.


     Y la consulta la vamos a guardar con el siguiente nombre: "Val. Dscto. Orden de venta artículos". Ahora bien vamos ha darle un uso practico a todo esto y lo que haremos es en el campo que creamos "DsctItmR" una búsqueda formateada que la vamos a configurar como la siguiente imagen: 

     Lo hemos configurado de esta manera para que se actualice constantemente nuestros campos conforme capturemos valores. Para probar este punto vamos a crear grupos de descuento para socios de negocio y vamos a generar una orden de venta lo cual se vería algo así : 


     Ahora bien ya validamos nuestro documento linea por linea, ahora validar el documento completo y lo haremos con la siguiente consulta y le asignaremos una búsqueda formateada al campo DsctItremT con la misma configuración anterior, ahora en la imagen vamos a ver la consulta y un ejemplo de cuando un articulo esta mal se nos muestra de inmediato el valor INVALIDO en el campo DsctItemT: 


     Ya estamos llegando al final y para crear nuestro proceso de autorización ocupamos crear una ultima consulta que pregunte sobre el estado de nuestro documento la consulta seria la siguiente: 


     Ahora si creamos nuestro procedimiento de autorización que seria algo parecido a esta pantalla. 

     Ahora si lo ultimo seria probar dicho proceso. Ahora Bien Maria me pidió ayuda para el calculo de la ganancia bruta con respecto a un vendedor, igual cambiando un poco de estas cosas podría ella generar distintas reglas de negocio, inclusive un consulta que le pudiera ayudar seria: IF $[oqut.U_Dept] = 'A' AND ($[OQUT.GrosProfit.number] / $[OQUT.DocTotal.number] < 0.4) SELECT 'true'. Pero bueno aquí cada quien aplicaría su criterio. 

     Hoy me despido un poco diferente con  unas palabras de mi autor favorito: "Todos los tiempos tienen cosas buenas, todos los tiempos las tuvieron malisimas, pero como comunidad la especie humana es un desastre. Entonces es muy dificil decir que todo el tiempo pasado ha sido mejor" Jose Saramago

Saludos. 

7 comentarios:

  1. Anónimo Says:

    De hecho este documento es de sap. Alguien me lo paso en el foro. Saludos. por ahi lo pueden conseguir tambien.

  2. sapbo_Roberto Says:

    Muy bien Ingeniero. Vale la pena documentar de manera sencilla procesos que nos puedan traer beneficios.... que sea documento de sap o no, es lo de menos, Gracias. ROBERTO ARIAS

  3. Alejandra Says:

    Hola buenas tardes,

    Me gustaría saber si este procedimiento toma en cuenta las líneas que se borran de la orden de venta, eliminándolas de la tabla temporal.

    Gracias y saludos

  4. Anónimo Says:

    Hola!
    Como puedo re-enviar una orden de compras cerrada por error por la persona que autoriza.

  5. Anónimo Says:

    Hola, recreando el procedimiento, logre ver que cuando se borran lineas no afecta la base temporal. Si alquien tiene idea como agregar esta mejora , me gustaria que la publicara.
    Saludos

  6. Unknown Says:

    La mejor manera de trabajar autorizaciones a nivel de detalle de los documentos es primero crear un campo de usuario a nivel de encabezado donde se indique si el documento requiere autorización y su valor por defecto es NO.
    crear un sp que valide las condiciones, en este caso los descuentos para todos los documentos que tienen el campo de autorización en NO.
    Lo que pasara de cara al usuario es que se le mostrara un mensaje indicando que no puede crear el documento, que requiere solicitar autorizacion, para esto cambia el valor del campo de usuario de autorizacion a SI, y con este campo se activa el proceso de autorizacion, donde el documento quedara como preliminar. luego de aprobado el documento con el campo autorizacion en SI, se crea la transaccion la cual es omitida por el SP por su valor del campo de usuario.
    de esta maneja es mas transparente al trabajar con elementos del estandar y menos complejo a no requerir tantos elementos tecnicos.

    Andres Ramirez Jaramillo.

  7. Anónimo Says:

    De acuerdo con Andres Ramirez Jaramillo, es la mejor forma.

Related Posts with Thumbnails