gekoppelde foto's van plaats veranderd

Status
Niet open voor verdere reacties.

Elsverheyen

Gebruiker
Lid geworden
28 jan 2016
Berichten
53
Beste,
in mijn gegevenstabel heb ik een aantal kolommen met gekoppelde foto's die buiten de database zijn opgeslagen. Bij het veranderen van laptop is die plaats nu veranderd. Ze staan niet meer op D:\Els Verheyen\Pictures\Erfgoed\kerkhof Ramsdonk\ maar op F:\afbeeldingen\kerkhof Ramsdonk\. Hoe kan ik dit aanpassen voor alle foto's per kolom?
Al vast bedankt.
 
Dat is beginsel eenvoudig op te lossen met een bijwerkquery. Iets in de trant van:
Code:
UPDATE JouwTabel
SET Foto = Replace([Foto],"D:\Els Verheyen\Pictures\Erfgoed\kerkhof Ramsdonk\","F:\afbeeldingen\kerkhof Ramsdonk\")
WHERE Foto Is Not Null;

Omdat je meerdere velden hebt moet je voor elk veld zo'n update uitvoeren.
Het feit dat je meerdere velden hebt duidt erop dat je database mogelijk niet juist is ontworpen. Je hebt te maken met een herhaalde groep, dus de tabel is niet juist genormaliseerd.

Ook blijkt nu dat dat het niet handig is telkens de volledige locatie op te slaan als die altijd hetzelfde is. Je zou een tabel (met één record) kunnen maken waarin je het pad opslaat. In je bestaande tabel sla je dan alleen de naam van de foto op.
 
Laatst bewerkt:
Het feit dat je meerdere velden hebt duidt erop dat je database mogelijk niet juist is ontworpen. Je hebt te maken met een herhaalde groep, dus de tabel is niet juist genormaliseerd.
Beschouw deze opmerking van Peter als een stukje normaliserings theorie, maar niet als een ijzeren wet. Hoewel een genormaliseerde tabel doorgaans de voorkeur heeft, zijn er best situaties voor te stellen waarbij je één of meer velden in een tabel herhaalt. Denk bijvoorbeeld aan een genealogie tabel waarin je van een persoon de (biologische) ouders opslaat. Dat zijn er doorgaans twee, hoef ik hopelijk niet uit te leggen. Peter zou zo’n tabel dus normaliseren, maar ik niet. En jij vermoedelijk ook niet.

Iets vergelijkbaars kán er aan de hand zijn in jouw tabel, waarin je dan één, twee of drie foto’s per record wilt opslaan. Dat kun je dan in een genormaliseerde tabel oplossen, maar kan ook best in één tabel. Heb je daarentegen een wisselend (groot) aantal foto’s die in de velden foto1 t/m foto 20 worden opgeslagen, dan vind ik ook dat je dat moet scheiden d.m.v. een gekoppelde tabel.

Ik ben ook al geen fan van een tabel voor één record met één veld; dat beschouw ik als een zinloze constructie. Je hebt veel meer aan een (TempVar) variabele die je één keer vastlegt in de code van je database, en dus ook maar één keer hoeft te veranderen. En die gebruik je dan in combinatie met een veld met alleen de fotonamen, zodat je bij het opvragen kunt volstaan met het koppelen van de foto aan de TempVar met de locatie.

Foto’s die bij een database horen, sla ik zelf overigens meestal op in een map onder de map waarin de database staat. Met de standaardopdracht CurrentProject.Path & “\Afbeeldingen\” heb je dan altijd het actuele pad naar de foto’s, ook als je later de database verplaatst. De foto’s blijven dan gewoon op te vragen.
 
Peter,
je gaat het iets gedetailleerder moeten uitleggen hoe ik die bijwerkquery en code moet aanpassen want ik ben maar een beginneling.
Grts Els
 
Veel gedetailleerder kan ik het niet maken. Je hoeft alleen in plaats van "JouwTabel" de naam van de betrokken tabel in te vullen. Waar "Foto" staat zet je de naam van een veld waar de fotogegevens staan.
Zoals gezegd moeten je 4 query's maken (en uitvoeren); één voor elk van vier velden.
De (eerste) query maak door een nieuwe query toe te voegen en naar de SQL-weergave te gaan. Daar zet je de (aangepaste) tekst van de query. Dan sla je de query op. De query voer je uit door er op te dubbelklikken. Je ziet dan niets gebeuren, maar als je de tabel opent zie je als het goed is dat de waardes van het eerste fotoveld zijn bijgewerkt.
Kopieer de query, open de kopie in SQL-weergave en wijzig de naam van het fotoveld naar het tweede fotoveld. Opslaan en uitvoeren.
En dan nog twee keer kopiëren, aanpassen en uitvoeren.
 
@els: Dit is een openbaar forum, dus het lijkt mij dat in beginsel iedereen die het forum leest ook antwoord mag geven, niet alleen Peter. Daarnaast kan Peter (en dat geldt voor elke lezer) niets met jouw laatste opmerking zonder verdere informatie. Op zijn minst moeten we dan de tabelnaam en de veldnamen weten die je in je tabel hebt staan. Maar dan nog: als je een 'beginneling' bent, is de werkwijze die je aan de hand van de code die wij kunnen aanleveren nog best lastig. Veel beter kun je de query dus zélf maken. Dus laat ik dat dan maar als ongevraagde bijdrage toevoegen.

1. Maak een nieuwe query aan
2. Kies in het ontwerpvenster de optie Bijwerken

Bijwerkquery.png

3. Sleep jouw tabel naar het query raster bovenin.
4. Sleep het veld uit de tabel naar het velden raster (of dubbelklik op de veldnaam)
5. Typ in het veld <Wijzigen in> de nieuwe naam van de locatie.

Overigens weet ik niet of Peter zijn query wel eens heeft uitgetest, maar die gaat natuurlijk nooit werken. Replace kun je alleen met VBA gebruiken in deze opzet.

Veel beter is het als je e.e.a. 'even' programmeert met een functie. Een Bijwerkquery kun je eigenlijk alleen gebruiken om de complete tekst van een veld te vervangen. Omdat je de taak uitvoert op een veld, en niet op een deel van het veld. Het verbaasde me dan ook niets dat de query van Peter bij mij niet aan de praat te krijgen is :).
 
Overigens weet ik niet of Peter zijn query wel eens heeft uitgetest, maar die gaat natuurlijk nooit werken
Ter geruststelling: ik heb de query getest en die doet het gewoon.
 
5. Typ in het veld <Wijzigen in> de nieuwe naam van de locatie.
Op basis van de oorspronkelijke vraag neem ik aan dat in het veld het pad + de bestandsnaam staat. Als TS dit dan zo doet is ze alle bestandsnamen kwijt.
 
Ik zou het dus niet met Replace doen, maar zo:
Code:
UPDATE JouwTabel SET [Foto1] = "F:\afbeeldingen\kerkhof Ramsdonk\" & Mid([Foto1],InStrRev([Foto1],"\")+1,Len([Foto1]));
Ik had vermoedelijk een database geopend die gelocked was, want na kopie van de tabel naar een nieuwe database deed mijn query het nu wél. Dus die van Peter zal ook wel werken.
 
Zoals gezegd moeten je 4 query's maken (en uitvoeren); één voor elk van vier velden.
Dit is natuurlijk onzin, het kan allemaal in één query tegelijk worden uitgevoerd. Gewoon alle velden naast elkaar zetten in de Bijwerkquery en draaien die hap.

Code:
UPDATE JouwTabel SET
Foto1 = "F:\afbeeldingen\kerkhof Ramsdonk\" & Mid([Foto1],InStrRev([Foto1],"\")+1,Len([Foto1])),
Foto2 = "F:\afbeeldingen\kerkhof Ramsdonk\" & Mid([Foto2],InStrRev([Foto2],"\")+1,Len([Foto2])),
Foto3 = "F:\afbeeldingen\kerkhof Ramsdonk\" & Mid([Foto3],InStrRev([Foto3],"\")+1,Len([Foto3])),
Foto4 = "F:\afbeeldingen\kerkhof Ramsdonk\" & Mid([Foto4],InStrRev([Foto4],"\")+1,Len([Foto4]));[/code\]
Etc.
 
Ik zou het dus niet met Replace doen, maar zo:
Dan ben ik oprecht benieuwd waarom je het "dus" zo zou doen. Dat leg je niet uit.
Eerst beweer je dat je de functie Replace niet kunt gebruiken in query's en vervolgens kom je met een query waarin je ook meerdere functies gebruikt.
 
Laatst bewerkt:
Dit is natuurlijk onzin, het kan allemaal in één query tegelijk worden uitgevoerd.
De functie Replace gaat, net als de functies die jij gebruikt, over zijn nek als het veld leeg is. Vandaar dat ik er een criterium bij heb gezet en je het niet meer met één query afkan.
 
Ergo, een bestaande backup van de originele database zou nog wel eens handig kunnen zijn.... mag aannemen dat de TS die heeft of alsnog maakt voordat er zo een actie, welke dan ook, plaats gaat vinden.
 
Beetje luie antwoorden; natúúrlijk kun je de totale query uitvoeren als er een leeg veld tussen zit. Wil ik je best een keer uitleggen :). En ik heb al uitgelegd waarom de query het in eerste instantie niet deed. Het helpt als je andere antwoorden goed leest.
En de query dóet het uiteraard wel, alleen krijg je een waarschuwing dat je niet alle velden kunt bijwerken. Boeie....
 
Maar goed, om TS het helemaal makkelijk te maken, hier een query zonder foutmelding.

Code:
UPDATE tblAdressen SET
Foto1 = IIf([Foto1] Is Null,"","F:\afbeeldingen\kerkhof Ramsdonk\" & Mid([Foto1],InStrRev([Foto1],"\")+1,Len([Foto1]))),
Foto2 = IIf([Foto2] Is Null,"","F:\afbeeldingen\kerkhof Ramsdonk\" & Mid([Foto2],InStrRev([Foto2],"\")+1,Len([Foto2]))),
Foto3 = IIf([Foto3] Is Null,"","F:\afbeeldingen\kerkhof Ramsdonk\" & Mid([Foto1],InStrRev([Foto3],"\")+1,Len([Foto3]))),
Foto4 = IIf([Foto4] Is Null,"","F:\afbeeldingen\kerkhof Ramsdonk\" & Mid([Foto2],InStrRev([Foto4],"\")+1,Len([Foto4])))

Zelf zet ik in de Eigenschappen altijd de vinkjes uit bij de actiequeries, zodat je die vraag (Weet u het zeker?) niet hoeft te beantwoorden. Dat scheelt ook weer een handeling.

Even voor de goede orde voor Els (die angstvallig stil blijft onder dit gebikkel ;))
1. Klik in het tabblad <Maken> op de knop <Queryontwerp>. (Zónder dat je een tabel geselecteerd hebt!)

Queryontwerp - SQL.png

2. In de linkerhoek zie je nu de knop <SQL weergave>. Daar klik je op.
3. Verwijder de tekst die er staat (gelijk op <Delete> drukken)
4. Plak de query die ik hierboven heb neergepend.
Pas de tabelnaam aan, en eventueel de veldnamen. Bij mij heten de velden dus Foto1, Foto2 etc. De tabelnaam staat achter UPDATE.
5. Klik op de knop Uitvoeren (Tweede knop links; die is nu Rood. In mijn plaatje nog grijs).
6. Bevestig eventueel het uitvoeren van de Bijwerkquery, en controleer de data!

Makkelijker kunnen we het toch echt niet maken....
 
OK iedereen,
ik ga een poging doen om de laatste oplossing te proberen. Waarschijnlijk nog een domme vraag maar Mid([Foto1] dat wisselt af per regel of moet dat ook Mid([Foto3] en 4 worden?
 
OK iedereen,
ik ga een poging doen om de laatste oplossing te proberen.
Succes.
Vervang wel even de komma's door puntkomma's.
Bedenk ook dat als je dit nog een keer wil doen de "Is Null" niet meer werkt. Om mij onduidelijke redenen worden in deze oplossing de velden waar niet in staat ook bijgewerkt. Ze wijzigen van Null naar "" en dat is voor Access echt iets anders.
 
Ik doe waarschijnlijk iets fout want hij vindt de tabel niet nochtans heb ik de naam aangepast
UPDATE tblgrafgegevens SET
foto1 = IIf([foto1] Is Null,"","F:\afbeeldingen\kerkhof Ramsdonk\" & Mid([foto1],InStrRev([foto1],"\")+1,Len([foto1]))),
foto2 = IIf([foto2] Is Null,"","F:\afbeeldingen\kerkhof Ramsdonk\" & Mid([foto2],InStrRev([foto2],"\")+1,Len([foto2]))),
foto3 = IIf([foto3] Is Null,"","F:\afbeeldingen\kerkhof Ramsdonk\" & Mid([foto1],InStrRev([foto3],"\")+1,Len([foto3]))),
foto4 = IIf([foto4] Is Null,"","F:\afbeeldingen\kerkhof Ramsdonk\" & Mid([foto2],InStrRev([foto4],"\")+1,Len([foto4])))

die komma's vervangen geeft syntaxis fout
 
Vervang wel even de komma's door puntkomma's.
Oh Peter, wat is dát nu weer voor een advies? Als je in je SQL code kijkt, zie je dat daar wel degelijk komma's staan, en geen puntkomma's. Die zie je dan weer wél in het Ontwerpscherm, maar daar is deze code niet te plakken.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan