DEFINE VARIABLE Firma AS CHARACTER NO-UNDO INIT '1000' . DEFINE VARIABLE nBestand AS DECIMAL NO-UNDO. DEFINE VARIABLE iGGebMe AS INTEGER NO-UNDO. DEFINE VARIABLE iVGebMe AS INTEGER NO-UNDO. DEFINE VARIABLE iKGebMe AS INTEGER NO-UNDO. DEFINE VARIABLE iHoReId AS INTEGER NO-UNDO. DEFINE BUFFER bArtst FOR Artst . DEFINE BUFFER bArtLager FOR ArtLager . DEFINE BUFFER bHoReLager FOR HoReLager. DEFINE BUFFER bLotLager FOR LotLager . DEFINE TEMP-TABLE tArtLager FIELD Firma AS CHARACTER FIELD Artnr AS INTEGER FIELD Inhalt AS INTEGER FIELD Jahr AS INTEGER FIELD Ort AS CHARACTER FIELD Bestand AS INTEGER FIELD HoRe1Best AS DECIMAL FIELD HoRe2Best AS DECIMAL FIELD HoReBest AS DECIMAL FIELD lVerfall AS LOGICAL FIELD Lot1Best AS DECIMAL FIELD Lot2Best AS DECIMAL FIELD LotBest AS DECIMAL FIELD iAnzGGeb AS INTEGER FIELD iKGebMe AS INTEGER INDEX tArtLager-k1 IS PRIMARY Firma Artnr Inhalt Jahr. DEFINE TEMP-TABLE tBesEing LIKE BesEing FIELD lFound AS LOGICAL INDEX tBesEing-k1 IS PRIMARY Artnr Inhalt Jahr Verfall Lotnr INDEX tBesEing-k2 Artnr Inhalt Jahr Verfall DESCENDING Lotnr. DEFINE TEMP-TABLE tHoReLager LIKE HoReLager. DEFINE TEMP-TABLE tLotLager LIKE LotLager . DISABLE TRIGGERS FOR LOAD OF Artst . DISABLE TRIGGERS FOR LOAD OF ArtLager . DISABLE TRIGGERS FOR LOAD OF HoReLager . DISABLE TRIGGERS FOR LOAD OF LotLager . MESSAGE 'Lagerplatzupdate' VIEW-AS ALERT-BOX. RUN LAGERPLATZ_UPDATE. MESSAGE 'Tagesbestand rechnen' VIEW-AS ALERT-BOX. RUN TAGESBESTAND_RECHNEN. MESSAGE 'Lageranpassung ruestlager' VIEW-AS ALERT-BOX. RUN LAGERANPASSUNG_RUESTLAGER. MESSAGE 'saameln verfall eingang' VIEW-AS ALERT-BOX. RUN SAMMELN_VERFALL_EINGANG. MESSAGE 'lotlager bereinigen' VIEW-AS ALERT-BOX. RUN LOTLAGER_BEREINIGUNG. MESSAGE 'Bestände Reserve-Lager vs Rüstlager' VIEW-AS ALERT-BOX INFORMATION BUTTONS OK. RUN BESTANDESKONTROLLE_RFESERVE_RUESTLAGER. /* ********************** Internal Procedures *********************** */ PROCEDURE LAGERANPASSUNG_RUESTLAGER: /*------------------------------------------------------------------------------*/ /* Purpose: */ /* Notes: */ /*------------------------------------------------------------------------------*/ DEFINE VARIABLE nMenge AS DECIMAL NO-UNDO. DEFINE BUFFER bLotLager FOR LotLager. DISABLE TRIGGERS FOR LOAD OF LotLager . DISABLE TRIGGERS FOR LOAD OF HoReLager. FOR EACH HoReLager WHERE HoReLager.Firma = Firma AND HoReLager.Lager = 0: IF HoReLager.Artnr = 0 THEN DO: ASSIGN HoReLager.Bestand = 0 HoReLager.iStatus = 0 HoReLager.Verfall = ? HoReLager.Eingang = ? HoReLager.Lotnummer = ''. NEXT. END. ASSIGN HoReLager.Bestand = 0 HoReLager.iStatus = 1 HoReLager.Verfall = ? HoReLager.Eingang = ? HoReLager.Lotnummer = ''. END. FOR EACH tArtLager: IF tArtLager.Bestand <= 0 THEN DO: FOR EACH LotLager WHERE LotLager.Firma = tArtLager.Firma AND LotLager.Artnr = tArtLager.Artnr AND LotLager.Inhalt = tArtLager.Inhalt AND LotLager.Jahr = tArtLager.Jahr: DELETE LotLager. END. NEXT. END. DO WHILE tArtLager.iAnzGGeb > 0: nMenge = (IF tArtLager.Ort = '' THEN tArtLager.Bestand ELSE tArtLager.iAnzGGeb * tArtLager.iKGebMe). FIND FIRST HoReLager WHERE HoReLager.Firma = tArtLager.Firma AND HoReLager.Lager = 0 AND HoReLager.Art = 2 AND HoReLager.Artnr = tArtLager.Artnr AND HoReLager.Inhalt = tArtLager.Inhalt AND HoReLager.Jahr = tArtLager.Jahr NO-ERROR. IF AVAILABLE HoReLager THEN DO: ASSIGN HoReLager.Bestand = HoReLager.Bestand + nMenge HoReLager.iStatus = 2. LEAVE. END. FIND FIRST HoReLager WHERE HoReLager.Firma = tArtLager.Firma AND HoReLager.Lager = 0 AND HoReLager.Art = 2 AND HoReLager.Artnr = tArtLager.Artnr AND HoReLager.Inhalt = tArtLager.Inhalt NO-ERROR. IF AVAILABLE HoReLager THEN DO: ASSIGN HoReLager.Bestand = HoReLager.Bestand + nMenge HoReLager.iStatus = 2. LEAVE. END. tArtLager.iAnzGGeb = 0. LEAVE. END. IF tArtLager.Ort = '' THEN NEXT. FIND FIRST HoReLager WHERE HoReLager.Firma = tArtLager.Firma AND HoReLager.Lager = 0 AND HoReLager.cSort = tArtLager.Ort NO-ERROR. ASSIGN HoReLager.Bestand = HoReLager.Bestand + (tArtLager.Bestand - (tArtLager.iAnzGGeb * tArtLager.iKGebMe)) HoReLager.iStatus = 2. END. END PROCEDURE. PROCEDURE LAGERPLATZ_UPDATE: /*------------------------------------------------------------------------------*/ /* Purpose: */ /* Notes: */ /*------------------------------------------------------------------------------*/ DISABLE TRIGGERS FOR LOAD OF ArtLager . DISABLE TRIGGERS FOR LOAD OF HoReLager. FOR EACH ArtLager WHERE ArtLager.Firma = Firma AND ArtLager.Lager = 0: ArtLager.Ort = ''. END. FOR EACH HoReLager NO-LOCK WHERE HoReLager.Firma = Firma AND HoReLager.Lager = 0 AND HoReLager.Art = 1 AND HoReLager.Artnr > 0 AND HoReLager.Jahr = 0: FIND ArtLager WHERE ArtLager.Firma = HoReLager.Firma AND ArtLager.Lager = HoReLager.Lager AND ArtLager.Artnr = HoReLager.Artnr AND ArtLager.Inhalt = HoReLager.Inhalt AND ArtLager.Jahr = HoReLager.Jahr NO-ERROR. IF AVAILABLE ArtLager THEN DO: ArtLager.Ort = HoReLager.cSort. NEXT. END. FOR EACH ArtLager WHERE ArtLager.Firma = HoReLager.Firma AND ArtLager.Lager = HoReLager.Lager AND ArtLager.Artnr = HoReLager.Artnr AND ArtLager.Inhalt = HoReLager.Inhalt : ArtLager.Ort = HoReLager.cSort. END. END. FOR EACH HoReLager NO-LOCK WHERE HoReLager.Firma = Firma AND HoReLager.Lager = 0 AND HoReLager.Art = 1 AND HoReLager.Artnr > 0 AND HoReLager.Jahr > 0: FIND ArtLager WHERE ArtLager.Firma = HoReLager.Firma AND ArtLager.Lager = HoReLager.Lager AND ArtLager.Artnr = HoReLager.Artnr AND ArtLager.Inhalt = HoReLager.Inhalt AND ArtLager.Jahr = HoReLager.Jahr NO-ERROR. IF NOT AVAILABLE ArtLager THEN NEXT. ArtLager.Ort = HoReLager.cSort. END. END PROCEDURE. PROCEDURE LOTLAGER_BEREINIGUNG: /*------------------------------------------------------------------------------*/ /* Purpose: */ /* Notes: */ /*------------------------------------------------------------------------------*/ FOR EACH LotLager WHERE LotLager.Firma = Firma: DELETE LotLager. END. FOR EACH tArtLager NO-LOCK, FIRST Artst NO-LOCK OF tArtLager: IF NOT Artst.lVerfall THEN NEXT. IF tArtLager.Ort <> '' THEN DO: FOR EACH HoReLager NO-LOCK WHERE HoReLager.Firma = Firma AND HoReLager.Lager = 0 AND HoReLager.Art = 1 AND HoReLager.cSort = tArtLager.Ort BY HoReLager.Artnr BY HoReLager.Inhalt BY HoReLager.Jahr : nBestand = HoReLager.Bestand. FOR EACH tBesEing USE-INDEX tBesEing-k2 WHERE tBesEing.Artnr = HoReLager.Artnr AND tBesEing.Inhalt = HoReLager.Inhalt AND tBesEing.Jahr = HoReLager.Jahr AND tBesEing.Eingang > 0 : CREATE LotLager. ASSIGN LotLager.Firma = Firma LotLager.Lager = 0 LotLager.Artnr = tBesEing.Artnr LotLager.Inhalt = tBesEing.Inhalt LotLager.Jahr = tBesEing.Jahr LotLager.Verfall = tBesEing.Verfall LotLager.Lotnummer = tBesEing.Lotnr LotLager.HoReLager_Id = HoReLager.HoReLager_Id LotLager.Eingang = tBesEing.Eing_Dat. IF tBesEing.Eingang >= nBestand THEN LotLager.Bestand = nBestand. ELSE LotLager.Bestand = tBesEing.Eingang. nBestand = nBestand - LotLager.Bestand. tBesEing.Eingang = tBesEing.Eingang - LotLager.Bestand. IF nBestand = 0 THEN LEAVE. END. END. END. FOR EACH HoReLager NO-LOCK WHERE HoReLager.Firma = Firma AND HoReLager.Lager = 0 AND HoReLager.Art = 2 AND HoReLager.Artnr = tArtLager.Artnr AND HoReLager.Inhalt = tArtLager.Inhalt AND HoReLager.Jahr = tArtLager.Jahr: nBestand = HoReLager.Bestand. FOR EACH tBesEing USE-INDEX tBesEing-k2 WHERE tBesEing.Artnr = HoReLager.Artnr AND tBesEing.Inhalt = HoReLager.Inhalt AND tBesEing.Jahr = HoReLager.Jahr AND tBesEing.Eingang > 0 : CREATE LotLager. ASSIGN LotLager.Firma = Firma LotLager.Lager = 0 LotLager.Artnr = tBesEing.Artnr LotLager.Inhalt = tBesEing.Inhalt LotLager.Jahr = tBesEing.Jahr LotLager.Verfall = tBesEing.Verfall LotLager.Lotnummer = tBesEing.Lotnr LotLager.HoReLager_Id = HoReLager.HoReLager_Id LotLager.Eingang = tBesEing.Eing_Dat. IF tBesEing.Eingang >= nBestand THEN LotLager.Bestand = nBestand. ELSE LotLager.Bestand = tBesEing.Eingang. nBestand = nBestand - LotLager.Bestand. tBesEing.Eingang = tBesEing.Eingang - LotLager.Bestand. IF nBestand = 0 THEN LEAVE. END. END. END. END PROCEDURE. PROCEDURE SAMMELN_VERFALL_EINGANG: /*------------------------------------------------------------------------------*/ /* Purpose: */ /* Notes: */ /*------------------------------------------------------------------------------*/ DEFINE VARIABLE nDiff AS DECIMAL NO-UNDO. DEFINE BUFFER btBesEing FOR tBesEing. FOR EACH Artst NO-LOCK WHERE Artst.Firma = Firma AND Artst.lVerfall AND Artst.Aktiv AND Artst.Lager: FOR EACH BesEing NO-LOCK WHERE BesEing.Firma = Artst.Firma AND BesEing.Artnr = Artst.Artnr AND BesEing.Inhalt = Artst.Inhalt AND BesEing.Jahr = Artst.Jahr AND BesEing.Verfall <> ?. FIND FIRST tBesEing WHERE tBesEing.Artnr = BesEing.Artnr AND tBesEing.Inhalt = BesEing.Inhalt AND tBesEing.Jahr = BesEing.Jahr AND tBesEing.Verfall = BesEing.Verfall AND tBesEing.Lotnr = BesEing.Lotnr NO-ERROR. IF NOT AVAILABLE tBesEing THEN DO: CREATE tBesEing. BUFFER-COPY BesEing TO tBesEing ASSIGN tBesEing.lFound = TRUE. NEXT. END. tBesEing.Eingang = tBesEing.Eingang + BesEing.Eingang. END. END. FOR EACH LotLager WHERE LotLager.Firma = Firma AND LotLager.Lager = 0: FIND FIRST tBesEing WHERE tBesEing.Artnr = LotLager.Artnr AND tBesEing.Inhalt = LotLager.Inhalt AND tBesEing.Jahr = LotLager.Jahr AND tBesEing.Verfall = LotLager.Verfall AND tBesEing.Lotnr = LotLager.Lotnummer NO-ERROR. IF NOT AVAILABLE tBesEing THEN DO: CREATE tBesEing. BUFFER-COPY LotLager USING Firma Artnr Inhalt Jahr Verfall Barcode TO tBesEing ASSIGN tBesEing.Eingang = LotLager.Bestand tBeseing.lFound = FALSE tBeseing.Lotnr = LotLager.Lotnummer tBeseing.Eing_Dat = LotLager.Eingang. NEXT. END. END. FOR EACH tBesEing BREAK BY tBesEing.Artnr BY tBesEing.Inhalt BY tBesEing.Jahr: IF FIRST-OF (tBesEing.Jahr) THEN nBestand = 0. nBestand = nBestand + tBesEing.Eingang. IF NOT LAST-OF (tBesEing.Jahr) THEN NEXT. FIND FIRST tArtLager WHERE tArtLager.Firma = Firma AND tArtLager.Artnr = tBesEing.Artnr AND tArtLager.Inhalt = tBesEing.Inhalt AND tArtLager.Jahr = tBesEing.Jahr NO-ERROR. IF NOT AVAILABLE tArtLager THEN NEXT. nDiff = tArtLager.Bestand - nBestand. IF nDiff > 0 THEN DO: FIND LAST btBesEing USE-INDEX tBesEing-k1 WHERE btBesEing.Artnr = tArtLager.Artnr AND btBesEing.Inhalt = tArtLager.Inhalt AND btBesEing.Jahr = tArtLager.Jahr AND btBesEing.lFound = FALSE NO-ERROR. IF NOT AVAILABLE btBesEing THEN DO: FIND FIRST btBesEing USE-INDEX tBesEing-k1 WHERE btBesEing.Artnr = tArtLager.Artnr AND btBesEing.Inhalt = tArtLager.Inhalt AND btBesEing.Jahr = tArtLager.Jahr NO-ERROR. END. btBesEing.Eingang = btBesEing.Eingang + nDiff. NEXT. END. FOR EACH btBesEing USE-INDEX tBesEing-k1 WHERE btBesEing.Artnr = tArtLager.Artnr AND btBesEing.Inhalt = tArtLager.Inhalt AND btBesEing.Jahr = tArtLager.Jahr: IF btBesEing.Eingang <= nDiff THEN DO: nDiff = nDiff - btBesEing.Eingang. btBesEing.Eingang = 0. END. ELSE DO: btBesEing.Eingang = btBesEing.Eingang - nDiff. nDiff = 0. END. IF nDiff = 0 THEN LEAVE. END. END. END PROCEDURE. PROCEDURE TAGESBESTAND_RECHNEN: /*------------------------------------------------------------------------------*/ /* Purpose: */ /* Notes: */ /*------------------------------------------------------------------------------*/ EMPTY TEMP-TABLE tArtLager. FOR EACH Artst NO-LOCK WHERE Artst.Firma = Firma AND Artst.Aktiv AND Artst.Lager, FIRST ArtLager NO-LOCK WHERE ArtLager.Firma = Artst.Firma AND ArtLager.Lager = 0 AND ArtLager.Artnr = Artst.Artnr AND ArtLager.Inhalt = Artst.Inhalt AND ArtLager.Jahr = Artst.Jahr: CREATE tArtLager. BUFFER-COPY ArtLager USING Firma Artnr Inhalt Jahr Bestand Ort TO tArtLager. FOR EACH Aufze NO-LOCK WHERE Aufze.Firma = Artst.Firma AND Aufze.Artnr = Artst.Artnr AND Aufze.Inhalt = Artst.Inhalt AND Aufze.Jahr = Artst.Jahr AND Aufze.Lag_Buch = TRUE , FIRST Aufko NO-LOCK OF Aufze: IF Aufko.Lief_Datum <= (TODAY + 1) THEN NEXT. tArtLager.Bestand = tArtLager.Bestand + Aufze.MGeli. END. END. FOR EACH tArtLager: FIND Artst NO-LOCK OF tArtLager. FIND GGebinde NO-LOCK WHERE GGebinde.Firma = bArtst.Firma AND GGebinde.Geb_Cd = bArtst.GGeb_Cd NO-ERROR. iGGebMe = (IF AVAILABLE GGebinde THEN GGebinde.Inhalt ELSE 1). FIND VGebinde NO-LOCK WHERE VGebinde.Firma = bArtst.Firma AND VGebinde.Geb_Cd = bArtst.VGeb_Cd NO-ERROR. iVGebMe = (IF AVAILABLE VGebinde THEN VGebinde.Inhalt ELSE 1). iKGebMe = iGGebMe * iVGebMe. tArtLager.iKGebMe = iKGebMe. IF tArtLager.Bestand < iKGebMe THEN NEXT. nBestand = tArtLager.Bestand. tArtLager.iAnzGGeb = (nBestand - (nBestand MOD iKGebMe)) / iKGebMe. END. END PROCEDURE. PROCEDURE BESTANDESKONTROLLE_RFESERVE_RUESTLAGER. DEFINE VARIABLE iKGebMe AS INTEGER NO-UNDO. DEFINE VARIABLE iMenge AS INTEGER NO-UNDO. DEFINE VARIABLE iRest AS INTEGER NO-UNDO. DEFINE VARIABLE lOK AS LOGICAL NO-UNDO. FOR EACH HoReLager NO-LOCK WHERE HoReLager.Firma = Firma AND HoReLager.Lager = 0 AND HoReLager.Art = 2 AND HoReLager.Artnr > 0 TRANSACTION: IF HoReLager.Bestand <= 0 THEN DO: FIND bHoReLager WHERE RECID(bHoReLager) = RECID(HoReLager). ASSIGN bHoReLager.Bestand = 0 bHoReLager.iStatus = 1. RELEASE bHoReLager. NEXT. END. FIND FIRST bHoReLager WHERE bHoReLager.Firma = HoReLager.Firma AND bHoReLager.Lager = HoReLager.Lager AND bHoReLager.Art = 1 AND bHoReLager.Artnr = HoReLager.Artnr AND bHoReLager.Inhalt = HoReLager.Inhalt AND bHoReLager.Jahr = HoReLager.Jahr NO-ERROR. IF NOT AVAILABLE (bHoReLager) THEN DO: FIND FIRST bHoReLager WHERE bHoReLager.Firma = HoReLager.Firma AND bHoReLager.Lager = HoReLager.Lager AND bHoReLager.Art = 1 AND bHoReLager.Artnr = HoReLager.Artnr AND bHoReLager.Inhalt = HoReLager.Inhalt NO-ERROR. END. IF NOT AVAILABLE (bHoReLager) THEN NEXT. FIND Artst NO-LOCK WHERE Artst.Firma = Firma AND Artst.Artnr = HoReLager.Artnr AND Artst.Inhalt = HoReLager.Inhalt AND Artst.Jahr = HoReLager.Jahr NO-ERROR. IF NOT AVAILABLE Artst THEN DO: FIND FIRST Artst NO-LOCK WHERE Artst.Firma = Firma AND Artst.Artnr = HoReLager.Artnr AND Artst.Inhalt = HoReLager.Inhalt NO-ERROR. END. IF NOT AVAILABLE Artst THEN DO: FIND bHoReLager WHERE RECID(bHoReLager) = RECID(HoReLager). ASSIGN bHoReLager.Bestand = 0 bHoReLager.iStatus = 0 bHoReLager.Artnr = 0 bHoReLager.Inhalt = 0 bHoReLager.Jahr = 0 bHoReLager.Eingang = ? bHoReLager.Verfall = ? bHoReLager.Lotnummer = '' . NEXT. END. FIND GGebinde NO-LOCK WHERE GGebinde.Firma = Artst.Firma AND GGebinde.Geb_Cd = Artst.GGeb_Cd NO-ERROR. IF NOT AVAILABLE GGebinde THEN NEXT. IF GGebinde.Inhalt < 2 THEN NEXT. FIND VGebinde NO-LOCK WHERE VGebinde.Firma = Artst.Firma AND VGebinde.Geb_Cd = Artst.VGeb_Cd NO-ERROR. iKGebMe = GGebinde.Inhalt * VGebinde.Inhalt. lok = TRUE. DO WHILE TRUE: IF Artst.Bestand <= iKGebMe THEN DO: iMenge = HoReLager.Bestand. LEAVE. END. IF HoReLager.Bestand < iKGebMe THEN DO: iMenge = HoReLager.Bestand. LEAVE. END. iMenge = HoReLager.Bestand MOD iKGebMe. IF iMenge > 0 THEN LEAVE. lOK = FALSE. LEAVE. END. IF NOT lOK THEN NEXT. EMPTY TEMP-TABLE tHoReLager. EMPTY TEMP-TABLE tLotLager . iRest = iMenge. FOR EACH LotLager NO-LOCK WHERE LotLager.HoReLager_Id = HoReLager.HoReLager_Id AND LotLager.Artnr = HoReLager.Artnr: IF LotLager.Bestand <= iRest THEN DO: CREATE tLotLager. BUFFER-COPY LotLager EXCEPT HoReLager_Id TO tLotLager ASSIGN tLotLager.HoReLager_Id = bHoReLager.HoReLager_Id. iRest = iRest - LotLager.Bestand. RELEASE bLotLager. IF iRest = 0 THEN LEAVE. END. CREATE tLotLager. BUFFER-COPY LotLager EXCEPT HoReLager_Id Bestand TO tLotLager ASSIGN tLotLager.HoReLager_Id = bHoReLager.HoReLager_Id tLotLager.Bestand = iRest. FIND bLotLager WHERE RECID(bLotLager) = RECID(LotLager). bLotLager.Bestand = bLotLager.Bestand - iRest. iRest = 0. LEAVE. END. FOR EACH tLotLager: FIND LotLager OF tLotLager NO-ERROR. IF NOT AVAILABLE LotLager THEN DO: CREATE LotLager. BUFFER-COPY tLotLager TO LotLager. NEXT. END. LotLager.Bestand = LotLager.Bestand + tLotLager.Bestand. END. FOR EACH LotLager WHERE LotLager.HoReLager_Id = HoReLager.HoReLager_Id AND LotLager.Artnr = HoReLager.Artnr AND LotLager.Bestand = 0: DELETE LotLager. END. ASSIGN bHoReLager.Bestand = bHoReLager.Bestand + HoReLager.Bestand bHoReLager.iStatus = 2. FIND bHoReLager WHERE RECID(bHoReLager) = RECID(HoReLager). ASSIGN bHoReLager.Bestand = 0 bHoReLager.iStatus = 1. END. END PROCEDURE.