PDA

Vollständige Version anzeigen : Grundlagenforschung Bildzuordnung


Panther24
27.04.2011, 11:03
Hallo Leute,

für ein Projekt bin ich beauftragt, in kurzer Zeit 13 000 Bilder in eine Tabelle einzufügen, d.h. einer fortlaufenden Nummer in einer zweiten Spalte den jeweils zugehörigen Hyperlink zuzuordnen. Die naheliegendste Variante per Drag & Drop ist bei dieser Masse an Bildern wirklich frustrierend.
Ich befinde mich, was Access betrifft, auf absolutem Neuland; weder habe ich je viel mit Access gearbeitet, noch jemals darin bzw. in .vba programmiert. Erschwerend kommt hinzu, dass ich mich in Frankreich befinde und daher mit einer französischen Version von Access 2002 zu arbeiten habe.
Mit Threads wie diesem (http://www.ms-office-forum.net/forum/showthread.php?t=47534) kann ich bisher wenig anfangen, ich habe gerade erst überhaupt den Makro/VBasic Dialog gefunden. Also schreibt bitte keine gidf.de Antworten. Ich bin über jeden Hinweis (oder auch Verweis) sehr dankbar, doch bitte, bitte erklärt lieber 2 Worte zuviel als zuwenig, sodass ich mit euren Tips auch etwas anfangen kann.

Herzlichen Dank bereits im Voraus

Panther24

Atrus2711
27.04.2011, 11:30
Hi,

du willst also die Namen von 13.000 Dateien in einer Tabelle haben?


Sind diese Dateien irgendwie erkennbar (liegen im Ordner X, sind .jpgs o.ä.)?
Gibts die Tabelle schon? Wie sieht die ggf. aus?
Ist das eine Einmalaktion oder wird das öfter vorkommen?
Es ist nicht schlimm, dass du keine VBA-Erfahrung hast, aber wie kann man dir dann diese Aufgabe aufdrücken? Sollst du als (unterstellter) Nichtpilot auch morgen eine 747 nach New York fliegen?

Lanz Rudolf
27.04.2011, 11:49
Hallo
und Wilkommen im Forum :hands:
Melde Dich doch hier im Forum an kostet NICHTS 0.0 €
und bringt viele Vorteile :)

Zu dem:
ich habe gerade erst überhaupt den Makro/VBasic Dialog gefunden

Du könntest Ja einfach in Meiner Doc ein Wenig Lesen
Klicke auf den Link hinter Meine Doc
in meiner FussZeile
Lade Dir die PDF-Datei runter und Lies ...... :)

kama
27.04.2011, 11:54
Schau mal hier nach
http://www.ms-office-forum.net/forum/showpost.php?p=1337970&postcount=4

Panther24
27.04.2011, 14:14
Hallo liebe Leute,
Danke, dass ihr so schnell antwortet!
Also, einige Erklärungen meinerseits:
es handelt sich um etwa 13 000 JPG Fotos von Objekten, lokal (hier) gespeichert. Die Tabelle existiert und besteht einfach nur aus 2 Spalten: "No de Référence" (fortlaufende Nummer) und "Lien" (Ort) bis zur Nummer 463 sind die Hyperlinks bereits "von Hand" eingetragen worden.
Es geht dabei nicht darum, die Namen der Bilddateien in die Tabelle einzutragen, sondern die Speicherpfade. D.h. zu Referenznummer 463 soll der Pfad von Bild "inv 463" zugeordnet werden etc. Problemverschärfend kommt hinzu, dass einige wenige Bilder fehlen. So existiert z.B. die Nummer 246 (noch) nicht, hier bleibt der Pfad einfach frei.
Es handelt sich hier um eine einmalige Aktion; es ist allerdings möglich, dass sich im Zuge der geplanten Erweiterung der Datenbank irgendwann noch andere Probleme (möglicherweise ähnlich geartete) auftreten.
Der Vergleich mit dem Piloten ist lustig - tatsächlich werde ich häufig mit diversen Computerproblemen (meist einfacherer Art) zu Rate gezogen, auch aus Verfügbarkeitsgründen. Per Se wurde mir die Aufgabe übertragen, das Flugzeug von Hand 13 000 km nach NY zu ziehen - ich versuche jedoch die Maschine zu starten und so ans Ziel zu fliegen :)
@Rudolf: Die Dokumentation wird gerade geladen (und dann überflogen) und angemeldet bin ich schon (seit heute).
@Kama: Kann ich eine solche Textdatei denn in meine spezielle Access Tabelle so importieren, dass die Zuordnungen (s.o.) genau stimmen?!
Meine Hoffnung war natürlich, einen bereits vorgefertigten Code wie z.B. in #1 verlinkt mit nur leichten Anpassungen übernehmen zu können...

MfG
Panther24

Atrus2711
27.04.2011, 14:18
Hi,

sind die Dateinamen denn "sprechend", also lässt sich da die Nummer rauslesen?

Zu "laufender Nummer": wenn es Lücken gibt, ist sie nicht laufend. Wer also vergibt die Nummer? bestimmt die Datei die "laufende" Nummer, oder hat es die 13000 Sätze zu geben, und zu einigen fehlen noch die Dateien?

Panther24
27.04.2011, 14:27
Ja die Dateinamen lauten (bis auf ganz wenige Ausnahmen) stets "inv Nr.". Die Nummer müsste sich also auslesen lassen. Die Referenznummer ist einfach nur automatisch fortlaufend bis 14464 vergeben worden und es fehlen noch einige Dateien. Zu diesen kann es dann natürlich (noch) keinen Pfad geben.

<Nr.>

Atrus2711
27.04.2011, 14:34
Die Referenznummer ist einfach nur automatisch fortlaufend bis 14464 vergeben worden und es fehlen noch einige Dateien.
Endzustand soll also sein, dass die Tabelle 14464 Sätze enthält, von denen 13000 mit einem Hyperlink gefüllt sind?

Ich frage mich auch, wer die laufende Nummer vergibt. Ein Autowert?

Panther24
27.04.2011, 14:45
Genau so soll der Endzustand sein, möglicherweise sind letztlich (noch nicht) sogar 14464 Sätze mit ebensovielen (enthaltenen) Hyperlinks das Ziel.
Ich vermute, dass die Nummer als Autowert vergeben wurde, (in der letzten Zeile nach der 14464 steht noch eine 0).
Also im Klartext soll meine gesuchte Funktion folgendes machen:
Lies die Nummer aus Spalte Referenznummer aus. Finde die zugehörige Bilddatei anhand der Nummer im Dateinamen in Ornder X. Schreibe nun den Pfad dieser Bilddatei in die Spalte "lien".

Atrus2711
27.04.2011, 14:53
Hi,

Lies die Nummer aus Spalte Referenznummer aus. Finde die zugehörige Bilddatei anhand der Nummer im Dateinamen in Ornder X. Schreibe nun den Pfad dieser Bilddatei in die Spalte "lien".

Da der Dateiname ja (afaik) durch die Referenznummer determiniert wird, brauchst du nur nach dem Dateinamen zu suchen, der sich aus dem "Davor", der Nummer und der "Danach" ergibt. Wenn es den gibt, trag ihn ein. Wenn nicht, lass leer.

Function SearchFile(lngReferenznummer as Long) AS Variant
dim strFilePrefix as String
dim strFileSuffix as String
dim strFile as String
strFilePrefix = "\\server\pfad\Inv" 'Teil vor der Nummer; anpassen!
strFileSuffix = ".jpg" 'Teil nach der Nummer; anpassen!
strFile = strFilePrefix & lngReferenznummer & strFileSuffix 'Gesamtdatei
If Dir(strFile) = "" Then 'Suchen nach Datei
'nicht vorhanden
SearchFile = NULL
Else
'vorhanden
SearchFile = strFile
End If
End Function

Aufruf dann mit einer Aktualisierungsabfrage:
UPDATE Tabelle SET Linkfeld = Searchfile(Referenznummer)
Namen der Felder ggf. anpassen!

ebs17
27.04.2011, 16:05
Es geht dabei nicht darum, die Namen der Bilddateien in die Tabelle einzutragen, sondern die Speicherpfade.
Das heißt dann wohl, die Bilddateien liegen in verschiedenen Ordnern (innerhalb eines bekannten Ordners)?

Dann sollte man in einem ersten Schritt die Ordnerstruktur auslesen und die Dateinamen und Pfade in eine temporäre Tabelle schreiben und im zweiten Schritt per Anfügeabfrage die ermittelten Pfade in die Zieltabelle übertragen.
Das dürfte deutlich schneller und einfacher ablaufen als Dateien einzeln in einer Ordnerstruktur zu suchen.

Panther24
27.04.2011, 16:08
Vielen Dank für den Code, Atrus!
Leider ist mir noch völlig unklar, wo genau ich denn nun diesen Code eingebe. Und brauche ich noch Header u.ä.?
Sind denn die Präfix/Suffix - Parts wirklich nötig? Die Dateien sind wirklich alle nach dem gleichen Schema benannt:
"inv 5514.JPG"
Im Zweifel wären die Anpassungen aber kein Problem. Läuft diese Funktion denn dann wirklich ~13000 mal durch oder muss ich noch eine Schleife einbauen?!

Panther24
27.04.2011, 16:14
Oha, nein die Dateien liegen alle in einem Ordner!! (Moglicherweise auch noch in 2 oder 3 weiteren Ordnern, aber auf jeden Fall nicht in einer Ordnerstruktur!!)
MfG

Thomas Möller
27.04.2011, 16:45
Hallo!

nein die Dateien liegen alle in einem Ordner!!

Wenn alle Dateien in einem Ordner gespeichert sind und der Dateiname immer nach dem selben Schema aufgebaut ist, und dabei auch die Lfd. Nr. im Dateinamen vorkommt könntest Du Dir das Einlesen der Daten in die Tabelle sparen. Du kannst statt dessen den Namen und den Pfad einfach aus der lfd. Nr. "berechnen".

CU

ebs17
27.04.2011, 17:05
nein die Dateien liegen alle in einem Ordner!!
Dann braucht man keinen Pfad ermitteln (und nicht mal in eine Tabelle eintragen) - warum sollte man 15.000-mal eine Konstante neu ermitteln und speichern?
Was machtest Du mit Drag&Drop?

Man bräuchte dann nur jeweils zu prüfen, ob es die Datei gibt. Das hätte allerdings vermutlich bis dahin Zeit, wenn man eine betreffende Datei wirklich braucht - eine gespeicherte Momentaufnahme und der reale Zustand im Verzeichnis können sich auseinander bewegen.

Atrus2711
27.04.2011, 21:14
Hi,

von einem Ende musst du das Pferd aufzäumen:

von der Datensatzzeile: das wäre mein gezeigter Ansatz. Die Funktion kommt in ein Modul. Im Direkrfenster (Strg+G) kannst du sie testen mit z.B. ? SearchFile(2323). Wenn das für die einze Nummer klappt, dann klappt es auch für 12999 anderen. Die eigentliche Änderun macht die Aktualisierungsabfrage, die die Funktion dann 13000 mal ausführt. Ist aber kein Problem.
vom Dateiende. Lies die Dateien ein und füge jede gefundene Datei "ihrem" Datensatz zu. Dazu kannst du dich bei Access 2002 noch dem Application.FileSearch bedienen, und jeden Treffer per DB.Execute oder auch Recordset wegschreiben. AUch dabei werden aber 13000x "Infos bewegt". Ist aber kein Problem.

Panther24
27.04.2011, 23:53
Hallo zusammen,

wie ich zum Ziel komme, ist für mich nicht entscheidend - ich wähle deine Variante 1, da du den Code ja schon gepostet hast. Jetzt würde es mir wirklich noch viel helfen, wenn ich wüsste, WO ich diesen Code denn nun hineinkopiere und wie ich anschließend die Aktualisierungsabfrage starte. (Wie vormals bereits erwähnt, bin ich wirklich Laie was Access angeht, zumal ich mit einer französischen Version arbeiten muss.)
@Thomas: Den Vorschlag finde ich prima und sehr kreativ! Ich bevorzuge jedoch den anderen, etwas komplizierteren Weg, da wir quasi schon am Ziel sind und dabei auch die fehlenden Bilder schnell ersichtlich sind.
@ebs17: Du hast mein Problem noch nicht ganz verstanden; das liegt aber zugegeben auch daran, dass ich wenig über den Sinn der Tabelle berichtet habe. Die Hyperlinks der Bilddateien werden über diese Tabelle mit einer Reihe anderer Attribute verknüpft; das ist wichtig z.B. für die Datenbankrecherche, wo dann neben Beschreibungen etc. auch ein Bild des entsprechenden Objekts auftaucht. (Ich hole dazu morgen noch mal genauere Informationen ein.) Per Drag & Drop kann ich eine Bilddatei aus einem Ordner einfach in das entsprechende (zugehörige) Feld in der Tabelle ziehen, sodass der Hyperlink erscheint.

Gute Nacht wünscht

Panther24

Atrus2711
28.04.2011, 08:01
Hi,


kopiere meinen Code in ein neues Modul (im Datenbankfenster die unterste Rubrik; keine Ahnung wie die auf frz. heißt). Wähle im Menü des VBA-Editors (wo der Code hinkommt) Extras/Kompilieren. Die Routine sollte fehlerfrei kompilieren (ansonsten nochmal melden).
Passe die Routine in den Prä- und Suffixen an. Das sind die teile unmittelbar vor bzw. hinter der Nummer. Im Präfix achte auch auf den Pfad, wo die Dateien stehen.
Teste die Routine, indem du mit Strg+G den Direktbereich aufrufst. Gib da ein: ? SearchFile(xxx), wobei xxx eine beliebige Refernznummer ist, von der du weißt, dass es dazu eine Datei gibt. Drücke Enter, Das Ergebnis sollte der komplette Dateiname mit Pfad sein. Wenn ja - > ok. Wenn nein, check die Pfade (Präfix/Suffix) und ggf. den Dateinamensaufbau.
Wenn die Testdatei gefunden wurde, baue eine Aktualisierungabfrage (Neue Abfrage, dann das 1. Symbol oben links aufklappen und auf SQL klicken). Gib dort ein: UPDATE [DeineTabelle] SET [DeinFeld] = SearchFile([Referenznummer]) Die Feld- und Tabellennamen musst du an deine Verhältnisse anpassen. Führe die Abfrage durch das Ausrufezeichen aus.
Prüfe das Ergebnis in der Tabelle stichprobenartig (gefüllte und leere Links).

Panther24
28.04.2011, 16:30
Es hat tatsächlich einwandfrei funktioniert!!
Dabei trat noch das eine oder andere Problem auf, so unterscheidet sich die Namensstruktur der Bilddateien nun doch mehr als gedacht, dazu morgen mehr - an dieser Stelle aber schon ein herzliches Dankeschön!
Mit allerbesten Grüssen aus Frankreich
Panther24

Panther24
29.04.2011, 16:47
Hallo nochmal,
es gibt nun doch ein gewaltiges Problem: Anders als zuerst angenommen, gibt es 4 verschiedene Namensschemata für die Bennenung der 14 000 Bilder:
Das Prefix kann daher lauten:
"", "inv ", "2003-015 inv "und "2003-15 inv "
Ich wollte dieses Problem einfach lösen, indem ich einfach nur 4x die SearchFile Funktion leicht anpasse. Problem dabei: Die Funktion trägt für jeden nicht gefundenen Eintrag Null also leer ein und überschreibt damit die Einträge der vorherigen Funktion in der Tabelle. Mit einem Kollegen kamen wir auf abenteurliche Lösungsansätze, von der automatischen Umbennenung aller Bilddateien nach einem (!) Schema, dem Starten von 4 Abfragen (pro Funktion eine), um diese danach zusammenzuführen etc. Tatsächlich muss es aber bestimmt auch eine einfache Lösung im Programmcode geben, um
a) die Anweisung
SearchFile = Null
ausser Kraft zu setzen
oder b) die Kondition
If Dir(strFile) = ""
zu verändern
oder c) mithilfe einer Variable X z.B. in dieser Zeile
strFile = strFilePrefix & X & lngReferenznummer & strFileSuffix
die Suche nach allen 4 Dateinamensschemata in einer Funktion abzudecken!
Über Hilfe bei diesem letzen Schritt meines Problems wäre ich überglücklich! (Mein armer Kopf ist schon ganz viereckig.)

Mit allerbesten Grüssen
Panther24

kama
30.04.2011, 12:39
hallo
Erzeuge mal mit Hilfe dieses Strings eine Textdatei
C:\> dir d:\*inv*.* /B/S >D:\INVDateien.txt im Dosmodus
Start>>Ausführen>>cmd
Passe die Laufwerksbuchstaben entsprechend an.
bearbeite diese mit Word (Suchen 1 erste Möglichkeit, ersetzen mit "INV" usw)
Ansonsten Lade mal die Datei auszugsweise hoch,

Atrus2711
02.05.2011, 07:32
Hi,

wenn die Präfixe so variable sind, könnten sie einzeln abgeklopft werden. Oder man stelle sich die Frage, ob die Präfixe überhaupt noch relevant sind: genügt vielleicht einfach die Suche nach "*Nummer*.jpg"?


Um einfach nur die Nummer zu suchen:
Function SearchFile(lngReferenznummer as Long) AS Variant
dim strFilePrefix as String
dim strFileSuffix as String
dim strFile as String
strFilePrefix = "\\server\pfad\*" 'Teil vor der Nummer; anpassen!
strFileSuffix = ".jpg" 'Teil nach der Nummer; anpassen!
strFile = strFilePrefix & lngReferenznummer & strFileSuffix 'Gesamtdatei
If Dir(strFile) = "" Then 'Suchen nach Datei
'nicht vorhanden
SearchFile = NULL
Else
'vorhanden
SearchFile = strFile
End If
End Function

Für die 4 Fälle (weitere evtl. analog):
Function SearchFile(lngReferenznummer as Long) AS Variant
dim strFilePrefix(3) as String
dim strFileSuffix as String
dim strFile as String
dim i as long
strFileSuffix = ".jpg" 'Teil nach der Nummer; anpassen!
strFilePrefix(0) = "\\server\pfad\" 'Teil vor der Nummer; anpassen!
strFilePrefix(1) = "\\server\pfad\Inv" 'Teil vor der Nummer; anpassen!
strFilePrefix(2) = "\\server\pfad\2003-015 inv" 'Teil vor der Nummer; anpassen!
strFilePrefix(3) = "\\server\pfad\2003-15 inv" 'Teil vor der Nummer; anpassen!
for i = 0 to 3
strFile = strFilePrefix(i) & lngReferenznummer & strFileSuffix 'Gesamtdatei
If Dir(strFile) = "" Then 'Suchen nach Datei
'nicht vorhanden
SearchFile = NULL
Else
'vorhanden
SearchFile = strFile
Exit For '------------->Exit, wenn gefunden, um Überschreiben zu vermeiden
End If
next i
End Function

Panther24
12.05.2011, 09:22
Hallo liebe Helfer,

nachdem ich nun eine Woche beurlaubt war, konnte ich nun den perfektionierten Code ausprobieren! Die einfache Lösung mit dem Platzhalter * funktionierte nicht, dafür die Lösung mit den verschieden vordefinierten Prefixes umso besser! Mein Problem ist damit gelöst.
An dieser Stelle möchte ich allen Beteiligten meinen Dank für ihre Mühen aussprechen, besonders aber Dir, Atrus! Ohne deine unkonventionelle und vor allem auf meinen Verstehensgrad angepasste Hilfe würde ich wohl noch lange über meinen 14000 Einträgen brüten.
Solltest du mal etwas brauchen (z.B. eine Übersetzung ins/vom Französische[n]), melde dich bei mir (am besten per Mail)!

Mit den allerbesten Grüssen aus Frankreich

Panther24

Atrus2711
12.05.2011, 09:39
Solltest du mal etwas brauchen
Ooch, ich wüsste da was, aber das kannst du nicht liefern ;) :grins: