*!* grid_calculatedcolumn.prg
PUBLIC goForm
goForm = NEWOBJECT("form1")
goForm.Show
Read Events
Close all
Clear All
RETURN
**************************************************
DEFINE CLASS form1 AS form
AutoCenter = .T.
Caption = "Grid with calculated columns"
MinHeight = This.Height
MinWidth = This.Width
MaxWidth = This.Width
ADD OBJECT grid1 AS grid WITH ;
ColumnCount = -1, ;
Left = 12, ;
Top = 36, ;
Width = ThisForm.Width - 24, ;
Height = ThisForm.Height - 48, ;
RecordSource = "curTemp", ;
Anchor = 15
PROCEDURE grid1.Init
WITH This.Column1
.Width = 90
.Header1.Caption = "Name"
ENDWITH
WITH This.Column2
.Width = 90
.Header1.Caption = "Amount"
ENDWITH
ENDPROC
ADD OBJECT lblTAmount as Label WITH ;
Left = 228, Top = 6, Caption = "Grand Total: ", FontBold = .T., FontItalic = .T., AutoSize = .T., Visible = .F.
ADD OBJECT cmdUndo AS CommandButton WITH ;
Left = 120, Top = 6, Height = 24, Caption = "Undo"
PROCEDURE cmdUndo.Click()
With ThisForm
.Grid1.ColumnCount = -1
.Grid1.Recordsource = "curTemp"
.Grid1.Init()
.lblTAmount.Visible = .F.
.Refresh()
ENDWITH
ENDPROC
ADD OBJECT cmdDoit AS CommandButton WITH ;
Left = 12, Top = 6, Height = 24, Caption = "Calculate"
PROCEDURE cmdDoit.Click()
Local Array laCalc[1,1], laTAmount[1], laDBCCriteria[1,1]
SELECT SUM(iAmount) FROM curTemp INTO ARRAY laTAmount
SELECT .F. as lSwitch, cName, iAmount, iAmount as iRAmount from curTemp order by 2 into Array laCalc
SELECT .T. as lSwitch, cName, 0 as iAmount, SUM(iAmount) as iSAmount FROM curTemp ORDER BY 2 Group BY 2 INTO ARRAY laDBCCriteria
For i = 2 to ALEN(laCalc, 1)
If laCalc[i , 2] = laCalc[i - 1 , 2]
laCalc[i, ALEN(laCalc, 2)] = laCalc[i, ALEN(laCalc, 2)] + laCalc[i - 1, ALEN(laCalc, 2)]
EndIF
EndFor
CREATE CURSOR curTemp2 (lSwitch L, cName C(20), iAmount I, iTAmount I)
INDEX on cName + PADL(iTAmount, 7, "0") TAG xNaMxAm
SET ORDER TO xNaMxAm
APPEND FROM ARRAY laCalc
APPEND FROM array laDBCCriteria
LOCATE
With ThisForm.Grid1
.ColumnCount = -1
.Recordsource = "curTemp2"
.SetAll("DynamicBackColor", "ICASE(lSwitch, RGB(0,255,0), RGB(255, 255, 255))", "Column")
.SetAll("DynamicFontBold", "ICASE(lSwitch, .T., .F.)", "Column")
.SetAll("DynamicFontItalic", "ICASE(lSwitch, .T., .F.)", "Column")
.Column2.Width = 90
.Column2.Header1.Caption = "Name"
.Column3.Width = 90
.Column3.Sparse = .F.
.Column3.Header1.Caption = "Amount"
.Column3.Text1.Inputmask = "999,999"
.Column4.Width = 90
.Column4.Sparse = .F.
.Column4.Header1.Caption = "Running Total"
.Column4.Text1.Inputmask = "999,999"
.DeleteColumn(1)
ENDWITH
WITH ThisForm
.lblTAmount.Caption = "Grand Total: " + TRANSFORM(laTAmount[1], "999,999")
.lblTAmount.Visible = .T.
.Refresh()
ENDWITH
ENDPROC
PROCEDURE Destroy
Thisform.Release()
CLOSE ALL
Clear Events
ENDPROC
PROCEDURE Load
CREATE CURSOR curTemp (cName C(20), iAmount I)
INSERT INTO curTemp VALUES ("Allan", 300)
INSERT INTO curTemp VALUES ("Allan", 400)
INSERT INTO curTemp VALUES ("Margie", 100)
INSERT INTO curTemp VALUES ("Kim", 1250)
INSERT INTO curTemp VALUES ("Allan", 600)
INSERT INTO curTemp VALUES ("Margie", 300)
INSERT INTO curTemp VALUES ("Margie", 200)
INSERT INTO curTemp VALUES ("Chris", 500)
INSERT INTO curTemp VALUES ("Allan", 500)
INSERT INTO curTemp VALUES ("Kim", 250)
LOCATE
ENDPROC
ENDDEFINE
*********************************************