Utilidades SQL - Ejemplo de stored de integración de pedidos con ERP

Creado por David Miralpeix, Modificado el Fri, 16 Feb 2024 a las 12:26 PM por David Miralpeix

Ejemplo de cómo generar una stored personalizada para crear pedidos tal cual lo haría el ERP
- Creamos un pedido de cliente con los artículos que pase por parámetro o si no con los que se definan en tabla personalizada Pers_Clientes_PedidoHab
- Definimos la llamada mediante script

Probado con versión 4.2.1
Atención, que si cambiamos de versión y la estructura de tablas cambió, tendremos que adaptar la stored a dichos cambios.

 

Código SQL:

ALTER TABLE [dbo].[Pers_Clientes_PedidoHab] DROP CONSTRAINT [FK_Pers_Clientes_PedidoHab_Clientes_Datos]
GO

ALTER TABLE [dbo].[Pers_Clientes_PedidoHab] DROP CONSTRAINT [FK_Pers_Clientes_PedidoHab_Articulos]
GO

/****** Object: Table [dbo].[Pers_Clientes_PedidoHab] Script Date: 24/03/2017 12:25:25 ******/
DROP TABLE [dbo].[Pers_Clientes_PedidoHab]
GO

/****** Object: Table [dbo].[Pers_Clientes_PedidoHab] Script Date: 24/03/2017 12:25:25 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Pers_Clientes_PedidoHab](
[IdCliente] [dbo].[T_Id_Cliente] NOT NULL,
[IdArticulo] [dbo].[T_Id_Articulo] NOT NULL,
[Cantidad] [dbo].[T_Cantidad] NOT NULL,
[IdDoc] [dbo].[T_Id_Doc] IDENTITY(1,1) NOT NULL,
CONSTRAINT [PK_Pers_Clientes_PedidoHab] PRIMARY KEY CLUSTERED
(
[IdCliente] ASC,
[IdArticulo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Pers_Clientes_PedidoHab] WITH CHECK ADD CONSTRAINT [FK_Pers_Clientes_PedidoHab_Articulos] FOREIGN KEY([IdArticulo])
REFERENCES [dbo].[Articulos] ([IdArticulo])
ON UPDATE CASCADE
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[Pers_Clientes_PedidoHab] CHECK CONSTRAINT [FK_Pers_Clientes_PedidoHab_Articulos]
GO

ALTER TABLE [dbo].[Pers_Clientes_PedidoHab] WITH CHECK ADD CONSTRAINT [FK_Pers_Clientes_PedidoHab_Clientes_Datos] FOREIGN KEY([IdCliente])
REFERENCES [dbo].[Clientes_Datos] ([IdCliente])
ON UPDATE CASCADE
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[Pers_Clientes_PedidoHab] CHECK CONSTRAINT [FK_Pers_Clientes_PedidoHab_Clientes_Datos]
GO

zpermisos Pers_Clientes_PedidoHab
go


if exists (select * from sys.procedures where name = 'pPers_Pedido_Asistente') begin
drop procedure pPers_Pedido_Asistente
end
go
CREATE PROCEDURE [dbo].[pPers_Pedido_Asistente]
@IdEmpleado t_id_empleado
, @IdCliente t_id_cliente
, @IdContacto t_id_contacto
, @IdProyecto t_id_proyecto = NULL
, @IdFormaPago t_forma_pago = NULL
, @IdArticulo1 t_id_articulo = NULL
, @Cantidad1 t_cantidad = 1
, @IdArticulo2 t_id_articulo = NULL
, @Cantidad2 t_cantidad = 1
, @IdPedido t_id_Pedido = 0 output
AS
select @IdProyecto=case when isnull(@idproyecto,0)=0 then null else @idproyecto end
, @IdContacto=case when isnull(@IdContacto,0)=0 then null else @IdContacto end
, @IdFormaPago=case when isnull(@IdFormaPago,0)=0 then null else @IdFormaPago end
, @IdArticulo1=case when isnull(@IdArticulo1,'')='' then null else @IdArticulo1 end
, @IdArticulo2=case when isnull(@IdArticulo2,'')='' then null else @IdArticulo2 end
--declare @IdPedido int
declare @IdLinea int
--declare @IdFactura int
--declare @IdAlbaran int
--declare @NumFactura int
--set @IdAlbaran = 0
--set @IdPedido = 0
--set @IdLinea = 0
--set @IdFactura = 0

Declare @vRet int
declare @IdEmpresa t_id_empresa
declare @IdDepartamento t_id_departamento

declare @FechaPed smalldatetime
--declare @IdContacto t_id_contacto
declare @IdContactoA t_id_contacto
declare @IdContactoF t_id_contacto
declare @DescripPed varchar (255)
declare @IdLista t_id_lista
declare @FormaPago t_forma_pago
declare @IdMoneda t_id_moneda
declare @Descuento real
declare @ProntoPago real
declare @IdPortes T_Id_Portes
declare @IdIva T_Id_Iva
declare @IdComisionista t_id_empleado
declare @Usuario varchar (50)
declare @IdCentroCoste T_Id_CentroCoste
declare @IdDelegacion t_id_delegacion
set @Usuario = USER


select @FechaPed=GETDATE() ,@IdContacto=isnull(@IdContacto,cd.IdContacto),@IdContactoA=cd.IdContactoA,@IdContactoF=cd.IdContactoF
,@DescripPed= cd.Cliente + ' Fecha: ' + convert(varchar (10),GETDATE(),103),@IdLista=cde.IdLista
,@FormaPago= ISNULL(@IdFormaPago, cde.FormaPago)
,@IdMoneda=cde.IdMoneda
,@Descuento=cde.Descuento,@ProntoPago=cde.ProntoPago, @IdPortes=IdPortes, @IdIva = IdIva
,@IdComisionista = cdc.IdEmpleado
from Clientes_Datos cd
inner join Clientes_Datos_Economicos cde on cde.IdCliente=cd.IdCliente
inner join Clientes_Datos_Comerciales cdc on cdc.IdCliente=cd.IdCliente
where cd.IdCliente = @IdCliente

--select @FechaPed=getdate()
select @IdDepartamento=ed.IdDepartamento,@IdEmpresa=d.IdEmpresa, @IdDelegacion=d.IdDelegacion from Empleados_Datos ed inner join Departamentos d on d.IdDepartamento=ed.IdDepartamento where ed.IdEmpleado=@IdEmpleado
--select @IdCentroCoste=IdCentroCoste from Proyectos where IdProyecto=@IdProyecto

select @IdPedido=0, @IdLinea=0

BEGIN TRY
BEGIN TRAN
Exec @vRet = pPedidos_Cli_Cabecera_I @IdPedido out, --auto
@IdEmpresa = 0,
@AñoNum = 2017, --lo obtiene automáticamente de acuerdo a la serie y la fecha
@SeriePedido = 0,
@NumPedido = 0, --auto
@Fecha = @FechaPed,
@IdCliente = @IdCliente,
@Origen = NULL,
@IdPedidoCli = NULL,
@IdContacto = @IdContacto, --ficha de cliente
@IdContactoA = @IdContactoA, --""
@IdContactoF = @IdContactoF, --""
@DescripcionPed = @DescripPed, --descrip opcional
@IdLista = @IdLista,--ficha de cliente lista de precios
@IdListaRevision = 1, --ficha de cliente lista de precios rev
@IdEmpleado = @IdEmpleado, --emp. alta
@IdDepartamento = @IdDepartamento, --depto empleado alta
@IdTransportista = NULL,
@IdMoneda = @IdMoneda, --Ficha de cliente
@FormaPago = @FormaPago, --ficha de cliente
@Descuento = @Descuento, --ficha de cliente
@ProntoPago = @ProntoPago, --ficha de cliente
@IdPortes = @IdPortes, --ficha de cliente
@IdIva = @IdIva, --ficha de cliente
@IdEstado = 0, --pedidos_estados
@IdSituacion = 0,
@FechaSalida = @FechaPed,
@Observaciones = NULL,
@Comision = 0,
@Cambio = 0,
@CambioEuros = 1,
@CambioBloqueado = 0,
@Representante = @IdComisionista,--comisionista --ficha de cliente
@IdCentroCoste = @IdCentroCoste,
@IdProyecto = @IdProyecto,
@IdOferta = NULL,
@Revision = NULL,
@Inmovilizado = 0,
@Referencia = '0',
@RecogidaPorCli = 0,
@ContactoLlamada = NULL,
@Hora = NULL,
@HoraSalida = NULL,
@IdTipoPedido = 0,
@RecEquivalencia = 0,
@Bloqueado = 0,
@IdMotivoBloqueo = NULL,
@IdEmpleadoBloqueo = NULL,
@IdApertura = NULL,
@IdPedidoOrigen = 0,
@NoCalcularPromo = 0,
@IdDoc = NULL,
@Usuario = @Usuario,
@FechaInsertUpdate = @FechaPed

if @vRet = 0 begin
RAISERROR('Error al insertar el pedido',12,1)
end

declare @TablaArticulos table (IdArticulo t_id_Articulo, Descrip varchar (50), IdIva smallint, Cantidad float)

if @IdArticulo1 is not null or @IdArticulo2 is not null begin
insert into @TablaArticulos
(IdArticulo, Descrip, IdIva, Cantidad)
select IdArticulo, Descrip,IdIva,isnull(@Cantidad1,1)
from articulos where IdArticulo = @IdArticulo1
UNION
select IdArticulo, Descrip,IdIva,isnull(@Cantidad2,1)
from articulos where IdArticulo = @IdArticulo2
end else begin
insert into @TablaArticulos
(IdArticulo, Descrip, IdIva, Cantidad)
select a.IdArticulo, a.Descrip,a.IdIva,1
from articulos a
inner join Pers_Clientes_PedidoHab p on p.IdArticulo=a.IdArticulo
where p.IdCliente=@IdCliente
end

declare @Precio T_Precio, @PrecioPtas T_Precio
declare @IdMonedaDev T_Id_Moneda
declare @DescuentoLin float
declare @Comision T_Comision
declare @DtoLP1 float
declare @DtoLP2 float
declare @idTipoCantidad T_Tipo_Cantidad
declare @_IdArticulo t_id_Articulo, @_Descrip varchar (50), @_IdIva t_id_iva, @_Cantidad float

DECLARE lCur CURSOR FOR
Select IdArticulo,Descrip,IdIva,Cantidad
from @TablaArticulos
OPEN lCur
FETCH NEXT FROM lCur INTO @_IdArticulo, @_Descrip,@_IdIva,@_Cantidad
WHILE @@FETCH_STATUS <> -1
BEGIN
select @Precio=0, @DtoLP1=0,@DtoLP2=0, @DescuentoLin=0, @Descuento=0
exec dbo.PDamePrecio_Articulo
@IdArticulo =@_IdArticulo,
@IdCliente =@IdCliente,
@IdLista =@IdLista,
@Cantidad =@_Cantidad,
@IdMoneda =@IdMoneda,
@Precio =@Precio OUTPUT,
@IdMonedaDev =@IdMoneda OUTPUT,
@Descuento =@DescuentoLin OUTPUT,
@Comision =@Comision OUTPUT,
@IdListaRet =NULL,--@IdLista OUTPUT,
@DtoLP1 =@DtoLP1 OUTPUT,
@DtoLP2 =@DtoLP2 OUTPUT,
@DtoGD =@Descuento OUTPUT,
@IdAlmacen =0,
@PrecioCosteEuros =0,-- OUTPUT,
@PreciosGenericos =0,
@CampoPrecioCoste =0,
@IdTipoUnidad =@idTipoCantidad OUTPUT,
@FechaComprobacion =@FechaPed,
@IdDelegacion =@IdDelegacion,
@DtoLP3 =NULL,
@DtoLP4 =NULL,
@DtoLP5 =NULL,
@Objeto =NULL,
@IdDocObjeto =NULL
set @PrecioPtas = @Precio * 166.386
--creamos la línea de pedido
--select @IdLista

Exec @vRet = pPedidos_Cli_Lineas_I @IdPedido ,
@IdLinea output,
@IdArticulo = @_IdArticulo,
@IdArticuloCli = NULL,
@IdAlmacen = 0,
@Cantidad = @_Cantidad,
@Precio = @PrecioPtas,
@Precio_EURO = @Precio,
@PrecioMoneda = @Precio,
@Descuento = @DescuentoLin,
@IdIva = @IdIva,
@IdEstado = 0,
@IdSituacion = 0,
@IdEmbalaje = NULL,
@CantidadEmbalaje = 1,
@Observaciones = NULL,
@Descrip = @_Descrip,
@Comision = @Comision,
@IdAlbaran = NULL,
@FechaAlbaran = NULL,
@IdFactura = NULL,
@FechaFactura = NULL,
@CantidadLotes = 0,
@Marca = NULL,
@EmbalajeFinal = NULL,
@CantidadEmbalajeFinal = 1,
@Descrip2 = NULL,
@PesoNeto = 0,
@PesoEmbalaje = 0,
@PesoEmbalajeFinal = 0,
@Orden = 0,
@TotalComision = 0,
@Path = NULL,
@DtoLP1 = @DtoLP1,
@DtoLP2 = @DtoLP2,
@DtoGD = @Descuento,
@DtoMan = 0,
@ConjManual = 0,
@IdDocPadre = NULL,
@IdFase = NULL,
@IdProyecto_Produccion = NULL,
@CuentaArticulo = NULL,
@TipoUnidadPres = NULL,
@UnidadesStock = 0,
@UnidadesPres = @Precio,
@Precio_EuroPres = @Precio,
@PrecioMonedaPres = @Precio,
@IdOrdenCarga = NULL,
@IdOferta = 0,
@Revision = 1,
@IdOfertaLinea = 0,
@RefCliente = NULL,
@NumPlano = NULL,
@IdParte = NULL,
@IdSeguimiento = NULL,
@IdConceptoCertif = NULL,
@NumBultos = @_Cantidad,
@IdTipoOperacion = NULL,
@IdFacturaCertif = 0,
@UdsCarga = 0,
@IdEmbalaje_Disp = NULL,
@IdOrdenRecepcion = NULL,
@CantRecep = 0,
@NumBultosFinal = 0,
@DtoLP3 = 0,
@DtoLP4 = 0,
@DtoLP5 = 0,
@UdStockCarga = 0,
@UdStockRecep = 0,
@IdMaquina = NULL,
@Total_Euros = 0,
@Total_Moneda = 0,
@IdDoc = NULL,
@Usuario = @Usuario,
@FechaInsertUpdate = @FechaPed

if @vRet = 0 begin
RAISERROR('Error al insertar la línea del pedido',12,1)
end
FETCH NEXT FROM lCur INTO @_IdArticulo, @_Descrip,@_IdIva,@_Cantidad
END
CLOSE lCur
DEALLOCATE lCur

exec @vRet = pPedido_MarcarAlbaran @idpedido

if @vRet = 0 begin
RAISERROR('Error al insertar la línea del pedido',12,1)
end
COMMIT TRAN
--select 'Javascript', 'window.open(''./view.aspx?Tipo=Pers_PedidoCliCab&Where=IdPedido=' + convert(varchar (10),@IdPedido) + ''')' as Javascript --abre nuevo objeto en ventana nueva
--select 'window.open(''./view.aspx?Tipo=Pers_Pedido_Cli_Cab&Where=IdPedido=' + convert(varchar (10),@IdPedido) + ''');parent.cierraIframe();parent.location.reload();' as Javascript --Proceso de bolsa, abre nuevo objeto en ventana nueva
--select 'alert("' + @Str + '");parent.document.location=parent.document.location' as Javascript --Recarga objeto que lanza el proceso
--select 'alert("Actuaciones actualizadas correctamente");parent.document.location.reload();' as Javascript --recargar grid para procesos de bolsa
--select 'Javascript', 'window.open(''./view.aspx?Tipo=P_Tarea&Where=IdTarea=' + convert(varchar (10),@IdTarea) + ''')' as Javascript --abre nuevo objeto en ventana nueva
--select 'alert("Actuación procesada correctamente");parent.document.location=parent.document.location' as Javascript --Recarga objeto que lanza el proceso
RETURN -1
END TRY
BEGIN CATCH

IF @@TRANCOUNT >0 BEGIN
ROLLBACK TRAN
END

print 'Error al generar el pedido de cliente. ' + ERROR_MESSAGE()
RETURN 0

END CATCH


GO


zpermisos pPers_Pedido_Asistente
go


--PRUEBA

insert into Pers_Clientes_PedidoHab (idcliente, Idarticulo, Cantidad)
values ('00001','0',1)
insert into Pers_Clientes_PedidoHab (idcliente, Idarticulo, Cantidad)
values ('00001','art1',2)
go

--set context_info 23067 --IdDoc de la Sesion que quiero replicar (tabla ahora_sesion)



declare @IdEmpleado t_id_Empleado = 0
, @IdCliente t_id_cliente = '00001'
, @IdContacto t_id_contacto = null
, @IdProyecto t_id_proyecto = NULL
, @IdFormaPago t_forma_pago = NULL
, @IdArticulo1 t_id_articulo = NULL
, @Cantidad1 t_cantidad = 1
, @IdArticulo2 t_id_articulo = NULL
, @Cantidad2 t_cantidad = 1
, @IdPedido t_id_Pedido = 0
begin tran
exec dbo.pPers_Pedido_Asistente @IdEmpleado,@IdCliente, @IdContacto,@IdProyecto,@IdFormaPago,@IdArticulo1,@Cantidad1, @IdArticulo2,@Cantidad2, @IdPedido out
select @IdPedido as PedidoGen
Rollback tran


¿Le ha sido útil este artículo?

¡Qué bien!

Gracias por sus comentarios

¡Sentimos mucho no haber sido de ayuda!

Gracias por sus comentarios

¡Háganos saber cómo podemos mejorar este artículo!

Seleccione al menos una de las razones
Se requiere la verificación del CAPTCHA.

Sus comentarios se han enviado

Agradecemos su esfuerzo e intentaremos corregir el artículo