Seite 1 von 2

Aufblitzen der Liste

BeitragVerfasst: 16. Mai 2021, 10:00
von kathyv
Hallo,
ein Klick in eine Liste soll den Datensatz des angeklickten Eintrags im Formular zeigen Das passiert auch.
Aber ist das Aufblitzen der Liste beim Klick vermeidbar?
Es muss mit diesem Code zusammenhängen:
Code: Alles auswählen
Private Sub lstPerso_AfterUpdate()
  Me.Recordset.FindFirst "ID=" & Str(lstPerso)
End Sub

Es gibt sonst keinen Code in der DB, der das verursachen könnte. Wird er deaktiviert, bleibt das Aufblitzen aus.
Die DB wurde angelegt, um das Phänomen zu überprüfen, das auch in der eigentlichen DB mit mehr Code auftritt.
Kann man das Aufbitzen vermeiden?
LG Kathy

Re: Aufblitzen der Liste

BeitragVerfasst: 16. Mai 2021, 11:01
von KlausMz
Hallo,
das Aufblitzen find ich jetzt nicht so störend, es ist auch nicht immer. Ich glaube auch, dass man das nicht wegkriegt.

Noch eine Anmerkung.
Warum machts Du aus einer Zahl einen String ?
Code: Alles auswählen
  Me.Recordset.FindFirst "ID=" & Str(lstPerso)

Außerdem sollte es einen Bezug auf das Formular geben. Also eher so:
Code: Alles auswählen
  Me.Recordset.FindFirst "ID=" & Me.lstPerso

Re: Aufblitzen der Liste

BeitragVerfasst: 16. Mai 2021, 12:14
von kathyv
Hallo,
das Aufblitzen.... ist auch nicht immer.

Hast du das an dieser DB festgestellt oder aufgrund langjähriger Erfahrung? Es kann sein, dass ich bei anderen DB darauf nicht geachtet habe oder auch weil es nicht auftrat.
Warum machts Du aus einer Zahl einen String ?

lt. Hilfe: Criteria Erforderlich String Eine Zeichenfolge, um den Datensatz zu finden.
Man beginnt ja das Kriterium mit "ID=", also einem String und m.E. dann weiter mit Str(lstPerso), also auch einem String.
Ich weiß, dass es ohne die Str-Funktion geht, aber das führe ich darauf zurück, dass Access das intern regelt.
Besser auf jeden Fall Me.lstPerso. Bei fehlendem Me und bei dem Punkt (statt Me!lstPerso) scheint Access auch "großzügig" zu sein.
Code: Alles auswählen
 Me.Recordset.FindFirst

Warum versagt bei der Eingabe eigentlich die IntelliSense? Hat MS das übersehen oder ist das logisch?
LG Kathy

Re: Aufblitzen der Liste

BeitragVerfasst: 16. Mai 2021, 13:00
von KlausMz
Hallo,
ich habe das in deine Beispieldb festgestellt. Und da finde ich das gelegentliche Aufblitzen wenig störend.

Was das Str betrifft, so interpretierst Du die Hilfe falsch. Es geht um den Gesamtausdruck für das Kriterium und der muss ein String sein. Die einzelnen Bestandteile (Felder) des Strings sollten in den original Datentypen übergeben werden. ID ist eine Zahl und da ist auch der zu vergleichende Wert eine Zahl. Wenn es mit Str funktioniert, ist das der "Großzügigkeit" von Access zu verdanken.
Str wird in einem Kriterium so gut wie nie gebraucht und ist im hier gezeigten Kontext falsch.
So ist es richtig:
Code: Alles auswählen
Me.Recordset.FindFirst "ID=" & Me.lstPerso

Würdest Du hier eine feste Zahl übergeben, würde das so aussehen:
Code: Alles auswählen
Me.Recordset.FindFirst "ID= 123"

Und das "ID= 123" ist dann der Kriteriumsstring.
Hat man einen String zum Vergleich, so ist der in Hochkomma einzuschließen, aber auch hier ohne Str.
Wenn die ID ein String (Text) wäre, würde das so aussehen:
Code: Alles auswählen
Me.Recordset.FindFirst "ID='" & Me.lstPerso &"'"

Dann wäre das der Kriteriumsstring:
Code: Alles auswählen
Me.Recordset.FindFirst "ID= '123'"


Zu IntelliSense kann ich Dir nichts sagen. Der 1. Punkt funktioniert, der 2. nicht, ist bei mir auch so.

Re: Aufblitzen der Liste

BeitragVerfasst: 16. Mai 2021, 13:46
von knobbi38
@Klaus,

hier liegst du heute aber etwas daneben.

Kathy hat das schon sehr richtig erkannt und interpretiert. Das Argument bei FindFirst wird als String übergeben, also korrekt wäre:
Code: Alles auswählen
Me.Recordset.FindFirst "ID=" &  CStr(Me.lstPerso.Value)
' oder auch
strCriteria = "ID=" &  CStr(Me.lstPerso.Value)
Me.Recordset.FindFirst strCriteria
Bei deinem Vorschlag kommt stattdessen die implizite Typkonvertierung zur Anwendung.

Man könnte sich den gesamten Kriterienstring auch mit BuildCriteria zusammensetzen:
Code: Alles auswählen
strCriteria = Application.BuildCriteria("ID", dbLong, CStr(Me.lstPerso.Value))

Statt me.lstPerso.Value geht natürlich auch den Bang-Operator, also z.B. me!lstPerso.Value, aber das ist ein anderes Thema.

Gruß Ulrich

Re: Aufblitzen der Liste

BeitragVerfasst: 17. Mai 2021, 09:53
von Marco PB
Ein braver Schüler konvertiert eine Zahl in einem String um sie zu einem String anzuhängen, zeigt aber dabei, den Unterschied zwischen dem Operator ' + ' und eben den Operator ' & ' nicht verstanden zu haben. Der einzige Unterschied ist nämlich dass ' & ', anders als ' + ', gegebenenfalls eine Zahl in ein String ohne Leerzeichen vorne und hinten konvertiert, sodass eine explizite Konvertierung ganz überflüssig ist und auf Kosten der Lesbarkeit geht.

Re: Aufblitzen der Liste

BeitragVerfasst: 17. Mai 2021, 10:25
von knobbi38
@Marco PB

Hier war mit keiner Silbe die Rede vom "+" Operator zum concatenieren von Strings.
Der einzige Unterschied ist nämlich dass ' & ', anders als ' + ', gegebenenfalls eine Zahl in ein String

Beim "&" Operator wird nicht "gegebenenfalls" ein numerischer Datentyp in einen String konvertiert, sondern immer.
... sodass eine explizite Konvertierung ganz überflüssig ist und auf Kosten der Lesbarkeit geht

Seit wann geht eine explizite Konvertierung zulasten der Lesbarkeit bzw. ist sie überflüssig?
Das sind sonderbare Ansichten ...

Ulrich

Edit: Tippfehler bereinigt.

Re: Aufblitzen der Liste

BeitragVerfasst: 17. Mai 2021, 11:04
von Bitsqueezer
Hallo,

zum Thema "IntelliSense": Im Fall des Formular-Recordsets ist das korrekt, da es sich hier NICHT um das DAO-Recordset handelt, sondern nur um ein generisches Objekt, genauso wie "Object" oder "Control" oder "Form".

Das heißt, es kann darin mehr als ein Objekttyp enthalten sein und IntelliSense listet nur solche Elemente, die allen in diesem Objekt enthaltenen Eigenschaften/Methoden gemeinsam sind.

Was nicht ganz so bekannt ist (weil eigentlich hauptsächlich von mittlerweile ausgestorbenen ADPs verwendet): Ein Formular-Recordset kann ein DAO-Recordset genauso wie ein ADO-Recordset sein. Im Normalfall ist es ein DAO-Recordset, man kann aber auch ein ADO-Recordset erstellen und es dem Formular-Recordset per Set-Befehl zuweisen. Das Formular kann dann wie bei DAO mit den etwas anderen Eigenschaften und Methoden von ADO genauso umgehen.

Wenn man IntelliSense verwendet möchte, muß man es hier also genau umgekehrt machen: Eine DAO-Recordsetvariable erstellen und dieser das Formular-Recordset zuweisen. Mit der Variable klappt dann auch IntelliSense.

Das generische Formular-Recordset-Objekt ist also sozusagen ein "Wrapper" für das echte Recordset-Objekt, das selbst keine Eigenschaften und Methoden hat und alle "Anfragen" an das darunterliegende Objekt weiterleitet. Zwei Ebenen kann IntelliSense aber nicht verarbeiten und da das Wrapper-Objekt nichts liefert, liefert auch IntelliSense nichts.

Natürlich muß man beachten, daß hier auch der Compiler nichts prüft. Will man also nicht erst zur Laufzeit auf mögliche Fehler stoßen, muß man in der Tat die Methode mit der Zuweisung zu einem DAO-Recordset verwenden. Der Compiler wird "Me.Recordset.Blödsinn" also nicht anmeckern.

Gruß

Christian

Re: Aufblitzen der Liste

BeitragVerfasst: 18. Mai 2021, 13:56
von kathyv
Hallo,
danke.
Muss man das Aufblitzen also tatsächlich hinnehmen? Wenn es nur manchmal auftaucht, muss es ja einen Grund dafür geben.
zum Plusoperator
aus dem Direktbereich ergeben sich interessante Optionen für die Verkettung von Strings mit dem Plusoperator
Code: Alles auswählen
?"Hamburg" + NULL
Null
?"Hamburg" + ""
Hamburg

LG Kathy

Re: Aufblitzen der Liste

BeitragVerfasst: 19. Mai 2021, 10:07
von Gast
@Ulrich
Ansichten von einer, der seit 1973 in Basic programmiert und der uA. hunderte Programme korrigiert hat, die Andere geschrieben und nicht auf die Reihe gekriegt haben.
Und er heisst concatEnieren, oder noch besser verketten.

Re: Aufblitzen der Liste

BeitragVerfasst: 19. Mai 2021, 11:47
von knobbi38
Hallo Gast,

das Basic von 1973 sah aber noch ganz anders aus, als heutiges Visual Basic und gerade wenn du dich schon so lange mit Basic beschäftigst hast, solltest du eigentlich die Vorzüge einer expliziten Typkonvertierung erkannt haben und welche Fehlerquellen mit einer impliziten Konvertierung einhergehen.
Allerdings kann ich dir insoweit folgen, daß nicht jede implizite immer gleich durch eine explizite Konvertierung ersetzt werden muß bzw. sollte. Wenn man jedoch gerade eine Datentypkonvertierung hervorheben möchte oder an der Stelle mögliche Fehlerquellen ausschalten möchte, sollte man das auch durch eine explizite Konvertierung deutlich machen. Gerade Einsteiger habe es dadurch leichter.

Meine ganz persönliche Meinung ...

Ah, noch eine Frage, rein interessehalber: mit welchem Basicdialekt hast du 1973 auf welcher Maschine gearbeitet?

Gruß Ulrich

PS. Danke für den Hinweis auf den Tippfehler.

Re: Aufblitzen der Liste

BeitragVerfasst: 19. Mai 2021, 17:51
von derArb
Hallo,
ganz sicher hat niemand 1973 schon in Basic programmierte "Volksanwendungen" auf den entsprechend dafür
gebauten "Volksmaschinen" korrigiert.
Maschinen wie Altair als eine der ersten, gab es erst ab ca. 1975. Da kamen sie dann alle wie Sinclair, Acorn, Commodore usw.
Jede Maschine hatte eine angepasste Basic-Sprache.
Ich hatte als PC den Texas Instruments TI-99/4A mir damals besorgt und in TBasic programmiert.
Das war immerhin schon eine Maschine mit 16bit Hauptspeicher und einer Erweiterungsbox von 16mb auf 32mb RAM
inkl. 5Zoll Floppy für 1000 DM !!!!... :badgrin:

Re: Aufblitzen der Liste

BeitragVerfasst: 19. Mai 2021, 18:33
von Gast
Hallo,
wo wir gerade in der Abtlg. "Früher" sind
Ich quäle mich gerade mit dem Phänomen eines alten Programms rum, bei dem folgendes Phänomen auftaucht.
Wird in dem Programm eine neue Vorlage erstellt, so landet sie in dessen Vorlagenordner. Sie kann genutzt werden und ist auch im Datei-Öffnen-Dialog des Programms zu sehen und zu verwenden.
Geht man in den Pfad im Win-Explorer, so ist sie dort nicht zu sehen. Aber alle Vorlagendateien, die vom Programm her dort sind.
Bisher im Win10-Explorer versucht:
1) Unter Ansicht , Optionen, Ansicht alle Dateien anzeigen, versteckte usw.; kein Erfolg
2) In der Eingabeaufforderung den Pfad auf den Vorlagenordner eingestellt.
- Mit Dir werden nur die Vorlagendateien des Programms gezeigt, nicht die selbst erstellte.
- Mit Attrib *.* werden nur die Vorlagendateien des Programms gezeigt und mit A angezeigt, also Archiv; die selbst erstellte ist nicht dabei.
- Mit attrib -a /s /d kommt "Zugriff verweigert". Daselbe mit dem -H-Parameter
Bis jetzt also nichts erreicht.
Warum wird die selbst erstellte Vorlage nicht gezeigt; auch unter DOS nicht? Unter den Eigenschaften sind sie nicht als schreibgeschützt oder versteckt aufgeführt. Und vor allem, wie kann ich meine Datei im Explorer angezeigt bekommen?
LG Kathy

Re: Aufblitzen der Liste

BeitragVerfasst: 19. Mai 2021, 20:07
von Bitsqueezer
Hallo,

es gab nicht nur PCs in der Vergangenheit. BASIC gibt es seit 1964...
https://devskiller.com/de/geschichte-de ... rsprachen/
https://de.wikipedia.org/wiki/BASIC

@Kathy:
Vorlagen werden mittlerweile meistens nicht mehr im "Programme"-Ordner erstellt. Dort liegen nur die, die der Hersteller mitliefert. Für eigene werden dann entweder Ordner im "Dokumente"-Ordner erstellt oder in den Systemordnern des Benutzerprofils wie "Local", "LocalLow" oder "Roaming". Das macht Windows teilweise selbst, so daß alte Programme selbst davon nichts mitbekommen.
Am einfachsten suchst Du mal die gesamte Platte nach dem Dateinamen ab, das geht am leichtesten mit dem Explorer selbst.
Auch als Admin hast Du auf einige Ordner keinen Zugriff, das merkst Du dann, wenn Du "DOS"-Befehle verwendest (wobei es DOS in dem Sinn nicht mehr gibt). Das ist genauso, wenn Du manuell versuchst, auf bestimmte Systemordner zuzugreifen.
Statt "Attrib" würde man wennschon, dann "Dir" verwenden.

Gruß

Christian

Re: Aufblitzen der Liste

BeitragVerfasst: 20. Mai 2021, 09:12
von knobbi38
Hallo Kathy,

du kannst die Vorlagen nicht sehen, weil sie wahrscheinlich nicht in dem Ordner sind. Wie Christian schon gesagt hat, bleibt dir nur übrig, die Datei auf der gesamten Festplatte zu suchen, entweder mit dem Explorer, der Eingabeaufforderung und Dir() oder in der Powershell z.B. mit Get-ChildItem -path "C:\" -recurse | where name -like "*.txt"

Gruß Ulrich