Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Recordset-> MSHFlexGrid Добавлено: 28.03.03 22:09  

Автор вопроса:  Svetlana | ICQ: 262385618 


Если убрать строки с MSHFlexGrid, а всесто них написать Msgbox, то все работает и считается (причем правильно), но мне надо вывести данные в таблицу. При выполнении кода ошибки не возникают, но в ячейки ничего не записывается (!), хотя появляется правильное число строк (кол-во групп в БД). Помогите, плиз! Может какой-нибудь другой способ записи в ячейки подскажите...

Private Sub GoldButton27_Click()
Dim cn As ADODB.Connection
Dim rst1 As ADODB.Recordset
Dim rst2 As ADODB.Recordset
Dim s1 As String
Dim s2 As String
Dim str1 As String
Dim m, w, st As Integer
Dim ng As String
Dim f As Integer
Dim k As Integer
Dim i As Long
Set cn = New ADODB.Connection
cn.Open "provider=microsoft.jet.oledb.4.0;data source=c:\s.mdb"
s1 = "select distinct группа from студенты order by группа"
s2 = "select * from студенты order by группа"
Set rst1 = cn.Execute(s1, , adCmdText)
Set rst2 = cn.Execute(s2, , adCmdText)
i = 0
k = 0
Do Until rst1.EOF
k = k + 1
rst1.MoveNext
Loop
MSHFlexGrid1.Rows = k + 1
Do Until rst1.EOF
ng = rst1!группа
m = 0
w = 0
st = 0
Do While rst2!группа = ng
If rst2!пол = "м" Then
m = m + 1
Else
w = w + 1
End If
st = st + 1
rst2.MoveNext
If rst2.EOF = True Then Exit Do
Loop
i = i + 1
MSHFlexGrid1.TextMatrix(i, 0) = ng
 MSHFlexGrid1.TextMatrix(i, 1) = st
MSHFlexGrid1.TextMatrix(i, 2) = m
MSHFlexGrid1.TextMatrix(i, 3) = w
'str1 = str1 & rst1!группа & "        " & CStr(st) & "           " & CStr(m) & "            " & CStr(w) & vbCr
rst1.MoveNext
Loop
'MsgBox "Назв_gruppy  всего   М   Ж  " & vbCr & str1
End Sub

Ответить

  Ответы Всего ответов: 29  

Номер ответа: 1
Автор ответа:
 MAGNUS



Вопросов: 12
Ответов: 430
 Профиль | | #1 Добавлено: 28.03.03 23:52

Ну гражданка вы тут наворотили.... После обьявлений одна бессмыслица. Вот это что ?

Do Until rst1.EOF
k = k + 1
rst1.MoveNext
Loop

А так не проще rst1.RecordCount ?

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

И вообще это все делается гораздо проще, если вам нужно найти  количество особей :) каждой группе то

dim rs as new adodb.recordset

dim s$

dim rs.open ""

s= "select GRuppa.gr, count(Studenti.pol)as polm,a.polw
from GRuppa
inner join Studenti on GRuppa.gr=Studenti.gr and pol='m' 
inner join(
select GRuppa.gr, count(Studenti.pol)as polw
from GRuppa
inner join Studenti on GRuppa.gr=Studenti.gr
and pol='w'
group by GRuppa.gr)a on GRuppa.gr=a.gr
group by GRuppa.gr ,a.polw"

dim rs.open s, Connection

msflexgrid1.datasource=rs

Все! END OF STORY...

Где это вас так научили позольте узнать?

 

 

Ответить

Номер ответа: 2
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #2
Добавлено: 29.03.03 00:31

>;Dim m, w, st As Integer

Надо
Dim m As Integer, w As Integer, st As Integer

Или так
DefInt A 'Declaration
Dim Am, Aw, Ast

Ответить

Номер ответа: 3
Автор ответа:
 MAGNUS



Вопросов: 12
Ответов: 430
 Профиль | | #3 Добавлено: 29.03.03 00:37

Привет CyRax .

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

Ответить

Номер ответа: 4
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #4
Добавлено: 29.03.03 00:47

Здрав будь и ты коли не шутишь :)

Честно говоря я с базами данных дальше Data контрола не продвинулся. По этому мне нет до них никакого дела. Да никогда и не было.

Не пойму что тебе не нравится. Я сказал человеку как правильно объявлять переменную.

Ответить

Номер ответа: 5
Автор ответа:
 MAGNUS



Вопросов: 12
Ответов: 430
 Профиль | | #5 Добавлено: 29.03.03 01:06

Да я не о твоем ответе собственно. Тс сказал все правильно. Я имел  ввиду что проблема этого кода совсем не в обьявлении переменных. Вот новую квери наваюл маленько подумав. И более правильно и быстрее и короче.

Вот посмотри и заметь небольшую разницу между ее и этим кодом.

Private Sub GoldButton27_Click()
Dim rs As New adodb.Recordset
Dim s$

s = "select Gruppa.gr, sum(case when pol= 'm'   then 1 else 0 end)as m,sum(case when pol= 'g'   then 1 else 0 end)as w" & _
"from Studenti inner join Gruppa on Studenti.gr=Gruppa.gr " & _
"group by Gruppa.gr "

rs.open s, "provider=microsoft.jet.oledb.4.0;data source=c:\s.mdb"
msflexgrid1.DataSource = rs
End Sub

 

Ответить

Номер ответа: 6
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #6
Добавлено: 29.03.03 01:11

Честно говоря никогда не возникало страстного желания учить язык баз данных.

Верю что всё работает отлично !

Ответить

Номер ответа: 7
Автор ответа:
 MAGNUS



Вопросов: 12
Ответов: 430
 Профиль | | #7 Добавлено: 29.03.03 01:26

Работает ты прав. В QA проверял. А кстати зря не задавался. T-SQL  офигительнейшай вещь!! Когда работаешь с базами и хорошо его знаешь, любые задачи упрощаются в 1К раз! Вот этот топик простейший пример... :)

Советую занятся. Нужная

Ответить

Номер ответа: 8
Автор ответа:
 MAGNUS



Вопросов: 12
Ответов: 430
 Профиль | | #8 Добавлено: 29.03.03 01:30
Сорри за флуд, у кого то что то глюкануло, или мой осел или серак.

Ответить

Номер ответа: 9
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #9
Добавлено: 29.03.03 01:31

Эк тебя кидануло :)

>Ну гражданка вы тут наворотили

Ответить

Номер ответа: 10
Автор ответа:
 MAGNUS



Вопросов: 12
Ответов: 430
 Профиль | | #10 Добавлено: 29.03.03 01:35
#$@ буду не со зла

Ответить

Номер ответа: 11
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #11
Добавлено: 29.03.03 01:36

Всё я баиньки.

Не забудь прислать API по локалке. сеть! сеть? ага сеть)

Ответить

Номер ответа: 12
Автор ответа:
 MAGNUS



Вопросов: 12
Ответов: 430
 Профиль | | #12 Добавлено: 29.03.03 01:46
Я тож :) .Уже кинул.

Ответить

Номер ответа: 13
Автор ответа:
 Svetlana



ICQ: 262385618 

Вопросов: 43
Ответов: 205
 Профиль | | #13 Добавлено: 29.03.03 16:09
Ну во-первых никто меня не учил, я сама делала. Ну и что, что не по правилам.. Зато мои Recordsetы работают! Дело в том, что я не могу понять, почему в цикле можно слепить строку str1 = str1 & rst1!GRUPPA & "        " & CStr(st) & "           " & CStr(m) & "            " & CStr(w) & vbCr, а если в этом же цикле  записывать переменные gruppa, st,m,w в MSHFlexGrid, то их значения в ячейки не вносятся(), хотя ошибки не выдает.
Вот это я понять просто не могу..

Ответить

Номер ответа: 14
Автор ответа:
 hedgehog



ICQ: 175571327 

Вопросов: 15
Ответов: 207
 Web-сайт: ezh.ru
 Профиль | | #14
Добавлено: 30.03.03 01:28

1. Рекордсет открыт как статический, т.е. движение возможно только вперед, а у тебя:

...

Do Until rst1.EOF

k = k + 1

rst1.MoveNext

Loop

MSHFlexGrid1.Rows = k + 1

Do Until rst1.EOF

...

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

2. Любопытный подход с двумя рекорсетами ;-) Гораздо проще первый возвращающий только названия групп вообще выбросить. А в ходе обработки второго название группы хранить в переменной и сравнивать с ней значения в последующих записях.

3. И вообще все это следует делать через группировку и статистические функции.

PS А не заполнялосб именно см. п. 1, остальное лишь благие пожелания на светлое будущее

Ответить

Номер ответа: 15
Автор ответа:
 MAGNUS



Вопросов: 12
Ответов: 430
 Профиль | | #15 Добавлено: 01.04.03 01:28

Эй народ! Вы это о чем??? Одумайтесь!!! Какой смысл обсуждать ошибки кода, концепция которого в корне не верна?!

Я ж кидал код уже:

Private Sub GoldButton27_Click()
Dim rs As New adodb.Recordset
Dim s$

s = "select Gruppa.gr, sum(case when pol= 'm'   then 1 else 0 end)as m,sum(case when pol= 'g'   then 1 else 0 end)as w" & _
"from Studenti inner join Gruppa on Studenti.gr=Gruppa.gr " & _
"group by Gruppa.gr "

rs.open s, "provider=microsoft.jet.oledb.4.0;data source=c:\s.mdb"
msflexgrid1.DataSource = rs
End Sub

ВСЕ!!!! Больше ничего не нужно!

Его только адоптировать нужно к реальной базе. В НЕГО вникать нужно. А вся эта куча переменных, лупов и пр. просто не нужна там!

З.Ы."Теперь программерам становится все легче и легче" (с)Светлана

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам