Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Go Back   Foros Club Delphi > Bases de datos > MS SQL Server
Register FAQ Members List Calendar Guía de estilo Today's Posts

 
 
Thread Tools Search this Thread Display Modes
Prev Previous Post   Next Post Next
  #1  
Old 30/05/2024
jcartaza jcartaza is offline
Registrado
 
Join Date: 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

Código SQL [-]
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
Attached Files
File Type: rar Doc1.rar (80.2 KB, 3 views)

Last edited by Neftali [Germán.Estévez] : 31/05/2024 at 10:17. Reason: Añadir TAGs al mensaje ([SQL])
Reply With Quote
 



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Ayuda con procedimiento almacenado XBart Firebird e Interbase 8 02/02/2010 11:05
ayuda con procedimiento almacenado microbiano Internet 6 10/09/2008 03:11
ayuda con el codigo de procedimiento almacenado pipecato MS SQL Server 3 13/12/2005 03:41
ayuda con el procedimiento almacenado pipecato Varios 1 13/12/2005 03:38
Ayuda sobre un Procedimiento Almacenado Nuria Firebird e Interbase 6 21/01/2004 13:18


All times are GMT +2. The time now is 05:30.


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