Hallo!
Ich habe in einer Tabelle in verschiedenen Feldern (Link_1 ; Link_2 ; ... ) Links zu verschiedenen Webseiten gespeichert.
Kann ich (aus einem Formular mit einer Befehlsschaltfläche) mit einer Abfrage alle Links auf Gültigkeit (nur ob die Links noch funktionieren) testen.
Wenn ich einzelne Links mit einer Befehlsschaltfläche (Application.FollowHyperlink Me!Link_1) teste, öffnet die Seite oder es kommt eine Fehlermeldung. Aber dies hunderte mal zu tun ist etwas Zeitaufwendig...
Dorian
Hallo,
Du könntest eine solche Funktion in einer (bzw. entsprechend den Link-Feldern) berechneten Abfragespalte (oder anderswo, z. B. in einer Prozedur mit einem Recordset und einer Schleife über die Link-Felder) aufrufen:
Function ExistsURL(Url As String) As Boolean
Dim oXMLHTTP As Object
On Error GoTo Myerr
ExistsURL = False
Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP")
oXMLHTTP.Open "GET", Url, False
oXMLHTTP.Send
If oXMLHTTP.Status = 200 Then ExistsURL = True
MyExit:
Set oXMLHTTP = Nothing
Exit Function
Myerr:
ExistsURL = False
Resume MyExit
End Function
Hallo!
Wie und wo kann ich diese Funktion den genau einfügen? Im Formular oder in der Tabelle?
Werden dann alle Links der Tabelle (z.B. Link_1) geprüft oder nur der aktuelle?
Dorian
Hallo,
ZitatIm Formular oder in der Tabelle?
weder noch. Es würde auch nicht machbar sein. Die Funktion kommt in ein allgemeines Modul und wird in der Abfrage für jeden Datensatz aufgerufen. Es werden also alle Links der Tabelle geprüft.
Als berechnetes Feld in der Abfrage z.B. so:
UrlExistiert: ExistsURL(FeldMitUrl)Es steht dann entweder Wahr (True) oder Falsch (False) in dem berechneten Feld. Das kannst Du dann sicher selbst deuten.
ZitatIch habe in einer Tabelle in verschiedenen Feldern (Link_1 ; Link_2 ; ... ) Links zu verschiedenen Webseiten gespeichert.
Das Datenmodell ist auch falsch. Die Links gehören in eine extra Tabelle mit einem Fremdschlüssel zur jetzigen Tabelle. Je Link ein Datensatz. Hast Du 5 Links so sind in dieser Tabelle 5 Datensätze. Das heißt, die Links stehen immer in einem Feld. Daher wird auch obige Funktion nur 1x aufgerufen. Bei Deinem jetzigen Aufbau wird die Funktion je Feld aufgerufen. Link_1 ; Link_2, .... sind sogenannte Aufzählungsfelder (mit einer Zahl hinten). Diese verstoßen bereits gegen die 1. Normalform.
Ich habe nun ein modul erstellt mit der Bezeichnung "ExistsURL" und habe den von DF6GL erstellten Code dort eingefügt.
Wie mache ich den das?:
wird in der Abfrage für jeden Datensatz aufgerufen
Danke für die Hilfe
Dorian
Hallo,
ZitatIch habe nun ein modul erstellt mit der Bezeichnung "ExistsURL"
das Modul darf nicht den gleichen Namen haben wie die Funktion. Modul bitte umbenennen (mdlExistURL z.B.).
Wie das in der Abfrage gemacht wird, habe ich bereits beschrieben.
ZitatAls berechnetes Feld in der Abfrage z.B. so:
UrlExistiert: ExistsURL(FeldMitUrl)
Hallo!
Also, habe die Funktion umbenannt und in einer Abfrage ein berechnendes Feld eingefügt.
Wenn ich die Abfrage jetzt starte kann ich bis zu 1 Stunde warten und Access friert quasi ein.
Es wird zwischendurch eine Tabelle (Ergebnis der Abfrage) gezeigt mit den Werten 0 oder -1
Es sind im Moment ca. 450 Links zu prüfen...
Hallo,
hast Du meinen Hinweis in #3 zum Datenmodell gelesen ?
Wie viele Linkfelder hast Du im Moment je Datensatz ?
Ja, habe ich gelesen. Ist aber viel Arbeit es zu ändern...
Ich habe in jedem Datensatz 4 Linkfelder und insgesamt ca. 450 Datensätze.
Ich habe die Abfrage nur auf einen Link je Datensatz angewendet (Link_1)
Hallo,
egal (in diesem Fall!), ob normalisiert oder nicht , die Überprüfung eines Links dauert nun mal einige Augenblicke (ca. 1 s) ...
Die Frage stellt sich, wann und wie oft denn nun die Link-Prüfung stattfinden soll und für was das eigentlich gebraucht wird... Dauernd alle Links zu prüfen, ist wohl eher Arbeitsbeschaffung (für den PC und das IN)
nein, sie sollen nur einmal - wenn die Abfrage betätigt wird - geprüft werden nicht andauernd...
Hallo,
naja,.... wann wird denn die Abfrage "betätigt" und was passiert dann mit dem Abfrageergebnis? Soll heißen, für welchen Zweck werden die Urls überhaupt in einer Abfrage geprüft?
Die Abfrage soll ca. 1 mal die Woche betätigt werden um zu prüfen ob die Links noch gültig sind.
Ungültige Links kann ich dann entfernen bzw. erneuern. Es ersparnt mit hunderte Lesezeichen zu setzten und immer wieder zu prüfen...
Hallo,
in diesem Fall musst Du halt die Laufdauer der Abfrage in Kauf nehmen.
Alternativer Vorschlag:
Prüfung eines Links dann, wenn er verwendet wird. Ist er ungültig, kann durch ein aufpoppendes Form der Datensatz, in dem dieser Link steht, entspr. bearbeitet werden.
OK, danke schön!!!
Nochmal eine Frage dazu:
Ich habe jetzt für jeden Datensatz 4 zu prüfende Felder in einem Endlosformular.
Das entsprechende Feld zeigt mir jetzt ob der Link gültig ist oder nicht mit Hilfe dieser Formel:
=Wenn([UrlExistiert]=Wahr;"geht";"geht nicht")
mit der bedingten Formatierung ändert sich auch die Farbe auf grün oder rot.
1.
Wie kann ich jetzt erreichen, dass in einem neuen Datensatz (Endlosformular)
die Prüfung nicht stattfindet, also wenn das Feld "Link" leer ist?
2. Wie kann man die Prüfung veranlassen, erst nach 10 Sekunden zu beginnen bis ich den richtigen Datensatz angezeigt bekomme? Ich muss beim blättern sonst immer warten.
Dorian
Hallo Dorian,
ich würde wie MzKlMu beschrieben, die Links in eine extra Tabelle setzen.
Wird denn in dem besagten Datensatz noch was anderes außer den Links eingegeben?
Werden denn auch alle Links immer ausgefüllt?
Wenn das jede Woche einmal geprüft wird, würde ich ein extra Formular anlegen, welches mittels Startbutton alle Links prüft, und mir im Anschluß einen Bericht ausgeben lassen, welcher die ungültigen Links (jeder Link ein Datensatz) ausgibt.
Dann kannst Du auch nur diesen Datensatz löschen.
Andere Möglichkeit, in dieser extra Tabelle ein Ja/Nein Feld hinzufügen, welche die Gültigkeit hinterlegt.
Dann mittels Akualisierungsabfrage die ungültigen Datansätze löschen.
Gruß
Hubert
Hallo!
Also die Links befinden sich nun in einer externen, verküpften Tabelle. Mir werden nun pro Datensatz 4 Links (Unterformular - Endlosformular) angezeigt.
Meine Frage war:
1.
Im Endlosformular wird ja automatisch nach dem letzten Datensatz schon ein neuer angezeigt.
Bei diesem neuen Datensatz wird aber im Moment "geht nicht" angezeigt weil natürlich in dem neuen Datensatz noch kein Link hinterlegt ist. Wie kann ich dies verhindern. (wenn Feld leer keine Prüfung oder so ähnlich...)
2.
Wie kann man die Prüfung veranlassen, erst nach 10 Sekunden zu beginnen bis ich den richtigen Datensatz angezeigt bekomme?
PS: Ein extra Formular um alle Links zu prüfen geht nun leider nicht mehr weil es mitlerweile ca. 7500 Links sind. Die alle zu prüfen dauert ca. 3 Stunden ... also nicht möglich...
Dorian
Hallo Dorian,
von den 4 Links kann man in einer manuellen Abfrage die anderen 3 Links in einen neuen Datensatz mit entsprechendem Fremdschlüssel einfügen.
Von daher würde sich der Aufwand pro Link ein Datensatz in Grenzen halten.
Und sollte mal ein oder mehrere Links später hinzu kommen, hast Du alle Möglichkeiten offen.
So musst Du ja wieder in den Tabellenaufbau eingreifen.
Deine andere Frage verstehe ich nicht ganz.
Du willst einen neuen Datensatz anlegen, aber der Rechner ist damit beschäftigt die anderen Links zu prüfen sowie die bedingte Formatierung abzuarbeiten?
Ich denke, die Prüfung soll nur einmal pro Woche erfolgen!?
Was heißt "bis ich den richtigen Datensatz angezeigt bekomme?"
Du suchst einen Datensatz und der Rechner ist (leider mit der Prüfung) beschäftigt?
Dann hinterlege doch einen Button pro Datensatz im Endlosformular, wo Du jeden Datensatz nach Bedarf einer Prüfung unterziehen kannst.
Ändern sich die Links den ständig, dass diese jede Woche aktualisiert sein müssen?
Sind das Firmenwebadressen, oder Artikel?
Gruß
Hubert
Hallo!
In meinem Unterformular befindet sich ein Endlosformular mit im Moment 4 Datensätzen. (Können auch mehr werden) Mittels einer Abfrage und des Moduls wird die Gültigkeit dieser Links geprüft.
Das Endlosformular zeigt aber natürlich schon die Möglichkeit an, einen neuen Datensatz hinzuzufügen.
(Datensatzmakierer mit Stern) auch hier wird schon geprüft und da das Feld Link leer ist natürlich auch ungültig angezeigt. Dies möchte ich verhindern.
Alle Links einmal die Woche zu prüfen geht nicht mehr weil es zu viele geworden sind. Es handelt sich um Fundstellen zu dem jeweiligen Thema die manchmal aber leider gelöscht worden sind...
Hallo,
Möglichkeit:
Das UFO bei "Anfügen zulassen" auf nein stellen. Damit wir kein neuer DS permanent angezeigt. Wenn ein neuer DS hinzu kommen soll, dann das UFO an dieser Eigenschaft per Button umstellen oder über ein separat aufgerufenes Form einen neuen Link eingeben.
Ansonsten könnte auch die Prüfroutine so erweitert werden, dass beim Erkennen einen neuen DS eben keine Gültigkeitsprüfung erfolgt.
Zitat von: DF6GL am Mai 03, 2018, 21:09:19
...
Ansonsten könnte auch die Prüfroutine so erweitert werden, dass beim Erkennen einen neuen DS eben keine Gültigkeitsprüfung erfolgt.
Hallo!
Wie stelle ich den die Routine um? In dem Modul?
Function ExistsURL(Url As String) As Boolean
Dim oXMLHTTP As Object
On Error GoTo Myerr
ExistsURL = False
Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP")
oXMLHTTP.Open "GET", Url, False
oXMLHTTP.Send
If oXMLHTTP.Status = 200 Then ExistsURL = True
MyExit:
Set oXMLHTTP = Nothing
Exit Function
Myerr:
ExistsURL = False
Resume MyExit
End Function
... oder in dem Unterformular / Endlosformular?
Danke und Gruß
Dorian
Hallo,
im einfachsten Fall:
ZitatFunction ExistsURL(Url As Variant) As Boolean
Dim oXMLHTTP As Object
On Error GoTo Myerr
If IsNull(Url) Then Exit Function
.
.
Hallo!
In der Abfrage bleibt das Feld UrlExistiert jetzt leer.
Wie kann ich dem Formular den sagen wenn AbfrageFeld leer soll das Formularfeld auch leer bleiben?
Im Moment habe ich im Formularfeld disen Code:
=Wenn([UrlExistiert]=Wahr;"geht";"geht nicht")
Hallo,
z. B.:
= Choose([UrlExistiert];""; "geht";"geht nicht";"Fehler") <edit>
und
Function ExistsURL(Url ) As Long
Dim oXMLHTTP As Object
On Error GoTo Myerr
If IsNull (Url) then
ExistsURL=1
Else
Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP")
oXMLHTTP.Open "GET", Url, False
oXMLHTTP.Send
If oXMLHTTP.Status = 200 Then
ExistsURL = 2
Else
ExistsURL = 3
End If
End If
MyExit:
Set oXMLHTTP = Nothing
Exit Function
Myerr:
ExistsURL = 4 'evtl. gesondert behandeln
Resume MyExit
End Function
Hallo!
Die Abfrage (mit dem neuen Code im Modul) zeigt jetzt 2 oder 3. Der leere DS ist leer (gut)
Aber das Formularfeld mit dem Code = Chose([UrlExistiert];""; "geht";"geht nicht";"Fehler")
zeigt nur Fehler an ...
Hallo,
da ist ein Tippfehler..
Die Funktion heißt Choose()
Ahhhh jetzt geht es ... außer bei einem neuen Datensatz, da sagt er jetzt #Typ!...
Dorian
Hallo,
was zeigt denn die Abfrage bei einem neuen DS in Spalte "UrlExistiert" an?
In der Abfrage ist das Feld leer ...
Hallo,
dann versuch es so:
=Choose(nz([UrlExistiert];1);""; "geht";"geht nicht";"Fehler")
:-)
Vielen Dank jetzt klappt es!!!
Gruß
Dorian