Access-o-Mania

Access-Forum => Access Programmierung => Thema gestartet von: Guenther am Februar 16, 2018, 11:32:57

Titel: verwaister Verzeichnispfad
Beitrag von: Guenther am Februar 16, 2018, 11:32:57
Liebe AccesslerInnen! Ich könnte mal Hilfe gebrauchen.
Ich habe in einer DB eine Tabelle mit den Namen aller Mitglieder. Für jedes Mitglied wird, sofern ein Brief erstellt wird, auf einem Netzlaufwerk ein Verzeichnis erstellt. Nun hat sich leider ergeben, dass Namen gelöscht wurden, das Verzeichnis auf dem Netzwerk aber nicht. Das ist inzwischen ausgeschlossen, trotzdem liegen einige verwaiste Verzeichnisse dort.
Nun würde ich gerne in einer Schleife das Netzlaufwerk durchgehen und mir die verwaisten Verzeichnisse in einer MsgBox anzeigen lassen. Könnte mir da jemand auf die Sprünge helfen - DANKE  :D
Titel: Re: verwaister Verzeichnispfad
Beitrag von: daolix am Februar 16, 2018, 13:00:34
Hallo
du könntest per Dos'en-Dir die Namen der Verzeichnisse in eine Textdatei umleiten und diese dann als Grundlage einer Abfrage mit z.B. einer Where Not In - Klausel mit deiner Namenstabelle abgleichen und dir dann die überschüssigen Verzeichnisse anzeigen lassen.
Titel: Re: verwaister Verzeichnispfad
Beitrag von: Guenther am Februar 16, 2018, 18:41:37
Hallo daolix,
leider kann ich mit "Dos'en-Dir" nichts anfangen :( Kannst du deinen Vorschlag etwas konkretisieren? Nehmen wir an, mein Netzlaufwerk lautet J:, das Hauptverzeichnis Daten und für jedes Mitglied wird in diesem Ordner ein Unterordner angelegt.
Danke :)
Titel: Re: verwaister Verzeichnispfad
Beitrag von: daolix am Februar 16, 2018, 19:11:45
Hallo
mit Dos'en-Dir ist der "DOS" - Dir-Befehl des Commandozeileninterpreters gemeint.

Folgendes Bsp geht von der Annahme aus das die einzelnen Verzeisnissnamen der Mitglieder ein entsprechendes Feld in einer deiner Tabellen besitzen. (großgeschriebenes anpassen)
dim s as string
call createobject("wscript.shell").run("cmd.exe /c dir j:\daten\ /b /ad  1>j:\daten\sdir.txt", 0, true)
with currentdb.openrecordset("select f1 from [text;database=j:\daten\;hdr=no].sdir.txt where (((f1) not in (select DEIN_ID_FELD from DEINE_TABELLE)));")
do while .eof = false
s = s & .fields(0).value & vbcrlf
.movenext
loop
.close
end with
msgbox s
kill "j:\daten\sdir.txt"
Titel: Re: verwaister Verzeichnispfad
Beitrag von: Guenther am Februar 16, 2018, 19:50:53
Hallo daolix,
Danke für den Code!  :D Leider kann ich den Code nicht mehr vor nächsten Montag einpflegen. Ich gebe dann Rückmeldung.
Titel: Re: verwaister Verzeichnispfad
Beitrag von: Guenther am Februar 21, 2018, 09:13:08
Hallo daolix,
konnte mich leider erst heute wieder der Sache widmen.
Die select-Anweisung habe ich entsprechend angepasst. Beim Ausführen erhalte ich leider eine Fehlermeldung in Zeile 3 (with currentdb.openrecordset("select f1 from [text;database=j:\daten\;hdr=no].sdir.txt where (((f1) not in (select DEIN_ID_FELD from DEINE_TABELLE)));"). Es könne das Objekt -sdir.txt- nicht gefunden werden. :-\.
Zugriff auf das Netzlaufwerk liegt vor. Es scheint so, als ob die sdir.txt nicht erstellt wird. Hast du eine Idee?
DANKE
Titel: Re: verwaister Verzeichnispfad
Beitrag von: Lachtaube am Februar 21, 2018, 10:10:17
Man könnte ja durchaus einmal nachsehen, ob die Datei sdir.txt vor dem Auftreten des Fehlers existiert.
Titel: Re: verwaister Verzeichnispfad
Beitrag von: Guenther am Februar 21, 2018, 10:38:16
Hallo Lachtaube,
die Datei besteht eben nicht- daher kann eben dann auch nicht darauf zugegriffen werden. Mir ist leider nicht klar, warum sie erstellt wird.
Titel: Re: verwaister Verzeichnispfad
Beitrag von: Lachtaube am Februar 21, 2018, 11:26:20
Der Zweck liegt darin begründet, alle Verzeichnisnamen zu ermitteln, damit in einer SQL-Abfrage die Verzeichnisnamen ausgeschlossen werden können, die keine Waisen sind - also nur die Waisen übrig lassen.

Kannst Du die Datei denn in einer Eingabeaufforderung-Sitzung manuell anlegen? Zuerst J: eingeben, danach cd \daten eintippen und anschließend den Befehl dir /b /ad > sdir.txt absetzen (jede Eingabe jeweils mit der Eingabetaste abschließen). Danach prüfen, ob die Datei sdir.txt im Verzeichnis existiert.
Titel: Re: verwaister Verzeichnispfad
Beitrag von: Guenther am Februar 21, 2018, 12:19:11
Hallo Lachtaube,
das geht- die Datei wird erstellt!
Titel: Re: verwaister Verzeichnispfad
Beitrag von: Lachtaube am Februar 21, 2018, 12:32:57
Dann sollte der Code von Daolix ja laufen, wenn Du die zweite und letzte Zeile auskommentierst.
Titel: Re: verwaister Verzeichnispfad
Beitrag von: Guenther am Februar 21, 2018, 12:50:13
DANKE! Werde das nochmals probieren.
Titel: Re: verwaister Verzeichnispfad
Beitrag von: DF6GL am Februar 21, 2018, 13:32:10
Hallo,

Access mag die Punkte in der verknüpften Tabelle nicht..
Ein Aliasname löst das Problem:

with currentdb.openrecordset("select T.f1  from [text;database=j:\daten\;hdr=no].sdir.txt as T where (((T.f1) not in (select DEIN_ID_FELD from DEINE_TABELLE)));")
Titel: Re: verwaister Verzeichnispfad
Beitrag von: Guenther am Februar 22, 2018, 12:25:24
Hallo!
Konnte inzwischen wieder mit dem Problem beschäftigen. Es ist definitiv so, dass die txt-Datei in Zeile nicht erstellt wird. Wenn ich sie manuel über die Eingabeaufforderung erstelle, dann läuft der Code in der restlichen Form wie von daolix vorgeschlagen durch. Das von DF6GL angedeute Problem zeigt sich nicht.
Leider werden aber in der MsgBox dann ALLE Namen angezeigt. Mit dem Filter klappt es leider noch nicht. Habe in meiner Tabelle ein Feld exakt den Namen des Verzeichnisses auf dem Laufwerk entspricht. Dieses habe ich in der select-Anweisung eingepflegt. Müsste ich den Code von einem Formular mit den Namen aus aufrufen?
Titel: Re: verwaister Verzeichnispfad
Beitrag von: daolix am Februar 22, 2018, 13:32:29
Hallo
Wenn keine txt Datei erstellt wird  (auch keine 0-Byte große) könnte es bedeuten das wscript wohl nicht ausgeführt wird. K.A warum. Sicherheitseinstellungen?
In der Textdatei stehen nur die Namen der Verzeichnisse von J:\Daten\ (z.B. Guenther BeiAOM). In deiner Tabelle sollte dann auch nur das stehen, nicht der komplette Path, oder zusätze wie z.B. ein backslash.
Zitat
Müsste ich den Code von einem Formular mit den Namen aus aufrufen?
Nein. den Code in ein Modul als Sub einfügen und diese Sub Ausführen.



 



 
Titel: Re: verwaister Verzeichnispfad
Beitrag von: Guenther am Februar 22, 2018, 16:28:34
Könnten Leerstellen ein Problem sein? Grundsätzlich steht in der Tabelle exakt dasselbe wie in der Textdatei.
Titel: Re: verwaister Verzeichnispfad
Beitrag von: Guenther am Februar 22, 2018, 16:33:53
Könnten Leerstellen ein Problem sein? In meiner Tabelle steht exakt dasselbe wie in der Textdatei!
Titel: Re: verwaister Verzeichnispfad
Beitrag von: daolix am Februar 22, 2018, 16:46:17
Ein schneller Test mit Leerstellen zwischen den Wörtern lief bei mir zumindest ohne Probleme.
Wenn das jetzt bei dir nicht funktioniert dann ggf eine VBA-Dir Lösung mit z.b. DLookup (anpassen)
dim d$, p$, s$
p = "j:\daten\
d = dir(p, vbdirectory)
do while len(d)
if ((getattr(p & d) and vbdirectory) = vbdirectory) and ((d <> ".") and (d <> "..")) then
if nz(dlookup("EIN_FELD", "DEINE_TABELLE", "DEIN_ID_FELD='" & d & "'"), "null") = "null" then s = s & d & vbcrlf
end if
d = dir()
loop
msgbox s
Titel: Re: verwaister Verzeichnispfad
Beitrag von: Guenther am Februar 22, 2018, 16:50:25
DANKE für die Rückmeldung ;) Keine Ahnung, warum es bei mir nicht geht.
Titel: Re: verwaister Verzeichnispfad
Beitrag von: Guenther am Februar 22, 2018, 23:11:40
Sorry! Muss nochmal nachhaken - verstehe leider nicht ganz, was in dem dlookup-befehl mit "Ein_Feld" gemeint ist.  :-\
Titel: Re: verwaister Verzeichnispfad
Beitrag von: Lachtaube am Februar 23, 2018, 11:21:26
EIN_FELD kann irgendein existierender Pflichtfeldname sein. Denn findet das Kriterium keinen Wert, wird das 2. Argument der Nz-Funktion wirksam und der Code folgend auf Then ausgeführt.
Titel: Re: verwaister Verzeichnispfad
Beitrag von: Guenther am Februar 28, 2018, 22:26:19
SORRY! Ich komme leider nicht weiter. Es wird leider in der MsgBox immer alle Namen angezeigt. Der zweite Code führt bei mir zum Absturz der Anwendung  :(
Gibt es einen Tipp, was ich falsch machen könnte? Wäre dankbar dafür :)
Oder gibt es noch eine Alternative? Schon mal DANKE!
Titel: Re: verwaister Verzeichnispfad
Beitrag von: Guenther am März 02, 2018, 20:20:15
Ich schätze, dass mein Problem Kommas und Leerstellen in den Verzeichnisnamen sind. Ist es so, dass der Code die Daten der txt-Datei gleich behandelt, als ob ich daraus eine Tabelle erstellen möchte. Dann ist klar, dass da nichts vernünftiges daraus werden kann. Werde jetzt die txt-Datei mit Umlauten erstellen und von Hand eine Tabelle erstellen, welche ich dann in einer Abfrage mit dem Feld in meiner Ausgangstabelle abgleiche. Könnte man eine brauchbare Tabelle via Code erstellen, welche den ganzen Verzeichnisname in ein Feld fasst?
Titel: Re: verwaister Verzeichnispfad
Beitrag von: Frithjiof am März 03, 2018, 11:03:09
Hallo  Guenther

Hier eine VBA-Prozedur die dein Problem lösen sollte.

Mit <Dir(sPath, vbDirectory)> wird  das aktuelle Verzeichnis gesetzt und der erste Eintrag zurückgegeben.
Wenn sPath existiert ist der erste Eintrag ein "." der zweite "..".
Alle nachfolgenden Aufrufe von <Dir()> ohne Parameter liefern einen Eintrag nach dem anderen.

In der Variablen sDir befindet sich der Verzeichnisname.  Dieser muss in deiner Datenbank existieren.
In meinem Beispiel ist  Verzeichnisname =  Mitgliedsnummer ("Mitglnr")
Sollte er nicht existieren, dann löschen.
Meine Routine verschiebt das Verzeichnis mit  Name sOldName As sNewName sicherheitshalber in ein anderes Verzeichnis. (sNewPath = "C:\Ablage\kill\").

Sub meindeldir()
    Dim sDir As String
    Dim sPath As String
    Dim sNewPath As String
    Dim dbs As DAO.Database
    Dim rst As DAO.Recordset
    Dim sNewName As String
    Dim sOldName As String
    Set dbs = CurrentDb
    Set rst = dbs.OpenRecordset("select DBO_Adresse.Mitglnr from DBO_Adresse;")
     sPath = "C:\Ablage\Schrift\"
     sNewPath = "C:\Ablage\kill\"
     sDir = Dir(sPath, vbDirectory)
     Do While sDir <> ""
        If sDir <> "." And sDir <> ".." Then
            rst.FindFirst ("MITGLNR ='" & sDir & "'")
            If rst.NoMatch = True Then
                sNewName = sNewPath & sDir
                sOldName = sPath & sDir
                Name sOldName As sNewName
            End If
        End If
        sDir = Dir()
     Loop
    rst.Close
    dbs.Close
End Sub
Du müsstest die Verzeichnisse anpassen, bzw anlegen und den Recordset dann sollte es laufen.
Frithjof
Titel: Re: verwaister Verzeichnispfad
Beitrag von: Guenther am März 15, 2018, 19:38:43
DANKE an alle, die für mich mitgehirnt haben.
Habe mein Problem etwas konventioneller gelöst. Das erste Problem waren die Umlaute, habe zuerst in der Eingabeaufforderung den Code-Satz geändert, so dass ich eine Textdatei erhalte, die die Umlaute in den Verzeichnisnamen berücksichtigt. Dann habe ich eine Abfrage erstellt und darüber die "verwaisten" Verzeichnisse anzeigen lassen. Leider nicht ganz so elegant, aber Lösungsorientiert. Problem gelöst  :)