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


插入数据

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    )






得到上面的表需要使用如下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(Moneyas 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 IntegerByVal 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

posted @ 2007-10-18 14:28  jhtchina  阅读(3076)  评论(1)    收藏  举报