Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: VB

Программирование VB

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: DataGridView сумма
 
 автор: Василий   (01.03.2010 в 15:21)   личное сообщение
 
 

доброго всем дня! Подскажите пожалуйста, имею таблицу с 3 полями ид, число, сумма
возможно ли при помощи запроса или как то еще сделать следующие:
ид число сумма
1 100 100
2 100 200
3 100 300
в экселе легко это сделать а в vb незнаю как, и возможно ли вообще. Заранее благодарю.

  Ответить  
 
 автор: час   (01.03.2010 в 20:44)   личное сообщение
 
 

Необходимо создать запрос к таблице через Connect соединение
например:
Dim rst As ADODB.Recordset

Set rst = New ADODB.Recordset

rst.Open "My_TBL", GLB_CONNECTION, adOpenKeyset, adLockOptimistic

затем этот rst использовать как источник строк...

или прямо так:
Public GLB_CONNECTION As ADODB.Connection

Set GLB_CONNECTION = New ADODB.Connection
GLB_CONNECTION.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & GLB_PATCH_CONNECTION

Me!Adodc1.ConnectionString = GLB_CONNECTION

Me!Adodc1.RecordSource = "SELECT My_TBL.* From My_TBL"
Me!Adodc1.Refresh

Set Me!DataGrid1.DataSource = Me!Adodc1
Me!DataGrid1.Refresh

  Ответить  
 
 автор: час   (01.03.2010 в 20:58)   личное сообщение
 
 

Запрос может содержать вычисленные выражения
SUMMA = My_TBL.Стоимость*My_TBL.Количество as Сумма

  Ответить  
 
 автор: FORMAT   (02.03.2010 в 10:34)   личное сообщение
 
 

А таблицы в какой субд?

  Ответить  
 
 автор: Василий   (02.03.2010 в 11:05)   личное сообщение
 
 

спасибо буду пробовать.
Таблицы в mdf, можно попробовать и в access

  Ответить  
 
 автор: FORMAT   (02.03.2010 в 11:39)   личное сообщение
 
 

Ну зачем же, Можно и в mdf решить эту проблему одной хранимкой

Таблица Table1 имеет вид

Id
MyNum - число
MySum - сумма


CREATE PROCEDURE _spMyProc

AS
DECLARE @MySum int
DECLARE @MyNum int
DECLARE @Id int

SET @MySum=0
DECLARE CurSum CURSOR FOR
SELECT MyNum,Id FROM Table1
OPEN CurSum

FETCH NEXT FROM CurSum INTO @MyNum ,@Id
WHILE @@FETCH_STATUS = 0
BEGIN
SET @MySum = @MySum + @MyNum
Update Table1 Set MySum = @MySum WHERE Id=@Id
FETCH NEXT FROM CurSum INTO @MyNum ,@Id
END

CLOSE CurSum
DEALLOCATE CurSum
/* SET NOCOUNT ON */
RETURN

  Ответить  
 
 автор: Василий   (02.03.2010 в 16:43)   личное сообщение
 
 

очень извиняюсь за глупый вопрос, хранимка это хранимая процедура?

  Ответить  
 
 автор: FORMAT   (02.03.2010 в 16:54)   личное сообщение
 
 

да

  Ответить  
 
 автор: Василий   (03.03.2010 в 12:58)   личное сообщение
 
 

Уважаемый FORMAT так как я никогда раньше не работал с хранимыми процедурами, создать ее я создал, но не понял как ее привязать к датагриду или запросу, не могли бы вы в кратце объяснить или дать ссылку на материал
p.s почитал на мдмн-е, но не нашел как привязать.

  Ответить  
 
 автор: Мюллер   (03.03.2010 в 13:51)   личное сообщение
 
 

Источником данных грида может являться, например, датасет.


Using cn As New SqlConnection(conn.ConnectionString) 'Строка подключения
cn.Open()
Dim cmd As SqlCommand
cmd = New SqlCommand("Имя хранимой процедуры", cn)
cmd.CommandType = CommandType.StoredProcedure
'Следующие 2 строки передают значение параметров хранимой процедуре,
'если в хранимке есть параметры. Количество этих строк зависит от количества
'параметров в хранимке. Если параметров нет, то строки не нужны

cmd.Parameters.AddWithValue("@Параметр1 в хранимой процедуре", Значение параметра1);
cmd.Parameters.AddWithValue("@Параметр2 в хранимой процедуре", Значение параметра2);



Dim da1 As New SqlDataAdapter(cmd)
Dim ds1 As New DataSet()
da1.Fill(ds1)



Me.DataGrid1.DataSource = ds1
Me.DataGrid1.DataBind()

cmd.Connection.Close()
cmd.Connection.Dispose()

End Using

  Ответить  
 
 автор: FORMAT   (03.03.2010 в 13:53)   личное сообщение
 
 

Вечно этот гестаповец влезет без очереди

Добавлено:
Возможно этот код придется чуток подкоректировать, поскольку VB я не очень хорошо помню и переводил с языка C#

  Ответить  
 
 автор: Мюллер   (03.03.2010 в 13:59)   личное сообщение
 
 


но не понял как ее привязать к датагриду или запросу


Хранимка сама является запросом, поэтому к запросу ее точно привязывать не нужно

  Ответить  
 
 автор: Василий   (03.03.2010 в 21:55)   личное сообщение
 
 

Огромное всем спасибо! Сам бы не допер никогда

  Ответить  
 
 автор: Василий   (04.03.2010 в 22:54)   личное сообщение
 
 

Уважаемые профессионалы а если есть еще поле Company, можно ли чтоб Mysum считался для каждой компании в отдельности, пробовал варианты такие варианты но безрезультатно
ALTER PROCEDURE _spMyProc1

AS
DECLARE @MySum int
DECLARE @Daily int
DECLARE @No int
DECLARE @Company nchar

SET @MySum=0
DECLARE CurSum CURSOR FOR
SELECT Daily,No,Company FROM DailyTbl
OPEN CurSum

FETCH NEXT FROM CurSum INTO @Daily ,@No , @Company
WHILE @@FETCH_STATUS = 0
BEGIN
SET @MySum = @MySum + @Daily
Update DailyTbl Set MySum = @MySum WHERE Company=@Company
FETCH NEXT FROM CurSum INTO @Daily ,@No , @Company
END

CLOSE CurSum
DEALLOCATE CurSum
/* SET NOCOUNT ON */
RETURN
и
Update DailyTbl Set MySum = @MySum WHERE No=@No and Company=@Company
Update DailyTbl Set MySum = @MySum WHERE No=@No or Company=@Company

  Ответить  
 
 автор: Мюллер   (05.03.2010 в 13:11)   личное сообщение
 
 

Вспомнился бородатый анекдот
Дьякон сдает экзамен на попа. Для этого ему нужно было отслужить службу.
После службы поп его вызывает и говорит. Ты все сделал правильно, сын мой, но допустил некоторые неточности:

-Перед молитвой нужно остограмиться, а не ополлитровиться
-Рясу нужно одевать поверх, а не заправлять в джинсы
-Кадилом нужно махать вдоль себя, а не вертеть над головой
-На кафедру нужно восходить, а не восползать
-Во время молитвы нужно обращаться к божей матери, не упоминая никаких других матерей
-Иисуса Христа распяли римляне, а не замучали фашисты
-В конце молитвы нужно говорить аминь, а не пи$дец

Так вот, уважаемый коллега. Вы все сделали правильно, но допустили ряд неточностей.
-Если название компании содержит киррилицу, то лучше использовать не nchar, а nvarchar
И в любом случае после в скобках нужно указывать размер (Пример - nvarchar(50))
-Если сравниваете со строковым значением, лучше пользоваться конструкцией LIKE
-Судя по приведенному коду, вы не разобрались в принципе работы курсоров. А это зря, поскольку это достаточно мощное средство

Я, конечно, могу написать вам текст хранимки, но это будет не совсем правильно с идеологической точки.
Давайте сделаем так- За сегодня и выходные ( а их целых три ) попробуйте разобраться самостоятельно. Если не получится - во вторник - сделаю вам хранимку с комментариями и помогу разобраться с курсорами.
Но повторяю, попробуйте разобраться самостоятельно. Чувство ЭВРИКА - не самое плохое и неплохо щекочит самолюбие.
Удачи.
FORMAT & Мюллер

Добавлю. Для решения вашей задачи попробуйте использовать два встроенных один в другой курсора.

  Ответить  
 
 автор: Василий   (05.03.2010 в 13:29)   личное сообщение
 
 

Спасибо вам! Буду пробовать, замечания исправлять.

  Ответить  
 
 автор: Василий   (08.03.2010 в 18:22)   личное сообщение
 
 

Уважаемый Мюллер, исправил те неточности о которых вы мне говорили, прочел мсдн, и так и не понял курсоры, провозился все выходные, какие только варианты не пробовал (методом тыка), помогите пожалуйста решить мне эту задачу

  Ответить  
 
 автор: Мюллер   (10.03.2010 в 11:20)   личное сообщение
 
 

Вчера образовался у мну дополнительный выходной, потому посмотрел только сегодня.

Таблица Table1 имеет вид
Id
MyNum
MySum
MyComp - наименование компании

Тогда хранимка должна быть такой



ALTER PROCEDURE _spMyProc

AS
DECLARE @MySum int
DECLARE @MyNum int
DECLARE @Id int
DECLARE @MyComp nvarchar(50)

DECLARE CurComp CURSOR FOR
SELECT DISTINCT MyComp FROM Table1
OPEN CurComp
FETCH NEXT FROM CurComp INTO @MyComp
WHILE @@FETCH_STATUS = 0
BEGIN

SET @MySum=0
DECLARE CurSum CURSOR FOR
SELECT MyNum,Id,MyComp FROM Table1 WHERE MyComp LIKE @MyComp
OPEN CurSum

FETCH NEXT FROM CurSum INTO @MyNum ,@Id,@MyComp
WHILE @@FETCH_STATUS = 0
BEGIN
SET @MySum = @MySum + @MyNum
UPDATE Table1 SET MySum = @MySum WHERE Id=@Id AND MyComp LIKE @MyComp
FETCH NEXT FROM CurSum INTO @MyNum ,@Id,@MyComp
END

CLOSE CurSum
DEALLOCATE CurSum

FETCH NEXT FROM CurComp INTO @MyComp
END
CLOSE CurComp
DEALLOCATE CurComp

/* SET NOCOUNT ON */
RETURN




В этой хранимке создается два курсора.
Курсор - это некий аналог датаридера (если работаете с VS, то должны знать, что это такое )
С помощью первого курсора мы создаем запрос , в котором выводим без повторов все компании в нашей таблице (Выделено жирным шрифтом)


DECLARE CurComp CURSOR FOR
SELECT DISTINCT MyComp FROM Table1OPEN CurComp



Этим курсором мы пробегаемся по нашей таблице и с помошью второго курсора апдейтим таблицу в нужных нам полях.


ЗЫ
Вааще-то правильней было сделать две таблицы - одна справочник организаций, а во второй только Id этих организаций. Но это дело вкуса.
Можете, кстати, так и сделать, а заодно потренируетесь на курсорах.{перепишите хранимку исходя из двух таблиц, а не одной}

  Ответить  
 
 автор: Василий   (10.03.2010 в 22:21)   личное сообщение
 
 

Спасибо большое, буду и дальше двигаться в этом направлении, т.к очень полезная вещь!

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList