programing

MySQL로 채워진 목록 상자 필터링

starjava 2023. 10. 29. 18:55
반응형

MySQL로 채워진 목록 상자 필터링

텍스트 상자나 콤보 상자를 사용하여 사용자 양식의 목록 상자를 필터링하는 사람들이 많이 보입니다.

내 것으로 하고 싶지만, 그들과는 달리 내 목록 상자는 MySQL 레코드 집합을 사용하여 채워지는 반면 그들은 Excel 스프레드시트를 사용합니다.

제 실제 코드가 있는데 여기 SelectProduct는 제 User form이고 ListRef는 제 Listbox입니다.

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


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

Listbox는 곧 700 이상의 결과를 보여줄 것이고 나는 내 사용자가 필요한 것을 찾기 위해 그것들을 필터링할 수 있는 방법이 필요합니다.

스프레드시트를 사용하여 목록 상자 값을 가져온 경우 필터 코드는 다음과 같습니다. (원래 Ralph에서 온 코드)

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 테이블을 모두 붙여넣을 수 있는 방법이 필요합니다. 하지만 저는 이 방법을 전혀 모릅니다.

SQL 데이터를 표시하기 위해 필터링하는 표준 방법은WHERE문의에 조항이 있습니다.7,700,700,700만 줄이 있을 때 효과가 있을 겁니다.

당신은 다음과 같은 것을 시도해 볼 수 있습니다.

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

만약 당신이 빈 문자열을 준다면,filter value처음 100개의 행을 얻을 수 있습니다. 사용자는 필터가 필요하다는 것을 빠르게 알 수 있습니다.

필터 값이 없으면, 당신은WHERE Produit LIKE '%'여과하지 않기 위해서입니다.와 함께Pom당신이 얻게 될 필터 값으로WHERE Produit LIKE 'Pom%'그것은 일치합니다.Pomme,Pomme de terre,그리고.Pomade,예를들면.

편집사용가능%pom%라이크로그러나, 여기 문제가 있습니다: 만약 당신의 검색어가%먼저 DBMS는 인덱스 조회를 사용하여 데이터를 찾을 수 없으므로 검색 속도가 느려집니다.천 개의 행을 검색할 수 있으니, 이것은 중요하지 않습니다.수백만 개의 행이 있다면, 그것은 매우 중요합니다.

이런 종류의 소프트웨어 개발자들은 데이터를 필터링하기 위해 쿼리를 많이 사용합니다.DBMS는 이를 위해 구축됩니다.DBMS의 핵심은 소프트웨어가 방대한 데이터 집합을 효율적으로 처리할 수 있도록 하는 것입니다.

프로 팁:항상사용ORDER BY문의하신 내용에 따라그렇지 않은 경우 데이터베이스 서버는 자유롭게 순서에 따라 결과를 제시할 수 있습니다.이를 불안정한 정렬이라고 하며 사용자를 미치게 합니다.

워크시트.보이는 속성에는 다음과 같은 세 가지 옵션이 있습니다.

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.

이 데이터를 받기 위해 숨겨진 시트를 생성하는 경우 다음과 같이 시도할 수 있습니다. 워크북에 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 쿼리에 데이터를 주문하는 것이 좋을 수도 있습니다.

언급URL : https://stackoverflow.com/questions/52496468/filter-a-listbox-thats-filled-with-mysql

반응형