ColorsMax=3 Dimension colors[3] ColorS[1] ='Red' ColorS[2] ='Silver' ColorS[3] ='Black' Rand(-1) Create cursor comparesales (nyear i, qtr i, car c(10), color c(10)) For years = 1998 to 2000 For iQtr = 1 to 4 For Sales = 1 to 10 Insert into comparesales ; values (years, iQtr, ; iif(int(rand()*1000)%2=0,'Corvette','Ferrari'), ; colors[int(rand()*ColorsMax)%5+1]) Endfor Endfor Endfor * Our xtabber Select distinct car from comparesales into array arrCars order by car Asort(Colors) Dimension Sales[2+alen(arrCars)*alen(colors)] && 2 for year and qtr Dimension arrStruc[alen(Sales),4] arrStruc = 0 arrStruc[1,1] = 'Year' arrStruc[1,2] = 'I' arrStruc[1,3] = 4 arrStruc[2,1] = 'Qtr' arrStruc[2,2] = 'I' arrStruc[2,3] = 4 For ix=1 to alen(arrCars) For jx = 1 to alen(colors) lnCurFieldNum = (ix-1)*alen(colors)+jx+2 arrStruc[lnCurFieldNum,1] = padr(arrCars[ix],5,'_')+padr(colors[jx],5,'_') arrStruc[lnCurFieldNum,2] = 'I' arrStruc[lnCurFieldNum,3] = 4 Endfor Endfor Create cursor crsXTab from array arrStruc For years = 1998 to 2000 For iQtr = 1 to 4 Sales = 0 m.year = years m.qtr = iQtr Select car,color,cnt(*) as amount ; from comparesales ; group by 1,2 ; where nyear = years and qtr = iQtr ; into cursor crsCounts Scan Store amount to ('m.'+padr(trim(car),5,'_')+padr(trim(color),5,'_')) Endscan Insert into crsXTab from memvar Endfor Endfor Select crsXTab **** Data is prepared and ready in crsXTab - Graph oForm = createobject('myForm') With oForm With .MSChart && Set Chart parameters using methods. .rowCount = reccount() .columnCount = fcount()-2 Scan .Row = recno() For ix=3 to fcount() .Column = ix-2 .Data = eval(field(ix)) Endfor Endscan With .DataGrid rowLabelCount = 2 columnLabelCount = 2 rowCount = reccount() ColumnCount = fcount()-2 .SetSize(rowLabelCount, columnLabelCount, rowCount, ColumnCount ) * Assign labels For iColors = 1 to columncount .ColumnLabel(iColors, 1) = Colors[(iColors-1)%alen(colors)+1] Endfor For iCars=1 to alen(arrCars) .ColumnLabel((iCars-1)*alen(colors)+1, 2) = arrCars[iCars] Endfor For iQtr = 1 to rowCount .RowLabel(iQtr, 1) = (iQtr-1)%4+1 Endfor For years=1998 to 2000 .RowLabel((years-1998)*4+1, 2) = transform(years) Endfor Endwith .ShowLegend = .T. Endwith .Show() Endwith Read events Define CLASS myForm AS form Top = 0 Left = 0 Height = 574 Width = 793 DoCreate = .T. Caption = "Form1" Name = "Form1" Add OBJECT MSChart AS olecontrol WITH ; Top = 2, ; Left = 2, ; Height = 550, ; Width = 778, ; Name = "MsChart",; OleClass='MSChart20Lib.MSchart.2' Procedure queryunload Clear events Endproc EnddefineCetin