Показать сообщение отдельно
Старый 16.08.2013, 13:29   #25  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
650 / 352 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Ок, вот готовая процедура, которая у нас уже довольно давно используется в SSRS отчете:
X++:
USE [PRD]
GO
/****** Object:  StoredProcedure [dbo].[usp_ReportEOLYield]    Script Date: 08/16/2013 05:24:11 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[usp_ReportEOLYield]
--DECLARE
        @StartDate DATETIME
      , @EndDate DATETIME
      , @WorkCenters VARCHAR(MAX)
      , @Shifts VARCHAR(MAX)
AS
BEGIN
--SET @StartDate = '2012-09-23'
--SET @EndDate = '2012-10-23'
--SET @WorkCenters = 'V01,V02'
--SET @Shifts = 'A,B,C,D'

--SET @StartDate = '2012-04-01 21:00:00'
--SET @EndDate = '2012-04-01 22:00:00'
--SET @WorkCenters = 'E02,E03,E04'
--SET @Shifts = 'A,B,C,D'

DECLARE @WorkCenterTable TABLE(ListItem VARCHAR(100) COLLATE Latin1_General_CI_AI)
DECLARE @ShiftTable TABLE(ListItem VARCHAR(100) COLLATE Latin1_General_CI_AI)
INSERT INTO @WorkCenterTable SELECT ListItem FROM QALab.[dbo].[SplitListItemsIntoTable](@WorkCenters)
INSERT INTO @ShiftTable SELECT ListItem FROM QALab.[dbo].[SplitListItemsIntoTable](@Shifts)

SET NOCOUNT ON

IF OBJECT_ID('Temp_DB..#EOLTable') IS NOT NULL DROP TABLE #EOLTable
	
CREATE TABLE #EOLTable(
      WorkCenter varchar(10) COLLATE Latin1_General_CI_AI
      , Prod varchar(20) COLLATE Latin1_General_CI_AI
      , Item varchar(20) COLLATE Latin1_General_CI_AI
      , Job varchar(20) COLLATE Latin1_General_CI_AI
      , Serial varchar(20) COLLATE Latin1_General_CI_AI
      , FeedStock varchar(20) COLLATE Latin1_General_CI_AI
      , Date datetime
      , Qty numeric(28,12)
      , UOM varchar(15) COLLATE Latin1_General_CI_AI
      , Scrap numeric(28,12)
      , ScrapCode varchar(20) COLLATE Latin1_General_CI_AI
      , Descript varchar(50) COLLATE Latin1_General_CI_AI
      , WrkCtrGroup varchar(10) COLLATE Latin1_General_CI_AI
      , InventTransId varchar(20) COLLATE Latin1_General_CI_AI
)

INSERT INTO #EOLTable(WorkCenter, Prod, Item, Job, Serial, Date, Qty, UOM, Scrap, ScrapCode,
	Descript, WrkCtrGroup,
	InventTransId)
SELECT SFMatl.WrkCtrId
	, ProdTable.DIMENSION2_
	, RTRIM(CASE WHEN SFMatl.ItemId LIKE 'Waste%' THEN '' ELSE SFMatl.ItemId END)
		+ CASE(RTRIM(ColorId)) WHEN '' THEN '' ELSE '-' + RTRIM(SizeId) + '-' + RTRIM(ColorId) END
	, UPPER(RTRIM(SFMatl.ProdId))
	, ppoSerialNum
	, ShiftTime
	, CASE WHEN SFMatl.WasteId <> '' AND TranType = 'OFF-WST' OR SFMatl.ItemId LIKE 'Waste%' THEN 0 ELSE StkQty END
	, StkUnit
	, CASE WHEN SFMatl.WasteId <> '' AND TranType = 'OFF-WST' OR SFMatl.ItemId LIKE 'Waste%' THEN StkQty ELSE 0 END
	, CASE WHEN SFMatl.ItemId LIKE 'Waste%' AND SFMatl.WasteId = '' THEN SFMatl.ItemId ELSE SFMatl.WasteId END
	, WasteCaption
	, WrkCtrTable.WrkCtrGroupId
	, SFMatl.InventTransId
FROM CSF_PRD.dbo.SFMatl SFMatl WITH (NOLOCK)
INNER JOIN CSF_PRD.dbo.WasteId WasteId
   ON WasteId.WasteId = SFMatl.WasteId -- Old behaviour: CASE WHEN ItemId LIKE 'Waste%' AND SFMatl.WasteId = '' THEN ItemId ELSE SFMatl.WasteId END
INNER JOIN ProdTable
   ON ProdTable.DataAreaId = SFMatl.CompanyId
  AND ProdTable.ProdId = SFMatl.ProdId
INNER JOIN WrkCtrTable
   ON WrkCtrTable.DataAreaId = ProdTable.DataAreaId
  AND WrkCtrTable.WrkCtrId = SFMatl.WrkCtrId
WHERE
      SFMatl.CompanyId = 'clt'
	  AND ProdTable.DIMENSION3_ = 'FSM'
      AND RTRIM(ColorId) = ''
      AND SFMatl.TranType IN ('OFF-FIN','OFF-WST')
      AND ShiftTime >= @StartDate
      AND ShiftTime < @EndDate
	  AND WrkCtrTable.WrkCtrGroupId NOT IN ('FSMSLIT','FSMREW','FSMDEP2','FSMDEP1','CCDFSMSLIT','CCDFSMREW','CCDFSMDEP2','CCDFSMDEP1')
	  AND [dbo].[udfGetShift] (ShiftTime) IN (SELECT ListItem FROM @ShiftTable)
      AND SFMatl.WrkCtrId IN (SELECT ListItem FROM @WorkCenterTable)
      AND SerialNum IN (SELECT Matl.SerialNum FROM CSF_PRD.dbo.SFMatl AS Matl
						WHERE Matl.ContainerNum = SFMatl.ContainerNum
						  AND Matl.ppoSerialNum = SFMatl.ppoSerialNum
						  AND Matl.PrOdId = SFMatl.PrOdId
						GROUP BY Matl.SerialNum
						HAVING SUM(Matl.StkQty) <> 0);

WITH MyCTE(Item, SerialNum) AS 
	(SELECT pmtOn.Item, pmtOff.SerialNum FROM ppoProdMatlTrace pmtOff WITH (NOLOCK) 
		INNER JOIN ppoProdMatlTrace pmtOn WITH (NOLOCK) 
		   ON pmtOff.DataAreaId = pmtOn.DataAreaId 
		  AND pmtOff.PrOdSet = pmtOn.PrOdSet 
		  AND pmtOff.Ply = pmtOn.MakingPly 
		  AND pmtOff.Type = 0 
		  AND pmtOn.Type = 1
		WHERE pmtOff.DataAreaId = N'clt'
		  AND pmtOff.SERIALNUM IN (SELECT DISTINCT SERIAL FROM #EOLTable))
		  
UPDATE #EOLTable
SET FeedStock = (SELECT MAX(Item) FROM MyCTE
					WHERE MyCTE.SerialNum = Serial)
	, Item = CASE WHEN Item = '' OR LEFT(Item, 1) = '-' THEN 
		(SELECT MAX(ItemId) FROM InventTrans 
			WHERE InventTrans.DataAreaId = N'clt' 
			  AND InventTrans.InventTransId = #EOLTable.InventTransId) + Item
		ELSE Item END

SELECT * FROM #EOLTable

--DROP TABLE #EOLTable
END
Мне нужно всего-то добавить еще 1 параметр и пару полей во временную таблицу для вывода новых данных. И все это дело выгружать в эксель. Но никак не получается вызвать её правильно.
__________________
// no comments