Hallo,
ich habe ein Problem mit einer verlinkten Tabelle. Das Problem ist, dass mir ein Fehler angezeigt wird, sobald die Tabelle nicht vorhanden ist, aber genau dies stellt der User ein. Soll heissen:
Wenn das Benutzen der verlinkten Tabelle aktiviert ist (Ziffer 6 des Feldes "FAD_STATUS" in der Tabelle 'FAD_SysEnv' ist auf den Wert "1" gesetzt), soll die Funktion {FAD_TabChk} ausgefuehrt werden - andernfalls natuerlich nicht.
'Check for ID-Table settings
'
If Mid(DLookup("FAD_STATUS", "FAD_SysEnv"), 6, 1) = "1" Then
'Check for ID-Table (settings) by module {TAB_Existing} with option:
'
' o FTC_Opt as String Check section
'
If FAD_TabChk("all") = False Then
DoCmd.OpenForm "ErrorMSGW", acNormal, , , acFormReadOnly, acWindowNormal
Forms!ErrorMSGW!Text01 = DLookup("Txt", "HelpTexts", "Cmd = 'Err07_H'")
Forms!ErrorMSGW!Text02 = DLookup("Txt", "HelpTexts", "Cmd = 'Err67_M'")
Exit Function
End If
End If
In der Funktion wird u. a. der Inhalt der Tabelle geprueft (FTC_Opt = "all" oder FTC_Opt = "content").
Option Compare Database
'FAD_TabChk Script status
'FTC_Opt Option ("all", "content", "database", "exttable", "loctable", "settings")
'FAD_DbCnt Internal script counter
'FAD_DbMain Database
'FAD_TabChk Status
'RecordSet Database record object
Function FAD_TabChk(FTC_Opt As String) As Boolean
'Check for option "all", "exttable", "loctable" or "content"
'
If FTC_Opt = "all" Or FTC_Opt = "exttable" Or FTC_Opt = "loctable" Or FTC_Opt = "content" Then
Dim RecordSet As Object
Dim FAD_DbMain As Database
'Check for option "loctable"
'
If FTC_Opt = "loctable" Then
Set FAD_DbMain = CurrentDb
'Check for option "exttable"
'
ElseIf FTC_Opt = "exttable" Then
Set FAD_DbMain = OpenDatabase(DLookup("TABVOL", "FAD_SysEnv") & "\DOD-00000000-3C")
End If
End If
'Check for option "all", "exttable" or "loctable"
'
If FTC_Opt = "all" Or FTC_Opt = "exttable" Or FTC_Opt = "loctable" Then
Dim FAD_DbCnt As Integer
'Check for option "exttable" or "loctable"
'
If FTC_Opt = "exttable" Or FTC_Opt = "loctable" Then
FAD_DbCnt = 1
Else
FAD_DbCnt = 2
Set FAD_DbMain = OpenDatabase(DLookup("TABVOL", "FAD_SysEnv") & "\DOD-00000000-3C")
End If
While FAD_DbCnt > 0
For Each RecordSet In FAD_DbMain.TableDefs
'Check for found table name
'
If RecordSet.Name = "ID_Codes" Then
FAD_TabChk = True
Exit For
Else
FAD_TabChk = False
End If
Next RecordSet
FAD_DbCnt = FAD_DbCnt - 1
'Check for internal script counter value
'
If FAD_DbCnt = 1 Then
Set FAD_DbMain = CurrentDb
End If
Wend
End If
'Check for option "all" or "content"
'
If FTC_Opt = "all" Or FTC_Opt = "content" Then
'Check for one (!) and existing record in table 'ID_Codes':
'
' o NCode = "X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0"
' NText = "DELETED - DELETED - DELETED"
'
If Nz(DCount("NCode", "ID_Codes", "NCode = 'X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0' And NText = 'DELETED - DELETED - DELETED'")) = 1 Then
'Check for one (!) and existing record in table 'ID_Codes':
'
' o NCode = "Y0Y0Y0Y0Y0Y0Y0Y0Y0Y0Y0Y0Y0Y0Y0"
' NText = "VIRTUAL ARCHIVE FOR SAVINGS ON LOCAL STORAGE (SID: 00000000)"
'
If Nz(DCount("NCode", "ID_Codes", "NCode = 'Y0Y0Y0Y0Y0Y0Y0Y0Y0Y0Y0Y0Y0Y0Y0' And _
NText = 'VIRTUAL ARCHIVE FOR SAVINGS ON LOCAL STORAGE (SID: 00000000)'")) = 1 Then
'Check for one (!) and existing record in table 'ID_Codes':
'
' o NCode = "Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0"
' NText = "VIRTUAL STORAGE FOR LOCAL SAVINGS"
'
If Nz(DCount("NCode", "ID_Codes", "NCode = 'Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0' And _
NText = 'VIRTUAL STORAGE FOR LOCAL SAVINGS'")) = 1 Then
FAD_TabChk = True
Else
FAD_TabChk = False
End If
Else
FAD_TabChk = False
End If
Else
FAD_TabChk = False
End If
End If
End Function
Und genau bei der Uebrpruefung des Inhalts ("content") liegt das Problem, wenn der Status auf "0" gesetzt ist - denn dann wird die Funktion wohl trotzdem durchlaufen/aufgerufen. Kann man das irgendwie umgehen? - Ich hatte schon an eine Abfrage nach den Anzahl von "X0X0X0...", "Y0Y0Y0..." und "Z0Z0Z0..." gedacht, was mir aber weniger gefaellt.
Servus,
(wenn ich das soweit richtig verstanden hab: Du willst beim Start Deiner DB prüfen, ob eine Tabelle xy vorhanden ist, dann verlinken und dann Deine Prozedur ausführen)
Ich denke, eine Tabelle von Hause aus zu verlinken, die potentiell gar nicht da ist, ist eher semi-optimal. Und worauf willst Du genau verlinken? Excel-Tabelle oder Access-Tabelle aus einer anderen DB???
Grundsätzlich solltest Du vielleicht die Verlinkung weglassen und beim Start Deiner DB per VBA-Prozedur prüfen lassen, ob die Datei, aus welcher Du die Tabelle beziehen willst, überhaupt existiert. So dies bejaht wird, kann eine nachträgliche Verlinkung oder Import der Tabelle (z.B. mit DoCmd.TransferDatabase o.ä.) geschehen und Deine Prozedur ausgeführt werden.
Gruß aus Berlin
Pat
Nur so zur Info:
Ich verlinke auf eine Tabelle in einer anderen Datenbank - also Access-Tabelle.
Das Szenario:
Die Datenbank erfasst Dateien. Die Beschreibungen der Dateien werden aber - aus Sicherheitsgruenden - in einer anderen Datenbank hinterlegt. Diese Prozedur kann der User aber selbst bestimmen - er muss demnach keine zweite Datenbank fuer die Beschreibungen verwenden, sondern kann diese auch in ein und derselben Datenbank sichern.
Ob nun die externe Access-Tabelle genutzt wird oder nicht wird geprueft. EInmal an den Einstellungen ("FAD_STATUS"), ob die Tabelle ueberhaupt existiert und ob die Tabelle auch tatsaechlich 3 fixe Eintraege hat.
Ist der Wert ("FAD_STATUS") auf "0" werden saemtliche Module/Funktionen, die mit Hilfe der Tabelle arbeiten, uebersprungen - was aber fehlschlaegt. Siehe zweiten Quellcode - da die Tabelle ja nicht vorhanden ist.
Das Erstellen mittels "DoCmd." ist zwar ganz schoen, aber sinnvoll - wenn die DB bei jedem Start einen evtl. "Link" loescht, die EInstellungen ueberprueft und dann einen neuen Link erstellt?
??? ??? ???
mir erschließt sich dein Vorhaben (vielmehr der Sinn dahinter) zwar immer noch nicht, aber vielleicht helfen ja auch tipps zu deiner Funktion
1. Setze unter "Option Compare Database" noch das "Option Explicit"
2. Versuche anstelle von ...
Dim FAD_DbMain As Database
einfach mal
Dim FAD_DbMain As DAO.Database
3. "Dim RecordSet As Object" - dabei würde ich "RecordSet" mal durch einem anderen Namen ersetzen
4. das Ganze nochmal "Debuggen", vielleicht wird dir ja dann irgendein Fehler angezeigt
.... und auch dieser tolle Beitrag hat hier eigentlich nichts zu suchen.
Mal abgesehen davon dass dieser in keiner Weise auch nur annähernd zum Threadthema passt - das ist hier keine Harwarebörse!
Mann oh Mann - .... ! >:(
Sorry,
wie schon in einem anderen Thread auch, bezog sich meine Kritik NICHT auf den TO und die Antworter sondern auf einen sehr sonderbaren Eintrag, der nun nicht mehr vorhanden ist.
Grüße
Peter