Как я могу поддерживать общее количество в базе данных SQL Server с помощью VB.NET?

Я использую Visaul Studio 2010 для создания приложения Windows Forms для поддержки таблицы в базе данных SQL Server 2008. Таблица называется CASHBOOK и вот дополнительные сведения:

 DATE | DESCRIPTION | DEBIT | CREDIT | BALANCE --------|----------------|---------|-----------|--------- 1/1/2011| CASH BALANCE | | | 5000 1/1/2011| SALES | 2500 | | 7500 2/1/2011| PURCHASE | | 3000 | 4500 2/1/2011| RENT | | 4000 | 500 2/1/2011| SALES | 5000 | | 5500 

Я могу использовать CASHBOOKTABLEADAPTER.INSERT(...) для правильной вставки, но моя проблема в том, как обновить столбец BALANCE ?

См. Статью Александра Кузнецова

Денормализация для обеспечения соблюдения бизнес-правил: Выполнение итогов

Вы можете попробовать вставить с подзапросом, что-то вроде следующего:

 INSERT INTO CASHBOOK ( DESCRIPTION, DEBIT, BALANCE ) 'asdf', 2500, SELECT TOP(1) BALANCE FROM CASHBOOK + 2500 

Это немного тяжело, но вот способ обновить полную таблицу с информацией о балансе.

 update a set a.Balance = ( select sum(isnull(x.debit, 0.0) - isnull(x.credit, 0.0)) from cashbook x where x.Date < a.Date or (x.Date = a.Date and x.ID <= a.ID) ) + ( select top 1 y.Balance from cashbook y where y.debit is null and y.credit is null order by y.ID ) from cashbook a 

Теперь это полезно, только если у вас есть баланс в таблице. Более подходящим решением может быть создание UDF, который охватывает эту логику и вызывает это, чтобы вычислить поле баланса для определенной строки только тогда, когда вам это нужно. Это действительно зависит от вашего использования.

 create function dbo.GetBalance(@id int) returns decimal(12, 2) as begin declare @result decimal(12, 2) = 0.0 select @result = ( select sum(isnull(x.debit, 0.0) - isnull(x.credit, 0.0)) from cashbook x where x.Date < a.Date or (x.Date = a.Date and x.ID <= a.ID) ) + ( select top 1 y.Balance from cashbook y where y.debit is null and y.credit is null order by y.ID ) from cashback a where a.ID = @id return @result end 

Зачем вам это нужно? Это то, что должно быть рассчитано как функция отчетности / просмотра. Я бы предложил либо создать представление с полным столбцом (различные способы достижения этого).

Альтернативно, если вы просматриваете это в VB.Net, подсчитайте его в своем приложении.

Я согласен с Джоэлем, вы должны рассчитывать это во время выполнения, а не на хранение текущих итогов в базе данных. Ниже приведен пример того, как вычислять текущие итоги с использованием рекурсивного cte в sql-сервере:

 declare @values table (ID int identity(1,1), Value decimal(4,2)) declare @i int insert into @values values (1.00) insert into @values values (2.00) insert into @values values (3.00) insert into @values values (4.00) insert into @values values (5.00) insert into @values values (6.00) select @i=min(ID) from @values ;with a as ( select ID, Value, Value as RunningTotal from @values where [email protected] union all select b.ID, b.Value, cast(b.Value + a.RunningTotal as decimal(4,2)) as RunningTotal from @values b inner join a on b.ID=a.ID+1 ) select * from a 

вот блог по рекурсивным запросам: рекурсивные CTE

Кроме того, здесь приведен длинный разговор о текущих итогах.

Одной из потенциальных проблем с рекурсивными CTE является максимальный предел глубины 32767, который может быть запретительным в производственной среде.

В этом решении вы добавляете столбец идентификатора, который является порядковым для последовательности транзакций, а затем обновляет столбец баланса на месте.

 declare @t table(id int identity(1,1) not null , [DATE] date not null , [DESCRIPTION] varchar(80) null , [DEBIT] money not null default(0) , [CREDIT] money not null default(0) , [BALANCE] money not null default(0) ); declare @bal money=0; insert into @t([DATE],[DESCRIPTION],[DEBIT],[CREDIT],[BALANCE]) select '1/1/2011','CASH BALANCE',0,0,5000 UNION ALL select '1/1/2011','SALES',2500,0,0 UNION ALL select '2/1/2011','PURCHASE',0,3000,0 UNION ALL select '2/1/2011','RENT',0,4000,0 UNION ALL select '2/1/2011','SALES',5000,0,0; set @bal=(select top 1 [BALANCE] from @t order by id); /* opening balance is stored but not computed, so we simply look it up here. */ update t set @bal=t.[BALANCE]=(t.[DEBIT]-t.[CREDIT])[email protected] output inserted.* from @tt left join @t t0 on t0.id+1=t.id; /*should order by id by default, but to be safe we force the issue here. */ 
  • Есть ли способ создать автоматическое создание свойств из базы данных SQL Server?
  • Обходной путь с «Имя столбца недействителен»
  • Является ли мой код отсоединения правильным?
  • Получение надежного списка экземпляров сервера
  • SQL Server для VB.Net IF EXISTS должен что-то вернуть, но не
  • Сбой выполнения условия обновления
  • Время ожидания истечения времени ожидания с использованием устройства чтения данных
  • VB.Net: кавычки Escape синглов в строке запроса, которая использует переменную с одинарными кавычками
  • Поиск решения перезаписи SQL
  • Создайте автоматический установщик программы VB.Net + SQL Server & script для создания БД и пользователя
  • Проблемы с Datetime с vb.net и MSSQL
  • Interesting Posts

    Автоматическая синхронизация базы данных

    Что случилось с моим SQL? (найдите «предыдущую» запись)

    Переменные таблицы с псевдонимом в команде «Удалить из заявления»

    sql-сервер для строк обновлений, которые кратно 2

    Почему тайм-ауты сеанса после открытия OledbConnection

    LINQ to SQL: группа, количество, сумма. я весьма озадачен

    Приоритет запроса в MS SQL

    Неэффективный SQL-запрос с расчетами DATETIME. Как оптимизировать?

    обновление столбца на основе максимальной даты и группы по

    Как преобразовать синтаксис T-SQL, написанный CASE WHEN, в функции поворота или окна

    VB.Net (или C #) 2008 Многопоточный импорт

    Значение Linq to SQL DateTime является локальным (Kind = Unspecified) – Как мне настроить UTC?

    Как передать имя столбца в качестве параметра в выражении select SQL Server

    В чем разница между трансом и транзакцией в SQL Server 2005

    Как изменить пароль для входа в SQL Server, который был создан с помощью опции MUST_CHANGE

    Давайте будем гением компьютера.