| Author |
Topic |
|
AskSQLTeam
Ask SQLTeam Question
0 Posts |
Posted - 2002-03-13 : 18:24:21
|
Diane writes "When I perform the update to the table the last record retreived in the loop is populating the 'new_date' field in every record in the temp table.ALTER PROCEDURE TEST_DATESASCREATE TABLE TEMP_TABLE_DATES(WONUM VARCHAR(10),STK_KEY VARCHAR(11),FSC VARCHAR(4),PONUM VARCHAR(20),REQUEST_QTY FLOAT,BAL_DUE_QTY FLOAT,EST_PARTS_COST MONEY,REQUEST_DATE VARCHAR(20),PO_DATE DATETIME,PR_DATE DATETIME,EXPECTED_DLVR_DATE DATETIME,REQUIRED_DLVR_DATE VARCHAR(3),REQUESTOR VARCHAR(25),STK_KEY_DESC VARCHAR(25),DOC_NR_DATE VARCHAR(3),DOC_NR_YEAR VARCHAR(1),NEW_DATE DATETIME)INSERT INTO TEMP_TABLE_DATES( WONUM, STK_KEY, FSC, PONUM, REQUEST_QTY, BAL_DUE_QTY, EST_PARTS_COST, REQUEST_DATE, PO_DATE, PR_DATE, EXPECTED_DLVR_DATE, REQUIRED_DLVR_DATE, REQUESTOR, STK_KEY_DESC, DOC_NR_DATE, DOC_NR_YEAR, NEW_DATE)SELECT DO.WRK_ORD AS WORK_ORDER, DO.STK_KEY AS STOCK_KEY, PD.FSC AS FED_STOCK_CODE, PR.PONUM AS PO_NUM, DO.D_O_ORIG_QTY AS REQ_QTY, DO.DUE_OUT_QTY AS BAL_DUE, CONVERT(DECIMAL(10,2),PM.UNIT_PRC * DO.D_O_ORIG_QTY) AS EST_COST, SUBSTRING(REQ_TM_DT,1,8) AS REQ_DATE, PO.ORDERDATE AS PURCHASE_ORD_DATE, PR.DATEGENERATED AS PURCHASE_REQ_DATE, PR.DUEDATE AS EXP_DLVR_DATE, CONVERT(INT,D_O_REQ_DLV_DT) AS REQ_DLVR_DATE, SUBSTRING(REQ_TM_DT,10,24) AS REQUESTOR_NAME, PD.STK_KEY_DESC AS STOCK_KEY_DESC, CONVERT(INT,SUBSTRING(DUE_OUT_DOC_NR,8,3)) AS DOC_NR_DATE, CONVERT(INT,SUBSTRING(DUE_OUT_DOC_NR,7,1)) AS DOC_NR_YEAR, NULLFROM LOSCSOCS..SC.PMDUEOUT DO LEFT JOIN LOSCMP2.MP2.dbo.PURREQ PR ON DO.DUE_IN_DOC_NR = PR.REQUISITIONNUM JOIN LOSCSOCS..SC.PMISSUE PM ON DO.DUE_OUT_DOC_NR = PM.DOC_NR JOIN PART_DESCRIPTIONS PD ON PD.STK_KEY = DO.STK_KEY LEFT JOIN LOSCMP2.MP2.dbo.POHEADER PO ON PO.PONUM = PR.PONUMDECLARE TEST_DATE CURSORFORSELECT WONUM, STK_KEY, FSC, PONUM, REQUEST_QTY, BAL_DUE_QTY, EST_PARTS_COST, REQUEST_DATE, PO_DATE, PR_DATE, EXPECTED_DLVR_DATE, REQUIRED_DLVR_DATE, REQUESTOR, STK_KEY_DESC, DOC_NR_DATE, DOC_NR_YEAR, NEW_DATE FROM TEMP_TABLE_DATES FOR UPDATE/*OPEN THE CURSOR */OPEN TEST_DATEDECLARE@WONUM VARCHAR(10), @STK_KEY VARCHAR(11),@FSC VARCHAR(4),@PONUM VARCHAR(20), @REQUEST_QTY FLOAT,@BAL_DUE_QTY FLOAT, @EST_PARTS_COST MONEY,@REQUEST_DATE VARCHAR(20), @PO_DATE DATETIME, @PR_DATE DATETIME, @EXPECTED_DLVR_DATE DATETIME,@RDD INT,@REQUESTOR VARCHAR(25),@STK_KEY_DESC VARCHAR(24),@DOC_NR_DATE INT, @DOC_NR_YEAR INT,@NEW_DATE DATETIMEFETCH NEXT FROM TEST_DATE INTO @WONUM, @STK_KEY, @FSC, @PONUM, @REQUEST_QTY, @BAL_DUE_QTY, @EST_PARTS_COST, @REQUEST_DATE, @PO_DATE, @PR_DATE, @EXPECTED_DLVR_DATE, @RDD, @REQUESTOR, @STK_KEY_DESC, @DOC_NR_DATE, @DOC_NR_YEAR, @NEW_DATEWHILE @@FETCH_STATUS = 0 BEGINIF @RDD = 999 SET @NEW_DATE = CONVERT(DATETIME,'01/01/1900') ELSE IF @RDD >= @DOC_NR_DATE SET @NEW_DATE = DATEADD(DAY,@RDD,'12/31/' + CONVERT(VARCHAR,@DOC_NR_YEAR + 1999))ELSE SET @NEW_DATE = DATEADD(DAY,@RDD,'12/31/' + CONVERT(VARCHAR,@DOC_NR_YEAR + 2000))UPDATE TEMP_TABLE_DATES SET NEW_DATE = @NEW_DATEFETCH NEXT FROM TEST_DATE INTO @WONUM, @STK_KEY, @FSC, @PONUM, @REQUEST_QTY, @BAL_DUE_QTY, @EST_PARTS_COST, @REQUEST_DATE, @PO_DATE, @PR_DATE, @EXPECTED_DLVR_DATE, @RDD, @REQUESTOR, @STK_KEY_DESC, @DOC_NR_DATE, @DOC_NR_YEAR, @NEW_DATEENDCLOSE TEST_DATEDEALLOCATE TEST_DATE " |
|
|
rrb
SQLTeam Poet Laureate
1479 Posts |
Posted - 2002-03-13 : 18:58:41
|
[quote]Diane writes "When I perform the update to the table the last record retreived in the loop is populating the 'new_date' field in every record in the temp table.This is because your update statementUPDATE TEMP_TABLE_DATES SET NEW_DATE = @NEW_DATEhas no where clause - hence it is updating every row with @new_date.Correct me if I'm wrong (boy I say that a lot) - but I think you could do it without cursors - and fix your problem toosomething like - (once you have your join-table)update temp_table_datesset new_date = case when rdd = 999 then convert(datetime,'01/01/1900')when rdd<> 999 and rdd >= doc_nr_date then dateadd(day,rdd,'12/31/' + convert(varchar,doc_nr_year + 1999))else and dateadd(day,rdd,'12/31/' + convert(varchar,doc_nr_year + 2000))end now you have to admit - that's simpler--I hope that when I die someone will say of me "That guy sure owed me a lot of money"Edited by - rrb on 03/13/2002 19:01:31 |
 |
|
|
rrb
SQLTeam Poet Laureate
1479 Posts |
Posted - 2002-03-13 : 19:02:33
|
in fact, I believe you could replace the whole lot withselect do.wrk_ord as wonum, do.stk_key as stk_key, pd.fsc as fsc, pr.ponum as po_num, do.d_o_orig_qty as request_qty, do.due_out_qty as bal_due_qty, convert(decimal(10,2),pm.unit_prc * do.d_o_orig_qty) as est_parts_cost, substring(req_tm_dt,1,8) as request_date, po.orderdate as po_date, pr.dategenerated as pr_date, pr.duedate as expected_dlvr_date, convert(int,d_o_req_dlv_dt) as required_dlvr_date, substring(req_tm_dt,10,24) as requestor, pd.stk_key_desc as stk_key_desc, convert(int,substring(due_out_doc_nr,8,3)) as doc_nr_date, convert(int,substring(due_out_doc_nr,7,1)) as doc_nr_year,new_date = case when rdd = 999 then convert(datetime,'01/01/1900')when rdd<> 999 and rdd >= doc_nr_date then dateadd(day,@rdd,'12/31/' + convert(varchar,@doc_nr_year + 1999))else and dateadd(day,@rdd,'12/31/' + convert(varchar,@doc_nr_year + 2000))endinto temp_table_datesfrom loscsocs..sc.pmdueout do left join loscmp2.mp2.dbo.purreq pr on do.due_in_doc_nr = pr.requisitionnum join loscsocs..sc.pmissue pm on do.due_out_doc_nr = pm.doc_nr join part_descriptions pd on pd.stk_key = do.stk_key left join loscmp2.mp2.dbo.poheader po on po.ponum = pr.ponum One this to note was that I've updated the "as" names in your select clause....Edited by - rrb on 03/13/2002 19:10:34 |
 |
|
|
|
|
|