Listing of file='INVT110E' on disk='vmedia/701-2616C.wvd.zip'
# Sector 860, program filename = 'INVT110E' 0010 REM INVT110E, RELEASE 1-0, (06/15/79), THIS PROGRAM IS A COPYRIGHT PRODUC T OF WANG LABORATORIES., UNAUTHORIZED REPRODUCTION OR USE IS PROHIBITED, SALES PROJ/L.O.S. EXECUTION 0020 REM DATE WRITTEN = 8/28/78 0030 REM SYSTEM NAME = GBS/MVP INVENTORY SYSTEM 0040 REM PROGRAM NAME = SALES PROJ/ LEVEL OF SERVICE 0050 REM PROGRAM FUNCTION = MAKES + PRINTS SALES PROJECTIONS 0060 REM - OR LEVEL OF SERVICE CALCULATIONS 0140 REM ************************************************** 0170 DIM B8$24,B9$24,D6(13),D8(13),E6(13),E8(13),E9$10,F9$1,P$(12)3,K5$(50 )4 0172 REM FOLLOWING USED IN PROJECTION ROUTINE ONLY 0174 DIM D6$4,D6$(3)8,D7$6,D7$(39)15,K9$4 0175 REM FOLLOWING USED ONLY IN SAFETY FACTOR CALCULATIONS 0176 DIM C6$4,C6$(21)2,C7$(21)1,P7$(1)2 3970 REM ************************************************** 3980 REM * * * START POINT FOR READING SORTWORK FILE * * * 3985 REM * * * NEXT EXECUTABLE LINE # MUST BE 4000 * * * 3990 REM ************************************************** 3995 REM 4000 GOSUB 6575 4005 IF I6$="K" THEN 4250 4020 DATA LOAD DC OPEN T#4,S$(4) 4030 LIMITS T#1,S$(1),B6,E8,E8 4035 DATA LOAD DC OPEN T #1,S$(1) 4040 DATA LOAD DC #4,K5$() 4045 REM TEST IF NO RECORDS IN SORT 4050 IF END THEN B8=0 : ELSE B8=1 4055 GOSUB '90 4060 IF B8=0 THEN GOSUB '31 4065 REM GET NEXT INVENTORY RECORD WITH SORT WORKFILE 4070 IF B8<51 THEN 4095 4075 B8=1 4080 DATA LOAD DC #4,K5$() 4085 IF END THEN K5$()=ALL(FF) 4090 REM TEST IF END OF FILE REACHED 4095 IF STR(K5$(B8),1,1)<>HEX(FF) THEN 4120 4100 GOSUB 4555 4105 GOSUB 4615 4110 GOSUB '31 4115 REM SKIP TO RECORD POSITION TO DO DC READ 4120 B7=VAL(K5$(B8),2)-B6 4125 IF B7=0 THEN 4135 4130 DSKIP #1,B7S 4135 GOSUB '78(1) 4140 F8$=STR(M$(B6(1)),B6(2),B6(3)) 4145 DBACKSPACE #1,(B7+1)S 4150 REM TEST IF FIRST RECORD - PRINT HEADING 4155 IF F9$="1" THEN 4180 4160 F6$=F8$ 4165 GOSUB 4950 4170 GOTO 4205 4175 REM TEST IF NEW KEY 4180 IF F6$=F8$ THEN 4205 4185 GOSUB 4555 4190 F6$=F8$ 4195 GOSUB 4950 4200 REM CALL ROUTINE FOR SALES PROJ OR LEVEL OF SERVICE 4205 MAT D6=ZER 4210 ON I6+1 GOSUB 6270,5420 4215 F9$="1" 4220 B8=B8+1 4225 GOTO 4070 4230 REM ************************************************** 4235 REM * * * START POINT WHEN BYPASSING SORT * * * * * 4240 REM ************************************************** 4245 REM 4250 GOSUB '90 4255 IF K6>3 THEN 4350 4260 ON K6 GOTO 4350,4295 4265 REM ASK FOR INDIVIDUAL 4270 GOSUB '100(" ",HEX(7F),Q0,0,"ENTER PRODUCT ID (OR END)",2) 4275 IF Q6$=HEX(1F) OR Q6$="END" OR Q6$="end" THEN 4505 4280 GOSUB '96(2) 4285 F6$=Q6$ 4290 REM FIND INDIVIDUAL OR LOWER LIMIT OF RANGE 4295 GOSUB '232(1,0,F6$) 4300 IF K6=3 THEN 4310 4305 IF Q$="N" THEN 4445 4310 GOSUB '91 4315 IF J0=0 THEN 4390 4320 PRINT AT(3,LEN(J$(J0))+1);"- PRODUCT ID ";F6$ 4325 IF J0=3 THEN 4270 4330 IF J0<>7 THEN 6555 4335 GOSUB '92 4340 GOTO 4295 4345 REM FIND FIRST RECORD FOR "ALL" OR SINGLE KEY 4350 GOSUB '235(1,0) 4355 IF Q$=" " THEN 4390 4360 GOSUB '91 4365 PRINT AT(3,LEN(J$(J0))+1);"- INVENTORY FILE" 4370 IF J0<>7 THEN 6555 4375 GOSUB '92 4380 GOTO 4350 4385 REM GET RECORD 4390 GOSUB '78(1) 4395 REM SET WORK KEY IF PROCESSING SINGLE KEY 4400 IF K6<4 THEN 4420 4405 F8$=STR(M$(B6(1)),B6(2),B6(3)) 4410 REM TEST IF RIGHT KEY 4415 IF F8$<>F6$ THEN 4445 4420 MAT D6=ZER 4425 ON I6+1 GOSUB 6270,5420 4430 F9$="1" 4435 IF K6=3 THEN 4270 4440 REM FIND NEXT ROUTINE 4445 GOSUB '237(1,0) 4450 IF Q$=" " THEN 4495 4455 IF Q$="E" THEN 4505 4460 GOSUB '91 4465 IF J0<>7 THEN 4480 4470 GOSUB '92 4475 GOTO 4445 4480 PRINT AT(3,LEN(J$(J0))+1);"- INVENTORY FILE" 4485 GOTO 6555 4490 REM TEST IF END OF RANGE 4495 IF K6<>2 THEN 4390 4500 IF T7$<=F7$ THEN 4390 4505 GOSUB 4555 4510 GOSUB '31 4515 REM ************************************************** 4520 REM * * * * * SUBROUTINES * * * * * * * 4525 REM ************************************************** 4530 % ########## 4535 DEFFNL(Z)=ROUND((100*E6(Z)/(E6(Z)+E6(1+Z)),2) 4540 DEFFNR(Z)=ROUND((Z,0) 4545 REM -------------------------------------- 4550 REM PRINT SUBTOTALS 4555 MAT E6=D8 4560 MAT E8=E8+D8 4565 MAT D8=ZER 4570 B8$="TOTALS" 4575 B9$=" " 4580 IF I6=0 THEN 4630 4585 IF I6$="K" THEN 4630 4590 B8$=F6$ 4595 STR(B8$,LEN(B8$)+2)="TOTALS" 4600 GOTO 4630 4605 REM -------------------------------------- 4610 REM PRINT GRAND TOTAL FOR OPTIONS 4-7 4615 B8$="GRAND TOTALS" 4620 B9$=" " 4625 MAT E6=E8 4630 GOSUB '90 4635 PRINT HEX(0A) 4640 L=L+1 4645 IF F9$="1" THEN 4675 4650 PRINT " NO PRODUCTS IN GROUP" 4655 L=L+1 4660 RETURN 4665 REM TEST IF SCALING REQUIRED FOR TOTALS 4670 REM FIRST FIND MAXIMUM 4675 IF I6=1 THEN 4755 4680 I4=E6(1) 4685 FOR I3=1 TO 12 4690 IF E6(I3)<=I4 THEN 4700 4695 I4=E6(I3) 4700 NEXT I3 4705 REM IF MAX TOO BIG, CALC POWER OF TEN FOR SCALE 4710 IF I4<99999999 THEN 4755 4715 I4=INT(LOG(I4+1)/LOG(10))-7 4720 REM SET SCALING LABEL 4725 B9$="SCALED BY 1" 4730 INIT(30)Q6$ 4735 STR(B9$,12)=STR(Q6$,1,I4) 4740 MAT E6=(10^(-I4))*E6 4745 REM -------------------------------------- 4750 REM PRINT SALES ROUTINE 4755 GOSUB '90 4760 IF I6=0 THEN 4825 4765 IF A6$="S" THEN 4780 4770 PRINT TAB(5);B8$;TAB(19);B9$;TAB(I2-1); 4775 GOTO 4790 4780 PRINT B8$;TAB(I2-1); 4785 REM CALCULATE AND PRINT FIGURES 4790 I3,I4=0 4795 IF E6(1)+E6(2)>0 THEN I3=FNL(1) 4800 IF E6(3)+E6(4)>0 THEN I4=FNL(3) 4805 PRINTUSING "-#####,###,### -#####,###,### -###.## -#####,###,### -# ####,###,### -###.##",E6(1),E6(2),I3,FNR(E6(3)),FNR(E6(4)),I4 4810 L=L+1 4815 RETURN 4820 REM -------------------------------------- 4825 PRINT B8$;TAB(12); 4830 REM PRINT SALES, CALC CUMULATIVES AND YEAR END 4835 Q9,I4=0 4840 FOR I3=1 TO 13 4845 IF I3=I2 THEN 4880 4850 I4=I4+1 4855 E8=E6(I4) 4860 Q9=Q9+E8 4865 E6(I4)=Q9 4870 PRINTUSING " ########",FNR(E8); 4875 GOTO 4885 4880 PRINTUSING 4530,FNR(E6(13)+Q9); 4885 NEXT I3 4890 PRINT 4895 PRINT " ";B9$; 4900 REM PRINT QUARTERLY CUMULATIVE SALES (FROM START PROJ) 4905 FOR I3=3 TO 12 STEP 3 4910 PRINT TAB(1+I3*9+5.5*(SGN(I3-I2+.5)+1)); 4915 PRINTUSING 4530,FNR(E6(I3)); 4920 NEXT I3 4925 PRINT 4930 L=L+2 4935 RETURN 4940 REM -------------------------------------- 4945 REM PRINT GROUP NAME 4950 IF A6$="S" AND I6=1 THEN RETURN 4960 GOSUB '90 4965 PRINT HEX(0A);TAB(5*(1-K6));"*** ";B6$;" ";F8$;" ***" 4970 PRINT HEX(0A) 4975 L=L+3 4980 RETURN 4985 REM -------------------------------------- 4990 REM PROCESSING AFTER SALES PROJ OR L.O.S. CALCS. 4995 MAT D8=D8+D6 5000 IF A6$="D" THEN 5010 5005 RETURN 5010 B8$=F1$ 5015 B9$=F2$ 5020 MAT E6=D6 5025 GOSUB 4755 5030 RETURN 5035 REM -------------------------------------- 5040 REM PAGE EJECT 5045 DEFFN'90 5050 SELECT PRINT 005(80) 5055 REM PAPER CHANGE CHECK 5060 Q6$=" " 5065 KEYIN Q6$,5070,5070 5070 IF Q6$="P" THEN GOSUB '254 5075 IF Q6$=HEX(1F) THEN GOSUB '31 5080 REM LINE COUNT CHECK 5090 SELECT PRINT <I0$>(132) 5095 IF L <= L0-3 THEN RETURN 5100 P1 = P1 + 1 5105 PRINT HEX(0D0C0A0E);TAB(3);N2$ : REM PRINT COMPANY NAME 5110 REM PRINT FIRST LINE OF HEADING 5115 IF I6=0 THEN 5130 5120 PRINT TAB(55);"LEVEL OF SERVICE REPORT"; 5125 GOTO 5150 5130 Q6$="DOLLARS" 5135 IF A9$="Y" THEN 5145 5140 Q6$="UNITS" 5145 PRINT "FIGURES IN ";Q6$;TAB(55);"SALES PROJECTION REPORT"; 5150 PRINT TAB(109);Q1$;" PAGE";P1 5155 L=3 5160 REM TEST IF GROUP DESCRIPTION NEEDED 5165 IF P1>1 THEN 5240 5170 PRINT HEX(0A);"DATA GROUPING: ";B6$;" "; 5175 IF (K6-1)*(K6-3)=0 THEN 5205 5180 IF F6$=" " THEN PRINT "BEGINNING"; : ELSE PRINT F6$; 5185 IF F7$=F6$ THEN 5205 5190 Q6$=F7$ 5195 IF POS(STR(F7$,1,B6(3))<>7F)=0 THEN Q6$="END" 5200 PRINT " TO ";Q6$; 5205 PRINT 5210 L=L+2 5215 IF I6$="K" THEN 5240 5220 IF B8>0 THEN 5240 5225 PRINT HEX(0A) 5230 GOSUB 4650 5235 RETURN 5240 IF I6=0 THEN 5300 5245 REM LEVEL OF SERVICE HEADING 5250 PRINT HEX(0A);TAB(I2+3);"YEAR TO DATE UNIT SALES: LEVEL OF YEAR TO DATE $ SALES: LEVEL OF" 5255 IF A6$="S" THEN 5265 5260 PRINT TAB(5);"PRODUCT ID DESCRIPTION"; 5265 PRINT TAB(I2+9);"MADE LOST SERVICE MADE LOST SERVICE" 5270 PRINT HEX(0A) 5275 L=L+4 5280 RETURN 5285 REM -------------------------------------- 5290 REM PRINT HEADING FOR SALES PROJECTION 5295 REM CALC COLUMN FOR JAN 5300 I4=1+SGN(I5-1)*(13-I5) 5305 REM CALC YEAR IN JAN 5310 Q6$=STR(Q1$,7,2) 5315 IF K5+I5=2 THEN 5330 5320 CONVERT STR(Q1$,7,2) TO I3 5325 CONVERT I3+1 TO Q6$,(##) 5330 IF A6$="S" THEN 5340 5335 PRINT HEX(0A);"PRODUCT ID"; 5340 PRINT TAB(I4*9+8+5.5*(SGN(I4-I2+.5)+1));"19";Q6$ 5345 REM PRINT MONTH ABBREVIATIONS 5350 PRINT "DESCRIPTION "; 5355 FOR I3=1 TO 13 5360 IF I3<>I2 THEN 5370 5365 PRINT " TOTAL"; 5370 IF I3=13 THEN 5380 5375 PRINT " ";P$(I3); 5380 NEXT I3 5385 PRINT 5390 PRINT " QUARTERLY CUMULATIVE TOTALS" 5395 PRINT HEX(0A) 5400 L=L+5 5405 RETURN 5410 REM -------------------------------------- 5415 REM DO CALCULATIONS FOR LEVEL OF SERVICE 5420 D6(1)=H+H2 5425 D6(2)=D3(1)+D3(2) 5430 D6(3)=H1+H4 5435 IF D6(1)*D6(3)<=0 THEN 5460 5440 REM IF DATA NONZERO, CALC EFFECTIVE PRICE 5445 I4=D6(3)/D6(1) 5450 GOTO 5470 5455 REM IF NO DATA, AVERAGE PRICES 1,2,AND 3 5460 IF H(1)>0 THEN I4=H(1) : ELSE I4=0 5465 REM CALC LOST $ SALES FROM EFFECTIVE PRICE 5470 D6(4)=I4*D6(2) 5475 GOSUB 4995 5480 RETURN 5485 REM ----------------------------------------------------- 5490 REM SUBROUTINE 5495 DEFFN'173 5500 B$=" " 5505 IF K9=0 THEN 5760 5510 REM TEST IF LEVEL OF SERVICE LEGAL 5515 IF INT(-C5)=-1 THEN 5530 5520 B$="A" 5525 REM ESTABLISH K-FACTOR 5530 GOSUB 6085 5535 REM INITIALIZE MISC. PARAMS. 5540 INIT(00) D6$(),D7$() 5545 CONVERT STR(K9$,1,2) TO F7 5550 D8,F9=F7 5555 D6=D 5560 REM TEST IF DEMAND ZERO 5565 IF D>0 THEN 5590 5570 D6,D7,D9=0 5575 B$="D" 5580 RETURN 5585 REM ADJUST TREND % 5590 D7=D1 5595 E7=D*D7 5600 IF A4$="F" THEN 5610 5605 D7,E7=0 5610 IF I9=0 THEN 5630 5615 GOSUB 5815 5620 REM START MONTHLY CYCLE 5625 REM CALCULATE SALES,INVENT., BUY (FOR CURRENT PERIOD) 5630 A6=B(F7)*D6*(1+D7*.5) 5635 A7=A6+C8*D6*SQR(B(F7)) 5640 A8=A7-F6 5645 IF A8>0 THEN 5660 5650 A8=0 5655 REM ACTUAL ENDING INVENTORY = PREVIOUS+BUY-SALES 5660 F6=F6+A8-A6 5665 REM SAVE SALES, REQUIRED INVENTORY, BUY 5670 $PACK(F=D7$) D7$(F9-D8+1) FROM A6,A7,A8 5675 REM UPDATE DD 5680 IF D7>0 THEN 5695 5685 D6=D6*(1+D7) 5690 GOTO 5700 5695 D6=D6+E7 5700 IF F7<>P2 THEN 5725 5705 REM END OF YEAR PROCESSING 5710 GOSUB 5775 5715 $PACK(F=D6$) D6$(-INT(-F9/P)) FROM D6,D9 5720 REM UPDATE MONTH IN YEAR, TOTAL MONTH COUNTERS 5725 F7=F7+1 5730 F9=F9+1 5735 IF F7<=P THEN 5745 5740 F7=1 5745 IF F9<D8+K9 THEN 5630 5750 REM END OF PROJECTION 5755 GOSUB 5775 5760 RETURN 5765 REM -------------------------------------- 5770 REM CALCULATE YEARLY TREND % 5775 D9=0 5780 IF F8=0 THEN 5790 5785 D9=(D6-F8)/F8 5790 F8=D6 5795 RETURN 5800 REM -------------------------------------- 5805 REM SUBROUTINE TO DETERMINE EFFECTIVE TREND % 5810 REM SEPARATE CALCULATION WHEN FCST. PERIOD = 1 5815 IF K9>1 THEN 5845 5820 IF B(F7)=0 THEN 6055 5825 D7=2*(I9/(D*B(F7))-1) 5830 GOTO 6040 5835 REM A6,A7,A8,A9,D9 ARE WORK VARIABLES 5840 REM DETERMINE SIGN OF TREND 5845 D7,E7,A7,A8=0 5850 FOR A6=D8 TO D8+K9-1 5855 D9=A6-INT((A6-1)/P)*P 5860 A7=A7+B(D9) 5865 A8=A8+B(D9)*(A6-D8) 5870 NEXT A6 5875 REM NOTE A7 IS B' OF DERIVATION, A8 IS B" 5880 REM AND (B'*D-I9) IS CONSTANT IN QUADRATIC 5885 IF A7*D>I9 THEN 5940 5890 REM POSITIVE TREND (NO COMPOUNDING) 5895 REM SEE DOCUMENTATION FOR DERIVATION OF FORMULA 5900 IF A8=0 THEN 6055 5905 D7=(-A7*.5-A8+SQR(A7*A7*.25+A8*A8-A7*A8+2*A8*I9/D))/A8 5910 REM MONTHLY INCREMENT 5915 E7=D*D7 5920 RETURN 5925 REM NEGATIVE TREND (COMPOUNDED) 5930 REM USE NEWTON'S METHOD TO FIND TREND 5935 REM TEST IF TARGET <= SALES PROJ. FOR TREND OF <=-1 5940 IF I9<=D*.5*B(F7) THEN 6055 5945 REM INITIAL ESTIMATE OF TREND IS 0 5950 REM SET VALUES FOR FIRST PERIOD OF ITERATION 5955 A7=B(D8) 5960 A8=0 5965 A9=1 5970 REM DO SUMMATIONS FOR PERIODS 2 THROUTH K9 5975 FOR A6=D8+1 TO D8+K9-1 5980 D9=A6-P*INT((A6-1)/P) 5985 A8=A8+B(D9)*A9*(A6-D8) 5990 A9=A9*(1+D7) 5995 A7=A7+B(D9)*A9 6000 NEXT A6 6005 REM CALC. DERIVATIVE OF TOTAL SALES WITH RESPECT TO TREND 6010 A8=D*((1+.5*D7)*A8+.5*A7) 6015 IF A8=0 THEN 6055 6020 REM (CHANGE IN TREND)=(SALES-TARGET)/SLOPE 6025 A7=(D*(1+.5*D7)*A7-I9)/A8 6030 D7=D7-A7 6035 IF ABS(A7)>=.001 THEN 5955 6040 IF D7<=-1 THEN 6055 6045 RETURN 6050 REM COMPUTATIONAL ERROR RETURN 6055 D7=D1 6060 B$="C" 6065 RETURN 6070 REM -------------------------------------- 6075 REM - SAFETY FACTOR CALC. (MODIFIED SLIGHTLY FROM ORIG) 6080 REM CALCULATE DESIRED FREQUENCY OF A STOCK OUT 6085 IF D0*D=0 THEN 6145 6090 C8=C5 6095 IF INT(-C8)=-1 THEN 6105 6100 C8=.95 6105 C8=D/D0*(1-C8) 6110 REM IF FREQUENCY > .5 NO SAFETY STOCK IS NEEDED 6115 IF C8>=.5 THEN 6145 6120 PACK(.####) C6$ FROM C8 6125 MAT SEARCH C6$(),>STR(C6$,1,2) TO P7$() STEP 2 6130 C9=.5*VAL(STR(P7$(1),2))+.5 6135 REM BRANCK IF OK 6140 IF C9>1 THEN 6160 6145 C8=0 6150 RETURN 6155 REM GET CO-ORDINATES FOR INTERPOLATION 6160 UNPACK(.####)C6$(C9-1) TO D6 6165 UNPACK(.####)C6$(C9) TO D8 6170 UNPACK(#.#) C7$(C9-1) TO D7 6175 UNPACK(#.#) C7$(C9) TO D9 6180 REM INTERPOLATE SAFETY STOCK FACTOR 6185 C8=((D9-D7)/(D8-D6)*(C8-D6)+D7)*(D0/D) 6190 RETURN 6195 REM -------------------------------------- 6200 REM INITIALIZATION ROUTINE 6205 DEFFN'172 6210 A4$="F" 6215 C5=.95 6220 D1=0 6225 I9=0 6230 P=12 6235 P2=I8 6240 D6$=HEX(51055303) 6245 D7$=HEX(510551055105) 6250 RETURN 6255 REM -------------------------------------- 6260 REM PROCESSING FOR SALES PROJECTION 6265 REM FIND AND GET PROFILE IF NOT IN MEMORY 6270 IF E9$=G1$ THEN 6355 6275 GOSUB '232(2,0,G1$) 6280 IF Q$=" " THEN 6340 6285 IF Q$="N" THEN 6315 6290 GOSUB '91 6295 PRINT AT(3,LEN(J$(J0))+1);"- PROFILE ID ";G1$ 6300 IF J0<>7 THEN 6555 6305 GOSUB '92 6310 GOTO 6270 6315 GOSUB '90 6320 L=L+1 6325 PRINT F1$;" PROFILE ";G1$;" NOT FOUND" 6330 RETURN 6335 REM GET PROFILE 6340 GOSUB '79(8) 6345 E9$=G1$ 6350 REM SET TREND LIMIT AND TREND TYPE ACCORDING TO SALES STAB 6355 Q9=1 6360 IF I1$="L" THEN 6380 6365 Q9=2 6370 IF I1$="M" THEN 6380 6375 Q9=3 6380 A4$=STR(D4$(),Q9,1) 6385 REM SET SAF FACT TO ZERO SO K-FACT NOT CALCULATED 6390 REM SET START OF YR DEMAND=0 TO SKIP YRLY. TREND CALCS. 6395 D0,F8=0 6400 REM CALL PROJECTION ROUTINE 6405 GOSUB '173 6410 REM UNPACK SALES DATA TO BE PRINTED 6415 FOR I3=I7 TO I7+11 6420 $UNPACK(F=D7$) D7$(I3) TO D6(I3-I7+1) 6425 NEXT I3 6430 REM TEST IF MORE DATA NEEDED FOR FISCAL YEAR TOTAL 6435 IF K2=0 THEN 6465 6440 FOR I3=K1 TO K1+K2-1 6445 $UNPACK(F=D7$) D7$(I3) TO I4 6450 D6(13)=D6(13)+I4 6455 NEXT I3 6460 REM SET Q9 TO YTD UNIT SALES 6465 Q9=H2 6470 IF A9$="N" THEN 6530 6475 REM USE PAST SALES TO EST. PRICE IF ENOUGH DATA 6480 IF H+H2<10 THEN 6500 6485 I4=(H1+H4)/(H+H2) 6490 GOTO 6510 6495 REM IF NOT ENOUGH DATA, AVERAGE PRICES 1,2,AND 3 6500 IF H(1)>0 THEN I4=H(1) : ELSE I4=0 6505 REM MULTIPLY UNIT SALES BY PRICE 6510 MAT D6=(I4)*D6 6515 REM SET Q9 TO YTD $ SALES 6520 Q9=H4 6525 REM ADD YTD UNIT OR DOLLAR TO YTD TOTAL, COMPLETE CALCS 6530 D6(13)=D6(13)+Q9*K3 6535 GOSUB 4995 6540 RETURN 6545 REM -------------------------------------- 6550 REM TERMINATE FOR KFAM OR SORT WORKFILE ERROR 6555 PRINT AT(1,0,80);"PROGRAM WILL BE TERMINATED" 6560 GOSUB '254 6565 REM -------------------------------------- 6570 REM STARTUP ROUTINE 6575 SELECT @PART S0$ 6580 REM GIVE SCREEN DISPLAY 6585 SELECT PRINT 005(80),LIST 005,CO 005 6590 IF I6=0 THEN Q6$="SALES PROJECTION REPORT" : ELSE Q6$="LEVEL OF SERVICE REPORT" 6595 PRINT HEX(03);AT(0,40-.5*LEN(Q6$));Q6$ 6600 GOSUB '93(" ") 6605 IF I0$=" " THEN GOSUB '31 6610 IF K6<>3 THEN PRINT AT(10,33,0);"PRINTING REPORT" 6615 REM SET VALUES OF VARIOUS PARAMETERS 6620 F9$="0" 6625 P1=0 6630 L=L0+5 6635 MAT D8=ZER 6640 MAT E8=ZER 6645 I2=48 6650 IF A6$="D" THEN 6660 6655 I2=22 6660 IF I6=1 THEN RETURN 6665 REM READ MONTH NAMES, PUTTING IN P$() IN PRINT ORDER 6670 Q6$="JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC" 6675 MAT REDIM P$(1)36 6680 P$(1)=STR(Q6$,I5*3-2) 6685 IF I5=1 THEN 6695 6690 STR(P$(1),40-I5*3)=Q6$ 6695 MAT REDIM P$(12)3 6700 REM CALL PROJECTION INITIALIZATION ROUTINE 6705 GOSUB '172 6710 STR(K9$,1,2)=STR(Q1$,1,2) 6715 CONVERT STR(K9$,1,2) TO K5 6720 REM CALC FIRST PERIOD OF PROJECTION TO PRINT 6725 I7=1+I5-K5-6*(SGN(I5-K5+.5)-1) 6730 REM CALC LENGTH OF PROJECTION 6735 K9=I7+11 6740 K1,K3=1 6745 K2=I7-1 6750 REM CALC COLUMN FOR FISCAL YEAR TOTALS ON PAGE 6755 I2=2+I8-I5-6*(SGN(I8-I5+.5)-1) 6760 IF I2<13 THEN 6785 6765 REM SPEC CASES WHERE 1ST PROJ PER = 1ST PER FISCAL YEAR 6770 K2,K3=0 6775 RETURN 6780 REM TEST IF LAST PER FISCAL YEAR OCCURS BETWEEN K5 AND I5 6785 IF I7=1 THEN RETURN 6790 FOR I3=K5 TO K5+I7-1 6795 IF I3-12*INT((I3-1)/12)<>I8 THEN 6815 6800 K1=I3-K5+2 6805 K2=I7-K1 6810 K3=0 6815 NEXT I3 6820 RETURN 6825 REM -------------------------------------- 6830 REM TERMINATE ROUTINE 6835 DEFFN'31 6845 SELECT PRINT 005(80) 6850 PRINT HEX(030A);TAB(20);"** TERMINATING PROGRAM **" 6855 Q=2 6860 LOAD T "KFAMOPEN" 10,6835 BEG 6865 6865 LOAD T "COMCLEAR"10,199 BEG 6870 6870 SELECT @PART S0$ 6875 IF I6$="S" THEN 6895 6880 GOSUB '239(1) 6885 GOTO 6905 6895 GOSUB '219(S$(1),1,S2," ",0) 6900 GOSUB '219(S$(4),4,S2," ",0) 6905 IF I6=0 THEN GOSUB '239(2) 6910 COM CLEAR I 6915 LOAD T M$ 6920 REM ************************************************** 6925 REM * * * * * VARIABLE DESCRIPTIONS * * * * * * 6930 REM ************************************************** 6935 REM - A6$ - REPORT TYPE - DETAIL OR SUMMARY 6940 REM - B6$ - DATA GROUP NAME 6945 REM - B8 - REFERENCE TO POINTER IN SORTWORK RECORDS 6950 REM - B8$ - TOTALS NAME 6955 REM - D6() - PRODUCT SALES (1-12) / YTD SALES (13) 6960 REM - FOR L.O.S, YTDMADE, YTDLOST, $MADE, $LOST 6965 REM - D8() - GROUP ACCUM FOR D6() 6970 REM - E6() - WORK ARRAY TO PRINT DATA 6975 REM - E8 - WORK 6980 REM - E8() - GRAND TOTAL ACCUM FOR D8() 6985 REM - E9$ - NAME OF LAST PROFILE READ 6990 REM - F6$ - FIRST KEY IN RANGE 6995 REM - F7$ - LAST KEY IN RANGE 7000 REM - F8$ - NEXT KEY IN RANGE 7005 REM - F9$ - FLAG IF A KEY FOUND 7010 REM - I2 - FOR PROJ, COL FOR YTD TOTALS 7015 REM - I2 - FOR L.O.S, COLUMN TO PRINT DATA 7020 REM - I3,I4 - WORK 7025 REM - I5 - FIRST PERIOD OF PROJECTION 7030 REM - I6 - 0 FOR SALES PROJECTION, 1 FOR LEVEL OF SERV. 7035 REM - I6$ - "S" IF SORT RUN, "K" OTHERWISE 7040 REM - I7 - FIRST PERIOD IN PROJECTION W/OUTPUT DATA 7045 REM - I8 - LAST PERIOD IN FISCAL YEAR 7050 REM - K1 - 1ST PER TO INCLUDE IN ACCUM OF FISCAL TOTAL 7055 REM - K2 - # PROJ PERIODS TO INCL IN FISCAL TOTAL 7060 REM - K3 - FLAG (0 OR 1) TO INCLUDE YTD IN TOTAL 7065 REM - K5 - CURRENT PERIOD NUMBER 7070 REM - K6 - NUMBER OF GROUP OPTION 7075 REM - 1=ALL, 2=RANGE, 3=INDIV., 4=VENDOR, 7080 REM - 5=PROFILE ID, 6=PREFIX, 7=STOCK LOC 7085 REM - P$() - MONTH ABBREVIATIONS 7090 REM ***************************************************** 7095 REM ***** PROJECTION VARIABLE DESCRIPTIONS ******* 7100 REM ***************************************************** 7105 REM OUTPUT VARIABLES 7110 REM B$,D6,D7,D6$(),D7$(),D9 7115 REM INPUT VARIABLES 7120 REM A4$,B(),B0,B1,C3,C5,D,D0,D1,F8,I9,K9,K9$,P,P2 7125 REM INTERNAL VARIABLES 7130 REM A6,A7,A8,A9,C8,C6$(),C7$(),C9,D6,D6$,D7,D7$,D8,D9,E7,E9,F6,F7,F9 7135 REM ***************************************************** 7140 DEFFN'29"Q$=";HEX(22);"INVT110E";HEX(22);":SCRATCHTQ$:SAVET$()Q$";HEX(0D)