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 5 Días
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

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
Archivos Adjuntos
Tipo de Archivo: rar Doc1.rar (80,2 KB, 2 visitas)

Última edición por Neftali [Germán.Estévez] fecha: Hace 4 Días a las 10:17:45. Razón: Añadir TAGs al mensaje ([SQL])
Responder Con Cita
  #2  
Antiguo Hace 9 Horas
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.738
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
El muuuuy dfificil saber qué es lo que está mal son la estructura de tablas y los datos que contienen.
Deberías preguntar cosas más puntuales ya que solo tu conoces esa estructura y los posibles datos...

Dicho esto:

Mencionas que sale repetido el campo Numero_ING.
Sin saber qué es lo que significa este campo solo puedo decirte que según tu procedimiento es el MAX(Numero_ING) de la tabla TAL_Movimiento.
Al utilizar el MAX, tomas solo uno y siempre es el más grande, por lo que para un mismo movID se repetirá.


Te recomendaría hacer por separado los diferentes SELECT para ver qué es lo que devuelven.
As esto SELECTs los filtras por algún movID, artículo o nro_pedido que sepas que te da problemas, para tratar de acotar los datos a revisar.

Quizás hay algún JOIN mal hecho y te devuelve registros duplicados o erróneos.
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 01:06:11.


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