FpSpread 应用程序
有数据表
CREATE TABLE [products_1] (
[ProductID] [char] (10) COLLATE Japanese_CI_AS NOT NULL ,
[ProductName] [char] (20) COLLATE Japanese_CI_AS NOT NULL ,
[LineNm] [int] NOT NULL ,
[SaleTime] [int] NULL ,
[Qty] [int] NULL ,
[Money] [int] NULL ,
CONSTRAINT [PK_products_1] PRIMARY KEY CLUSTERED
(
[ProductID],
[ProductName],
[LineNm]
) ON [PRIMARY]
) ON [PRIMARY]
GO
[ProductID] [char] (10) COLLATE Japanese_CI_AS NOT NULL ,
[ProductName] [char] (20) COLLATE Japanese_CI_AS NOT NULL ,
[LineNm] [int] NOT NULL ,
[SaleTime] [int] NULL ,
[Qty] [int] NULL ,
[Money] [int] NULL ,
CONSTRAINT [PK_products_1] PRIMARY KEY CLUSTERED
(
[ProductID],
[ProductName],
[LineNm]
) ON [PRIMARY]
) ON [PRIMARY]
GO
插入数据
insert  into  products_1(ProductID,ProductName,LineNm,SaleTime,Qty,Money)   values(    'Product001'    ,    'ProductNm001        '    ,    1    ,    2005    ,    189    ,    4244    )
insert into products_1(ProductID,ProductName,LineNm,SaleTime,Qty,Money) values( 'Product001' , 'ProductNm001 ' , 2 , 2006 , 190 , 4245 )
insert into products_1(ProductID,ProductName,LineNm,SaleTime,Qty,Money) values( 'Product001' , 'ProductNm001 ' , 3 , 2007 , 191 , 4246 )
insert into products_1(ProductID,ProductName,LineNm,SaleTime,Qty,Money) values( 'Product004' , 'ProductNm004 ' , 1 , 2006 , 343 , 6767 )
insert into products_1(ProductID,ProductName,LineNm,SaleTime,Qty,Money) values( 'Product004' , 'ProductNm004 ' , 2 , 2007 , 343 , 2643 )
insert into products_1(ProductID,ProductName,LineNm,SaleTime,Qty,Money) values( 'Product006' , 'ProductNm006 ' , 1 , 2004 , 345 , 5675 )
insert into products_1(ProductID,ProductName,LineNm,SaleTime,Qty,Money) values( 'Product007' , 'ProductNm007 ' , 1 , 2007 , 2342 , 835 )
insert into products_1(ProductID,ProductName,LineNm,SaleTime,Qty,Money) values( 'Product008' , 'ProductNm008 ' , 1 , 2007 , 343 , 5645 )
insert into products_1(ProductID,ProductName,LineNm,SaleTime,Qty,Money) values( 'Product009' , 'ProductNm009 ' , 1 , 2007 , 375 , 5646 )
insert into products_1(ProductID,ProductName,LineNm,SaleTime,Qty,Money) values( 'Product001' , 'ProductNm001 ' , 2 , 2006 , 190 , 4245 )
insert into products_1(ProductID,ProductName,LineNm,SaleTime,Qty,Money) values( 'Product001' , 'ProductNm001 ' , 3 , 2007 , 191 , 4246 )
insert into products_1(ProductID,ProductName,LineNm,SaleTime,Qty,Money) values( 'Product004' , 'ProductNm004 ' , 1 , 2006 , 343 , 6767 )
insert into products_1(ProductID,ProductName,LineNm,SaleTime,Qty,Money) values( 'Product004' , 'ProductNm004 ' , 2 , 2007 , 343 , 2643 )
insert into products_1(ProductID,ProductName,LineNm,SaleTime,Qty,Money) values( 'Product006' , 'ProductNm006 ' , 1 , 2004 , 345 , 5675 )
insert into products_1(ProductID,ProductName,LineNm,SaleTime,Qty,Money) values( 'Product007' , 'ProductNm007 ' , 1 , 2007 , 2342 , 835 )
insert into products_1(ProductID,ProductName,LineNm,SaleTime,Qty,Money) values( 'Product008' , 'ProductNm008 ' , 1 , 2007 , 343 , 5645 )
insert into products_1(ProductID,ProductName,LineNm,SaleTime,Qty,Money) values( 'Product009' , 'ProductNm009 ' , 1 , 2007 , 375 , 5646 )

得到上面的表需要使用如下Sql
   select    
c.ProductID ,
c.ProductName,
sum(this_qty) as thisyear_qty ,
sum(last_qty) as lastyear_qty ,
sum(this_Money) as thisyear_Money ,
sum(last_Money) as lastyear_Money
from
(
select
b.ProductID,
b.ProductName,
case b.saletime
when 2007 then
case b.qtys
when 0
then 0
else b.qtys
End
end
as this_qty,
case b.saletime
when 2006 then
case b.qtys
when 0
then 0
else b.qtys
End
end
as last_qty,
case b.saletime
when 2007 then
case b.Moneys
when 0
then 0
else b.Moneys
End end
as this_Money,
case b.saletime
when 2006 then
case b.Moneys
when 0
then 0
else b.Moneys
End
end
as last_Money
from
(
select
*
from
(
select
ProductID ,
ProductName,
SaleTime,
sum(qty) as qtys ,
sum(Money) as Moneys
from products_1
group by ProductID ,ProductName,SaleTime
) a
where a.SaleTime>2005 and a.SaleTime<2008) b) c group by c.ProductID ,c.ProductName
go
c.ProductID ,
c.ProductName,
sum(this_qty) as thisyear_qty ,
sum(last_qty) as lastyear_qty ,
sum(this_Money) as thisyear_Money ,
sum(last_Money) as lastyear_Money
from
(
select
b.ProductID,
b.ProductName,
case b.saletime
when 2007 then
case b.qtys
when 0
then 0
else b.qtys
End
end
as this_qty,
case b.saletime
when 2006 then
case b.qtys
when 0
then 0
else b.qtys
End
end
as last_qty,
case b.saletime
when 2007 then
case b.Moneys
when 0
then 0
else b.Moneys
End end
as this_Money,
case b.saletime
when 2006 then
case b.Moneys
when 0
then 0
else b.Moneys
End
end
as last_Money
from
(
select
*
from
(
select
ProductID ,
ProductName,
SaleTime,
sum(qty) as qtys ,
sum(Money) as Moneys
from products_1
group by ProductID ,ProductName,SaleTime
) a
where a.SaleTime>2005 and a.SaleTime<2008) b) c group by c.ProductID ,c.ProductName
go

产生如下界面,使用了FpSpread 控件,然后进用拖入界面
代码部分如下:
//显示列名定义
Enum ProductColumnName
ProductID = 0
ProductName = 1
SaleInformation = 2
Period = 2
Qty = 3
Money = 4
End Enum
//定义表头
'define SpreadHead
Private Sub InitSpreadHead(ByVal fpSpread As FarPoint.Win.Spread.FpSpread)
With fpSpread.Sheets(0)
.Models.ColumnHeaderData.RowCount = 2
.Columns.Count = 5
.ColumnHeader.Cells.Get(0, Int32.Parse(ProductColumnName.ProductID)).RowSpan = 2
.ColumnHeader.Cells.Get(0, Int32.Parse(ProductColumnName.ProductID)).BackColor = Color.Aqua
.ColumnHeader.Cells.Get(0, Int32.Parse(ProductColumnName.ProductName)).RowSpan = 2
.ColumnHeader.Cells.Get(0, Int32.Parse(ProductColumnName.ProductName)).BackColor = Color.Aqua
.ColumnHeader.Cells.Get(0, Int32.Parse(ProductColumnName.ProductID)).Text = "Product ID"
.ColumnHeader.Cells.Get(0, Int32.Parse(ProductColumnName.ProductName)).Text = "Product Name"
.ColumnHeader.Cells.Get(0, Int32.Parse(ProductColumnName.SaleInformation)).ColumnSpan = 3
.ColumnHeader.Cells.Get(0, Int32.Parse(ProductColumnName.SaleInformation)).Text = "Sale Information"
.ColumnHeader.Cells.Get(1, Int32.Parse(ProductColumnName.Period)).Text = "Period"
.ColumnHeader.Cells.Get(1, Int32.Parse(ProductColumnName.Qty)).Text = "Qty"
.ColumnHeader.Cells.Get(1, Int32.Parse(ProductColumnName.Money)).Text = "Money"
End With
End Sub
//定义表体
'define SpreadBody
Private Sub InitSpreadBody(ByVal fpSpread As FarPoint.Win.Spread.FpSpread, ByVal recordCout As Integer, ByVal logicRowCount As Integer)
'1.Spread count rows
fpSpread.Sheets(0).RowCount = recordCout * logicRowCount
'2.Spread style
With fpSpread.Sheets(0)
For i As Integer = 0 To .RowCount - 1 Step i + logicRowCount
'logic Row include physics Row
.RowHeader.Cells.Get(i, 0).RowSpan = logicRowCount
'rows number
.RowHeader.Cells.Get(i, 0).Text = (i / logicRowCount + 1).ToString()
'ProductID and ProductName have 2 rows
.Cells.Get(i, Int32.Parse(ProductColumnName.ProductID)).RowSpan = logicRowCount
.Cells.Get(i, Int32.Parse(ProductColumnName.ProductName)).RowSpan = logicRowCount
Next
End With
End Sub
//表头和表体合成
Private Sub InitSpreadStruct(ByVal fpSpread As FarPoint.Win.Spread.FpSpread, _
ByVal logicRowCount As Integer, _
ByVal recordCount As Integer)
InitSpreadHead(FpSpread1)
InitSpreadBody(FpSpread1, recordCount, logicRowCount)
End Sub
//邦定数据到 Spread
Private Sub SetDataSource(ByVal fpSpread As FarPoint.Win.Spread.FpSpread, ByVal dtSource As DataTable, ByVal logicRowCount As Integer)
With fpSpread.Sheets(0)
If dtSource Is Nothing OrElse dtSource.Rows.Count = 0 Then
Return
End If
.RowCount = dtSource.Rows.Count * logicRowCount
' Cells Values
For i As Integer = 0 To dtSource.Rows.Count - 1 Step i + 1
'Column 1,2 (ProductID,ProductName)
.Cells.Get(i * logicRowCount, Int32.Parse(ProductColumnName.ProductID)).Value = dtSource.Rows(i)("ProductID").ToString()
.Cells.Get(i * logicRowCount, Int32.Parse(ProductColumnName.ProductName)).Value = dtSource.Rows(i)("ProductName").ToString()
'
.Cells.Get(i * logicRowCount, Int32.Parse(ProductColumnName.Period)).Value = "Last Year"
.Cells.Get(i * logicRowCount, Int32.Parse(ProductColumnName.Qty)).Value = dtSource.Rows(i)("lastyear_qty").ToString()
.Cells.Get(i * logicRowCount + 1, Int32.Parse(ProductColumnName.Qty)).Value = dtSource.Rows(i)("thisyear_qty").ToString()
.Cells.Get(i * logicRowCount, Int32.Parse(ProductColumnName.Money)).Value = dtSource.Rows(i)("lastyear_Money").ToString()
.Cells.Get(i * logicRowCount + 1, Int32.Parse(ProductColumnName.Money)).Value = dtSource.Rows(i)("thisyear_Money").ToString()
.Cells.Get(i * logicRowCount + 1, Int32.Parse(ProductColumnName.Period)).Value = "This Year"
Next
End With
End Sub
//主程序
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim strConn = "Data Source=.;Initial Catalog=Northwind;Integrated Security=True"
Dim sqlCon As SqlConnection = New SqlConnection(strConn)
sqlCon.Open()
Dim strSql As String
strSql = " select c.ProductID ,c.ProductName, sum(this_qty) as thisyear_qty ,sum(last_qty) as lastyear_qty ,sum(this_Money) as thisyear_Money , sum(last_Money) as lastyear_Money from (select"
strSql += " b.ProductID,b.ProductName,"
strSql += " case b.saletime when 2007 then case b.qtys when 0 then 0 else b.qtys End end as this_qty,"
strSql += "case b.saletime when 2006 then case b.qtys when 0 then 0 else b.qtys End end as last_qty,"
strSql += "case b.saletime when 2007 then case b.Moneys when 0 then 0 else b.Moneys End end as this_Money,"
strSql += " case b.saletime when 2006 then case b.Moneys when 0 then 0 else b.Moneys End end as last_Money "
strSql += " from (select * from (select ProductID ,ProductName,SaleTime,sum(qty) as qtys ,sum(Money) as Moneys from products_1 group by ProductID ,ProductName,SaleTime) a where a.SaleTime>2005 and a.SaleTime<2008) b) c group by c.ProductID ,c.ProductName"
Dim sqlAdpt As SqlDataAdapter = New SqlDataAdapter(strSql, sqlCon)
Dim ds As DataSet = New DataSet()
sqlAdpt.Fill(ds)
Dim logicRowCount As Integer = 2
'1.Spread struct defing
InitSpreadStruct(FpSpread1, logicRowCount, ds.Tables(0).Rows.Count)
'2.DataSource fill
SetDataSource(FpSpread1, ds.Tables(0), logicRowCount)
sqlCon.Close()
'Me.ReportViewer1.RefreshReport()
End Sub
Enum ProductColumnName
ProductID = 0
ProductName = 1
SaleInformation = 2
Period = 2
Qty = 3
Money = 4
End Enum
//定义表头
'define SpreadHead
Private Sub InitSpreadHead(ByVal fpSpread As FarPoint.Win.Spread.FpSpread)
With fpSpread.Sheets(0)
.Models.ColumnHeaderData.RowCount = 2
.Columns.Count = 5
.ColumnHeader.Cells.Get(0, Int32.Parse(ProductColumnName.ProductID)).RowSpan = 2
.ColumnHeader.Cells.Get(0, Int32.Parse(ProductColumnName.ProductID)).BackColor = Color.Aqua
.ColumnHeader.Cells.Get(0, Int32.Parse(ProductColumnName.ProductName)).RowSpan = 2
.ColumnHeader.Cells.Get(0, Int32.Parse(ProductColumnName.ProductName)).BackColor = Color.Aqua
.ColumnHeader.Cells.Get(0, Int32.Parse(ProductColumnName.ProductID)).Text = "Product ID"
.ColumnHeader.Cells.Get(0, Int32.Parse(ProductColumnName.ProductName)).Text = "Product Name"
.ColumnHeader.Cells.Get(0, Int32.Parse(ProductColumnName.SaleInformation)).ColumnSpan = 3
.ColumnHeader.Cells.Get(0, Int32.Parse(ProductColumnName.SaleInformation)).Text = "Sale Information"
.ColumnHeader.Cells.Get(1, Int32.Parse(ProductColumnName.Period)).Text = "Period"
.ColumnHeader.Cells.Get(1, Int32.Parse(ProductColumnName.Qty)).Text = "Qty"
.ColumnHeader.Cells.Get(1, Int32.Parse(ProductColumnName.Money)).Text = "Money"
End With
End Sub
//定义表体
'define SpreadBody
Private Sub InitSpreadBody(ByVal fpSpread As FarPoint.Win.Spread.FpSpread, ByVal recordCout As Integer, ByVal logicRowCount As Integer)
'1.Spread count rows
fpSpread.Sheets(0).RowCount = recordCout * logicRowCount
'2.Spread style
With fpSpread.Sheets(0)
For i As Integer = 0 To .RowCount - 1 Step i + logicRowCount
'logic Row include physics Row
.RowHeader.Cells.Get(i, 0).RowSpan = logicRowCount
'rows number
.RowHeader.Cells.Get(i, 0).Text = (i / logicRowCount + 1).ToString()
'ProductID and ProductName have 2 rows
.Cells.Get(i, Int32.Parse(ProductColumnName.ProductID)).RowSpan = logicRowCount
.Cells.Get(i, Int32.Parse(ProductColumnName.ProductName)).RowSpan = logicRowCount
Next
End With
End Sub
//表头和表体合成
Private Sub InitSpreadStruct(ByVal fpSpread As FarPoint.Win.Spread.FpSpread, _
ByVal logicRowCount As Integer, _
ByVal recordCount As Integer)
InitSpreadHead(FpSpread1)
InitSpreadBody(FpSpread1, recordCount, logicRowCount)
End Sub
//邦定数据到 Spread
Private Sub SetDataSource(ByVal fpSpread As FarPoint.Win.Spread.FpSpread, ByVal dtSource As DataTable, ByVal logicRowCount As Integer)
With fpSpread.Sheets(0)
If dtSource Is Nothing OrElse dtSource.Rows.Count = 0 Then
Return
End If
.RowCount = dtSource.Rows.Count * logicRowCount
' Cells Values
For i As Integer = 0 To dtSource.Rows.Count - 1 Step i + 1
'Column 1,2 (ProductID,ProductName)
.Cells.Get(i * logicRowCount, Int32.Parse(ProductColumnName.ProductID)).Value = dtSource.Rows(i)("ProductID").ToString()
.Cells.Get(i * logicRowCount, Int32.Parse(ProductColumnName.ProductName)).Value = dtSource.Rows(i)("ProductName").ToString()
'
.Cells.Get(i * logicRowCount, Int32.Parse(ProductColumnName.Period)).Value = "Last Year"
.Cells.Get(i * logicRowCount, Int32.Parse(ProductColumnName.Qty)).Value = dtSource.Rows(i)("lastyear_qty").ToString()
.Cells.Get(i * logicRowCount + 1, Int32.Parse(ProductColumnName.Qty)).Value = dtSource.Rows(i)("thisyear_qty").ToString()
.Cells.Get(i * logicRowCount, Int32.Parse(ProductColumnName.Money)).Value = dtSource.Rows(i)("lastyear_Money").ToString()
.Cells.Get(i * logicRowCount + 1, Int32.Parse(ProductColumnName.Money)).Value = dtSource.Rows(i)("thisyear_Money").ToString()
.Cells.Get(i * logicRowCount + 1, Int32.Parse(ProductColumnName.Period)).Value = "This Year"
Next
End With
End Sub
//主程序
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim strConn = "Data Source=.;Initial Catalog=Northwind;Integrated Security=True"
Dim sqlCon As SqlConnection = New SqlConnection(strConn)
sqlCon.Open()
Dim strSql As String
strSql = " select c.ProductID ,c.ProductName, sum(this_qty) as thisyear_qty ,sum(last_qty) as lastyear_qty ,sum(this_Money) as thisyear_Money , sum(last_Money) as lastyear_Money from (select"
strSql += " b.ProductID,b.ProductName,"
strSql += " case b.saletime when 2007 then case b.qtys when 0 then 0 else b.qtys End end as this_qty,"
strSql += "case b.saletime when 2006 then case b.qtys when 0 then 0 else b.qtys End end as last_qty,"
strSql += "case b.saletime when 2007 then case b.Moneys when 0 then 0 else b.Moneys End end as this_Money,"
strSql += " case b.saletime when 2006 then case b.Moneys when 0 then 0 else b.Moneys End end as last_Money "
strSql += " from (select * from (select ProductID ,ProductName,SaleTime,sum(qty) as qtys ,sum(Money) as Moneys from products_1 group by ProductID ,ProductName,SaleTime) a where a.SaleTime>2005 and a.SaleTime<2008) b) c group by c.ProductID ,c.ProductName"
Dim sqlAdpt As SqlDataAdapter = New SqlDataAdapter(strSql, sqlCon)
Dim ds As DataSet = New DataSet()
sqlAdpt.Fill(ds)
Dim logicRowCount As Integer = 2
'1.Spread struct defing
InitSpreadStruct(FpSpread1, logicRowCount, ds.Tables(0).Rows.Count)
'2.DataSource fill
SetDataSource(FpSpread1, ds.Tables(0), logicRowCount)
sqlCon.Close()
'Me.ReportViewer1.RefreshReport()
End Sub
 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号