>>TEXT to m.lcSQL noshow >>Select c.cust_id, c.company, ; >> o.order_id, o.order_date, ; >> e.First_Name-(' '+e.Last_Name) As Employee, ; >> oi.line_no, p.prod_name,; >> oi.unit_price, oi.quantity; >> FROM testdata!customer c ; >> INNER Join testdata!orders o; >> ON c.cust_id = o.cust_id ; >> INNER Join testdata!Employee e ; >> ON o.emp_id = e.emp_id ; >> INNER Join testdata!orditems oi; >> ON o.order_id = oi.order_id ; >> INNER Join testdata!products p ; >> ON oi.product_id = p.product_id ; >> order By p.prod_name >>ENDTEXT >>m.lcSQL = Chrtran(m.lcSQL,';'+Chr(13)+Chr(10),'') >> >>lcPivotTableName = 'myCustomers' >>lcConnPath = Sys(5)+Curdir() >>lcConnStr = [Provider=VFPOLEDB.1;Data Source=]+lcConnPath >> >>Alines(laRowFields,'prod_name') >>Alines(laColumnFields,'Employee') >>Alines(laPageFields,'cust_id') >> >>#include xlConstants.h >>oExcel = Createobject('Excel.Application') >>With oExcel >> With .Workbooks.Add >> _CreatePivotTable(.ActiveSheet.Range('A3'),; >> m.lcPivotTableName,m.lcSQL,; >> m.lcConnStr) >> With .ActiveSheet.PivotTables(lcPivotTableName) >> .DisplayErrorString = .T. >> .MergeLabels = .T. >> .SmallGrid = .F. >> _AddPivotFields(@laRowFields, @laColumnFields, @laPageFields) >> .PivotFields('Quantity').Orientation = xlDataField >> Endwith >> Endwith >> .Visible = .T. >>Endwith >> >>Function _CreatePivotTable >>Lparameters toDestination,tcPivotTableName, tcSQL,tcConnStr >>With .PivotCaches.Add(xlExternal) >> .Connection = 'OLEDB;'+m.tcConnStr >> .CommandType = 2 && xlCmdSQL >> .CommandText = m.tcSQL >> .Maintainconnection = .F. >> .EnableRefresh = .F. >> .BackGroundQuery = .T. >> .CreatePivotTable(m.toDestination, m.tcPivotTableName) >>Endwith >>Endfunc >> >>Function _AddPivotFields >>Lparameters taRowFields, taColumnFields, taPageFields >>If !Empty(taPageFields[1]) >> .AddFields( @taRowFields, @taColumnFields, @taPageFields ) && Fields added >>Else >> .AddFields( @taRowFields, @taColumnFields ) >>Endif >>Endfunc >>>>Cetin
>>>>* Pivottable sampling for VFP3-5 - Excel97 >>>>* Current wizard doesn't work for Excel97 >>>>* VFP6 users probably don't need this >>>>* This is a simple sample and dummy with regard to >>>>* data choosen for pivot table >>>>* Pivot tables are kind of a crosstab tables >>>>* Data choosen is testdata!orditems >>>>* First a cursor is constructed having order_date, prod_name, >>>>* employee_name, customer.company and quantity >>>>* Cursor is copied to an XL5 file - faster then using ODBC >>>>* from Excel or writing directly to Excel with datatoclip() >>>>* Unless data is huge >>>>* XLS is opened >>>>* company set as page field >>>>* employee set as column field >>>>* Product and Dates are set as row field to demonstrate multipl fields setting >>>>* When you remove dates you get sum() grouped by product >>>> >>>>SET safety off >>>>SET century on >>>>#DEFINE DataPath "" >>>> >>>>SELECT b.emp_id ,a.company, b.order_date, d.prod_name, c.quantity ; >>>> FROM (DataPath+"customer") a; >>>> INNER JOIN (DataPath+"orders") b; >>>> INNER JOIN (DataPath+"orditems") c; >>>> INNER JOIN (DataPath+"products") d; >>>> ON d.product_id = c.product_id ; >>>> ON c.order_id = b.order_id ; >>>> ON b.cust_id = a.cust_id; >>>> order by 1,2,3 ; >>>> into cursor myCursor ; >>>> nofilter >>>> >>>>SELECT a.first_name + a.last_name as Employee, ; >>>> b.company, b.prod_name, b.quantity, b.order_date as "dates" ; >>>> from (DataPath+"employee") a; >>>> INNER join myCursor b; >>>> on a.emp_id = b.emp_id ; >>>> into cursor pivotdata >>>> >>>>COPY to pivotdata type xl5 && Copied to xls file >>>>lcRows = ltrim(str(reccount()+1)) && Including header line >>>>lcCols = ltrim(str(fcount())) >>>>* Pivot sample >>>>oExcel = createobject("Excel.application") >>>>#DEFINE xlDatabase 1 >>>> >>>>#DEFINE xlRowField 1 >>>>#DEFINE xlColumnField 2 >>>>#DEFINE xlPageField 3 >>>>#DEFINE xlDataField 4 >>>> >>>>WITH oExcel >>>> .visible = .t. >>>> .workbooks.open(sys(5)+curdir()+"pivotdata.xls") && Open saved xls >>>> WITH .ActiveWorkBook >>>> .Sheets("Pivotdata").activate >>>> .ActiveSheet.PivotTableWizard(xlDatabase, ; >>>> "pivotdata!R1C1:R"+lcRows+"C"+lcCols,"", "PivotTable1") >>>>&& Wizard sets Range and name >>>> WITH .ActiveSheet.PivotTables("PivotTable1") >>>> dimension flist[2] >>>> flist[1]="prod_name" >>>> flist[2]="dates" >>>> .AddFields( @flist, "employee","company" ) && Fields added >>>>* Add rowfields w/o an array >>>>* .AddFields( "prod_name", "employee", "company" ) && Fields added >>>>* .PivotFields("dates").Orientation = xlRowField >>>>&& Dates added as second row field >>>>* Add rowfields w/o an array >>>> .PivotFields("quantity").Orientation = xlDataField >>>>&& Quantity set as data field >>>> .PivotFields("company").Subtotals(1) = .t. >>>> .PivotFields("company").Subtotals(1) = .f. >>>> ENDWITH >>>> ENDWITH >>>>ENDWITH >>>>>>>>Cetin