Фильтрация записей в ListView

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

Фильтрация записей в ListView

Сообщение Perf2k2 » 13.07.2005 (Ср) 16:11

Всем привет!
Дали задание написать небольшую программку. Все шло нормально, пока не возникла необходимость сделать фильтрацию записей в ЛистВью. Не представляю как сделать. Нужно фильтровать по одному полю.
Данные в список заносятся из БД ручками. Причем значения в том поле, по которому нужно фильтровать, берутся не из БД, а считаются на лету (значение зависит от двух полей из таблицы). Поэтому невозможно использваоть SQL-запрос.

ЗЫ: юзал поиск, ничего не нашел.

очень надеюсь на вашу помощь :)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.07.2005 (Ср) 16:13

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

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

Сообщение alibek » 13.07.2005 (Ср) 16:13

Что-то не понял.
Приложи кусок кода, заполняющий ListView.
Lasciate ogni speranza, voi ch'entrate.

Perf2k2
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 07.02.2005 (Пн) 12:10

Сообщение Perf2k2 » 13.07.2005 (Ср) 16:21

Оперативненько вы тут отвечаете :D

Кусок кода:


Код: Выделить всё
Public Sub MakeQuery()
Dim rc As Long

' Обнуляем список
ListView1.ColumnHeaders.Clear
ListView1.ListItems.Clear

' Именуем колонки (14750)
ListView1.ColumnHeaders.Add 1, "delo_num", "№", 500
ListView1.ColumnHeaders.Add 2, "user_fio", "Принявший", 1050
ListView1.ColumnHeaders.Add 3, "delo_dt", "Звонок принят", 1700
ListView1.ColumnHeaders.Add 4, "sk_name", "Страховая", 1000
ListView1.ColumnHeaders.Add 5, "client_fio", "ФИО Страхователя", 2900
ListView1.ColumnHeaders.Add 6, "client_tel", "Телефон страхователя", 1500
ListView1.ColumnHeaders.Add 7, "delo_mesto", "", 0
ListView1.ColumnHeaders.Add 8, "delo_risk", "", 0
ListView1.ColumnHeaders.Add 9, "user_fio2", "Ведущий", 1000
ListView1.ColumnHeaders.Add 10, "delo_avto", "Авто", 1100
ListView1.ColumnHeaders.Add 11, "delo_avto_nomer", "", 0
ListView1.ColumnHeaders.Add 12, "delo_obst", "", 0
ListView1.ColumnHeaders.Add 13, "delo_1st_ring", "", 0
ListView1.ColumnHeaders.Add 14, "delo_zapros", "Подача запроса", 1300
ListView1.ColumnHeaders.Add 15, "delo_zapros_in", "", 0
ListView1.ColumnHeaders.Add 16, "kt", "Контрольное время", 1500
ListView1.ColumnHeaders.Add 17, "delo_docs_in", "", 0
ListView1.ColumnHeaders.Add 18, "delo_docs_move", "", 0
ListView1.ColumnHeaders.Add 19, "delo_2nd_ring", "", 0
ListView1.ColumnHeaders.Add 20, "delo_remove", "", 0
ListView1.ColumnHeaders.Add 21, "delo_comm", "Комментарий", 1500
ListView1.View = lvwReport

' Раскидываем данные по колонкам
Do Until lrs.EOF
Set Item = ListView1.ListItems.Add(, , lrs!delo_num)
Item.ListSubItems.Add , , lrs!user_fio 'delo_user_add
Item.ListSubItems.Add , , lrs!delo_dt
Item.ListSubItems.Add , , lrs!sk_name 'delo_sk
Item.ListSubItems.Add , , lrs!client_fio 'delo_client
Item.ListSubItems.Add , , lrs!client_tel & "" 'delo_client
Item.ListSubItems.Add , , lrs!delo_mesto
Item.ListSubItems.Add , , lrs!delo_risk
Item.ListSubItems.Add , , lrs!user_fio2 'delo_user_use
Item.ListSubItems.Add , , lrs!delo_avto
Item.ListSubItems.Add , , lrs!delo_avto_nomer & ""
Item.ListSubItems.Add , , lrs!delo_obst
Item.ListSubItems.Add , , lrs!delo_1st_ring & ""
Item.ListSubItems.Add , , lrs!delo_zapros & ""
Item.ListSubItems.Add , , lrs!delo_zapros_in & ""

' Выводим контрольную дату
Item.ListSubItems.Add , , mdlMain.set_ct(lrs)
Item.ListSubItems(15).ForeColor = &H800000
If mdlMain.kontrol_red = True Then
  Item.ListSubItems(15).ForeColor = &H80&
  Item.ListSubItems(15).Bold = True
End If

Item.ListSubItems.Add , , lrs!delo_docs_in & ""
Item.ListSubItems.Add , , lrs!delo_docs_move & ""
Item.ListSubItems.Add , , lrs!delo_2nd_ring & ""
Item.ListSubItems.Add , , lrs!delo_remove & ""
Item.ListSubItems.Add , , lrs!delo_comm & ""

lrs.MoveNext
Item.ListSubItems(2).Bold = True

Loop

End Sub


Вот контрольная дата и есть то значение в столбце.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.07.2005 (Ср) 16:26

Собственно, мне интересно только содержимое mdlMain.set_ct(lrs) :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Perf2k2
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 07.02.2005 (Пн) 12:10

Сообщение Perf2k2 » 13.07.2005 (Ср) 16:28

Без проблем:

Код: Выделить всё
Public Function set_ct(lrs As Recordset)
' Определяем коэффициенты
Dim koef, raznica As Integer
Dim dnei As String

' ОСАГО: МО - 30 дней, Москва - 10 дней
' КАСКО: МО - 20 дней, Москва - 5 дней
If lrs!delo_risk = "ОСАГО" Then
If lrs!delo_mesto = "Москва" Then
  koef = 10
Else
  koef = 30
End If
ElseIf lrs!delo_risk = "КАСКО" Then
If lrs!delo_mesto = "Москва" Then
  koef = 5
Else
  koef = 20
End If
End If

' Разница дат
raznica = DateDiff("d", lrs!delo_zapros, Date)

' Выводим
If raznica > koef Then
mdlMain.kontrol_red = True
set_ct = "СРОК ВЫШЕЛ!"
Else
mdlMain.kontrol_red = False
dnei = koef - raznica
set_ct = "Осталось " + dnei + " д."
End If

End Function

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.07.2005 (Ср) 16:31

Теперь дай свой SQL-запрос :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Perf2k2
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 07.02.2005 (Пн) 12:10

Сообщение Perf2k2 » 13.07.2005 (Ср) 16:34

Пжалуста:


Код: Выделить всё
Set lrs = db.OpenRecordset("SELECT dela.*, clients.*, users.*, users_1.user_fio AS user_fio2, sk.* FROM (((dela LEFT JOIN users ON dela.delo_user_add = users.user_id) INNER JOIN sk ON dela.delo_sk = sk.sk_id) INNER JOIN clients ON dela.delo_client = clients.client_id) INNER JOIN users AS users_1 ON dela.delo_user_use = users_1.user_id ORDER BY " + order + " DESC;")
MakeQuery


А зачем тебе все это добро?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.07.2005 (Ср) 16:54

Не просроченные:
Код: Выделить всё
SELECT dela.*, clients.*, users.*, users_1.user_fio AS user_fio2, sk.*
FROM (((dela LEFT JOIN users ON dela.delo_user_add = users.user_id) INNER JOIN sk ON dela.delo_sk = sk.sk_id) INNER JOIN clients ON dela.delo_client = clients.client_id) INNER JOIN users AS users_1 ON dela.delo_user_use = users_1.user_id
WHERE delo_zapros + IIf(delo_risk = 'ОСАГО', IIf(delo_mesto = 'Москва', 10, 30), IIf(IIf(delo_mesto = 'Москва', 5, 20))) - Now >= 0
ORDER BY " + order + " DESC


Просроченные:
Код: Выделить всё
SELECT dela.*, clients.*, users.*, users_1.user_fio AS user_fio2, sk.*
FROM (((dela LEFT JOIN users ON dela.delo_user_add = users.user_id) INNER JOIN sk ON dela.delo_sk = sk.sk_id) INNER JOIN clients ON dela.delo_client = clients.client_id) INNER JOIN users AS users_1 ON dela.delo_user_use = users_1.user_id
WHERE delo_zapros + IIf(delo_risk = 'ОСАГО', IIf(delo_mesto = 'Москва', 10, 30), IIf(IIf(delo_mesto = 'Москва', 5, 20))) - Now < 0
ORDER BY " + order + " DESC
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Perf2k2
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 07.02.2005 (Пн) 12:10

Сообщение Perf2k2 » 13.07.2005 (Ср) 17:05

Ага, спасибо большое. Вот только что-то мне не очень понятно что делает "IIF". И он мне еще ошибочку выдает: "Wrong number of arguments used with function in query expression". Поля вроде правильно указаны, насчет аргументов функции вроде все нормально, но точно сказать не могу, т.к. синтаксиса самой функции не знаю.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.07.2005 (Чт) 1:16

Условие, конечно, delo_zapros + IIf(delo_risk = 'ОСАГО', IIf(delo_mesto = 'Москва', 10, 30), IIf(delo_mesto = 'Москва', 5, 20)) - Now :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Perf2k2
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 07.02.2005 (Пн) 12:10

Сообщение Perf2k2 » 14.07.2005 (Чт) 10:21

Ага, все работает. Спасибо.
Я думаю это был не последний мой вопрос, все-таки прогу еще долго писАть :D

babagun
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 13.10.2004 (Ср) 15:21
Откуда: Krivoy Rog

Подскажите новичку

Сообщение babagun » 14.07.2005 (Чт) 12:31

Я тут посмотрел и по моему это то что мне нада, но вот только не могу найти этот ListView Де он находится то.


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

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

Сейчас этот форум просматривают: Majestic-12 [Bot], SemrushBot и гости: 93

    TopList  
cron