LagerBestandesAnpassungAus ArtLager.p 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697
  1. DEFINE VARIABLE Firma AS CHARACTER NO-UNDO INIT '1000' .
  2. DEFINE VARIABLE nBestand AS DECIMAL NO-UNDO.
  3. DEFINE VARIABLE iGGebMe AS INTEGER NO-UNDO.
  4. DEFINE VARIABLE iVGebMe AS INTEGER NO-UNDO.
  5. DEFINE VARIABLE iKGebMe AS INTEGER NO-UNDO.
  6. DEFINE VARIABLE iHoReId AS INTEGER NO-UNDO.
  7. DEFINE BUFFER bArtst FOR Artst .
  8. DEFINE BUFFER bArtLager FOR ArtLager .
  9. DEFINE BUFFER bHoReLager FOR HoReLager.
  10. DEFINE BUFFER bLotLager FOR LotLager .
  11. DEFINE TEMP-TABLE tArtLager
  12. FIELD Firma AS CHARACTER
  13. FIELD Artnr AS INTEGER
  14. FIELD Inhalt AS INTEGER
  15. FIELD Jahr AS INTEGER
  16. FIELD Ort AS CHARACTER
  17. FIELD Bestand AS INTEGER
  18. FIELD HoRe1Best AS DECIMAL
  19. FIELD HoRe2Best AS DECIMAL
  20. FIELD HoReBest AS DECIMAL
  21. FIELD lVerfall AS LOGICAL
  22. FIELD Lot1Best AS DECIMAL
  23. FIELD Lot2Best AS DECIMAL
  24. FIELD LotBest AS DECIMAL
  25. FIELD iAnzGGeb AS INTEGER
  26. FIELD iKGebMe AS INTEGER
  27. INDEX tArtLager-k1 IS PRIMARY
  28. Firma
  29. Artnr
  30. Inhalt
  31. Jahr.
  32. DEFINE TEMP-TABLE tBesEing LIKE BesEing
  33. FIELD lFound AS LOGICAL
  34. INDEX tBesEing-k1 IS PRIMARY
  35. Artnr
  36. Inhalt
  37. Jahr
  38. Verfall
  39. Lotnr
  40. INDEX tBesEing-k2
  41. Artnr
  42. Inhalt
  43. Jahr
  44. Verfall DESCENDING
  45. Lotnr.
  46. DEFINE TEMP-TABLE tHoReLager LIKE HoReLager.
  47. DEFINE TEMP-TABLE tLotLager LIKE LotLager .
  48. DISABLE TRIGGERS FOR LOAD OF Artst .
  49. DISABLE TRIGGERS FOR LOAD OF ArtLager .
  50. DISABLE TRIGGERS FOR LOAD OF HoReLager .
  51. DISABLE TRIGGERS FOR LOAD OF LotLager .
  52. MESSAGE 'Lagerplatzupdate'
  53. VIEW-AS ALERT-BOX.
  54. RUN LAGERPLATZ_UPDATE.
  55. MESSAGE 'Tagesbestand rechnen'
  56. VIEW-AS ALERT-BOX.
  57. RUN TAGESBESTAND_RECHNEN.
  58. MESSAGE 'Lageranpassung ruestlager'
  59. VIEW-AS ALERT-BOX.
  60. RUN LAGERANPASSUNG_RUESTLAGER.
  61. MESSAGE 'saameln verfall eingang'
  62. VIEW-AS ALERT-BOX.
  63. RUN SAMMELN_VERFALL_EINGANG.
  64. MESSAGE 'lotlager bereinigen'
  65. VIEW-AS ALERT-BOX.
  66. RUN LOTLAGER_BEREINIGUNG.
  67. MESSAGE 'Bestände Reserve-Lager vs Rüstlager'
  68. VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
  69. RUN BESTANDESKONTROLLE_RFESERVE_RUESTLAGER.
  70. /* ********************** Internal Procedures *********************** */
  71. PROCEDURE LAGERANPASSUNG_RUESTLAGER:
  72. /*------------------------------------------------------------------------------*/
  73. /* Purpose: */
  74. /* Notes: */
  75. /*------------------------------------------------------------------------------*/
  76. DEFINE VARIABLE nMenge AS DECIMAL NO-UNDO.
  77. DEFINE BUFFER bLotLager FOR LotLager.
  78. DISABLE TRIGGERS FOR LOAD OF LotLager .
  79. DISABLE TRIGGERS FOR LOAD OF HoReLager.
  80. FOR EACH HoReLager
  81. WHERE HoReLager.Firma = Firma
  82. AND HoReLager.Lager = 0:
  83. IF HoReLager.Artnr = 0 THEN
  84. DO:
  85. ASSIGN
  86. HoReLager.Bestand = 0
  87. HoReLager.iStatus = 0
  88. HoReLager.Verfall = ?
  89. HoReLager.Eingang = ?
  90. HoReLager.Lotnummer = ''.
  91. NEXT.
  92. END.
  93. ASSIGN
  94. HoReLager.Bestand = 0
  95. HoReLager.iStatus = 1
  96. HoReLager.Verfall = ?
  97. HoReLager.Eingang = ?
  98. HoReLager.Lotnummer = ''.
  99. END.
  100. FOR EACH tArtLager:
  101. IF tArtLager.Bestand <= 0 THEN
  102. DO:
  103. FOR EACH LotLager
  104. WHERE LotLager.Firma = tArtLager.Firma
  105. AND LotLager.Artnr = tArtLager.Artnr
  106. AND LotLager.Inhalt = tArtLager.Inhalt
  107. AND LotLager.Jahr = tArtLager.Jahr:
  108. DELETE LotLager.
  109. END.
  110. NEXT.
  111. END.
  112. DO WHILE tArtLager.iAnzGGeb > 0:
  113. nMenge = (IF tArtLager.Ort = '' THEN tArtLager.Bestand ELSE tArtLager.iAnzGGeb * tArtLager.iKGebMe).
  114. FIND FIRST HoReLager
  115. WHERE HoReLager.Firma = tArtLager.Firma
  116. AND HoReLager.Lager = 0
  117. AND HoReLager.Art = 2
  118. AND HoReLager.Artnr = tArtLager.Artnr
  119. AND HoReLager.Inhalt = tArtLager.Inhalt
  120. AND HoReLager.Jahr = tArtLager.Jahr NO-ERROR.
  121. IF AVAILABLE HoReLager THEN
  122. DO:
  123. ASSIGN
  124. HoReLager.Bestand = HoReLager.Bestand + nMenge
  125. HoReLager.iStatus = 2.
  126. LEAVE.
  127. END.
  128. FIND FIRST HoReLager
  129. WHERE HoReLager.Firma = tArtLager.Firma
  130. AND HoReLager.Lager = 0
  131. AND HoReLager.Art = 2
  132. AND HoReLager.Artnr = tArtLager.Artnr
  133. AND HoReLager.Inhalt = tArtLager.Inhalt NO-ERROR.
  134. IF AVAILABLE HoReLager THEN
  135. DO:
  136. ASSIGN
  137. HoReLager.Bestand = HoReLager.Bestand + nMenge
  138. HoReLager.iStatus = 2.
  139. LEAVE.
  140. END.
  141. tArtLager.iAnzGGeb = 0.
  142. LEAVE.
  143. END.
  144. IF tArtLager.Ort = '' THEN NEXT.
  145. FIND FIRST HoReLager
  146. WHERE HoReLager.Firma = tArtLager.Firma
  147. AND HoReLager.Lager = 0
  148. AND HoReLager.cSort = tArtLager.Ort NO-ERROR.
  149. ASSIGN
  150. HoReLager.Bestand = HoReLager.Bestand
  151. + (tArtLager.Bestand - (tArtLager.iAnzGGeb * tArtLager.iKGebMe))
  152. HoReLager.iStatus = 2.
  153. END.
  154. END PROCEDURE.
  155. PROCEDURE LAGERPLATZ_UPDATE:
  156. /*------------------------------------------------------------------------------*/
  157. /* Purpose: */
  158. /* Notes: */
  159. /*------------------------------------------------------------------------------*/
  160. DISABLE TRIGGERS FOR LOAD OF ArtLager .
  161. DISABLE TRIGGERS FOR LOAD OF HoReLager.
  162. FOR EACH ArtLager
  163. WHERE ArtLager.Firma = Firma
  164. AND ArtLager.Lager = 0:
  165. ArtLager.Ort = ''.
  166. END.
  167. FOR EACH HoReLager NO-LOCK
  168. WHERE HoReLager.Firma = Firma
  169. AND HoReLager.Lager = 0
  170. AND HoReLager.Art = 1
  171. AND HoReLager.Artnr > 0
  172. AND HoReLager.Jahr = 0:
  173. FIND ArtLager
  174. WHERE ArtLager.Firma = HoReLager.Firma
  175. AND ArtLager.Lager = HoReLager.Lager
  176. AND ArtLager.Artnr = HoReLager.Artnr
  177. AND ArtLager.Inhalt = HoReLager.Inhalt
  178. AND ArtLager.Jahr = HoReLager.Jahr NO-ERROR.
  179. IF AVAILABLE ArtLager THEN
  180. DO:
  181. ArtLager.Ort = HoReLager.cSort.
  182. NEXT.
  183. END.
  184. FOR EACH ArtLager
  185. WHERE ArtLager.Firma = HoReLager.Firma
  186. AND ArtLager.Lager = HoReLager.Lager
  187. AND ArtLager.Artnr = HoReLager.Artnr
  188. AND ArtLager.Inhalt = HoReLager.Inhalt :
  189. ArtLager.Ort = HoReLager.cSort.
  190. END.
  191. END.
  192. FOR EACH HoReLager NO-LOCK
  193. WHERE HoReLager.Firma = Firma
  194. AND HoReLager.Lager = 0
  195. AND HoReLager.Art = 1
  196. AND HoReLager.Artnr > 0
  197. AND HoReLager.Jahr > 0:
  198. FIND ArtLager
  199. WHERE ArtLager.Firma = HoReLager.Firma
  200. AND ArtLager.Lager = HoReLager.Lager
  201. AND ArtLager.Artnr = HoReLager.Artnr
  202. AND ArtLager.Inhalt = HoReLager.Inhalt
  203. AND ArtLager.Jahr = HoReLager.Jahr NO-ERROR.
  204. IF NOT AVAILABLE ArtLager THEN NEXT.
  205. ArtLager.Ort = HoReLager.cSort.
  206. END.
  207. END PROCEDURE.
  208. PROCEDURE LOTLAGER_BEREINIGUNG:
  209. /*------------------------------------------------------------------------------*/
  210. /* Purpose: */
  211. /* Notes: */
  212. /*------------------------------------------------------------------------------*/
  213. FOR EACH LotLager
  214. WHERE LotLager.Firma = Firma:
  215. DELETE LotLager.
  216. END.
  217. FOR EACH tArtLager NO-LOCK,
  218. FIRST Artst NO-LOCK OF tArtLager:
  219. IF NOT Artst.lVerfall THEN NEXT.
  220. IF tArtLager.Ort <> '' THEN
  221. DO:
  222. FOR EACH HoReLager NO-LOCK
  223. WHERE HoReLager.Firma = Firma
  224. AND HoReLager.Lager = 0
  225. AND HoReLager.Art = 1
  226. AND HoReLager.cSort = tArtLager.Ort
  227. BY HoReLager.Artnr
  228. BY HoReLager.Inhalt
  229. BY HoReLager.Jahr :
  230. nBestand = HoReLager.Bestand.
  231. FOR EACH tBesEing USE-INDEX tBesEing-k2
  232. WHERE tBesEing.Artnr = HoReLager.Artnr
  233. AND tBesEing.Inhalt = HoReLager.Inhalt
  234. AND tBesEing.Jahr = HoReLager.Jahr
  235. AND tBesEing.Eingang > 0 :
  236. CREATE LotLager.
  237. ASSIGN
  238. LotLager.Firma = Firma
  239. LotLager.Lager = 0
  240. LotLager.Artnr = tBesEing.Artnr
  241. LotLager.Inhalt = tBesEing.Inhalt
  242. LotLager.Jahr = tBesEing.Jahr
  243. LotLager.Verfall = tBesEing.Verfall
  244. LotLager.Lotnummer = tBesEing.Lotnr
  245. LotLager.HoReLager_Id = HoReLager.HoReLager_Id
  246. LotLager.Eingang = tBesEing.Eing_Dat.
  247. IF tBesEing.Eingang >= nBestand THEN LotLager.Bestand = nBestand.
  248. ELSE LotLager.Bestand = tBesEing.Eingang.
  249. nBestand = nBestand - LotLager.Bestand.
  250. tBesEing.Eingang = tBesEing.Eingang - LotLager.Bestand.
  251. IF nBestand = 0 THEN LEAVE.
  252. END.
  253. END.
  254. END.
  255. FOR EACH HoReLager NO-LOCK
  256. WHERE HoReLager.Firma = Firma
  257. AND HoReLager.Lager = 0
  258. AND HoReLager.Art = 2
  259. AND HoReLager.Artnr = tArtLager.Artnr
  260. AND HoReLager.Inhalt = tArtLager.Inhalt
  261. AND HoReLager.Jahr = tArtLager.Jahr:
  262. nBestand = HoReLager.Bestand.
  263. FOR EACH tBesEing USE-INDEX tBesEing-k2
  264. WHERE tBesEing.Artnr = HoReLager.Artnr
  265. AND tBesEing.Inhalt = HoReLager.Inhalt
  266. AND tBesEing.Jahr = HoReLager.Jahr
  267. AND tBesEing.Eingang > 0 :
  268. CREATE LotLager.
  269. ASSIGN
  270. LotLager.Firma = Firma
  271. LotLager.Lager = 0
  272. LotLager.Artnr = tBesEing.Artnr
  273. LotLager.Inhalt = tBesEing.Inhalt
  274. LotLager.Jahr = tBesEing.Jahr
  275. LotLager.Verfall = tBesEing.Verfall
  276. LotLager.Lotnummer = tBesEing.Lotnr
  277. LotLager.HoReLager_Id = HoReLager.HoReLager_Id
  278. LotLager.Eingang = tBesEing.Eing_Dat.
  279. IF tBesEing.Eingang >= nBestand THEN LotLager.Bestand = nBestand.
  280. ELSE LotLager.Bestand = tBesEing.Eingang.
  281. nBestand = nBestand - LotLager.Bestand.
  282. tBesEing.Eingang = tBesEing.Eingang - LotLager.Bestand.
  283. IF nBestand = 0 THEN LEAVE.
  284. END.
  285. END.
  286. END.
  287. END PROCEDURE.
  288. PROCEDURE SAMMELN_VERFALL_EINGANG:
  289. /*------------------------------------------------------------------------------*/
  290. /* Purpose: */
  291. /* Notes: */
  292. /*------------------------------------------------------------------------------*/
  293. DEFINE VARIABLE nDiff AS DECIMAL NO-UNDO.
  294. DEFINE BUFFER btBesEing FOR tBesEing.
  295. FOR EACH Artst NO-LOCK
  296. WHERE Artst.Firma = Firma
  297. AND Artst.lVerfall
  298. AND Artst.Aktiv
  299. AND Artst.Lager:
  300. FOR EACH BesEing NO-LOCK
  301. WHERE BesEing.Firma = Artst.Firma
  302. AND BesEing.Artnr = Artst.Artnr
  303. AND BesEing.Inhalt = Artst.Inhalt
  304. AND BesEing.Jahr = Artst.Jahr
  305. AND BesEing.Verfall <> ?.
  306. FIND FIRST tBesEing
  307. WHERE tBesEing.Artnr = BesEing.Artnr
  308. AND tBesEing.Inhalt = BesEing.Inhalt
  309. AND tBesEing.Jahr = BesEing.Jahr
  310. AND tBesEing.Verfall = BesEing.Verfall
  311. AND tBesEing.Lotnr = BesEing.Lotnr NO-ERROR.
  312. IF NOT AVAILABLE tBesEing THEN
  313. DO:
  314. CREATE tBesEing.
  315. BUFFER-COPY BesEing
  316. TO tBesEing
  317. ASSIGN
  318. tBesEing.lFound = TRUE.
  319. NEXT.
  320. END.
  321. tBesEing.Eingang = tBesEing.Eingang + BesEing.Eingang.
  322. END.
  323. END.
  324. FOR EACH LotLager
  325. WHERE LotLager.Firma = Firma
  326. AND LotLager.Lager = 0:
  327. FIND FIRST tBesEing
  328. WHERE tBesEing.Artnr = LotLager.Artnr
  329. AND tBesEing.Inhalt = LotLager.Inhalt
  330. AND tBesEing.Jahr = LotLager.Jahr
  331. AND tBesEing.Verfall = LotLager.Verfall
  332. AND tBesEing.Lotnr = LotLager.Lotnummer NO-ERROR.
  333. IF NOT AVAILABLE tBesEing THEN
  334. DO:
  335. CREATE tBesEing.
  336. BUFFER-COPY LotLager
  337. USING Firma Artnr Inhalt Jahr Verfall Barcode
  338. TO tBesEing
  339. ASSIGN
  340. tBesEing.Eingang = LotLager.Bestand
  341. tBeseing.lFound = FALSE
  342. tBeseing.Lotnr = LotLager.Lotnummer
  343. tBeseing.Eing_Dat = LotLager.Eingang.
  344. NEXT.
  345. END.
  346. END.
  347. FOR EACH tBesEing
  348. BREAK BY tBesEing.Artnr
  349. BY tBesEing.Inhalt
  350. BY tBesEing.Jahr:
  351. IF FIRST-OF (tBesEing.Jahr) THEN nBestand = 0.
  352. nBestand = nBestand + tBesEing.Eingang.
  353. IF NOT LAST-OF (tBesEing.Jahr) THEN NEXT.
  354. FIND FIRST tArtLager
  355. WHERE tArtLager.Firma = Firma
  356. AND tArtLager.Artnr = tBesEing.Artnr
  357. AND tArtLager.Inhalt = tBesEing.Inhalt
  358. AND tArtLager.Jahr = tBesEing.Jahr NO-ERROR.
  359. IF NOT AVAILABLE tArtLager THEN NEXT.
  360. nDiff = tArtLager.Bestand - nBestand.
  361. IF nDiff > 0 THEN
  362. DO:
  363. FIND LAST btBesEing USE-INDEX tBesEing-k1
  364. WHERE btBesEing.Artnr = tArtLager.Artnr
  365. AND btBesEing.Inhalt = tArtLager.Inhalt
  366. AND btBesEing.Jahr = tArtLager.Jahr
  367. AND btBesEing.lFound = FALSE NO-ERROR.
  368. IF NOT AVAILABLE btBesEing THEN
  369. DO:
  370. FIND FIRST btBesEing USE-INDEX tBesEing-k1
  371. WHERE btBesEing.Artnr = tArtLager.Artnr
  372. AND btBesEing.Inhalt = tArtLager.Inhalt
  373. AND btBesEing.Jahr = tArtLager.Jahr NO-ERROR.
  374. END.
  375. btBesEing.Eingang = btBesEing.Eingang + nDiff.
  376. NEXT.
  377. END.
  378. FOR EACH btBesEing USE-INDEX tBesEing-k1
  379. WHERE btBesEing.Artnr = tArtLager.Artnr
  380. AND btBesEing.Inhalt = tArtLager.Inhalt
  381. AND btBesEing.Jahr = tArtLager.Jahr:
  382. IF btBesEing.Eingang <= nDiff THEN
  383. DO:
  384. nDiff = nDiff - btBesEing.Eingang.
  385. btBesEing.Eingang = 0.
  386. END.
  387. ELSE
  388. DO:
  389. btBesEing.Eingang = btBesEing.Eingang - nDiff.
  390. nDiff = 0.
  391. END.
  392. IF nDiff = 0 THEN LEAVE.
  393. END.
  394. END.
  395. END PROCEDURE.
  396. PROCEDURE TAGESBESTAND_RECHNEN:
  397. /*------------------------------------------------------------------------------*/
  398. /* Purpose: */
  399. /* Notes: */
  400. /*------------------------------------------------------------------------------*/
  401. EMPTY TEMP-TABLE tArtLager.
  402. FOR EACH Artst NO-LOCK
  403. WHERE Artst.Firma = Firma
  404. AND Artst.Aktiv
  405. AND Artst.Lager,
  406. FIRST ArtLager NO-LOCK
  407. WHERE ArtLager.Firma = Artst.Firma
  408. AND ArtLager.Lager = 0
  409. AND ArtLager.Artnr = Artst.Artnr
  410. AND ArtLager.Inhalt = Artst.Inhalt
  411. AND ArtLager.Jahr = Artst.Jahr:
  412. CREATE tArtLager.
  413. BUFFER-COPY ArtLager
  414. USING Firma Artnr Inhalt Jahr Bestand Ort
  415. TO tArtLager.
  416. FOR EACH Aufze NO-LOCK
  417. WHERE Aufze.Firma = Artst.Firma
  418. AND Aufze.Artnr = Artst.Artnr
  419. AND Aufze.Inhalt = Artst.Inhalt
  420. AND Aufze.Jahr = Artst.Jahr
  421. AND Aufze.Lag_Buch = TRUE ,
  422. FIRST Aufko NO-LOCK OF Aufze:
  423. IF Aufko.Lief_Datum <= (TODAY + 1) THEN NEXT.
  424. tArtLager.Bestand = tArtLager.Bestand + Aufze.MGeli.
  425. END.
  426. END.
  427. FOR EACH tArtLager:
  428. FIND Artst NO-LOCK OF tArtLager.
  429. FIND GGebinde NO-LOCK
  430. WHERE GGebinde.Firma = bArtst.Firma
  431. AND GGebinde.Geb_Cd = bArtst.GGeb_Cd NO-ERROR.
  432. iGGebMe = (IF AVAILABLE GGebinde THEN GGebinde.Inhalt ELSE 1).
  433. FIND VGebinde NO-LOCK
  434. WHERE VGebinde.Firma = bArtst.Firma
  435. AND VGebinde.Geb_Cd = bArtst.VGeb_Cd NO-ERROR.
  436. iVGebMe = (IF AVAILABLE VGebinde THEN VGebinde.Inhalt ELSE 1).
  437. iKGebMe = iGGebMe * iVGebMe.
  438. tArtLager.iKGebMe = iKGebMe.
  439. IF tArtLager.Bestand < iKGebMe THEN NEXT.
  440. nBestand = tArtLager.Bestand.
  441. tArtLager.iAnzGGeb = (nBestand - (nBestand MOD iKGebMe)) / iKGebMe.
  442. END.
  443. END PROCEDURE.
  444. PROCEDURE BESTANDESKONTROLLE_RFESERVE_RUESTLAGER.
  445. DEFINE VARIABLE iKGebMe AS INTEGER NO-UNDO.
  446. DEFINE VARIABLE iMenge AS INTEGER NO-UNDO.
  447. DEFINE VARIABLE iRest AS INTEGER NO-UNDO.
  448. DEFINE VARIABLE lOK AS LOGICAL NO-UNDO.
  449. FOR EACH HoReLager NO-LOCK
  450. WHERE HoReLager.Firma = Firma
  451. AND HoReLager.Lager = 0
  452. AND HoReLager.Art = 2
  453. AND HoReLager.Artnr > 0 TRANSACTION:
  454. IF HoReLager.Bestand <= 0 THEN
  455. DO:
  456. FIND bHoReLager WHERE RECID(bHoReLager) = RECID(HoReLager).
  457. ASSIGN
  458. bHoReLager.Bestand = 0
  459. bHoReLager.iStatus = 1.
  460. RELEASE bHoReLager.
  461. NEXT.
  462. END.
  463. FIND FIRST bHoReLager
  464. WHERE bHoReLager.Firma = HoReLager.Firma
  465. AND bHoReLager.Lager = HoReLager.Lager
  466. AND bHoReLager.Art = 1
  467. AND bHoReLager.Artnr = HoReLager.Artnr
  468. AND bHoReLager.Inhalt = HoReLager.Inhalt
  469. AND bHoReLager.Jahr = HoReLager.Jahr NO-ERROR.
  470. IF NOT AVAILABLE (bHoReLager) THEN
  471. DO:
  472. FIND FIRST bHoReLager
  473. WHERE bHoReLager.Firma = HoReLager.Firma
  474. AND bHoReLager.Lager = HoReLager.Lager
  475. AND bHoReLager.Art = 1
  476. AND bHoReLager.Artnr = HoReLager.Artnr
  477. AND bHoReLager.Inhalt = HoReLager.Inhalt NO-ERROR.
  478. END.
  479. IF NOT AVAILABLE (bHoReLager) THEN NEXT.
  480. FIND Artst NO-LOCK
  481. WHERE Artst.Firma = Firma
  482. AND Artst.Artnr = HoReLager.Artnr
  483. AND Artst.Inhalt = HoReLager.Inhalt
  484. AND Artst.Jahr = HoReLager.Jahr NO-ERROR.
  485. IF NOT AVAILABLE Artst THEN
  486. DO:
  487. FIND FIRST Artst NO-LOCK
  488. WHERE Artst.Firma = Firma
  489. AND Artst.Artnr = HoReLager.Artnr
  490. AND Artst.Inhalt = HoReLager.Inhalt NO-ERROR.
  491. END.
  492. IF NOT AVAILABLE Artst THEN
  493. DO:
  494. FIND bHoReLager WHERE RECID(bHoReLager) = RECID(HoReLager).
  495. ASSIGN
  496. bHoReLager.Bestand = 0
  497. bHoReLager.iStatus = 0
  498. bHoReLager.Artnr = 0
  499. bHoReLager.Inhalt = 0
  500. bHoReLager.Jahr = 0
  501. bHoReLager.Eingang = ?
  502. bHoReLager.Verfall = ?
  503. bHoReLager.Lotnummer = ''
  504. .
  505. NEXT.
  506. END.
  507. FIND GGebinde NO-LOCK
  508. WHERE GGebinde.Firma = Artst.Firma
  509. AND GGebinde.Geb_Cd = Artst.GGeb_Cd NO-ERROR.
  510. IF NOT AVAILABLE GGebinde THEN NEXT.
  511. IF GGebinde.Inhalt < 2 THEN NEXT.
  512. FIND VGebinde NO-LOCK
  513. WHERE VGebinde.Firma = Artst.Firma
  514. AND VGebinde.Geb_Cd = Artst.VGeb_Cd NO-ERROR.
  515. iKGebMe = GGebinde.Inhalt * VGebinde.Inhalt.
  516. lok = TRUE.
  517. DO WHILE TRUE:
  518. IF Artst.Bestand <= iKGebMe THEN
  519. DO:
  520. iMenge = HoReLager.Bestand.
  521. LEAVE.
  522. END.
  523. IF HoReLager.Bestand < iKGebMe THEN
  524. DO:
  525. iMenge = HoReLager.Bestand.
  526. LEAVE.
  527. END.
  528. iMenge = HoReLager.Bestand MOD iKGebMe.
  529. IF iMenge > 0 THEN LEAVE.
  530. lOK = FALSE.
  531. LEAVE.
  532. END.
  533. IF NOT lOK THEN NEXT.
  534. EMPTY TEMP-TABLE tHoReLager.
  535. EMPTY TEMP-TABLE tLotLager .
  536. iRest = iMenge.
  537. FOR EACH LotLager NO-LOCK
  538. WHERE LotLager.HoReLager_Id = HoReLager.HoReLager_Id
  539. AND LotLager.Artnr = HoReLager.Artnr:
  540. IF LotLager.Bestand <= iRest THEN
  541. DO:
  542. CREATE tLotLager.
  543. BUFFER-COPY LotLager
  544. EXCEPT HoReLager_Id
  545. TO tLotLager
  546. ASSIGN
  547. tLotLager.HoReLager_Id = bHoReLager.HoReLager_Id.
  548. iRest = iRest - LotLager.Bestand.
  549. RELEASE bLotLager.
  550. IF iRest = 0 THEN LEAVE.
  551. END.
  552. CREATE tLotLager.
  553. BUFFER-COPY LotLager
  554. EXCEPT HoReLager_Id Bestand
  555. TO tLotLager
  556. ASSIGN
  557. tLotLager.HoReLager_Id = bHoReLager.HoReLager_Id
  558. tLotLager.Bestand = iRest.
  559. FIND bLotLager WHERE RECID(bLotLager) = RECID(LotLager).
  560. bLotLager.Bestand = bLotLager.Bestand - iRest.
  561. iRest = 0.
  562. LEAVE.
  563. END.
  564. FOR EACH tLotLager:
  565. FIND LotLager OF tLotLager NO-ERROR.
  566. IF NOT AVAILABLE LotLager THEN
  567. DO:
  568. CREATE LotLager.
  569. BUFFER-COPY tLotLager TO LotLager.
  570. NEXT.
  571. END.
  572. LotLager.Bestand = LotLager.Bestand + tLotLager.Bestand.
  573. END.
  574. FOR EACH LotLager
  575. WHERE LotLager.HoReLager_Id = HoReLager.HoReLager_Id
  576. AND LotLager.Artnr = HoReLager.Artnr
  577. AND LotLager.Bestand = 0:
  578. DELETE LotLager.
  579. END.
  580. ASSIGN
  581. bHoReLager.Bestand = bHoReLager.Bestand + HoReLager.Bestand
  582. bHoReLager.iStatus = 2.
  583. FIND bHoReLager WHERE RECID(bHoReLager) = RECID(HoReLager).
  584. ASSIGN
  585. bHoReLager.Bestand = 0
  586. bHoReLager.iStatus = 1.
  587. END.
  588. END PROCEDURE.