En este caso práctico vamos a crear un modelo que se ejecutará tras insertar o al editar una línea de un ticket, para permitir editar datos de la línea que no están disponibles desde la inserción/edición de línea estándar de la TPV.


También veremos cómo se puede condicionar este modelo para solo mostrarlo cuando se cumplan ciertos requisitos personalizables. En nuestro caso, vamos a hacer que la ventana solo se levante cuando la línea que se inserte, tenga un IdLinea par.


Recoger datos y aplicar condiciones deseadas


Será necesario un subproceso


Que tenga como origen de datos un procedimiento en el que se evalúe una o tantas condiciones como se necesiten.



Por ejemplo, en este procedimiento, se analiza si el IdLinea es par o impar.


CREATE PROCEDURE [dbo].[pPers_Evalua_Insercion]
@iXML XML,
@oXML XML OUTPUT
AS

DECLARE @IdTicket INT
DECLARE @IdLinea INT
DECLARE @MostrarVentana BIT

BEGIN TRY

-- Obtener parámetros de entrada
SELECT @IdTicket = T.C.value('IdTicket[1]','INT'),
@IdLinea = T.C.value('Linea[1]/IdLinea[1]','INT')
FROM @iXML.nodes('./data') T(C)

IF (@IdLinea % 2 = 0) BEGIN
SET @MostrarVentana = 1
END ELSE BEGIN
SET @MostrarVentana = 0
END

SET @oXML =
(SELECT
(SELECT
'ok' AS Estado,
'' AS Mensaje
FOR XML PATH('Respuesta'), ELEMENTS, TYPE),
(SELECT
@MostrarVentana AS MostrarVentana,
@IdTicket AS IdTicket,
@IdLinea AS IdLinea
FOR XML PATH('data'), ELEMENTS, TYPE),
(SELECT
NULL
FOR XML PATH('view'), ELEMENTS, TYPE)
FOR XML PATH('Resultado'), ELEMENTS, TYPE)

RETURN -1

END TRY

BEGIN CATCH

IF @@TRANCOUNT > 0 ROLLBACK TRAN

DECLARE @CatchError NVARCHAR(MAX) = ERROR_MESSAGE()
DECLARE @err_state INT = ERROR_STATE()
DECLARE @err_severity INT = ERROR_SEVERITY()

RAISERROR(@CatchError,@err_severity, @err_state)

RETURN 0

END CATCH

GO
zPermisos 'pPers_Evalua_Insercion'

Una vez configurado todo, se incluirá el subproceso en el proceso Pos inserción de línea (AHOR87). En versiones posteriores a la v4.4.2400.88 el proceso se llama TICKET LÍNEA - POST inserción (AHOR87).



Modelo


Una vez tenemos todo lo anterior configurado, podemos crear el modelo.



El origen de datos, para obtener datos extra de la línea del artículo, dependiendo de las necesidades en cuanto a la ventana, puede no ser necesario.



El diseño del formulario:




Guardado de formulario


El modelo en cuestión servirá, en este caso, para modificar las observaciones de una línea, así que necesita de un procedimiento y un subproceso/proceso/menú.


El procedimiento guarda las observaciones de la línea del ticket, en caso de recibir múltiples líneas de un ticket, solo modificará las observaciones de la primera:


CREATE PROCEDURE [dbo].[pPers_TPV_Guarda_Observaciones]
@iXML XML,
@oXML XML OUTPUT
AS

DECLARE @IdTicket INT
DECLARE @IdLinea INT
DECLARE @Observaciones VARCHAR(255)

BEGIN TRY

-- Obtener parámetros de entrada
SELECT @IdTicket = T.C.value('IdTicket[1]','INT'),
@IdLinea = T.C.value('Linea[1]/IdLinea[1]','INT'),
@Observaciones = T.C.value('Observaciones[1]','VARCHAR(255)')
FROM @iXML.nodes('./data') T(C)

-- Actualizar observaciones de la linea del ticket
UPDATE Tickets_Lineas SET Observaciones = @Observaciones
WHERE IdTicket = @IdTicket AND IdLinea = @IdLinea

-- Mensaje de ok
SELECT @oXML = '<Resultado>
<Respuesta>
<Estado>ok</Estado>
<Mensaje>Observaciones de la línea actualizada</Mensaje>
</Respuesta>
<data />
<view />
</Resultado>'

RETURN -1

END TRY

BEGIN CATCH

IF @@TRANCOUNT > 0 ROLLBACK TRAN

DECLARE @CatchError NVARCHAR(MAX) = ERROR_MESSAGE()
DECLARE @err_state INT = ERROR_STATE()
DECLARE @err_severity INT = ERROR_SEVERITY()

RAISERROR(@CatchError,@err_severity, @err_state)

RETURN 0

END CATCH

GO

-- Asigna permisos al procedimiento almacenado que acabas de crear
zPermisos 'pPers_TPV_Guarda_Observaciones'


Una vez creado el procedimiento, creamos un origen de datos usando este procedimiento de la siguiente forma:



Ese origen de datos, lo utilizamos en un subproceso de tipo Guardado de formularios:



Incluímos el subproceso en un proceso que refresca el ticket:




NOTA:

El refresco del ticket solo será necesario en caso de querer mostrar las observaciones en las líneas del ticket



Incluímos el proceso en un menú:



Y una vez tenemos el menú, lo asignamos al pie del modelo en el que hemos colocado un componente ahora menú.


Subproceso que levanta el modelo


Crearemos el subproceso, al que le asignaremos el modelo que acabamos de crear.



Después, vamos a colocarle la condición que va a hacer que se levante solo cuando queremos.



Este subproceso lo vamos a colocar, igual que el anterior, en el proceso TICKET LÍNEA - POST inserción



Una vez configurado, la ventana se levantará al realizar una inserción, pero solo cuando se cumplan las condiciones que queramos.