Filter Fehler in Marierung

Hallo ich weiss der Titel sagt nicht besonders viel über mein Problem aus. Aber ich versuchs mal zu beschreiben.

Ich habe mein FlexGrid, aus diesem Lese ich beim Selektieren einer zeile diverse Informationen in Textboxen aus.
Das Funktioniert auch Perfekt. Die Infos werden beim Klicken auf die Zeile ausgelesen und die Zeile wird Selektiert und hat einen Blauen Balken bzw ist Blau markiert wie es sein soll.

Nicht mehr so ganz so Rosig sieht es aus, nachdem ich mit Filtern arbeite.

Und Zwar habe ich 4 Filter.

Abmessung 1
Abmessung 2
Stahlsorte (Integerwerte) (DropDown)
Hersteller (DropDown)

Wenn ich Abmessung 1 und 2 Filtere Funktioniert das oben beschriebene Selektieren und auslesen immernoch Fehlerfrei und so wie es sein soll.

Doch Sobald ich Hersteller oder Stahlsorte zu dem Filter Hinzufüge, ist das Selektieren nicht mehr möglich.

Er Zeigt nicht mehr den Blauen Balken der anzeigt ob die Zeile Selektiert ist ABER liest die informationen aus. Jedoch die Information die er ausliest ist um eine Zeile nach Oben verschoben. Das heisst ich muss Zeile 2 Anklicken um zeile 1 Zu selektieren. Aber warum das Passiert ist mir Völlig schleierhaft. Und gerade bei diesen beiden Filtern die GENAU so funktionieren wie die AB1 und AB2.

Ich schreibe nichts an Row Col MouseRow oder sonstiges um. Das einzige was ich habe ist eine Sortierfunktion.

Private Sub DGV\_Click()

 If DGV.MouseRow = 0 Then

 With Me.DGV
 .Redraw = False
 If .MouseRow = 0 And .MouseCol \> .FixedCols - 1 Then
 .Col = .MouseCol
 If LastSortCol .Col Then .Tag = 0
 If .Tag = 0 Or .Tag = 6 Then
 .Sort = 5
 .Tag = 5
 LastSortCol = .Col
 Else
 .Sort = 6
 .Tag = 6
 LastSortCol = .Col
 End If
 .Col = 0
 .Row = 0
 End If
 .Redraw = True
 End With
 Else

 ZeileZeigen ' Zeigt infos aus Zeile

 End If

End Sub

Aber die Funktioniert ja sonst auch Wunderbar. Hat wer eine Idee?

Grüße vom Problembeladenen digi ^^

Hallo ich weiss der Titel sagt nicht besonders viel über mein
Problem aus. Aber ich versuchs mal zu beschreiben.

Hi digi,

Ich habe mein FlexGrid, aus diesem Lese ich beim Selektieren
einer zeile diverse Informationen in Textboxen aus.
Das Funktioniert auch Perfekt. Die Infos werden beim Klicken
auf die Zeile ausgelesen und die Zeile wird Selektiert und hat
einen Blauen Balken bzw ist Blau markiert wie es sein soll.

schön.

Nicht mehr so ganz so Rosig sieht es aus, nachdem ich mit
Filtern arbeite.

Und Zwar habe ich 4 Filter.

Abmessung 1
Abmessung 2
Stahlsorte (Integerwerte) (DropDown)
Hersteller (DropDown)

Wenn ich Abmessung 1 und 2 Filtere Funktioniert das oben
beschriebene Selektieren und auslesen immernoch Fehlerfrei und
so wie es sein soll.

Doch Sobald ich Hersteller oder Stahlsorte zu dem Filter
Hinzufüge, ist das Selektieren nicht mehr möglich.

Er Zeigt nicht mehr den Blauen Balken der anzeigt ob die Zeile
Selektiert ist ABER liest die informationen aus. Jedoch die
Information die er ausliest ist um eine Zeile nach Oben
verschoben. Das heisst ich muss Zeile 2 Anklicken um zeile 1
Zu selektieren. Aber warum das Passiert ist mir Völlig
schleierhaft.

hmmm, dann kann das Problem in der Prozedur ‚ZeileZeigen‘ liegen. Zeigst Du uns den Code auch noch?

Ohne den Code gesehen zu haben, würde ich vermuten, daß Du die Daten, die angezeigt werden aus dem gefilterten Recordset nimmst und die Nummer aus dem Flexgrid.
Beim Filtern werden aber Datensätze nur ausgeblendet und weiter mit gezählt. Die Zeilennummer stimmt dann nicht mehr mit der Datensatznummer überein. Daß sich da etwas immer um 1 verschiebt, wird an Deinen Beispielen liegen, Zufall sein. Der erste Datensatz, der angezeigt wird, kann auch Datensatz Nummer 10 oder 100 sein. Das hängt an der Menge der Daten und dem Filter.

Gruß, Rainer

Nene ich Filtere das Recordset und weise es dem FlexGrid zu deshalb stimmen die zeilen perfekt überein. Ich hab jetz was rausgenommen und zwar habe ich die IF abfrage herausgenommen so das es nu so aussieht:

Private Sub DGV\_Click()
 With Me.DGV
 .Redraw = False
 If .MouseRow = 0 And .MouseCol \> .FixedCols - 1 Then
 .Col = .MouseCol
 If LastSortCol .Col Then .Tag = 0
 If .Tag = 0 Or .Tag = 6 Then
 .Sort = 5
 .Tag = 5
 LastSortCol = .Col
 Else
 .Sort = 6
 .Tag = 6
 LastSortCol = .Col
 End If
 .Col = 0
 .Row = 0
 End If
 .Redraw = True
 End With
End Sub

So funktionierts fast immer. Wenn es nicht funktioniert dann scroll ich einma runter und es funktioniert wieder perfekt.

Das mit den spalten is egal.

Private Sub DGV\_EnterCell()
 Dim ArtNr As String
 ArtNr = DGV.TextMatrix(DGV.Row, 9)
 Nummertxt.Text = ArtNr
UND SOO WEITER .... für insg ca 30 spalten wird das gemacht.
End Sub

Das funktioniert ja.

grüße vom digi :smile:

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi digi,

Nene ich Filtere das Recordset und weise es dem FlexGrid zu
deshalb stimmen die zeilen perfekt überein.

dann hab’ ich falsch geraten.

Ich hab jetz was
rausgenommen und zwar habe ich die IF abfrage herausgenommen
so das es nu so aussieht:

Private Sub DGV_Click()
With Me.DGV
.Redraw = False
If .MouseRow = 0 And .MouseCol > .FixedCols -
1 Then
.Col = .MouseCol
If LastSortCol .Col Then .Tag = 0
If .Tag = 0 Or .Tag = 6 Then
.Sort = 5
.Tag = 5
LastSortCol = .Col
Else
.Sort = 6
.Tag = 6
LastSortCol = .Col
End If
.Col = 0
.Row = 0
End If
.Redraw = True
End With
End Sub

So funktionierts fast immer. Wenn es nicht funktioniert dann
scroll ich einma runter und es funktioniert wieder perfekt.

hmmm, da sehe ich so erst mal nichts, was nur mal funktioniert. Das ist dann wohl nur mit Debuggen zu finden.

Das mit den spalten is egal.

Private Sub DGV_EnterCell()
Dim ArtNr As String
ArtNr = DGV.TextMatrix(DGV.Row, 9)
Nummertxt.Text = ArtNr
UND SOO WEITER … für insg ca 30 spalten wird das gemacht.
End Sub

30 mal der selbe Code? Du weißt aber, daß es Steuerelementefelder gibt und hattest einfach nur Lust zum Tippen, stimmt’s? :smile:

Bei mir würde da stehen:

Private Sub DGV\_EnterCell()
 Dim Wert As String
 Wert = DGV.TextMatrix(DGV.Row, DGV.Col)
 Ausgabe(DGV.Col).Text = Wert
End Sub

Aber das ist Geschmackssache.

Gruß, Rainer

Ja ok ^^ warum einfach wenns auch kompliziert geht :smiley:
Naja die lösung hab ich halt genommen weil sie auf anhieb funktioniert hat und da hatte ich nich noch lust ewig rum zu basteln *g* und ich hab mehr überblick. Weil teilweise brauch ich die variablen noch mal später usw. Hat schon alles so seine richtigkeit ^^ …

Danke trotzdem für den tipp :wink:

grüße vom digi :smile:

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

So ich hab jetz ma n bisl rumprobiert.
Der nimmt als DGV.Toprow die 0. Aber es bringt mir auch nix wenn ich dem die 1 zuweise.

Dann habe ich DGV.FixedRow = 0 gesetzt und nachdem das RS gefiltert worden ist wieder auf 1. Das funktioniert. ABER nicht bei jedem. Wenn zb das DGV leer bleibt ist das Problem wieder genauso existent wie vorher für alle Filterergebnisse, die weniger haben als die sichtbaren zeilen im DGV. Erst wenn ich einen Hersteller anklicke der mehr ergebnisse liefert (sodass ein scrollbalken erscheint) funktioniert das ganze wieder. Aber nur solange, bis DGV wieder 0 einträge hat.

Ich finde es ziemlich kurrios … und mir gehen so langsam die ideen aus. Kann man irgendwie die FlexGrid.MouseRow werte editieren?

Grüße vom digi

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo digi,

ich habe ein einfaches Beispiel nachgebaut, der Fehlet tritt bei mir auch auf. Das ist ganz offensichtlich ein Bug im Flexgrid. :frowning: Ich suche noch, bisher habe ich keine Abhilfe gefunden.

Gruß, Rainer

Ausgetrickst :smile:
Hi Digi,

nicht schön, aber geht.

Private Sub Command1\_Click()
 Adodc1.Recordset.Filter = ""
 DoEvents
 DGV.TopRow = DGV.Rows - 1
 su = "Artikel-Nr \> 69"
 Adodc1.Recordset.Filter = su
End Sub

Private Sub Command2\_Click()
 su = "Artikel-Nr \> 90"
 Adodc1.Recordset.Filter = su
End Sub

Private Sub DGV\_Click()
 Label1.Caption = DGV.MouseRow
End Sub

Ist klar?

Das ist ein Bug im Flexgrid, da hat bei M$ Jemand geschlafen, damit müssen wir leben.

Gruß, Rainer

Also entweder Raff ichs net richtig ^^ oder bei mir funzt es nicht. Ich kopier jetz ma mein Quelltext wo ich das einfüge hier her:

Private Sub cboHersteller\_Click()
 FilterLoeschen.Enabled = True
 cboHerstellerText = cboHersteller.Text
 Dim FilterRSName As String
 'DGV.FixedRows = 0
 DGV.Redraw = False
 If SucheAusgefuehrt = True Then
 If FilterAktiv = True Then
 rsSuche.Filter = ""
 DGV.TopRow = DGV.Rows + 1
 FilterRSName = "Suche"
 If (FilterAB1txt.Text = "") And (FilterAB2txt.Text = "") And (StahlNummerText = "") Then
 rsSuche.Filter = "Match1 like '\*" & cboHerstellerText & "\*'"
 ElseIf Not (FilterAB1txt.Text = "") And Not (FilterAB2txt.Text = "") And Not (StahlNummerText = "") Then
 rsSuche.Filter = "USER\_AB1 like '\*" & FilterAB1txt.Text & "\*' AND USER\_AB2 like '\*" & FilterAB2txt.Text & "\*' AND Dimensionstext like '\*" & StahlNummerText & "\*' AND Match1 like '\*" & cboHerstellerText & "\*'"
 ElseIf Not (FilterAB1txt.Text = "") And (FilterAB2txt.Text = "") And (StahlNummerText = "") Then
 rsSuche.Filter = "USER\_AB1 like '\*" & FilterAB1txt.Text & "\*' AND Match1 like '\*" & cboHerstellerText & "\*'"
 ElseIf (FilterAB1txt.Text = "") And Not (FilterAB2txt.Text = "") And (StahlNummerText = "") Then
 rsSuche.Filter = "USER\_AB2 like '\*" & FilterAB2txt.Text & "\*' AND Match1 like '\*" & cboHerstellerText & "\*'"
 ElseIf Not (FilterAB1txt.Text = "") And Not (StahlNummerText = "") Then
 rsSuche.Filter = "USER\_AB1 like '\*" & FilterAB1txt.Text & "\*' AND Match1 like '\*" & cboHerstellerText & "\*' AND Dimensionstext like '\*" & StahlNummerText & "\*'"
 ElseIf Not (FilterAB2txt.Text = "") And Not (StahlNummerText = "") Then
 rsSuche.Filter = "USER\_AB2 like '\*" & FilterAB2txt.Text & "\*' AND Match1 like '\*" & cboHerstellerText & "\*' AND Dimensionstext like '\*" & StahlNummerText & "\*'"
 End If
 ElseIf (FilterAB1txt.Text = "") And (FilterAB2txt.Text = "") And Not (StahlNummerText = "") Then
 rsSuche.Filter = "Match1 like '\*" & cboHerstellerText & "\*' AND Dimensionstext like '\*" & StahlNummerText & "\*'"
 Else
 rsSuche.Filter = "Match1 like '\*" & cboHerstellerText & "\*'"
 End If
 Else
 If FilterAktiv = True Then
 rsMain.Filter = ""
 DGV.TopRow = DGV.Rows + 1
 FilterRSName = "Main"
 If (FilterAB1txt.Text = "") And (FilterAB2txt.Text = "") And (StahlNummerText = "") Then
 rsMain.Filter = "Match1 like '\*" & cboHerstellerText & "\*'"
 ElseIf Not (FilterAB1txt.Text = "") And Not (FilterAB2txt.Text = "") And Not (StahlNummerText = "") Then
 rsMain.Filter = "USER\_AB1 like '\*" & FilterAB1txt.Text & "\*' AND USER\_AB2 like '\*" & FilterAB2txt.Text & "\*' AND Dimensionstext like '\*" & StahlNummerText & "\*' AND Match1 like '\*" & cboHerstellerText & "\*'"
 ElseIf Not (FilterAB1txt.Text = "") And (FilterAB2txt.Text = "") And (StahlNummerText = "") Then
 rsMain.Filter = "USER\_AB1 like '\*" & FilterAB1txt.Text & "\*' AND Match1 like '\*" & cboHerstellerText & "\*'"
 ElseIf (FilterAB1txt.Text = "") And Not (FilterAB2txt.Text = "") And (StahlNummerText = "") Then
 rsMain.Filter = "USER\_AB2 like '\*" & FilterAB2txt.Text & "\*' AND Match1 like '\*" & cboHerstellerText & "\*'"
 ElseIf Not (FilterAB1txt.Text = "") And Not (StahlNummerText = "") Then
 rsMain.Filter = "USER\_AB1 like '\*" & FilterAB1txt.Text & "\*' AND Match1 like '\*" & cboHerstellerText & "\*' AND Dimensionstext like '\*" & StahlNummerText & "\*'"
 ElseIf Not (FilterAB2txt.Text = "") And Not (StahlNummerText = "") Then
 rsMain.Filter = "USER\_AB2 like '\*" & FilterAB2txt.Text & "\*' AND Match1 like '\*" & cboHerstellerText & "\*' AND Dimensionstext like '\*" & StahlNummerText & "\*'"
 End If
 ElseIf (FilterAB1txt.Text = "") And (FilterAB2txt.Text = "") And Not (StahlNummerText = "") Then
 rsMain.Filter = "Match1 like '\*" & cboHerstellerText & "\*' AND Dimensionstext like '\*" & StahlNummerText & "\*'"
 Else
 rsMain.Filter = "Match1 like '\*" & cboHerstellerText & "\*'"
 End If
 End If

 'If (FilterRSName = "Suche") Then
 ' If Not rsSuche.EOF Then
 ' DGV.TopRow = DGV.Rows - 1
 ' End If
 'ElseIf (FilterRSName = "Main") Then
 ' If Not rsSuche.EOF Then
 ' DGV.TopRow = DGV.Rows - 1
 ' End If
 'End If


 'SendMessage DGV.hwnd, WM\_VSCROLL, SB\_LINEDOWN, 0&
 'SendMessage DGV.hwnd, WM\_VSCROLL, SB\_LINEUP, 0&
 HerstellerF = True
 DGV.Redraw = True
End Sub

Ich habs auf 2 wege Probiert.

  1. Mit ner If Abfrage und n Wert der Speichert wo das Programm war damit der weiss ob der den If zweig für rsSuche oder rsMain genommen hat. Dann glotz ich ob rsMain oder rsSuche leer ist. Aber hm… ^^

  2. Einfach die anweisung
    rsSuche.Filter = „“
    DGV.TopRow = DGV.Rows + 1

In die dazugehörigen If Zweige kopiert.

Aber funktioniert au net :frowning:
Ich werd noch blöde ^^ warum hab ich nur VB genommen ^^ ich hab bald keine haare mehr aufm kopp *g*

grüße vom unheimlichen digi ^^

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Re^2: Ausgetrickst :smile:
Hey also es ist wirklich ein bestätigter BUG von M$.

http://support.microsoft.com/kb/267745/de

Aber n Lösungsquelltext hätten die wohl nichma schreiben können…

Ich habe es jetz so gelöst:

 If FilterRSsuche = True Then
 If Not rsSuche.EOF Then
 DGV.Redraw = True
 Else
 DoEvents
 Me.ergDGVFilterlbl.Visible = True
 rsSuche.Filter = ""
 DGV.Rows = 2
 DGV.FixedRows = 0
 DGV.Redraw = True
 DGV.FixedRows = 1
 End If
 ElseIf FilterRSsuche = False Then
 If Not rsMain.EOF Then
 DGV.Redraw = True
 Else
 DoEvents
 Me.ergDGVFilterlbl.Visible = True
 rsMain.Filter = ""
 DGV.Rows = 2
 DGV.FixedRows = 0
 DGV.Redraw = True
 DGV.FixedRows = 1
 End If
 End If
 HerstellerF = True

Das funktioniert.

grüße vom digi :smile:

Re^3: Ausgetrickst :smile:
Hi Digi,

Hey also es ist wirklich ein bestätigter BUG von M$.

http://support.microsoft.com/kb/267745/de

*gg* OK, dann habe ich ja Niemanden zu Unrecht beschuldigt.

Aber n Lösungsquelltext hätten die wohl nichma schreiben
können…

Ja, da muß ich zustimmen.

Ich habe es jetz so gelöst:

Das funktioniert.

OK, wenn’s funktioniert, spar ich mir alles übrige.

Gruß, Rainer

Hallo

Aber n Lösungsquelltext hätten die wohl nichma schreiben
können…

Testen Sie für die Bedingung eines leeren Re-Cord-Sets vor dem Binden eines Re-Cord-Sets an dem Steuerelement Hierarchical Flexgrid, um dieses Problem umzugehen. Deaktivieren Sie das Raster, und legen Sie das leere Re-Cord-Set auf der Eigenschaft Datasource nicht fest, wenn das Re-Cord-Set leer ist. Aktivieren Sie das Raster später und binden Sie das Steuerelement gewohnt, wenn ein Re-Cord-Set abgerufen wird, dass ein Re-Cord-Set Daten enthält.

Reicht nicht?

MfG Alex

Hi Alex,

Reicht nicht?

da steht, ‚zeig doch kein leeres reecordset an, wenn Du weißt, daß das zu Problemen führt‘. Nein, das reicht nicht. Daß ein Kunde keine Bestellung offen hat ist durchaus ein Ergebnis, das man anzeigen können muß und danach muß dsa Programm noch weiter arbeiten können.

OK, kann es ja jetzt. :smile:

Gruß, Rainer