! Do ABC Analysis of a set of items.
Essentially, sort a set of items to identify a small fraction
of the items that constitute a major fraction of profit;
! Keywords: ABC Analysis, Sorting, Inventory, Pareto analysis;
SETS:
  ITEM: Q, V, VOQ, SORTORD;
ENDSETS
DATA: ! Target fraction for Class A and C. TARGAC controls where the boundaries between A, B, and C are chosen; TARGAC = 0.3; ! The items, sales quantity and profit; ITEM, Q, V = 101 8.93 41.95 102 5.38 2.80 103 5.02 26.20 104 7.55 2.43 105 11.02 20.34 106 4.27 0.28 107 18.29 1.43 108 29.27 0.38 109 8.46 3.61 110 1.76 0.55 ; ENDDATA CALC: @SET( 'TERSEO',2); ! Output level (0:verb, 1:terse, 2:only errors, 3:none); ! Compute value over quantity ratio; @FOR( ITEM( i): VOQ(i) = V(i)/ Q(i); ); ! There are various ways of computing an importance measure, however, the key idea is to sort from most important to least; ! Sort decreasing in VOQ; SORTORD = @SORT( -VOQ); ! Get total Q and V; TOTQ = @SUM( ITEM(I): Q(i)); TOTV = @SUM( ITEM(i): V(i)); CUMQ = 0; ! Cumulative Q; CUMV = 0; ! Display an ordered list, important items first, inserting a boundary between Class A and B when the Cumulative volume fraction is first > TARGAC, and a boundary between Class B and C when the Cumulative volume fraction is first > 1 - TARGAC; @WRITE(' ABC Analysis of a set of items.', @NEWLINE(1)); @WRITE(' Item Q Cum Q% V Cum V%', @NEWLINE(1)); @WRITE(' Class A:', @NEWLINE(1)); CLASS = 1; @FOR( ITEM(i): ii = SORTORD( i); @IFC( CLASS #EQ# 1 #AND# CUMV #GT# TARGAC: @WRITE(' Class B:', @NEWLINE(1)); CLASS = 2; @ELSE @IFC( CLASS #EQ# 2 #AND# CUMV #GT# 1-TARGAC: @WRITE(' Class C:', @NEWLINE(1)); CLASS = 3; ); ); CUMQ = CUMQ + Q(ii)/ TOTQ; CUMV = CUMV + V(ii)/ TOTV; @WRITE( @FORMAT( ITEM(ii), '10S'), @FORMAT( Q(ii), '10.2f'), @FORMAT( CUMQ, '10.2f'), @FORMAT( V(ii), '10.2f'), @FORMAT( CUMV, '10.2f'),@NEWLINE(1)); ); ENDCALC