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

Discussion in 'German Forum' started by JOTHA, Sep 28, 2009.

  1. JOTHA

    JOTHA Well-Known Member Licensed User

    Hallo Forum,

    Wie man in eine bestimmte Spalte in allen Reihen einen Wert gleichzeitig einsetzt, weiß ich schon:
    Code:
    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:
    Code:
    TabelleVMatGesamt1.Filter  ("Vorgang LIKE  'noch zu bestellen' ")   'sucht den genauen Begriff
    ... nach diesem Filtervorgang funktioniert der obige Code nicht mehr.

    Weiß jemand Rat? :confused:
     
  2. specci48

    specci48 Well-Known Member Licensed User

    Hallo JOTHA,

    was meinst Du mit
    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
     
  3. JOTHA

    JOTHA Well-Known Member Licensed 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:

    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.
     
  4. specci48

    specci48 Well-Known Member Licensed 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...
     
  5. JOTHA

    JOTHA Well-Known Member Licensed User

    Hallo specci48,

    leider konnte ich mich gestern abend nicht mehr melden.

    Ich poste mal den Code für den Vorgang:
    Code:
    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:

    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.
     
  6. berndgoedecke

    berndgoedecke Active Member Licensed 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
     
  7. specci48

    specci48 Well-Known Member Licensed User

    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
     
  8. JOTHA

    JOTHA Well-Known Member Licensed User

    Hallo specci48,

    vielen Dank für deine Hilfe !

    Das ist die Lösung:
    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:
    Die ListView.DLL von Filippo finde ich auch hervorragend, aber da ist mir das Filtern noch zu kompliziert ...

    Danke nochmals an euch beide !
     
  9. JOTHA

    JOTHA Well-Known Member Licensed 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 ...
     
  10. JOTHA

    JOTHA Well-Known Member Licensed 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:
    Code:
    '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: Sep 30, 2009
  11. specci48

    specci48 Well-Known Member Licensed 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:
    Code:
    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
     
  12. JOTHA

    JOTHA Well-Known Member Licensed User

    Hallo specci48,
    ... 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 ... :(
     
  13. JOTHA

    JOTHA Well-Known Member Licensed User

    Hallo specci48,

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

    Code:
    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:
     
  14. klaus

    klaus Expert Licensed User

    Hallo JOTHA,

    So muss es sein:
    Code:
    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.
     
  15. specci48

    specci48 Well-Known Member Licensed User

    :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
     
  16. specci48

    specci48 Well-Known Member Licensed User

    ... siehe Anhang ... :)

    Gruß
    specci48
     
  17. berndgoedecke

    berndgoedecke Active Member Licensed 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
     
  18. JOTHA

    JOTHA Well-Known Member Licensed User

    Hallo berndgoedecke,

    ich habe mich jetzt mal in SQLite reingekniet.

    ... funktioniert schon ganz gut.
    Ich brauche jetzt aber auf dem PPC folgende DLL's:

    SQLite.Interop.060.dll
    System.Data.SQLite.Device.dll


    Nach langer Suche habe ich nur einen toten LinK gefunden:

    http://www.screentoaster.com/watch/...my_first_programhttp:/sqlite.phxsoftware.com/

    :(

    Weiß jemand, wo ich diese zwei DLL's herkriege?
     
  19. JOTHA

    JOTHA Well-Known Member Licensed User

    Hallo specci48,
    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.
     
  20. berndgoedecke

    berndgoedecke Active Member Licensed 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
     
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice