2015-04-07 52 views
0

我有一些VBA代碼在MS Access中運行,我想「升遷」到存儲過程。它現在使用ADO來生成排名(荷蘭語中的PLAATS),但我必須在SQL Server上完成這項工作。誰可以幫忙?將VBA函數移動到SQL Server存儲過程

在VBA代碼是:

Function InvullenUitslag() 

    Dim MijnDb As Database 
    Dim rsWEDS As Recordset 
    Dim iCategorie As Integer 
    Dim iPlaats As Integer 
    Dim iExequo As Integer 
    Dim dblTotaal As Double 
    Dim iAantalDeelnemers As Byte 

    Set MijnDb = DBEngine.Workspaces(0).Databases(0) 
    Set rsWEDS = MijnDb.OpenRecordset("Q_UITSLAG") 

    rsWEDS.MoveFirst 

    If Not rsWEDS.EOF Then 
     iCategorie = rsWEDS![CATEGORIEID] 
     dblTotaal = -1 
     iPlaats = 0 
     iExequo = 0 
     iAantalDeelnemers = 0 
    End If 

    While Not rsWEDS.EOF() 
     If Not (iCategorie = rsWEDS![CATEGORIEID]) Then 
      iPlaats = 1 
      iExequo = 0 
      iAantalDeelnemers = 1 
     Else 
      If Abs(dblTotaal - rsWEDS![iTOTAAL]) <= 0.0001 Then 
       iExequo = iExequo + 1 
       iAantalDeelnemers = iAantalDeelnemers + 1 
      Else 
       iPlaats = iPlaats + iExequo + 1 
       iExequo = 0 
       iAantalDeelnemers = iAantalDeelnemers + 1 
      End If 
     End If 

     rsWEDS.Edit 
     rsWEDS![PLAATS] = iPlaats 
     rsWEDS![AANTALDEELNEMERS] = iAantalDeelnemers 

     If iExequo > 0 Then 
      rsWEDS![EXEQUO] = "*" 
     End If 

     rsWEDS.Update 
     iCategorie = rsWEDS![CATEGORIEID] 
     dblTotaal = rsWEDS![iTOTAAL] 
     rsWEDS.MoveNext 
    Wend 

End Function 
+0

對於初學者...這是數據在SQL Server? 'DBEngine.Workspaces(0).Databases(0)'通常是指Access數據庫,而不是SQL Server –

+0

數據在Access數據庫中,我將它移動到SQL Server。我是這件事的先行者 – Jan

+0

我想你的第一步是把它放到SQL Server中。你能解釋一下VBA在數據樣本中的作用嗎?它看起來可能是分區類型查詢。它將進入哪個版本的SQL Server? –

回答

0

如果我理解正確的話,你想設置基於totalscore和拆分(由分區)級別的參加者的排名。

我認爲你需要使用PARTITION BY子句的RANK()。您的結果將是這個樣子:

declare @table table (
    Name nvarchar(50) 
    ,[Level] nvarchar(1) 
    ,ResultApparatus1 decimal(12,1) 
    ,ResultApparatus2 decimal(12,1) 
    ,TotalScore decimal(12,1) 
) 

insert into @table values ('Jimm','A',8.0,9.0,17.0) 
insert into @table values ('Jack','A',7.2,8.4,15.6) 
insert into @table values ('John','B',8.2,7.6,15.6) 
insert into @table values ('Frank','B',8.2,7.6,15.6) 
insert into @table values ('Mark','B',8.2,7.8,15.8) 

select 
    * 
    ,RANK() OVER (PARTITION BY [Level] ORDER BY [Level], TotalScore DESC) Position 
from 
    @table 

這將返回結果集如下:

Name Level ResultApparatus1 ResultApparatus2 TotalScore Position 
Jimm A  8.0     9.0     17.0  1 
Jack A  7.2     8.4     15.6  2 
Mark B  8.2     7.8     15.8  1 
John B  8.2     7.6     15.6  2 
Frank B  8.2     7.6     15.6  2