|
|
|
| доброго всем дня! Подскажите пожалуйста, имею таблицу с 3 полями ид, число, сумма
возможно ли при помощи запроса или как то еще сделать следующие:
ид число сумма
1 100 100
2 100 200
3 100 300
в экселе легко это сделать а в vb незнаю как, и возможно ли вообще. Заранее благодарю. | |
|
| |
|
|
|
| Необходимо создать запрос к таблице через 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 | |
|
| |
|
|
|
| Запрос может содержать вычисленные выражения
SUMMA = My_TBL.Стоимость*My_TBL.Количество as Сумма | |
|
| |
|
|
|
|
| спасибо буду пробовать.
Таблицы в mdf, можно попробовать и в access | |
|
| |
|
|
|
| Ну зачем же, Можно и в 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
|
| |
|
| |
|
|
|
| очень извиняюсь за глупый вопрос, хранимка это хранимая процедура? | |
|
| |
|
|
|
|
| Уважаемый FORMAT так как я никогда раньше не работал с хранимыми процедурами, создать ее я создал, но не понял как ее привязать к датагриду или запросу, не могли бы вы в кратце объяснить или дать ссылку на материал
p.s почитал на мдмн-е, но не нашел как привязать. | |
|
| |
|
|
|
| Источником данных грида может являться, например, датасет.
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
|
| |
|
| |
|
|
|
| Вечно этот гестаповец влезет без очереди
Добавлено:
Возможно этот код придется чуток подкоректировать, поскольку VB я не очень хорошо помню и переводил с языка C# | |
|
| |
|
|
|
|
но не понял как ее привязать к датагриду или запросу
|
Хранимка сама является запросом, поэтому к запросу ее точно привязывать не нужно | |
|
| |
|
|
|
| Огромное всем спасибо! Сам бы не допер никогда | |
|
| |
|
|
|
| Уважаемые профессионалы а если есть еще поле 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 | |
|
| |
|
|
|
| Вспомнился бородатый анекдот
Дьякон сдает экзамен на попа. Для этого ему нужно было отслужить службу.
После службы поп его вызывает и говорит. Ты все сделал правильно, сын мой, но допустил некоторые неточности:
-Перед молитвой нужно остограмиться, а не ополлитровиться
-Рясу нужно одевать поверх, а не заправлять в джинсы
-Кадилом нужно махать вдоль себя, а не вертеть над головой
-На кафедру нужно восходить, а не восползать
-Во время молитвы нужно обращаться к божей матери, не упоминая никаких других матерей
-Иисуса Христа распяли римляне, а не замучали фашисты
-В конце молитвы нужно говорить аминь, а не пи$дец
Так вот, уважаемый коллега. Вы все сделали правильно, но допустили ряд неточностей.
-Если название компании содержит киррилицу, то лучше использовать не nchar, а nvarchar
И в любом случае после в скобках нужно указывать размер (Пример - nvarchar(50))
-Если сравниваете со строковым значением, лучше пользоваться конструкцией LIKE
-Судя по приведенному коду, вы не разобрались в принципе работы курсоров. А это зря, поскольку это достаточно мощное средство
Я, конечно, могу написать вам текст хранимки, но это будет не совсем правильно с идеологической точки.
Давайте сделаем так- За сегодня и выходные ( а их целых три ) попробуйте разобраться самостоятельно. Если не получится - во вторник - сделаю вам хранимку с комментариями и помогу разобраться с курсорами.
Но повторяю, попробуйте разобраться самостоятельно. Чувство ЭВРИКА - не самое плохое и неплохо щекочит самолюбие.
Удачи.
FORMAT & Мюллер
Добавлю. Для решения вашей задачи попробуйте использовать два встроенных один в другой курсора. | |
|
| |
|
|
|
| Спасибо вам! Буду пробовать, замечания исправлять. | |
|
| |
|
|
|
| Уважаемый Мюллер, исправил те неточности о которых вы мне говорили, прочел мсдн, и так и не понял курсоры, провозился все выходные, какие только варианты не пробовал (методом тыка), помогите пожалуйста решить мне эту задачу | |
|
| |
|
|
|
| Вчера образовался у мну дополнительный выходной, потому посмотрел только сегодня.
Таблица 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 этих организаций. Но это дело вкуса.
Можете, кстати, так и сделать, а заодно потренируетесь на курсорах.{перепишите хранимку исходя из двух таблиц, а не одной} | |
|
| |
|
|
|
| Спасибо большое, буду и дальше двигаться в этом направлении, т.к очень полезная вещь! | |
|
| |