Hold/release rewrites OCRH.DCSTAT and DCHREA without touching any date column, so no watermark could see it. A full-table row diff of LGDAT.OCRH vs cms.ocrh (468,823 rows both sides) found 168 drifted rows, 0 missing, 0 extra -- and 159 of them changed with no date moving at all (checked dcudat/dcodat/dccdat/dcmdat/dchdat/dcxdat/dcsdat/dcmxdt). 155 of the drifts were DCSTAT, 4 DCHREA. Every drifted row was still open (DCSTAT in A/N/H/B); none had reached 'C'. Only ~2,044 of 468,823 orders are open, so re-pulling the whole open set each run is cheap and catches 100% of the observed drift. Applied to ocrh and to the two modules that read its changed-set, ocri and ocrs. Result: drift 168 -> 11 rows, DCSTAT 155 -> 3. No invoice-driven branch: tested against LGDAT.OCRHT (CMS's header change log, keyed DC3TMSP-leading via logical OCRHTX1) over the live watermark window -- 1,107 headers changed, 65 missed by the date branches, 0 missed by dates+open, and a 5- or 30-day invoiced-orders branch added exactly 0. Closing an order writes dcudat/dccdat, so the date window covers the flip. Also evaluated LGDAT.OCRIT (the order-line change log) as a replacement for the open-order branch and rejected it: at the live 8-day watermark it reports 0 changed orders not already caught, at ~12x the predicate cost, and its lower row count means it declines to pull 18k lines the open set would -- safe only if CMS's logging is complete, which is unverified. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
149 lines
4.7 KiB
SQL
149 lines
4.7 KiB
SQL
WITH changed AS (
|
|
SELECT dcord# FROM lgdat.ocrh WHERE dcudat BETWEEN '{ocri_wm}' AND CURRENT_DATE
|
|
UNION
|
|
SELECT dcord# FROM lgdat.ocrh WHERE dcodat BETWEEN '{ocri_wm}' AND CURRENT_DATE
|
|
UNION
|
|
SELECT dcord# FROM lgdat.ocrh WHERE dccdat BETWEEN '{ocri_wm}' AND CURRENT_DATE
|
|
UNION
|
|
-- Hold / release and other status flips rewrite DCSTAT and DCHREA and
|
|
-- move no date column, so no watermark can see them. Only ~2k orders are
|
|
-- open, so re-pulling the whole open set every run is cheap.
|
|
-- Checked 2026-08-11 against LGDAT.OCRIT (CMS's own order-line change
|
|
-- log): OCRIT reports 0 changed orders that are not already caught here,
|
|
-- at ~12x the predicate cost -- this branch is a proven superset.
|
|
SELECT dcord# FROM lgdat.ocrh WHERE RTRIM(DCSTAT) <> 'C'
|
|
)
|
|
SELECT
|
|
"DDORD#" AS "ddord#",
|
|
"DDITM#" AS "dditm#",
|
|
"DDDES#" AS "dddes#",
|
|
DDQTOI AS ddqtoi,
|
|
DDQTBI AS ddqtbi,
|
|
DDQTSI AS ddqtsi,
|
|
RTRIM(DDUNIT) AS ddunit,
|
|
DDUNPR AS ddunpr,
|
|
DDTOTI AS ddtoti,
|
|
RTRIM(DDSLMN) AS ddslmn,
|
|
DDCPCT AS ddcpct,
|
|
DDCRAT AS ddcrat,
|
|
RTRIM(DDAIND) AS ddaind,
|
|
RTRIM(DDPTEX) AS ddptex,
|
|
RTRIM(DDFTCD) AS ddftcd,
|
|
CASE WHEN DDRDAT IN (DATE('0001-01-01'), DATE('9999-12-31')) THEN NULL ELSE DDRDAT END AS ddrdat,
|
|
RTRIM(DDMAJS) AS ddmajs,
|
|
RTRIM(DDMINS) AS ddmins,
|
|
RTRIM(DDITST) AS dditst,
|
|
RTRIM(DDPART) AS ddpart,
|
|
RTRIM(DDGLC) AS ddglc,
|
|
RTRIM(DDCRRS) AS ddcrrs,
|
|
CASE WHEN DDSDAT IN (DATE('0001-01-01'), DATE('9999-12-31')) THEN NULL ELSE DDSDAT END AS ddsdat,
|
|
RTRIM(DDTXGR) AS ddtxgr,
|
|
RTRIM(DDTXRT) AS ddtxrt,
|
|
RTRIM(DDNU07) AS ddnu07,
|
|
RTRIM(DDTMPS) AS ddtmps,
|
|
DDTEMP AS ddtemp,
|
|
DDQTOO AS ddqtoo,
|
|
DDQTBO AS ddqtbo,
|
|
DDQTSO AS ddqtso,
|
|
RTRIM(DDORUN) AS ddorun,
|
|
DDQTSP AS ddqtsp,
|
|
RTRIM(DDPRUN) AS ddprun,
|
|
DDTOTB AS ddtotb,
|
|
DDTDIS AS ddtdis,
|
|
DDTTAX AS ddttax,
|
|
DDTFRT AS ddtfrt,
|
|
DDTWGT AS ddtwgt,
|
|
RTRIM(DDTWUN) AS ddtwun,
|
|
DDTVOL AS ddtvol,
|
|
RTRIM(DDTVUN) AS ddtvun,
|
|
CASE WHEN DDODAT IN (DATE('0001-01-01'), DATE('9999-12-31')) THEN NULL ELSE DDODAT END AS ddodat,
|
|
RTRIM(DDSTKL) AS ddstkl,
|
|
RTRIM(DDSTOR) AS ddstor,
|
|
CASE WHEN DDDDAT IN (DATE('0001-01-01'), DATE('9999-12-31')) THEN NULL ELSE DDDDAT END AS ddddat,
|
|
CASE WHEN DDFDAT IN (DATE('0001-01-01'), DATE('9999-12-31')) THEN NULL ELSE DDFDAT END AS ddfdat,
|
|
CASE WHEN DDHDAT IN (DATE('0001-01-01'), DATE('9999-12-31')) THEN NULL ELSE DDHDAT END AS ddhdat,
|
|
CASE WHEN DDQDAT IN (DATE('0001-01-01'), DATE('9999-12-31')) THEN NULL ELSE DDQDAT END AS ddqdat,
|
|
CASE WHEN DDCDAT IN (DATE('0001-01-01'), DATE('9999-12-31')) THEN NULL ELSE DDCDAT END AS ddcdat,
|
|
DDOLST AS ddolst,
|
|
DDCTMS AS ddctms,
|
|
RTRIM(DDCUSR) AS ddcusr,
|
|
RTRIM(DDDBUY) AS dddbuy,
|
|
"DDREQ#" AS "ddreq#",
|
|
RTRIM(DDPJNM) AS ddpjnm,
|
|
RTRIM(DDFUT1) AS ddfut1,
|
|
RTRIM(DDFUT2) AS ddfut2,
|
|
RTRIM(DDFUT3) AS ddfut3,
|
|
RTRIM(DDFUT4) AS ddfut4,
|
|
RTRIM(DDFUT5) AS ddfut5,
|
|
RTRIM(DDFUT6) AS ddfut6,
|
|
DDFUT7 AS ddfut7,
|
|
DDFUT8 AS ddfut8,
|
|
RTRIM(DDFUT9) AS ddfut9,
|
|
RTRIM(DDFUTA) AS ddfuta,
|
|
RTRIM(DDFUTB) AS ddfutb,
|
|
RTRIM(DDFUTC) AS ddfutc,
|
|
RTRIM(DDFUTD) AS ddfutd,
|
|
DDWTCH AS ddwtch,
|
|
DDWTCI AS ddwtci,
|
|
DDLDSQ AS ddldsq,
|
|
RTRIM("DDRAN#") AS "ddran#",
|
|
RTRIM(DDCTMZ) AS ddctmz,
|
|
RTRIM(DDOTMZ) AS ddotmz,
|
|
RTRIM(DDRTMZ) AS ddrtmz,
|
|
RTRIM(DDQTMZ) AS ddqtmz,
|
|
RTRIM(DDSTMZ) AS ddstmz,
|
|
DDRTME AS ddrtme,
|
|
DDQTME AS ddqtme,
|
|
DDSTME AS ddstme,
|
|
CASE WHEN DDRXDT IN (DATE('0001-01-01'), DATE('9999-12-31')) THEN NULL ELSE DDRXDT END AS ddrxdt,
|
|
DDRXTM AS ddrxtm,
|
|
CASE WHEN DDQXDT IN (DATE('0001-01-01'), DATE('9999-12-31')) THEN NULL ELSE DDQXDT END AS ddqxdt,
|
|
DDQXTM AS ddqxtm,
|
|
RTRIM(DDPTYP) AS ddptyp,
|
|
RTRIM(DDAWLS) AS ddawls,
|
|
DDPOIT AS ddpoit,
|
|
RTRIM(DDSRVC) AS ddsrvc,
|
|
RTRIM(DDPRCL) AS ddprcl,
|
|
RTRIM(DDAVAC) AS ddavac,
|
|
RTRIM(DDDBAC) AS dddbac,
|
|
RTRIM(DDSCDP) AS ddscdp,
|
|
RTRIM(DDSOCP) AS ddsocp,
|
|
RTRIM(DDCSPI) AS ddcspi,
|
|
RTRIM(DDSCPI) AS ddscpi,
|
|
RTRIM(DDSCOR) AS ddscor,
|
|
RTRIM(DDSCIM) AS ddscim,
|
|
RTRIM("DDREV#") AS "ddrev#",
|
|
RTRIM(DDCSPA) AS ddcspa,
|
|
DDOITM AS ddoitm,
|
|
RTRIM(DDFROM) AS ddfrom,
|
|
RTRIM(DDMMEL) AS ddmmel,
|
|
RTRIM(DDFEAT) AS ddfeat,
|
|
RTRIM(DDOPTN) AS ddoptn,
|
|
RTRIM(DDFUT10) AS ddfut10,
|
|
RTRIM(DDFUT11) AS ddfut11,
|
|
RTRIM(DDFUT12) AS ddfut12,
|
|
RTRIM(DDFUT13) AS ddfut13,
|
|
RTRIM(DDFUT14) AS ddfut14,
|
|
RTRIM(DDFUT15) AS ddfut15,
|
|
RTRIM(DDFUT16) AS ddfut16,
|
|
RTRIM(DDFUT17) AS ddfut17,
|
|
DDFUT18 AS ddfut18,
|
|
DDFUT19 AS ddfut19,
|
|
DDFUT20 AS ddfut20,
|
|
RTRIM(DDCONPT) AS ddconpt,
|
|
DDUFRT AS ddufrt,
|
|
DDHFEP AS ddhfep,
|
|
RTRIM(DDOGLDC) AS ddogldc,
|
|
RTRIM(DDDRSF) AS dddrsf,
|
|
RTRIM(DDODBUY) AS ddodbuy,
|
|
RTRIM(DDATSPG) AS ddatspg,
|
|
RTRIM(DDWCOD) AS ddwcod,
|
|
DD3PNM AS dd3pnm,
|
|
DDWEOR AS ddweor,
|
|
DDWEOI AS ddweoi,
|
|
RTRIM(DDAGRM) AS ddagrm,
|
|
DDRNDR AS ddrndr,
|
|
DDRNDI AS ddrndi
|
|
FROM LGDAT.OCRI i
|
|
INNER JOIN changed c ON c.dcord# = i.ddord#
|