2016-02-12 25 views
0

我試圖做與C#的WinForms一個會計應用的平衡專欄,我這樣做只是爲了我自己使用,是該列的公式像這樣的:嘗試訪問以前的記錄在SQL Server

balance[i] = debit[i] - credit[i] + balance[i-1] 

所以,我認爲計算列是最好的解決方案。我使用Visual Studio 2013社區和SQL Server中,我試圖做它在CREATE TABLE腳本中的「表視圖」:

CREATE TABLE [dbo].[CONTAT1] 
(
    [NASIENTO] INT   IDENTITY (1, 1) NOT NULL, 
    [FECHA] DATE   NOT NULL, 
    [CONCEPTO] NVARCHAR (MAX) NOT NULL, 
    [DEBIT]  INT   DEFAULT ((0)) NOT NULL, 
    [CREDIT] INT   DEFAULT ((0)) NOT NULL, 
    [BALANCE] AS    ([DEBIT]-[CREDIT] + lag([BALANCE], 1, 0)), 
    [FACTURA] INT   NULL, 
    [RECIBO] INT   NULL, 

    PRIMARY KEY CLUSTERED ([NASIENTO] ASC) 
); 

我指定的默認滯後的參數,以便在第一條記錄的功能滯後剛加0(哦,我已經翻譯了所謂的行名,所以任何人都可以按照這個問題)。當我更新它不工作表,並提供了以下消息:

Dropping unnamed constraint on [dbo].[CONTAT1]... 
Dropping unnamed constraint on [dbo].[CONTAT1]... 
Starting rebuilding table [dbo].[CONTAT1]... 
(116,1): SQL72014: .Net SqlClient Data Provider: Msg 10753, Level 15, State 1, Line 13 The function 'lag' must have an OVER clause. 
(104,0): SQL72045: Script execution error. The executed script: 
BEGIN TRANSACTION; 

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 

SET XACT_ABORT ON; 

CREATE TABLE [dbo].[tmp_ms_xx_CONTAT1] (
    [NASIENTO] INT   IDENTITY (1, 1) NOT NULL, 
    [FECHA] DATE   NOT NULL, 
    [CONCEPTO] NVARCHAR (MAX) NOT NULL, 
    [DEBIT]  INT   DEFAULT ((0)) NOT NULL, 
    [CREDIT] INT   DEFAULT ((0)) NOT NULL, 
    [BALANCE] AS    ([DEBIT] - [CREDIT] + lag([BALANCE], 1, 0)), 
    [FACTURA] INT   NULL, 
    [RECIBO] INT   NULL, 
    PRIMARY KEY CLUSTERED ([NASIENTO] ASC) 
); 

IF EXISTS (SELECT TOP 1 1 
      FROM [dbo].[CONTAT1]) 
    BEGIN 
     SET IDENTITY_INSERT [dbo].[tmp_ms_xx_CONTAT1] ON; 
     INSERT INTO [dbo].[tmp_ms_xx_CONTAT1] ([NASIENTO], [FECHA], [CONCEPTO], [DEBIT], [CREDIT], [FACTURA], [RECIBO]) 
    SELECT [NASIENTO], 
      [FECHA], 
      [CONCEPTO], 
      [DEBIT], 
      [CREDIT], 
      [FACTURA], 
      [RECIB 
An error occurred while the batch was being executed. 

我用SQL就像是在2000年初的最後一次,所以我不知道爲什麼不工作?老實說,批次的事情正在殺死我。

我已經搜索了滯後函數,對我來說似乎是正確的,並且由於表有一個主鍵AND如果我只是嘗試它沒有滯後函數(只使用[BALANCE] AS ([DEBIT]-[CREDIT]))它完美的作品,我想我沒有必要指定順序或別的東西,所以我認爲問題是滯後函數。

的問題是:

滯後功能可與CREATE TABLE使用,對不對?如果不是,我應該只是在形式OnLoad事件中創建一個查詢來創建該列?

還有沒有其他的方式來訪問之前的紀錄?是的,我可以通過一個非常簡單的foreach通過DataSet來完成,但我不想創建...你怎麼用英文來稱呼它?差距?只是在數據庫和應用程序中的不同信息,以及重複的查詢和什麼不是......所以我認爲數據庫自動管理它會更好:P,對吧?

+0

對不起SQL表沒有保證的自然順序。出於這個原因,您不能在計算列的定義中包含LAG或LEAD。您可以創建一個位於表格頂部的視圖,幷包含餘額計算。這是有效的,因爲您現在可以訪問ORDER BY子句,這是您可以在SQL集上強制執行命令的唯一方法。 –

+1

您正在使用什麼**版本的SQL Server? 'LAG'和'LEAD'是SQL Server ** 2012 **中的**新特性**,如果您有更早的版本(通過運行SELECT @@ VERSION進行驗證),那麼您運氣不好...... –

回答

1

在SQL沒有刑事紀錄 - 表中都沒有訂單。

標準會計 - 並且在大多數地區甚至法律非常需要 - 是與正在運行的數量(每個帳戶)來記錄的變化,並在表的新值,在一起。

+0

我知道表通常在SQL中沒有順序,但是沒有解決這個問題的關鍵?我認爲這是因爲存在滯後函數。對不起,編輯:我不明白你的意思是記錄更改和新值,這與計算列有什麼關係? – Nox

+0

需要做的是該值不計算。只有初學者犯這個錯誤。保持該值不在交易上,而在交易上保留帳戶AND,但不保留爲計算列。 – TomTom

+0

@Nox *「我知道表通常在SQL中沒有順序」*>不,表**不要**在SQL中有順序。結果集雖然可以使用'ORDER BY'條款 –

相關問題