Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Mit Klassen Durch Inhaltsverzeichnis

Begonnen von silentwolf, November 20, 2016, 10:59:55

⏪ vorheriges - nächstes ⏩

silentwolf

Hallo an alle!

Komme leider in folgender Situation nicht selbst weiter und hoffe jemand könnte mir auf die Sprünge helfen.

Ich habe eine Klasse erstellt indem ich Externe Daten verwalten möchte.

Diese Prozedur steht im Klassenmodule
Sub DateienImPfad()
   
    m_strDatei = Dir(PfadImport() & "*.accdb")
   
        Do Until m_strDatei = ""
           m_strDatei = Dir()
        Loop

End Sub


PfadImport ist eine Function die mir den Pfad mit Backslash und soweiter zurück liefert.

Diese Prozedur steht in einem herkömmlichen Modul..
Sub TesteDatenImInhaltsverzeichnis()
    Dim clsDir As clsExterneDatenbanken
   
    Set clsDir = New clsExterneDatenbanken
   
    clsDir.DateienImPfad


End Sub


Wenn ich diese TesteDatenImInhaltsverzeichnis() debuge läuft der Code ohne Probleme durch also soweit alles in Ordnung.

Nun zum eigentlichen Problem.. Ich möchte ein Listfeld mit diesen Inhaltsverzeichnis füllen..

Also wie bekomme ich die Dateien Zwischengespeichert damit ich beliebige Listenfelder in verschiedenen Formularen weiterverwenden kann?

Hoffe das ist verständlich? Irgendwie steh ich nun auf dem Schlauch und komme nicht dahinter.

Vielen Dank für Eure Hilfe!

LG

ebs17

Vielleicht führst Du Dir vor Augen, welche üblichen Datenherkünfte Access-Listenfelder benutzen:
- Werteliste => also kommagetrennte Auflistung
- Tabelle/Abfrage => also Tabelle füllen

Eine Klasse dafür sollte also etwas derartiges als Ausgabe erzeugen.
Mit freundlichem Glück Auf!

Eberhard

silentwolf

Hallo Eberhard,

ja das verstehe ich schon und ich bekomme es auch mit der Herkömmlichen Programmierung hin..
Aber was mir nicht ganz klar ist wie ich nun diese Daten Zwischenspeichern kann.?

Bekomme ja nicht mal ein debug.print hin ..( weis nicht irgendwie verstehe ich das nun nicht so ganz...
Also wenn ich ein Listenfeld fülle dann wie Du eben schon sagtest entweder mit Wertliste oder tabelle Abfrage..

Danke

MzKlMu

Hallo,
ZitatIch möchte ein Listefeld mit diesen Inhaltsverzeichnis füllen..
Fülle eine Tabelle.
Und das Listenfeld wird an diese Tabelle als Datenherkunft gebunden.
Gruß Klaus

silentwolf

Hallo Klaus,
Danke für den Tipp
na ja ich möchte es ja dynamisch haben und ich glaube das ich nicht mehr Glück habe eine Tabelle zu füllen als die Listbox ..
hmm
irgendwie glaub ich denke ich zu kompliziert...
Im  normalen Module habe ich es ja geschafft eine Listbox zu füllen mit dem angegebenen Pfad...  da es öfters verwendet werden soll möchte ich das selbe in einer Klasse erstellen.
Der Pfad und die darin enthaltenen Dateien werden jetzt per Klasse schon richtige durchlaufen nur wenn ich diese nun gleich in eine Tabelle speichere dann hab ich ja wieder den Nachteil es nicht dynamisch zu haben..

MzKlMu

Hallo,
Du brauchst entweder eine Werteliste die beim Auslesen zusammengestellt werden muss, oder eine Tabelle. Die Werteliste muss aber dann als globale Variable gespeichert werden, damit sie in allen Modulen zur Verfügung steht. Bei einem Neustart des Programmst, muss die Werteliste erst mal wieder gefüllt werden. Den Nachteil hat die Tabelle nicht.
Man müsste diese nur vor jedem neuen Einlesen leeren.
Gruß Klaus

silentwolf

Hallo Klaus,
nochmal danke..
Aber das ganze muss ich im Klassenmodul ergänzen oder?

im Klassenmodul des formulars habe ich es ja so gelöst

Private Sub Form_Current()
    Dim strDatei As String
   
    strDatei = Dir(PfadImport() & "*.accdb")
    Me!lstTabelDefs.RowSource = ""
   
    With Me.lstDateien
        .RowSource = ""
        Do Until strDatei = ""
           .RowSource = .RowSource & strDatei & ";"
           strDatei = Dir()
        Loop
    End With
   
    Me.lblDateien.Caption = Me.lstDateien.ListCount & " Access Dateien im Ordner " & CodeProject.Path

End Sub




MzKlMu

Hallo,
schreibe das in einem Modul in eine globale Variable (String).
Und im Formular weißt Du den String als Werteliste zu.

Me.Listenfeld.RowSource = GlobaleVariable
Gruß Klaus

silentwolf

Ok Danke das werde ich versuchen !

Vielen Dank

Schönen Sonntag noch!

ebs17

#9
Globale Variable und Klasse ist eine merkwürdige Kombination.

Ich beziehe mich auf den Eingangspost: Was gibt m_strDatei am Ende der Prozedur zurück. Wenn ein Code fehlerfrei durchläuft, besagt das noch lange nicht, dass etwas Sinnvolles erzeugt wird noch dass da das Gewünschte erzeugt wird, und für eine Rückgabe des Ergebnisses nach außen müsste man auch sorgen:
=> nicht Sub, sondern Funktion oder Property
=> Übergabe Wert von Membervariable

Tendenziell würde ich in der Klasse eine Property erzeugen, die als String die kommagetrennte Liste der Dateipfade enthält.
Mit freundlichem Glück Auf!

Eberhard

silentwolf

Hallo,

so ist es im Klassenmodul

Dim m_dbsExtern As Database
Dim m_rcsDaten As Recordset
Dim m_strRecordsetName As String
Dim m_strDatei As String
'

Public Property Let DateiName(strDateiname As String)
    m_strDatei = strDateiname
End Property

Public Property Get DateiName() As String
    DateiName = m_strDatei
End Property

Sub DateienImPfad()
   
    m_strDatei = Dir(PfadImport() & "*.accdb")
   
        Do Until m_strDatei = ""
           m_strDatei = Dir()
        Loop

End Sub


so habe ich es bis jetzt...

silentwolf

wollte eigentlich noch etwas hinzufügen

Sub OeffneExterneDB(strName As String)

    Set m_dbsExtern = OpenDatabase(CodeProject.Path & "\" & m_strDatei, , True)
   
End Sub


auch im Klassenmodul

ebs17

Ich bin desorientiert: Wofür steht m_strDatei?

Ursprünglich dachte ich, Du wolltest die Dateien eines Verzeichnisses über die Dir-Schleife versammeln, um sie in einem Listenfeld darstellen zu können. Jetzt hantierst Du mit Einzeldateien ...?

Vielleicht solltest Du Deine Strategie verraten, Codeinterpretation ist halt nur Interpretation.
Mit freundlichem Glück Auf!

Eberhard

MzKlMu

Hallo,
ob hier mit Klasse nicht einfach ein allgemeines Modul gemeint ist ?
Gruß Klaus

Josef P.

Hallo!

[eigentlich OT, da ich in diesem Code nichts von einem Inhaltsverzeichnis sehe]
ZitatSub OeffneExterneDB(strName As String)
    Set m_dbsExtern = OpenDatabase(CodeProject.Path & "\" & m_strDatei, , True)
End Sub

Welche Erwartungshaltung hast du von diesem Code?
Beispiel:
ZitatOeffneExterneDB "Test.accdb"
Würdest du nun erwarten, dass die Datei mit dem Namen Test.accdb geöffnet wird, oder die Datei mit dem Namen, der in der Variablen m_strDatei steht? ;)

Noch etwas (ist zwar nicht falsch, halte ich aber als Schnittstelle für fehleranfällig)
Ich würde die Referenz auf die geöffnete Datei als Rückgabewert von OeffneExterneDb verwenden und nicht direkt in die Modulvariable stellen.

Falls in der Klasse diese Datenbank verwendet werden soll, würde ich einen anderen Namen wählen.

Beispiel (nur Luftcode!):
private function OeffneExterneDB(strName As String) as dao.database
    Set OeffneExterneDB = OpenDatabase(CodeProject.Path & "\" & strName, , True)
End function

public sub VerwendeExterneDb(byval strName as String)
    Set m_dbsExtern = OeffneExterneDB(strName)
end Sub

'oder statt VerwendeExterneDb eine Property-Prozedur:
public property let ExterneDbDateiName(byval strName as string)
   Set m_dbsExtern = OeffneExterneDB(strName)
end Property


Begründung für den anderen Namen:
Wenn man eine Klasse verwendet, soll man sich keine Gedanken machen müssen, ob die Datei geöffnet werden muss. Man stellt nur ein, dass man diese Datei verwenden will.

mfg
Josef