German Zuerst eine Tabelle filtern und dann in eine bestimmte Spalte einen Wert setzen

JOTHA

Well-Known Member
Licensed User
Longtime User
Hallo Forum,

Wie man in eine bestimmte Spalte in allen Reihen einen Wert gleichzeitig einsetzt, weiß ich schon:
B4X:
For i = 0 To TabelleVMatGesamt1.RowCount -1
     TabelleVMatGesamt1.Cell ("Vorgang", i) = "bestellt"
Next
Jetzt möchte ich aber zuerst eine Tabelle filtern, und dann nur in die gefilterten Reihen gleichzeitig einen Wert einsetzen.

Beispiel:
B4X:
TabelleVMatGesamt1.Filter  ("Vorgang LIKE  'noch zu bestellen' ")   'sucht den genauen Begriff
... nach diesem Filtervorgang funktioniert der obige Code nicht mehr.

Weiß jemand Rat? :confused:
 

specci48

Well-Known Member
Licensed User
Longtime User
Hallo JOTHA,

was meinst Du mit
... funktioniert der obige Code nicht mehr.
Wird 'nichts' oder 'falsches' ersetzt?

Im Prinzip ist der Code auch für eine gefilterte Tabelle korrekt. Ist Dein Filter eventuell falsch gesetzt?


Gruß
specci48
 

JOTHA

Well-Known Member
Licensed User
Longtime User
Hallo specci48,

auch noch so spät "unterwegs"?

Wenn ich die Funktion ohne vorigen Filter ausführe, funktioniert es.

Wenn ich das Ganze ausführe, nachdem die Tabelle gefiltert wurde und nur noch die gefilterten Einträge zu sehen sind, kommt folgende Meldung:

Der Index 15 ist entweder negativ oder über der Gesamtanzahl der Zeilen. Continue?

Die Tabelle hat vor der Filterung 43 Datensätze und nach der Filterung noch 30 Datensätze.
In diese 30 Datensätze soll dann anstelle "noch zu bestellen" das Wort "bestellt" eingesetzt werden.
 

specci48

Well-Known Member
Licensed User
Longtime User
Hallo JOTHA,

zu manchen Dingen kommt man leider erst etwas später am Abend...;)

Also, Dein Filter funktioniert, nur der Laufindex ist nicht korrekt.

Die Funktion RowCount liefert immer die Anzahl der angezeigten Einträge einer Tabelle zurück, daher sollte der Index auch hier korrekt sein.

Hast Du den Laufindex mal mit Hilfe der Debug-Funktion kontrolliert? Benutzt Du auch die korrekten Variablen?


Gruß
specci48

P.S.: Sofern Du den aktuellen Programmstand posten kannst bzw. möchtest, würde ich auch direkt mal reinschauen...
 

JOTHA

Well-Known Member
Licensed User
Longtime User
Hallo specci48,

leider konnte ich mich gestern abend nicht mehr melden.

specci48 said:
Also, Dein Filter funktioniert, nur der Laufindex ist nicht korrekt.

Ich poste mal den Code für den Vorgang:
B4X:
Sub RadioBtnBestellungPerTelefax_Click

''Zuerst die Tabelle filtern:
'TabelleVMatGesamt1.Filter  ("Vorgang LIKE  'noch zu bestellen' ")   'sucht den genauen Begriff (!)
TabelleVMatGesamt1.Filter = "" 'löscht den Filter


'Trägt in der gefilterten Tabelle in allen Reihen in der Spalte "Vorgang" das Wort "bestellt" ein:
For i = 0 To TabelleVMatGesamt1.RowCount -1
     TabelleVMatGesamt1.Cell ("Vorgang", i) = "bestellt"
Next

'Trägt in der gefilterten Tabelle in allen Reihen in der Spalte "Datum" das heutige Datum ein:
For i = 0 To TabelleVMatGesamt1.RowCount -1
     TabelleVMatGesamt1.Cell ("Datum", i) = Date(Now)
Next

'Trägt in der gefilterten Tabelle in allen Reihen in der Spalte "Bestellung" "Per Telefax" ein:
For i = 0 To TabelleVMatGesamt1.RowCount -1
     TabelleVMatGesamt1.Cell ("Bestellung", i) = ""&VMatBestellungPerTelefax.Text&" ("&VMatBestellungBei1.Text&")"
Next

'Speichert die Daten als CSV-Datei:
TabelleVMatGesamt1.SaveCSV ("- Tabelle - V-Mat.CSV", ";", True) 

End Sub

Wenn ich den Filter gelöscht habe, funktioniert alles soweit.

Wenn ich den Filter aktiviert habe, kommt die Fehlermeldung (wie gehabt).

Das gibt es doch nicht ! :BangHead:

P.S.: Sofern Du den aktuellen Programmstand posten kannst bzw. möchtest, würde ich auch direkt mal reinschauen...
Der Programmstand ist sehr umfangreich und es würde länger dauern, bis ich dabei alles erklärt habe. Die Funktion kommt erst nach einer mehrstufigen Abfrage mit "Ja/Nein" und "OK-Buttons" zur Ausführung. Da sollte eigentlich kein Fehler drin sein, bis zu diesem Punkt funktioniert ja alles.
 

berndgoedecke

Active Member
Licensed User
Longtime User
Könnte es an der Tabelle liegen?

Hallo Jotha,
ich glaube es liegt daran, dass die Tabellendaten nach jeder Veränderung aktualisiert werden. Wenn du dann die Spalte veränderst, die du gefiltert hast,
dürften am Ende keine Daten mehr angezeigt werden. Deswegen kommt dann auch der anfänglich ermittelte Zähler nicht mehr hin.
Es sollte eigentlich klappen wenn du die Filter Tabelle nicht anzeigst und die Veränderung auf SQlite-Ebene mit "INSERT OR REPLACE INTO [Tabelle](TY,HN,DA) VALUES(" & Chr(34) & TYWert & Chr(34) & "," & Chr(34) & HNWert & Chr(34) & "," & Chr(34) & DAWert & Chr(34) & ")" , Danach sollte es keinen Filter mehr zum Anzeigen geben, da ja alle Datensätze die dem Filterkriterium entsprachen, jetzt geändert sind.
Ich würde gern ein kleines Beispiel dazu geben, bin aber im Moment mit einem eigenen Projekt sehr beschäftigt.
Teste es einfach mal an, es wäre auf jedenfall eine logische Erklärung.

PS.: Ich persönlich bevorzuge das ListView aus der ControlsEx DLL zur Darstellung der Daten.

Viel Spaß noch beim hacken

Bernd Gödecke
 

specci48

Well-Known Member
Licensed User
Longtime User
...ich glaube es liegt daran, dass die Tabellendaten nach jeder Veränderung aktualisiert werden.
So sehe ich das auch.

Laut Post #3 hat die gefilterte Tabelle 30 Einträge und der Index meckert an Position 15. Hier sind bereits 15 Einträge abgearbeitet (Positionen 0 - 14), es bleiben also noch 15 übrig. Der Index ist 15, womit eigentlich die 16te Zeile angesprochen wird und da greift das Programm nun mal ins leere.

Falls Du weiterhin mit einem Filter auf der Tabelle arbeiten willst, dann sind zwei Änderungen notwendig.
1. Mit einer While-Schleife immer die erste Zeile abarbeiten, bis die Tabelle (gefiltert) leer ist.
2. Erst die Änderungen in den Spalten "Datum" und "Bestellung" vornehmen und die Spalte "Vorgang" unbedingt als letztes Kriterium korigieren, da nach Änderung des Vorganges gleich der Filter greift und die Zeile verschwindet...


Gruß
specci48
 

JOTHA

Well-Known Member
Licensed User
Longtime User
Hallo specci48,

vielen Dank für deine Hilfe !

Das ist die Lösung:
Erst die Änderungen in den Spalten "Datum" und "Bestellung" vornehmen und die Spalte "Vorgang" unbedingt als letztes Kriterium korigieren, da nach Änderung des Vorganges gleich der Filter greift und die Zeile verschwindet...

Das Ganze funktioniert auch ohne die While-Schleife.

Würdest Du hier trotzdem einmal die Zeile mit der While-Schelife posten (nur für alle Fälle) ?
Vielleicht interessiert das ja auch andere "Mitleser".

@berndgoedecke:
Ich persönlich bevorzuge das ListView aus der ControlsEx DLL zur Darstellung der Daten.
Die ListView.DLL von Filippo finde ich auch hervorragend, aber da ist mir das Filtern noch zu kompliziert ...

Danke nochmals an euch beide !
 

JOTHA

Well-Known Member
Licensed User
Longtime User
... funzt doch noch nicht!

Leider funktioniert es doch nicht nur mit der einen Umstellung.

Ich hatte aus Versehen wieder den Filter aus der Tabelle genommen (da hat es ja schon funktioniert) und gemeint, es würde jetzt nach der Umstellung mit Filter funktionieren.

Ich muß also doch die While-Schleife einbauen.

Ich probiers mal ...
 

JOTHA

Well-Known Member
Licensed User
Longtime User
Funzt jetzt, aber mit einer anderen Lösung ...

An alle, die das vielleicht interessieren könnte:

Mit der While-Schleife hat das auch nicht geklappt. Sehr wahrscheinlich habe ich das eben nicht richtig eingesetzt. Nachdem ich also lange "rumprobiert" habe, bin ich auf eine Idee gekommen:

Ich habe die Tabelle um eine Spalte namens "StandVorher" erweitert. Dorthin habe ich dann den Wert, den ich eigentlich in die "gefilterte" Spalte eintragen wollte, eintragen lassen.

Danach habe ich die Tabelle ERNEUT gefiltert, diesmal nach dem Inhalt in der Spalte "StandVorher".

Jetzt kann es logischerweise kein Problem mehr sein, eine andere Spalte (also die Spalte, die ich vorher eigentlich füllen wollte) zu füllen.

... und siehe da: Es klappt !

Ergebnis: In der Spalte "AktuellerStand" wird jetzt alles wunschgemäß gefüllt.

Hier ist der Code:
B4X:
'Trägt in der gefilterten Tabelle in allen Reihen in der Spalte "Datum" das heutige Datum ein:
For i = 0 To TabelleVMatGesamt1.RowCount -1
     TabelleVMatGesamt1.Cell ("Datum", i) = Date(Now)
Next

'Trägt in der gefilterten Tabelle in allen Reihen in der Spalte "StandVorher" die Phrase "noch zu bestellen" ein:
For i = 0 To TabelleVMatGesamt1.RowCount -1
     TabelleVMatGesamt1.Cell ("StandVorher", i) = "noch zu bestellen"
Next

'Die Tabelle ERNEUT filtern und zwar JETZT nach ...
TabelleVMatGesamt1.Filter  ("StandVorher LIKE  'noch zu bestellen' ")

'Jetzt kann man in den VORIGEN Filter die Daten eintragen lassen:
For i = 0 To TabelleVMatGesamt1.RowCount -1
     TabelleVMatGesamt1.Cell ("AktuellerStand", i) = "bestellt"
Next

Viel Spaß damit !
:cool:
 
Last edited:

specci48

Well-Known Member
Licensed User
Longtime User
Hi JOTHA,

für meinen Geschmack immer noch ein ziemlich holpriger Workaround... :(

Hast Du Deinen alten Programmstand noch? Ich hoffe ja, denn dann kannst Du nochmal folgendes ausprobieren:
B4X:
Do While TabelleVMatGesamt1.RowCount > 0
   TabelleVMatGesamt1.Cell ("Datum", 0) = Date(Now)
   TabelleVMatGesamt1.Cell ("Bestellung", 0) = ""&VMatBestellungPerTelefax.Text&" ("&VMatBestellungBei1.Text&")"
   TabelleVMatGesamt1.Cell ("Vorgang", 0) = "bestellt"
While End
Sofern die gefilterte Tabelle noch Einträge enthält, wird die jeweils erste Zeile mit den aktuellen Daten gefüllt - dabei den Vorgang als letztes korrigieren. Nach der Vorgangskorrektur "verschwindet" die bisherige erste Zeile, weil sie nicht mehr dem Filter entspricht. Anschließend wird die nächste - jetzt neue erste - Zeile abgearbeitet, bis die Tabelle irgendwann leer ist.


Gruß
specci48
 

JOTHA

Well-Known Member
Licensed User
Longtime User
Hallo specci48,
... für meinen Geschmack immer noch ein ziemlich holpriger Workaround... :(
... da hast Du recht, aber wenn Du stundenlang rumprobierst und dann auf eine "holprige Lösung" kommst bist Du froh. Hauptsache es funktioniert!

Aber deine Lösung ist natürlich viel eleganter. Ich werde es ausprobieren - Vielen Dank!

Wenn wir schon mal dabei sind, noch eine Frage:

Wie kann ich aus einer Tabelle alle Reihen die in einer bestimmten Spalte den Wert "bestellt" haben kopieren (ohne die Daten in der alten Tabelle zu löschen) und in eine andere neue Tabelle einfügen?

Danach möchte ich diese neue Tabelle (nur mit den Reihen mit dem Wert "bestellt") speichern.

Hast Du da auch eine so elegante Lösung.
Ich doktere schon einige Zeit daran herum ... :(
 

JOTHA

Well-Known Member
Licensed User
Longtime User
Hallo specci48,

... zuerst hat er gemeckert weil der "loop" gefehlt hat, jetzt meckert er weil "While End" Meldung: Illegal first word in line

B4X:
Do While TabelleVMatGesamt1.RowCount > 0
   TabelleVMatGesamt1.Cell ("Datum", 0) = Date(Now)
   TabelleVMatGesamt1.Cell ("Bestellung", 0) = ""&VMatBestellungPerTelefax.Text&" ("&VMatBestellungBei1.Text&")"
   TabelleVMatGesamt1.Cell ("AktuellerStand", 0) = "bestellt"
Loop
While End

:confused::confused::confused:
 

klaus

Expert
Licensed User
Longtime User
Hallo JOTHA,

So muss es sein:
B4X:
Do While TabelleVMatGesamt1.RowCount > 0
    TabelleVMatGesamt1.Cell ("Datum", 0) = Date(Now)
    TabelleVMatGesamt1.Cell ("Bestellung", 0) = ""&VMatBestellungPerTelefax.Text&" ("&VMatBestellungBei1.Text&")"
    TabelleVMatGesamt1.Cell ("AktuellerStand", 0) = "bestellt"
Loop

While End ist in B4PPC nicht erkannt, Ich glaube es kommt von Pascal (Delphy).

Beste Grüsse.
 

specci48

Well-Known Member
Licensed User
Longtime User
While End ist in B4PPC nicht erkannt, Ich glaube es kommt von Pascal (Delphy)
:signOops: :sign0013:
Da habe ich wohl wieder einiges durcheinander gebracht.
:sign0161:
Passiert mir leider ab und zu, wenn ich täglich zwischen mehreren Programmiersprachen hin und her springe...


Gruß
specci48
 

specci48

Well-Known Member
Licensed User
Longtime User
Wie kann ich aus einer Tabelle alle Reihen die in einer bestimmten Spalte den Wert "bestellt" haben kopieren (ohne die Daten in der alten Tabelle zu löschen) und in eine andere neue Tabelle einfügen?
... siehe Anhang ... :)

Gruß
specci48
 

berndgoedecke

Active Member
Licensed User
Longtime User
Zauberwort "Update"

Hallo Jotha,
nochmal eine Anregung um evetuell eine Lösung in SQL anzupeilen.
In SQL sähe das so aus:

Update "order details" Set "unitprice" = "5000.99" Where "unitprice" = "14.00"
Mit dieser einen Zeile werden alle Preise von 14.00 auf 5000.99 angehoben.
(Dauert au einem 3GHz Pentium für 56 Werte 156ms)

Zugrunde liegt hier die Tabelle "order details" aus der allseits beliebten Nwind2009.db3. diese Beispieldatenbank aus MsAccess liegt, in konvertierter Form, dem Programm SQLite2009Pro bei.
näheres dazu gibt es hier: OsenXPSuite - Smart user interface for Visual Basic developers - ActiveX, embedded database, encryption, compression, button, listview, listbox, xp form, xpsuite, northwind trader, query analyzer, msaccess to mysql, auto update, visual basic 6.0, sql

Viele Grüße

Bernd Gödecke
 

JOTHA

Well-Known Member
Licensed User
Longtime User

JOTHA

Well-Known Member
Licensed User
Longtime User
Hallo specci48,
... siehe Anhang ... :)
Vielen lieben Dank!

Ich habe mich jetzt mal in SQLite reingekniet.
Vorteil in meinem Fall: Viel schneller bei großen Datenmengen!

Da sieht der Filter zwar wieder anders aus, aber Grundlagenwissen ist immer von Vorteil.
 

berndgoedecke

Active Member
Licensed User
Longtime User
dll's

Hallo Jotha,
bei mir lautet der Pfad zu diesen Dateien, die Bestandteil des letzten B4ppc-Updates waren:
"C:\Programme\Anywhere Software\Basic4ppc Desktop\Libraries\SQLNative\Device".
Solltest du das letzte Update versäumt haben?

Gruß
Bernd Gödecke
 
Top