Фильтр ListBox, который заполнен MySQL - PullRequest
0 голосов
/ 25 сентября 2018

Я вижу много людей, которые фильтруют свой ListBox своей пользовательской формы, используя TextBox или ComboBox.

Я бы хотел, чтобы это делало мое, но в отличие от них, мой Listbox заполняется с помощью MySQL Recordset, в то время какони используют электронную таблицу Excel

Вот мой фактический код, где SelectProduct - моя пользовательская форма, а ListRef - мой список.

  Requete = "SELECT Reference,Nom,Marque,PrixVente FROM Produits_Beta"
            rs.Open Requete, oConnect


SelectProduct.ListeRef.Clear
SelectProduct.ListeRef.Column = rs.GetRows

Список скоро будет отображать более 700 результатов, и яМне нужен способ, чтобы мой пользователь мог отфильтровать их, чтобы найти то, что ему нужно.

Если я использовал электронную таблицу для получения значения Listbox, мой код фильтра должен выглядеть следующим образом.(Код изначально от Ральфа) * ​​1010 *

Dim i As Long
Dim arrList As Variant

Me.ListeRef.Clear
If TheoricalSheet.Range("A" & TheoricalSheet.Rows.Count).End(xlUp).Row > 1 And Trim(Me.TXBoxFilter.Value) <> vbNullString Then
    arrList = TheoricalSheet.Range("A1:A" & TheoricalSheet.Range("A" & TheoricalSheet.Rows.Count).End(xlUp).Row).Value2
    For i = LBound(arrList) To UBound(arrList)
        If InStr(1, arrList(i, 1), Trim(Me.TXBoxFilter.Value), vbTextCompare) Then
            Me.ListeRef.AddItem arrList(i, 1)
        End If
    Next i
End If
If Me.ListeRef.ListCount = 1 Then Me.ListeRef.Selected(0) = True

Могу, но мне нужен способ вставить всю таблицу MySQL в скрытую электронную таблицу, и, опять же, я понятия не имею, как это сделать.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Канонический способ фильтрации данных SQL для отображения - это использование в вашем запросе предложения WHERE.Это сработает, когда у вас будет семь, семьсот или семь миллионов строк.

Вы можете попробовать что-то вроде этого:

 SELECT Reference,Nom,Marque,PrixVente 
   FROM Produits_Beta 
  WHERE Produit LIKE CONCAT('filter value', '%')
  ORDER BY Produit
  LIMIT 100

Если вы дадите пустую строку для filter value you 'получите первые сто рядов;Ваш пользователь быстро увидит, что фильтр необходим.

Если значение фильтра не указано, вы получаете WHERE Produit LIKE '%', чтобы не фильтровать.С Pom в качестве значения фильтра вы получите WHERE Produit LIKE 'Pom%' Это соответствует, например, Pomme, Pomme de terre и Pomade.

Редактировать Вы можете использовать %pom% в НРАВИТСЯ.Однако вот в чем дело: если в вашем поисковом термине на первом месте стоит %, СУБД не может использовать поиск по индексу для поиска ваших данных, поэтому поиск будет медленнее.С тысячами строк для поиска, это не имеет значения.С миллионами строк это очень важно.

Многие разработчики этого вида программного обеспечения часто используют запросы для фильтрации своих данных.СУБД созданы для этого.Смысл СУБД состоит в том, чтобы программное обеспечение могло эффективно обрабатывать большие наборы данных.

Pro tip : всегда используйте ORDER BY в своих запросах.Если вы этого не сделаете, сервер баз данных может представить результаты в любом порядке, который он считает наиболее эффективным в данный момент.Это называется нестабильная сортировка , и это сводит пользователей с ума.

0 голосов
/ 25 сентября 2018

Атрибут Worksheet.Visible имеет три параметра:

xlSheetVisible 'The usual visible worksheet.
xlSheetHidden 'Worksheet that is hidden but may be turned visible by the user.
xlSheetVeryHidden 'Worksheet that is hidden but may only be turned visible via VBA.

Если бы вам нужно было создать скрытый лист для получения этих данных, вы можете попробовать его следующим образом: допустим, вы сначала создалиРабочий лист в вашей рабочей книге (vba) с именем ws.Чтобы получить данные из этого набора записей, вам придется пройтись по его записям и скопировать значение каждого в строку:

'Header
With ws
    .Cells(1,1) = "Reference"
    .Cells(1,2) = "Nom"
    .Cells(1,3) = "Marque"
    .Cells(1,4) = "PrixVente"
End With

'Rows
Dim i as Long: i = 2

with Requete
    If not (.EOF and .BOF) then
        .movefirst

        Do until .EOF                
            ws.Cells(i,1) = .Fields("Reference")
            ws.Cells(i,2) = .Fields("Nom")
            ws.Cells(i,3) = .Fields("Marque")
            ws.cells(i,4) = .Fields("PrixVente")

            .MoveNext
            i=i+1
        Loop
    End If
End With

Затем, если вы не хотите, чтобы пользователь имелЧтобы получить доступ к своему листу, просто сделайте:

ws.visible = xlSheetVeryHidden

Если вы планируете обновить запрос и снова получить данные, вам придется предварительно очистить свой лист.Кроме того, было бы неплохо упорядочить данные в запросе SQL, чтобы список заполнялся в алфавитном порядке, если он соответствует вашим потребностям.

...