Помогите с циклом и recordset

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
dimalib
Обычный пользователь
Обычный пользователь
 
Сообщения: 58
Зарегистрирован: 08.12.2003 (Пн) 8:03

Помогите с циклом и recordset

Сообщение dimalib » 19.04.2004 (Пн) 8:18

Привет. Общем надеюсь что все понятно без слов. :)
Код: Выделить всё
Dim j(0 To 12) As String
Dim jDa(0 To 12) As Integer
Dim i As Integer
j(0) = "chb1"
………………..
j(12) = "01-38"
Set w1 = DBEngine.Workspaces(0)
Set d1 = w1.OpenDatabase("c:\cbsProject\cbs2004.mdb")
sql1 = "select * from forma6nk"
Set r1 = d1.OpenRecordset(sql1)
For i = 0 To 12
Do Until r1.EOF
If IsNull(r1.Fields(j(i))) Then
jDa(i) = jDai(i)
Else
jDa(i) = jDa(i) + r1![j(i)]
    End If
   r1.MoveNext
Loop
Next i
Text1.Text = jDa(i) 

Ломается вот здесь
Код: Выделить всё
jDai(i) = jDai(i) + r1![j(i)]

Просто не знаю как по другому тут задать. Подскажите чайнику Please.
:shock:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.04.2004 (Пн) 9:22

А что говорит? Скорее всего ругается, что нет такого поля в коллекции. Пиши так: + r1.Fields(j(i)).
Lasciate ogni speranza, voi ch'entrate.

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 19.04.2004 (Пн) 10:47

Нверное всетаки так


=IIf(IsNull(r1.Fields(...)) , ....TruePart , FalsePart)

dimalib
Обычный пользователь
Обычный пользователь
 
Сообщения: 58
Зарегистрирован: 08.12.2003 (Пн) 8:03

Сообщение dimalib » 19.04.2004 (Пн) 11:23

Скажите пожалуйста, почему когда доходит I=4 говорить что "Текущая запись отсутствует" хотя на его место пробовал поставит первую :oops:
Код: Выделить всё

Do Until r1.EOF
For i = 0 To 12
' For jDai = 0 To r1.RecordCount
If IsNull(r1.Fields(j(i))) Then
jDai(i) = jDai(i) + 0
Else
jDai(i) = jDai(i) + r1.Fields(j(i))
    End If
   r1.MoveNext
Next i
Loop     
:shock:

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 19.04.2004 (Пн) 11:47

dimalib писал(а):Скажите пожалуйста, почему когда доходит I=4 говорить что "Текущая запись отсутствует" хотя на его место пробовал поставит первую :oops:
Код: Выделить всё

Do Until r1.EOF
For i = 0 To 12
' For jDai = 0 To r1.RecordCount < -----А это как ????
If IsNull(r1.Fields(j(i))) Then
jDai(i) = jDai(i) + 0 < ------------Это к чему????
Else
jDai(i) = jDai(i) + r1.Fields(j(i))
    End If
   r1.MoveNext
Next i
Loop     
:shock:


Давай поступим так
Напиши словами без кода что ты хочешь получить на выходе

dimalib
Обычный пользователь
Обычный пользователь
 
Сообщения: 58
Зарегистрирован: 08.12.2003 (Пн) 8:03

Сообщение dimalib » 19.04.2004 (Пн) 12:39

Код: Выделить всё
' For jDai = 0 To r1.RecordCount < -----А это как ????
это не нужное строка
Код: Выделить всё
jDai(i) = jDai(i) + 0 < ------------Это к чему????
Это ну так себе :D :oops:

j(1)=""
….
J(12)=""
J =массив в которым содержится имена полей
JDai= Массив в которым должен содержатся суммарный вес полей
:P :shock:

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 19.04.2004 (Пн) 13:24

Ты посты вообще читаешь? Тебе alibek уже всё объяснил. Чего же боле? То что в квадратных скобках (в твоём коде) воспринимается не как выражение, а как имя поля. alibek показал как к нему обратиться правильно

dimalib
Обычный пользователь
Обычный пользователь
 
Сообщения: 58
Зарегистрирован: 08.12.2003 (Пн) 8:03

Сообщение dimalib » 19.04.2004 (Пн) 13:31

А вы сами прочли там все сообщение мр. Skiperski ? :P
Блин перепугался раз 10 прочел :shock:

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 19.04.2004 (Пн) 14:45

dimalib писал(а):[code]
J =массив в которым содержится имена полей
JDai= Массив в которым должен содержатся суммарный вес полей
:P :shock:



Все можно вычислить (итог по полю ) посредством SQL запроса

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 19.04.2004 (Пн) 15:38

Тщательнее надо быть, товаристч, тщательнее. Цикл который должен мотать поля, мотает записи, и если их меньше 12, то вызывается ошибка.

Вот так будет работать
Код: Выделить всё
Do Until (r1.EOF)
    For i = 0 To 12
        If (Not IsNull(r1(j(i)))) Then
            jDa(i) = jDa(i) + r1(j(i))
        End If
    Next
    r1.MoveNext
Loop

dimalib
Обычный пользователь
Обычный пользователь
 
Сообщения: 58
Зарегистрирован: 08.12.2003 (Пн) 8:03

Сообщение dimalib » 20.04.2004 (Вт) 5:47

Привет всем. Я пробовал так писать но он ругается что "Subscript out of range" ??? и указывает на list1. additem jda(i) самом конце кода когда я пытаюсь его вывести.
вроде бы все нормально

Код: Выделить всё
Dim j(0 To 12) As String
Dim jDa(0 To 12) As Long   
For i = 0 To 12


Пробовал увеличить jDa до (0 To 13) цикл проходит но не показывает желаемого результата. Может я не совсем правильно понял и не там копаю? :shock:

dimalib
Обычный пользователь
Обычный пользователь
 
Сообщения: 58
Зарегистрирован: 08.12.2003 (Пн) 8:03

Сообщение dimalib » 20.04.2004 (Вт) 6:58

Правильно оказывается так:
Код: Выделить всё
For fr = 0 To 12
Set r1 = d1.OpenRecordset(sql1)
Do Until (r1.EOF)
            If (Not IsNull(r1(j(fr)))) Then jDa(fr) = jDa(fr) + r1(j(fr))
        r1.MoveNext
    Loop
        Next fr
        For i = 0 To 12
        List1.AddItem jDa(i)
        Next i

Спасибо за помощь. :P :P
:shock:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 20.04.2004 (Вт) 8:55

:shock:

Все видел, но такое... 12 раз открывать рекордсет только для того, чтобы считать 12 полей... Мать моя женщина...
Lasciate ogni speranza, voi ch'entrate.

dimalib
Обычный пользователь
Обычный пользователь
 
Сообщения: 58
Зарегистрирован: 08.12.2003 (Пн) 8:03

Сообщение dimalib » 20.04.2004 (Вт) 10:32

А что можно по другому? Если
Код: Выделить всё
"Set r1 = d1.OpenRecordset(sql1)"

оставить вне цикла не работает блин почему та.

dimalib
Обычный пользователь
Обычный пользователь
 
Сообщения: 58
Зарегистрирован: 08.12.2003 (Пн) 8:03

Сообщение dimalib » 20.04.2004 (Вт) 14:08

Эх вы злые вы ребята. :? Любите мучит животных (ослов). :shock:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 20.04.2004 (Вт) 14:19

Честно говоря, так и не понял, что надо сделать. Если нужно заполнить список содержимым рекордсета (при условии, что все поля текстовые или числовые), то так.
Код: Выделить всё
Set r1 = d1.OpenRecordset(sql1)
Do Until (r1.EOF)
  res = vbNullString
  For I = LBound(j) To UBound(j)
    If Len(j(I)) > 0 Then
      If Not IsNull(r1.Fields(j(I))) Then
        res = res & r1.Fields(j(I))
      End If
    End If
  Next I
  rs.MoveNext
  List1.AddItem res
Loop
Lasciate ogni speranza, voi ch'entrate.

dimalib
Обычный пользователь
Обычный пользователь
 
Сообщения: 58
Зарегистрирован: 08.12.2003 (Пн) 8:03

Сообщение dimalib » 21.04.2004 (Ср) 8:49

Наверно уже всех задалбал своим ламерскими проблемами. :oops: Мне надо сложить содержимое рекордсета в одном поле. Ну примерно алгоритм таков if r1.EOF then I=I+1 и опять запускался цикл
Код: Выделить всё
Do Until r1.EOF
If Not IsNull(r1.Fields(j(i))) Then
jDai(i) = jDai(i) + r1.Fields(j(i))
Else
    End If
r1.MoveNext
Loop       

с новым J
Не могу ни как организовать. :roll: Может мозги на прокат дадите?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.04.2004 (Ср) 8:59

Тебе надо получить сумму всех полей (получить итоги)?
Код: Выделить всё
Dim vFields() As String, vTotals() As Long, I As Long
ReDim vFields(1 To 12), vTotals(1 To 12)
For I = 1 To 12
  vFields(I) = Choose(I, "chb1", ...)
  vTotals(I) = 0
Next I
...
sql = "..."
With db.OpenRecordset(sql)
  Do Until .EOF
    For I = LBound(vFields) To UBound(vFields)
      If Not IsNull(.Fields(vFields(I))) Then
        vTotals(I) = vTotals(I) + .Fields(vFields(I))
      End If
    Next I
    .MoveNext
  Loop
  .Close
End With
For I = LBound(vFields) To UBound(vFields)
  List1.AddItem vFields(I) & " = " & vTotals(I)
Next I
Lasciate ogni speranza, voi ch'entrate.

dimalib
Обычный пользователь
Обычный пользователь
 
Сообщения: 58
Зарегистрирован: 08.12.2003 (Пн) 8:03

Сообщение dimalib » 21.04.2004 (Ср) 11:07

Большому человеку огромное спасибо. :)
А жизнь та налаживается… :P
:shock:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.04.2004 (Ср) 11:25

Впрочем можно поменять сам запрос, не SELECT * FROM ..., а SELECT sum(cbn1), ... FROM ...
Тогда полученный рекордсет перебирать не нужно, просто копируешь значение полей в переменную.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 30

    TopList