Если убрать строки с 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
Ну гражданка вы тут наворотили.... После обьявлений одна бессмыслица. Вот это что ?
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"
Ты посмотри хорошенько. Дело то совсем не в обьявлениях. Просто все подругому делать нужно. Я квери конечно побыстрому наваял, можно и лучше, но это по крайней мере гораздо правильнее и короче...
Да я не о твоем ответе собственно. Тс сказал все правильно. Я имел ввиду что проблема этого кода совсем не в обьявлении переменных. Вот новую квери наваюл маленько подумав. И более правильно и быстрее и короче.
Вот посмотри и заметь небольшую разницу между ее и этим кодом.
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
Работает ты прав. В QA проверял. А кстати зря не задавался. T-SQL офигительнейшай вещь!! Когда работаешь с базами и хорошо его знаешь, любые задачи упрощаются в 1К раз! Вот этот топик простейший пример...
Ну во-первых никто меня не учил, я сама делала. Ну и что, что не по правилам.. Зато мои Recordsetы работают! Дело в том, что я не могу понять, почему в цикле можно слепить строку str1 = str1 & rst1!GRUPPA & " " & CStr(st) & " " & CStr(m) & " " & CStr(w) & vbCr, а если в этом же цикле записывать переменные gruppa, st,m,w в MSHFlexGrid, то их значения в ячейки не вносятся(), хотя ошибки не выдает. Вот это я понять просто не могу..
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, остальное лишь благие пожелания на светлое будущее