#Define TESTDATALOC "C:\ddrive\TEMP\testdata.DBC" oForm = createobject('myForm') oForm.Show Read events Define CLASS myform AS form Top = 0 Left = 0 Height = 450 Width = 750 DoCreate = .T. Caption = "Form1" Name = "Form1" Add OBJECT command1 as commandbutton with ; Autosize = .t., ; Top = 0, ; Left = 0, ; Name = "Set1", ; Caption = 'Sample 1' Add OBJECT command2 as commandbutton with ; Autosize = .t., ; Top = 0, ; Left = 0, ; Name = "Set2", ; Caption = 'Sample 2' Add OBJECT command3 as commandbutton with ; Autosize = .t., ; Top = 0, ; Left = 0, ; Name = "Set3", ; Caption = 'Sample 3' Add OBJECT command4 as commandbutton with ; Autosize = .t., ; Top = 0, ; Left = 0, ; Name = "Set4", ; Caption = 'Sample 4' Add OBJECT hflex AS olecontrol WITH ; Top = 0, ; Left = 0, ; Height = 420, ; Width = 750, ; Name = "Hflex", ; OleClass = 'MSHierarchicalFlexGridLib.MSHFlexGrid' Procedure LoadSet Lparameters tnSet Local oRecordset,oConnection, strCn, strShp strCn = [Provider=MSDataShape.1;Persist Security Info=False;]+; [Data Source="Data Provider = MSDASQL;]+; [DSN=Visual FoxPro Database;UID=;SourceDB=]+TESTDATALOC+[;]+; [SourceType=DBC;Exclusive=No;BackgroundFetch=Yes;Collate=Machine;Null=Yes;]+; [Deleted=Yes;";Data Provider=MSDASQL ] oRecordset = CreateObject("adodb.recordset") oConnection = CreateObject("adodb.connection") With oConnection .Provider = "MSDataShape" .ConnectionString = strCn .Open Endwith lcSel1 = [ select customer.cust_id, ]+; [ customer.Company,]+; [ orders.order_id,]+; [ orders.Order_date ]+; [ from customer ]+; [ inner join orders on customer.cust_id = orders.cust_id ] lcSel2 = [ select od.order_id, od.line_no, ]+; [ products.prod_name, ]+; [ products.no_in_unit as 'Packaging', ]+; [ od.unit_price, ]+; [ od.Quantity, ]+; [ od.unit_price * od.quantity as ExtendedPrice ]+; [ from orditems as od ]+; [ inner join products on od.product_id = products.product_id ] Do case Case tnSet = 1 strShp = [SHAPE TABLE customer ]+; [ APPEND ( (SHAPE TABLE orders ]+; [ APPEND (TABLE orditems RELATE order_id TO order_id)) ]+; [ RELATE cust_id TO cust_id ) ] Case tnSet = 2 strShp = [SHAPE { select Company, cust_id from customer } ]+; [APPEND (( SHAPE { select distinct First_name, Last_name, a.emp_id + cust_id as "Emp_sel", cust_id from employee a inner join orders b on a.emp_id = b.emp_id } ]+; [APPEND (( SHAPE { select order_date, order_net, shipped_on, emp_id + cust_id as "Emp_sel",order_id from orders } ]+; [APPEND ( { select order_id, line_no, prod_name from orditems inner join products on products.product_id = orditems.product_id } AS rsOrditems ]+; [RELATE order_id TO order_id )) AS rsEmployee ]+; [RELATE emp_sel TO emp_sel )) AS rsOrders ]+; [RELATE cust_id TO cust_id ) ] Case tnSet = 3 strShp = [ SHAPE {SELECT cust_id, company FROM customer} ]+; [APPEND ({SELECT cust_id, order_id, order_date, order_net ]+; [ FROM orders ]+; [ WHERE order_date < {1/1/1996} AND cust_id = ?} ]+; [ RELATE cust_id TO PARAMETER 0) AS rsOldOrders, ]+; [ ({SELECT cust_id, order_id, order_date, order_net ]+; [ FROM orders ]+; [ WHERE order_date >= {1/1/1996}} ]+; [ RELATE cust_id TO cust_id) AS rsRecentOrders ] Case tnSet = 4 strShp = [ SHAPE ]+; [(SHAPE {]+lcSel1+[ } as rs1 ]+; [ APPEND ({]+lcSel2+[ } AS rsDetails RELATE order_id TO order_id), ]+; [ SUM(rsDetails.ExtendedPrice) AS OrderTotal, ANY(rsDetails.order_id)) AS rsOrders ]+; [COMPUTE rsOrders, ]+; [SUM(rsOrders.OrderTotal) AS CustTotal, ]+; [ANY(rsOrders.Company) AS Cmpny ]+; [ BY cust_id ] Endcase With oRecordset .ActiveConnection = oConnection .Source = strShp .Open Endwith With this.hflex .Datasource = oRecordset .Mergecells = 3 .GridColorBand(1) = rgb(255,0,0) .GridColorBand(2) = rgb(0,0,255) .GridColorBand(3) = rgb(0,255,0) .ColWidth(0,0) = 300 .CollapseAll Endwith Endproc Procedure Init With this .Set2.Left = .Set1.Left + .Set1.Width + 5 .Set3.Left = .Set2.Left + .Set2.Width + 5 .Set4.Left = .Set3.Left + .Set3.Width + 5 .hflex.Top = .Set1.Top + .Set1.Height + 5 .hflex.Height = .Height - (.hflex.Top + 5) .hflex.Left = 5 .hflex.Width = .Width - 10 .LoadSet(1) Endwith Endproc Procedure QueryUnLoad Clear events Endproc Procedure Set1.Click Thisform.LoadSet(1) Endproc Procedure Set2.Click Thisform.LoadSet(2) Endproc Procedure Set3.Click Thisform.LoadSet(3) Endproc Procedure Set4.Click Thisform.LoadSet(4) Endproc EnddefineYou use shape syntax. It's hard to understand at first but easy to grab if you look at it closely :) Shape syntax is documented in ADO270.chm (or ADOxxx.chm). Shape syntax is especially nice for you can do things like in sample set 4 (COMPUTE totals for customer and order).