PDA

Vollständige Version anzeigen : Unterformular aktualisieren


Artistline
16.07.2013, 12:33
Hallo zusammen,

ich habe ein Formular (frm_akten) und darin ein Unterformular (UFO_KundenDokus). Aus dem Formular versuche ich mein Unterformular zu aktualisieren da hier beim Dokumentensystem die Link für Dateien in einem bestimmten Ordner hinterlegt werden kann. Also im Formular habe ich ein Feld "AktenOrdner" und hier wird der Ordnerpfad hinterlegt. Im Unterordner werden automatisch die einzelnen Dateien aktualisiert. Ich habe jetzt allerdings im Formular ein Button mit der ich einfach den Inhalt des Feldes (AktenOrdner) leere, so soll auch gleichzeitig die Inhalte des Unterformulars im Feld (Aktenlink) geleert werden.
Hierzu brauche ich eure Hilfe da die Aktualisierung nicht wirklich funktioniert.

Zum Einlesen der Daten benütze ich folgenden Code:

Public Sub Einlesen()
'hier das Verzeichnis eingeben in dem gesucht wird
Dim SuchVerzeichnis As String
Const DatTyp = "*.*"
Const ZielTab = "tbl_dokus"
Dim i As Integer
Dim AktDatei As String
Dim rs As DAO.Recordset
SuchVerzeichnis = Me.Parent!AktenOrdner & "\"
'Unter extras Verweise muss Microsoft DAO ausgewählt sein
CurrentDb.Execute "DELETE * FROM tbl_dokus WHERE beschwerde_id_f =" & Me.Parent!beschw_id
Set rs = CurrentDb.OpenRecordset(ZielTab)
AktDatei = Dir(SuchVerzeichnis & "\" & DatTyp)
While Len(AktDatei) > 0
rs.AddNew
'Feld der Tabelle in das geschrieben wird
rs("beschwerde_id_f") = Me.Parent!beschw_id
rs("Aktenlink") = SuchVerzeichnis & AktDatei
rs.Update
AktDatei = Dir ' nächste Datei
Wend
rs.Close
Set rs = Nothing
Me.Requery
End Sub

Um einen Ordner für AktenOrdner auszuwählen benütze ich folgenden Code:

Private Sub Befehl146_Click()
Dim strFile As String
strFile = OrdnerDlg()
'Wenn abgebrochen wird, bleibt der alte Wert stehen.
If strFile <> "" Then Me!AktenOrdner = strFile
'UFO aktualisieren, indem die Public Sub Einlesen aufgerufen wird.
Me!UFO_KundenDokus.Form.Einlesen
End Sub

Um schliesslich falsche Verlinkungen zu leeren benütze ich folgenden Code:

Private Sub cmdLöschen_Click()
Me.AktenOrdner = Null
Me!UFO_KundenDokus.Form.Requery
End Sub

Wenn ich jetzt cmdLöschen betätige, wird zwar im Formular das Feld AktenOrdner geleert aber im Unterformular bleiben die Felder noch bestehen.
Im Unterformular habe ich noch ein Aktualisierungsbutton und wenn ich jetzt diesen betätige bekomme ich eine Fehlermeldung Laufzeitfehler 52. Es springt im Code zum Private Sub Einlesen in die Zeile AktDatei. Der Wert ist natürlich Null da keine Verlinkung im Feld AktenOrdner besteht.
Gib es da ein Möglichkeit mein Unterformular zu aktualisieren wenn ich gleichzeit im Formular den Wert des Feldes AktOrdner leere?

Gruß
Artistline

maikek
16.07.2013, 12:41
Moin,
so wie ich das verstanden habe, musst du dann auch die Tabelle tbl_dokus leeren, wenn du dein Suchfeld zurücksetzt.
maike

Artistline
16.07.2013, 12:44
Ist richtig maikek,

das passiert ja hier beim Einlesen:

CurrentDb.Execute "DELETE * FROM tbl_dokus WHERE beschwerde_id_f =" & Me.Parent!beschw_id

Ich muss evtl eine IF Funktion vorher bastelt....weiss noch nicht genau wie ich es realisieren soll....

maikek
16.07.2013, 13:00
sollte so passen:
'...
CurrentDb.Execute "DELETE * FROM tbl_dokus" 'die soll doch komplett leer, oder?
If not IsNull(Me.Parent!AktenOrdner) then
SuchVerzeichnis = Me.Parent!AktenOrdner & "\"
'Unter extras Verweise muss Microsoft DAO ausgewählt sein
Set rs = CurrentDb.OpenRecordset(ZielTab)
'...
Set rs = Nothing
End if
Me.Requery
maike

Artistline
16.07.2013, 13:15
hallo maikek, die soll nicht komplett leer sein sondern nur für den Datensatz der gerade offen ist....bei deiner Variante wird alles gelöscht in der Tabelle oder?

CurrentDb.Execute "DELETE * FROM tbl_dokus WHERE beschwerde_id_f =" & Me.Parent!beschw_id

Ist schon richtig...nur muss ich es an der richtigen Stelle anwenden damit mein Unterformular ohne Fehler aktualisiert wird.

Habe den Code soweit verändert:

Public Sub Einlesen()
'hier das Verzeichnis eingeben in dem gesucht wird
Dim SuchVerzeichnis As String
Const DatTyp = "*.*"
Const ZielTab = "tbl_dokus"
Dim i As Integer
Dim AktDatei As String
Dim rs As DAO.Recordset

If Not IsNull(Me.Parent!AktenOrdner) Then
SuchVerzeichnis = Me.Parent!AktenOrdner & "\"
'Unter extras Verweise muss Microsoft DAO ausgewählt sein
CurrentDb.Execute "DELETE * FROM tbl_dokus WHERE beschwerde_id_f =" & Me.Parent!beschw_id
Set rs = CurrentDb.OpenRecordset(ZielTab)
AktDatei = Dir(SuchVerzeichnis & "\" & DatTyp)
While Len(AktDatei) > 0
rs.AddNew
'Feld der Tabelle in das geschrieben wird
rs("beschwerde_id_f") = Me.Parent!beschw_id
rs("Aktenlink") = SuchVerzeichnis & AktDatei
rs.Update
AktDatei = Dir ' nächste Datei
Wend
rs.Close
Set rs = Nothing
End If
Me.Requery
End Sub

An sich fehlt hier noch die Aktualisierung wenn es NULL ist im Unterformular....

maikek
16.07.2013, 14:14
imho kann die Delete-Anweisung dann genauso einfach ein Mal außerhalb des If-Blocks stehen, nur halt mit dem Kriterium.
maike

Artistline
16.07.2013, 15:16
genau das hatte ich auch im Sinn..allerdings verstehe ich nicht warum ausserhalb der If Anweisung....Müsste doch innerhalb stehen oder?
Das Kriterium ist ja mein Where Anweisung beim Löschen oder?

Hier nochmal mein geänderter Code:

Public Sub Einlesen()
'hier das Verzeichnis eingeben in dem gesucht wird
Dim SuchVerzeichnis As String
Const DatTyp = "*.*"
Const ZielTab = "tbl_dokus"
Dim i As Integer
Dim AktDatei As String
Dim rs As DAO.Recordset

If Not IsNull(Me.Parent!AktenOrdner) Then
SuchVerzeichnis = Me.Parent!AktenOrdner & "\"
'Unter extras Verweise muss Microsoft DAO ausgewählt sein
CurrentDb.Execute "DELETE * FROM tbl_dokus WHERE beschwerde_id_f =" & Me.Parent!beschw_id
Set rs = CurrentDb.OpenRecordset(ZielTab)
AktDatei = Dir(SuchVerzeichnis & "\" & DatTyp)
While Len(AktDatei) > 0
rs.AddNew
'Feld der Tabelle in das geschrieben wird
rs("beschwerde_id_f") = Me.Parent!beschw_id
rs("Aktenlink") = SuchVerzeichnis & AktDatei
rs.Update
AktDatei = Dir ' nächste Datei
Wend
rs.Close
Set rs = Nothing
Else
CurrentDb.Execute "DELETE * FROM tbl_dokus WHERE beschwerde_id_f =" & Me.Parent!beschw_id
End If
Me.Requery
End Sub

Beim Ordner auswählen bekomme ich schon direkt die Fehlermeldung: Laufzeitfehler 2467 : In dem von Ihnen eingegebenen Ausdruck wird auf ein Objekt verwiesen, das geschlossen ist oder nicht existiert.
Beim debuggen wird dann folgender Code für AktenOrdner auswählen angezeigt:

Private Sub Befehl146_Click()
Dim strFile As String
strFile = OrdnerDlg()
'Wenn abgebrochen wird, bleibt der alte Wert stehen.
If strFile <> "" Then Me!AktenOrdner = strFile
'UFO aktualisieren, indem die Public Sub Einlesen aufgerufen wird.
Me!UFO_KundenDokus.Form.Einlesen
End Sub

Gelb markiert:
Me!UFO_KundenDokus.Form.Einlesen

Gruß
Artistline

Anne Berg
16.07.2013, 15:36
Hi,

hast du den Code mal kompiliert vor dem Testen? :confused:Beim Ordner auswählen bekomme ich schon direkt die FehlermeldungWelche Codezeile erzeugt den Fehler?

maikek
16.07.2013, 16:08
allerdings verstehe ich nicht warum ausserhalb der If Anweisung
Innerhalb der If-Anweisung würden die Datensätze ja nur gelöscht, wenn die If-Bedingung wahr ist, also das Feld AktenOrdner nicht leer ist. Du musst die Datensätze aber ja auch löschen, wenn das Feld Null, also leer ist.
So wie du es jetzt machst, hast du den Befehl 2x drin. Das ist genauso, als wenn du ihn außerhalb lässt.
Wegen der Fehlermeldung:
Ich würde die komplette Sub Einlesen sowieso ins Hauptform verlegen. Den ganzen Parent-Kram raus und dafür am Ende Me!UFO_KundenDokus.Requery.
Vielleicht ist dann der Hinweis auf das fehlende Objekt auch konkreter.
maike

Artistline
17.07.2013, 09:52
Guten Morgen zusammen,

Welche Codezeile erzeugt den Fehler?
@Anne Berg: Wie weiter oben beschrieben :
Me!UFO_KundenDokus.Form.Einlesen
Beim Einlesen passiert der Fehler.....wo das genau das passiert ist kann ich nicht sehen. Habe den Code mittlerweile verändert und im HF gesetzt.



Du musst die Datensätze aber ja auch löschen, wenn das Feld Null, also leer ist.
@maikek: Habe jetzt die Bedingung hinzugefügt wenn das Feld NUll ist bzw. wenn der Löschbefehl ausserhalb IF Anweisung liegt. Sub Einlesen ist jetzt auch im HF. Das Auswählen eines Ordner klappt jetzt wunderbar. Allerdings wenn ich mein Feld AktenOrdner lösche, bekomme ich folgende Fehlermeldung:
Laufzeitfehler 52: Dateiname oder -nummer falsch.
Beim Debuggen springt es beim Sub Einlesen auf die Zeile :
AktDatei = Dir(SuchVerzeichnis & "\" & DatTyp)
Wert von AktDatei ist "". Ist ja auch klar.....es gibt kein Suchverzeichnis wenn es gelöscht wurde aber wie komme ich dem Ganzen entgegen?
Nach der Fehlermeldung ist eigentlich mein Ziel erreicht und die Werte sind gelöscht. Sollte ich da evtl den Fehler abfangen? Eigentlich dürfte es ja gar nicht bis zu der Zeile AktDatei kommen oder? Da AktenOrdner = Null ist, müsste direkt in diese Zeile springen und löschen....

Hier der Code nochmal:

Public Sub Einlesen()
'hier das Verzeichnis eingeben in dem gesucht wird
Dim SuchVerzeichnis As String
Const DatTyp = "*.*"
Const ZielTab = "tbl_dokus"
Dim i As Integer
Dim AktDatei As String
Dim rs As DAO.Recordset

If Not IsNull(Me.AktenOrdner) Then
SuchVerzeichnis = Me.AktenOrdner & "\"
'Unter extras Verweise muss Microsoft DAO ausgewählt sein
CurrentDb.Execute "DELETE * FROM tbl_dokus WHERE beschwerde_id_f =" & Me.beschw_id
Set rs = CurrentDb.OpenRecordset(ZielTab)
AktDatei = Dir(SuchVerzeichnis & "\" & DatTyp)
While Len(AktDatei) > 0
rs.AddNew
'Feld der Tabelle in das geschrieben wird
rs("beschwerde_id_f") = Me.beschw_id
rs("Aktenlink") = SuchVerzeichnis & AktDatei
rs.Update
AktDatei = Dir ' nächste Datei
Wend
rs.Close
Set rs = Nothing
End If
If Me.AktenOrdner = Null Then
CurrentDb.Execute "DELETE * FROM tbl_dokus WHERE beschwerde_id_f =" & Me.beschw_id
End If
Me.Requery

End Sub

Gruß
Artistline

Anne Berg
17.07.2013, 09:58
Hi.If Me.AktenOrdner = Null ThenSo geht es nicht, wie es richtig gemacht wird hast du ja weiter oben schon selbst geschrieben.

Ein simples "Else" würde es übrigens auch tun.

maikek
17.07.2013, 10:07
Wenn du AktenOrdner gelöscht hast, sollte es doch Null sein und der Code gar nicht erst bis zu dieser Anweisung kommen?
Prüf' mal den Wert des Feldes AktenOrdner per Debug.Print. Vielleicht muss die Bedingung da anders lauten. Ist das möglicherweise ein Kombifeld?

Anne hat dich auf den Fehler mit = Null ja schon hingewiesen.

Auch wenn ich jetzt vielleicht stur erscheine, aber kannst du mir den Unterschied erklären zwischen:

Wenn Feld leer, dann lösche aus Tabelle und wenn Feld nicht leer, dann auch (SQL 2x)
im Gegensatz zu

Lösche aus Tabelle, egal was im Feld steht (SQL 1x)

?
maike

Anne Berg
17.07.2013, 10:10
Und überhaupt: Warum Löschen und neu Einfügen anstelle von Ändern?

Artistline
17.07.2013, 11:49
also der Grund warum gelöscht wird, ist wenn man jedes mal einen anderen Ordner nimmt, sollen ja auch andere Werte drin stehen. Da in jedem Ordner ganz andere Dateien sind, keiner gleicht dem anderen, werden die Daten gelöscht und neu eingelesen. Der Unterschied ist einfach, daß wenn Aktenordner nicht NUll ist, die Werte zwar erst gelöscht werden aber dann neu hinzugefügt werden vom neuen Ordner. Falls es Null ist, werden die Werte für dieses ID gelöscht...und zwar nur gelöscht....
Habe es natürlich auch mit Else probiert....genau die selbe Fehlermeldung wie oben und ebenso wird gar nicht überprüft ob der Wert NUll ist....verstehe irgendwie nicht warum. Es ist kein Kombifeld. Habe mal eine DemoVersion hochgeladen....ist zwar gleich aufgebaut aber mit anderen Feldern....evtl kommt Ihr auf den Fehler.
Ihr müsst zuerst einen Ordner auswählen. Dann werden die Dateien im Unterformular angezeigt. Dann löscht einfach den Inhalt im Feld Aktenordner und Aktualisiert im Unterformular den Inhalt mit dem Button. Ihr bekommt die selbe Fehlermeldung wie ich...meine Datenbank ist ähnlich aufgebaut was diesen Teil angeht. Nur jetzt mit dem Unterschied das Sub Einlesen jetzt im HF ist. Ihr müsst nur den If-Else befehl hinzufügen...beim Sub Einlesen.

maikek
17.07.2013, 12:23
Sorry, aber eine Demo-Datenbank, die vielleicht so ähnlich ist und die ich mir auch noch selbst zurechtbasteln soll :rolleyes: ? Nö.
maike

Artistline
17.07.2013, 12:37
ok sorry....habs umgeändert...das komische bei der Geschichte: Beim Demodatenbank funktioniert es jetzt. Bei meiner eigentlichen Datenbank leider die selbe Fehlermeldung... :-( Keine Ahnung wo genau das Problem liegt...
Kann es sein das es mit Löscheitergabe von Tabellen was zutun hat?

Hier die Demodatenbank nochmal mit zwar andere Felderbezeichnung aber gleiche Form....

maikek
17.07.2013, 13:07
Tja, da funktioniert alles, soweit ich das feststellen kann.
Löschweitergabe kann eigentlich nicht verantwortlich sein, die würde bei einem gelöschten Kunden die Dokus aus der Tabelle entfernen, aber nicht umgekehrt.
Da scheint der Fehler an einer anderen Stelle ausgelöst zu werden ...
Importiere einfach mal nach und nach alles andere an Objekten und Codes in die Beispieldatenbank und probiere, ab wann der Fehler auftritt.
Oder versuch', ein Beispiel mit Problem hinzukriegen :p .
maike

Artistline
18.07.2013, 09:39
Moin,

hab jetzt meine Datenbank extrem gekürzt....ich sehe leider immer noch nicht den Fehler....Die Datenbank ist allerdings in Backend und Frontend aufgeteilt aber ich denke das sollte kein Problem darstellen oder?....

Gruß
Artistline

maikek
18.07.2013, 10:17
Deubg.Print sagt, das Feld Aktenordner ist nicht NULL sondern "". Hab's mal umbenannt in txtAktenordner und die Prüfung entsprechend geändert. Soweit ich das beurteilen kann, ist jetzt alles so wie es soll.
Mach dich mal mit dem Befehl Debug.Print vertraut, damit kannst du solche Dinge schnell kontrollieren.
maike

Artistline
18.07.2013, 10:36
ja super...danke dir herzlich maikek. Ich hatte allerdings im Debugprint mir den Wert angeschaut und auch bemerkt das der Wert "" ist...wäre aber im Leben nicht drauf gekommen das es da dran hängt....verstehe eigentlich immer noch nicht genau warum es bei der anderen Demodatenbank (sind die selben Felder) funktioniert....:rolleyes:

Anne Berg
18.07.2013, 11:51
Hi,

es kommt auf die Datenfeldeigenschaften an, wenn du Leerzeichen zulässt, kannst du nicht auf NULL abfragen.

Artistline
18.07.2013, 12:28
aha...ok wieder was dazu gelernt...wusste ich leider bisher nicht :-(
Vielen Dank für die Aufklärung...

Gruß
Artistline