Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MS SQL Server
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo Hace 2 Horas
jcartaza jcartaza is offline
Registrado
 
Registrado: may 2023
Posts: 5
Poder: 0
jcartaza Va por buen camino
ayuda con un procedimiento almacenado

buenas amigos!!! necesito de su bastos conocimientos para ver si me ayudan a solucionar el siguiente problema con un procedimiento. Este busca seguir la trayectoria de un pedido de compra que puede estar autorizado o no, de estarlo se genera una orden de compra esta puede ser parcial o total, referido a la cantidad de articulos que tenga el pedido, esta orden de compra se ingresa a almacen y puede darse el caso que tambien parcial o total, quedando pendiente en caso de ser parcial. entonces se pueden generar mas un ingreso por cada orden de compra y por diferentes cantidades. la misma situacion se presenta en la facturacion. entonces es bien complejo este procedimiento. comparto codigo de lo que voy generando pero me muestra filas duplicadas y algun otro detalle indeseado. estare muy agradecido por cualquier tipo de ayuda q me puedan brindar. adjunto codigo
USE [SInFlex_Produnoa]
GO
/****** Object: StoredProcedure [dbo].[PCP_SeguimientoOCM] Script Date: 30/05/2024 11:09:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[PCP_SeguimientoOCM]
@Desde datetime,
@Hasta datetime,
@Tipo nvarchar(2)


AS
IF (@Tipo = 'P')
BEGIN

-- Crear tabla temporal #TempB
SELECT
A.MovimientoID,
A.Linea,
A.FechaComprobante,
B.Numero AS PedidoNumero,
A.FechaNecesidad as Fec_Nec,
A.ArticuloID,
C.Codigo AS ArticuloCodigo,
C.Descripcion AS ArticuloDescripcion,
A.Cantidad AS Cant_PED,
A.Precio AS Precio_PED,
ISNULL(E.Numero, '') as NumOC,
ISNULL(F.Cantidad, 0) as Cant_OCM
INTO #TempB
FROM TCP_PedidoDeCompra_Articulo A
INNER JOIN TCP_PedidoDeCompra B ON B.MovimientoID = A.MovimientoID
INNER JOIN TAL_Articulo C ON C.ArticuloID = A.ArticuloID
LEFT JOIN TCP_OrdenDeCompra_Pedido D ON D.MovimientoID_PED = A.MovimientoID AND D.Linea_PED = A.Linea
LEFT JOIN TCP_OrdenDeCompra_Detalle_ALM F ON F.MovimientoID = D.MovimientoID AND F.Linea = D.Linea AND F.ArticuloID = A.ArticuloID
LEFT JOIN TCP_OrdenDeCompra E ON E.MovimientoID = F.MovimientoID
WHERE B.Anulado = 0
AND (E.Anulado = 0 OR E.Anulado IS NULL)
AND A.FechaComprobante >= '01/01/2024'--@Desde
AND A.FechaComprobante <= '01/06/2024'--@Hasta
ORDER BY A.MovimientoID, A.Linea;

-- Crear tabla temporal #Mayor0 con cantidades agrupadas
SELECT
B.MovimientoID as movID,
A.ArticuloID,
A.FechaComprobante AS Fecha,
A.MovimientoID,
B.Comprobante,
B.Numero,
SUM(A.Cantidad) AS Cantidad -- Sumar cantidades para el mismo ArticuloID
INTO #Mayor0
FROM TAL_Movimiento_Detalle A
INNER JOIN TAL_Movimiento B ON B.EstabID = A.EstabID AND B.MovimientoID = A.MovimientoID
INNER JOIN TGR_TipoDeMovimiento D ON D.TipoDeMovimientoID = B.TipoDeMovimientoID
INNER JOIN TAL_Articulo C ON C.ArticuloID = A.ArticuloID
WHERE B.Anulado = 0
AND A.FechaComprobante >= '01/01/2024'--@Desde
AND A.FechaComprobante <= '01/06/2024'--@Hasta
AND B.DepositoID = 2
AND C.TipoDeArticuloID = 2
AND B.Comprobante = 'ING'
GROUP BY
B.MovimientoID,
A.ArticuloID,
A.FechaComprobante,
A.MovimientoID,
B.Comprobante,
B.Numero
ORDER BY Numero, ArticuloID, Fecha, B.MovimientoID;

WITH FilteredResults AS (
SELECT DISTINCT
TB.MovimientoID,
TB.Linea,
TB.FechaComprobante,
TB.PedidoNumero,
TB.Fec_Nec,
TB.ArticuloID,
TB.ArticuloCodigo,
TB.ArticuloDescripcion,
TB.Cant_PED,
TB.Precio_PED,
TB.NumOC,
TB.Cant_OCM,
M1.movID,
M1.Fecha AS Fecha_ING,
M1.Numero AS Numero_ING,
M1.Cantidad AS Cantidad_ING
FROM #TempB TB
LEFT JOIN TAL_Movimiento_Recepcion MR ON MR.MovimientoID_OCM = TB.NumOC
LEFT JOIN #Mayor0 M1 ON M1.MovimientoID = MR.MovimientoID AND M1.ArticuloID = TB.ArticuloID
)
SELECT DISTINCT
FR.MovimientoID,
FR.Linea,
FR.FechaComprobante,
FR.PedidoNumero,
FR.Fec_Nec,
FR.ArticuloID,
FR.ArticuloCodigo,
FR.ArticuloDescripcion,
FR.Cant_PED,
FR.Precio_PED,
FR.NumOC,
FR.Cant_OCM,
FR.movID,
FR.Fecha_ING AS Fecha_ING,
MAX(FR.Numero_ING) AS Numero_ING,
SUM(FR.Cantidad_ING) AS Cantidad_ING -- Sumar las cantidades ingresadas
INTO #TempA
FROM FilteredResults FR
GROUP BY
FR.MovimientoID,
FR.Linea,
FR.FechaComprobante,
FR.PedidoNumero,
FR.Fec_Nec,
FR.ArticuloID,
FR.ArticuloCodigo,
FR.ArticuloDescripcion,
FR.Cant_PED,
FR.Precio_PED,
FR.NumOC,
FR.Cant_OCM,
FR.movID,
FR.Fecha_ING
HAVING COUNT(DISTINCT FR.Fecha_ING) + COUNT(DISTINCT FR.Numero_ING) + COUNT(DISTINCT FR.Cantidad_ING) > 0
OR (COUNT(DISTINCT FR.Fecha_ING) = 0 AND COUNT(DISTINCT FR.Numero_ING) = 0 AND COUNT(DISTINCT FR.Cantidad_ING) = 0);

-- Crear la tabla final con filas duplicadas
WITH Facturacion AS (
SELECT
B.MovimientoID_STK AS MovimientoID,
A.ArticuloID,
MAX(D.FechaComprobante) AS Fec_Fact,
MAX(D.Numero) AS NumFact,
SUM(C.Cantidad) AS Cant_Fact,
MAX(C.Precio) AS Precio,
C.Referencia1 as Cmpbte,
D.ProveedorID as Prov,
D.Nombre as Proveedor
FROM #TempA A
LEFT JOIN TCP_Movimiento_Recepcion B ON B.MovimientoID_STK = A.movID
LEFT JOIN TCP_Movimiento_Articulo_ALM C ON C.MovimientoID = B.MovimientoID AND A.ArticuloID = C.ArticuloID
LEFT JOIN TCP_Movimiento D ON D.MovimientoID = C.MovimientoID
GROUP BY B.MovimientoID_STK, A.ArticuloID, C.Referencia1, D.ProveedorID, D.Nombre
),
FinalResult AS (
SELECT
A.*,
F.Fec_Fact,
F.NumFact,
F.Cant_Fact,
F.Precio,
F.Cmpbte,
F.Prov,
F.Proveedor,
ROW_NUMBER() OVER (PARTITION BY A.MovimientoID, A.Linea, A.ArticuloID ORDER BY A.MovimientoID) AS RowNum
FROM #TempA A
LEFT JOIN Facturacion F ON A.movID = F.MovimientoID AND A.ArticuloID = F.ArticuloID
)
-- Seleccionar solo las filas con RowNum = 1 para eliminar duplicados
SELECT
MovimientoID,
Linea,
FechaComprobante,
PedidoNumero,
Fec_Nec,
ArticuloID,
ArticuloCodigo,
ArticuloDescripcion,
Cant_PED,
Precio_PED,
NumOC,
Cant_OCM,
movID,
Fecha_ING,
Numero_ING,
Cantidad_ING,
Fec_Fact,
NumFact,
Cant_Fact,
Precio,
Cmpbte,
Prov,
Proveedor
FROM FinalResult
WHERE RowNum = 1;


--select*from #TempB
DROP TABLE #Mayor0
DROP TABLE #TempB
DROP TABLE #TempA

END;-- y devuelve este resultado donde muestra el mismo numero de ingreso con la misma cantidad lo cual no es correcto: adjunto el documento con una imagen de los resultados. repito desde ya mis agradecimientos a cualquier tipo de ayuda. saludos cordiales
Archivos Adjuntos
Tipo de Archivo: rar Doc1.rar (80,2 KB, 0 visitas)
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Ayuda con procedimiento almacenado XBart Firebird e Interbase 8 02-02-2010 11:05:50
ayuda con procedimiento almacenado microbiano Internet 6 10-09-2008 03:11:15
ayuda con el codigo de procedimiento almacenado pipecato MS SQL Server 3 13-12-2005 03:41:35
ayuda con el procedimiento almacenado pipecato Varios 1 13-12-2005 03:38:26
Ayuda sobre un Procedimiento Almacenado Nuria Firebird e Interbase 6 21-01-2004 13:18:15


La franja horaria es GMT +2. Ahora son las 00:54:47.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi