Crear búsquedas formateadas en SAP Business One Parte 2

Hoy les traigo algo más avanzado sobre el uso de las búsquedas formateadas en SAP B1 a raíz de las preguntas en nuestra parte 1 Crear búsquedas formateadas en SAP Business One

Vamos a empezar creando una base de datos que llamaremos «Repositorio»

CREATE DATABASE RP_SBODemoCL
COLLATE SQL_Latin1_General_CP850_CI_AS
GO

Aquí guardaremos en tablas adicionales a SAP, el detalle de los documentos que se vayan creando. Ya que no es posible consultar con una BF por linea.

Haremos un caso práctico que implemente:
Si la entrada de mercaderías, tiene una cantidad mayor a la OC, debe pasar por un proceso de autorizacion.

Comenzamos creando una tabla donde guardaremos los datos de la linea de la entrada de mercadería que realiza el usuario.

USE RP_SBODemoCL
CREATE TABLE [dbo].[SBO_Temp_POR1](
	[DocEntry] [nvarchar](255) NULL,
	[LineNum] [nvarchar](255) NULL,
	[ItemCode] [nvarchar](255) NULL,
	[OC_Qty] [numeric](19, 6) NULL,
	[OC_OpenQty] [numeric](19, 6) NULL,
	[Quantity] [numeric](19, 6) NULL,
	[BaseEntry] [int] NULL,
	[CreateDate] [datetime] NULL,
	[CardCode] [nvarchar](20) NULL
) ON [PRIMARY]

GO

En esta tabla se insertarán las lineas del documento donde más tarde consultaremos el proceso de autorizacion.

Para insertar los datos, crearemos un procedimiento almacenado en la base de datos repositorio y lo llamaremos desde SAP.

USE RP_SBODemoCL 
CREATE proc [dbo].[Insert_POR1] 
	(
		@P1 nvarchar(255), 
		@P2 nvarchar(255), 
		@P3 nvarchar(255), 
		@P4 numeric(19,6), 
		@P5 numeric(19,6), 
		@P6 numeric(19,6), 
		@P7 int, 
		@P8 nvarchar(255)
	)

as
begin
	if exists(select 'A' from RP_SBODemoCL..SBO_Temp_POR1 T0 where T0.DocEntry=cast(@P1 as nvarchar(255)) and T0.LineNum=cast(@P2 as nvarchar(255)) and T0.CardCode=cast(@P8 as nvarchar(255)))
	begin
		update RP_SBODemoCL..SBO_Temp_POR1
		set
			DocEntry=cast(@P1 as nvarchar(255)),LineNum=cast(@P2 as nvarchar(255)),ItemCode=cast(@P3 as nvarchar(255)),OC_Qty=cast(@P4 as numeric(19,6)),OC_OpenQty=cast(@P5 as numeric(19,6)),Quantity=cast(@P6 as numeric(19,6)),BaseEntry=cast(@P7 as int), CardCode=cast(@P8 as nvarchar(255))
		where DocEntry=cast(@P1 as nvarchar(255)) and LineNum=cast(@P2 as nvarchar(255)) and CardCode=cast(@P8 as nvarchar(255))
	end
	else
		insert into RP_SBODemoCL..SBO_Temp_POR1
		values (cast(@P1 as nvarchar(255)),cast(@P2 as nvarchar(255)),cast(@P3 as nvarchar(255)),cast(@P4 as numeric(19,6)),cast(@P5 as numeric(19,6)),cast(@P6 as numeric(19,6)),cast(@P7 as int), cast(getdate() as datetime), cast(@P8 as nvarchar(255)))
end

GO

Con ese procedimiento que llamaremos desde una BF, insertaremos o actualizaremos un registro de la tabla SBO_Temp_POR1.

Ya hemos terminado la parte «externa», ahora debemos ir a SAP y crear una BF de la siguiente manera.

declare 
	@A1 numeric(19,6), 
	@A2 numeric(19,6), 
	@A3 numeric(19,6), 
	@A4 int

set @A1 = cast((select T0.Quantity from POR1 T0 where T0.DocEntry=$[$38.45.0] and T0.LineNum=$[$38.46.0] and T0.ItemCode=$[$38.1.0]) as numeric(19,6))
set @A2 = cast((select T0.OpenQty from POR1 T0 where T0.DocEntry=$[$38.45.0] and T0.LineNum=$[$38.46.0] and T0.ItemCode=$[$38.1.0]) as numeric(19,6))
set @A3 = cast($[$38.11.NUMBER] as numeric(19,6))
set @A4 = cast($[$38.45.0] as int)


EXEC RP_SBODemoCL..Insert_POR1
  $[OPDN.DocNum],
  $[$38.0.0],
  $[$38.1.0],
  @A1,
  @A2,
  @A3,
  @A4,
  $[OPDN.CardCode]

Luego de eso, la colocamos BF en un campo (el que ustedes quieran) y la configuramos de esta manera.

ScreenShot290

Y cada vez que el usuario modifique la cantidad, se actualizaran los datos en la tabla con el procedimiento y la BF que creamos.
Si tenemos la siguiente entrada de mercadería en SAP desde una OC cualquiera, veremos lo siguiente en SAP:

ScreenShot291

y en la tabla de SQL:
ScreenShot292

Como ven, los datos del detalle de la entrada y de la OC están insertados en la tabla, ahora viene la query del proceso de autorizacion.

————————————————————————
if (isnull((
select count(*)
from RP_SBODemoCL..SBO_Temp_POR1 T0
where T0.DocEntry=$[OPDN.DocNum]
and T0.CardCode=$[OPDN.CardCode]
and ((T0.Quantity>T0.OC_Qty and T0.Quantity>T0.OC_OpenQty)
or (T0.QuantityT0.OC_OpenQty))),0))>0

begin
select distinct ‘true’
end
————————————————————————

Con esto validamos que la entrada siempre tenga la misma cantidad que la OC o que la cantidad abierta de la OC.

Espero les haya gustado este pequeño tutorial más avanzado del uso de las BF.

Suscribanse a las RSS si desean enterarse de los nuevos post y comentarios de la página.

Saludos y gracias por su visita.

También te podría gustar...

33 Respuestas

  1. Mauri dice:

    Hola, y para tu ejemplo si quisieras eliminar una entrada, se duplicaría con el código siguiente. Como controlas eso?

  2. Juan Crivaro dice:

    Hola Felipe. Estoy queriendo completar con una BF los campos de la QUT12 (DIreccion) de una oferta de ventas basado en la dirección de otro socio de negocios. Como la ventana de direcciones de la oferta no tiene la posibilidad de acceder a los datos de la cabecera de la oferta, se me ocurre que quizás con este procedimiento podría resolverlo. Yo guardo en un campo adicional(U_SN) el CardCode del socio de negocios adicional, de quién quiero traerme los datos de la dirección. (Es que le cotizo a un SN pero lo entregó en la dirección de otro SN). Podrás darme una mano?

  3. Katherina dice:

    hola felipe muchas gracias por tus valiosos aportes, una consulta como puedo traer el valor de un campo de usuario para que se copie por línea la misma información en un Albarán de Entrada de Mercancías? Es decir, si la línea 0 del Albarán de Entrada tiene un valor el mismo se aparezca en la siguiente línea al introducir el artículo.

    Muchas gracias!! Espero me puedas ayudar…

  4. Edwin dice:

    me sale el error al ejecutar la autorizacion

    (could not commint transaction: Error -1 detected during transaction (por1)

  5. sandra m dice:

    hola Felipe

    Estoy tratando de hacer una busqueda formeteada
    en el documento recibo de la produccion que contenga
    el numero de la orden de fabricacion + numero de articulo
    y que ese sea el lote, pero no puedo hacerla. agradeceria su ayuda.

  6. Claudio dice:

    Hola Chicos, una consulta.
    Trabajo en control de gestión y recién nos cambiamos a SAP. Ahora tengo que armar una data con todas las transacciones contables.
    Favor me guían en que tablas tengo que consultar.

  7. Carlos Alvarado M. dice:

    Hola Felipe, ese método toma el total del documento, en este caso se requiere hacerlo por línea. Espero me puedas dar alguna idea o ayuda.
    Muchas gracias.

  8. Carlos Alvarado M. dice:

    Muchas gracias por tu aporte.
    Solicito por favor tu apoyo, la autorización en la Oferta de venta debe revisar que cada línea de la misma cumpla con que la ganancia sea mayor o igual al 12%, he elaborado la siguiente query para el proceso de autorización:

    DECLARE @ganancia INT
    DECLARE @valorCosto INT
    DECLARE @mon nvarchar(7)
    DECLARE @mon2 nvarchar(7)

    SET @valorCosto = $[QUT1.GrossBuyPr.0]*$[QUT1.Quantity.0]
    SET @ganancia = $[QUT1.GrssProfit.0] / @valorCosto
    SET @mon=(SELECT DISTINCT doccur FROM oqut where doccur=’SOL’)
    SET @mon2=(SELECT DISTINCT doccur FROM oqut where doccur=’USD’)

    IF @mon=’SOL’
    SELECT DISTINCT ‘True’ From QUT1 t1
    WHERE @ganancia < '0.12'
    AND $[$38.39.0] = 'N'
    IF @mon2='USD'
    SELECT DISTINCT 'True' From QUT1 t1
    WHERE @ganancia < '0.12'
    AND $[$38.39.0] = 'N'

    Sin embargo no hacen ningún efecto. Al crear una Oferta de venta con menos del 12% (inclusive con ganancia negativa) o cualquier otro, tengo el mensaje "Se ha producido un error interno (-1004) [Mensaje 131-183]" y el documento se crea.
    Espero me puedas ayudar. Muchas gracias.