Utilidades SQL

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.

 

Ver código ejemplo


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

Autor: Daniel Ernesto Lutz Llano