foto uploaden in form

Status
Niet open voor verdere reacties.

steve3

Gebruiker
Lid geworden
26 nov 2017
Berichten
27
(http://www.helpmij.nl/forum/images/smilies/confused2.gifIk verwittig maar al op voorhand dat ik niet veel kaas van programmeren heb gegeten.)

Met trial and error heb ik een code gevonden om een foto uit een identiteitskaart te halen. Die save ik in een bestand met
de correcte naam.
Via een button op mijn klantenformulier laad ik deze vervolgens in het veld [foto]

Maar ik doe natuurlijk weer wat fout. De foto komt goed terecht, maar vervolgens gaat het programma naar een
blanco record . Als ik bij de foutmelding (Run-time-Error 3314 - field can't contain a Null value
op End click en vervolgens het formulier opnieuw laad, dan is alles correct, inclusief de ge-uploade foto.
Ik zie wel dat er iets fout in de code staat (DoCmd.Run acCmdRecordsGoToNew),
waarschijnlijk weer iets eenvoudig, maar ik kom er niet uit. Alvast bedankt als iemand kan helpen.


Code:
Private Sub Command321_Click()
'EEN FOTO LADEN UIT EEN BESTAND EN IN HET VELD FOTO PLAATSEN

       Dim MyExt As String
       Dim Foldername As String

Foldername = "C:\Users\eigenaar\Documents\fotostest\" & LCase(Me.ACHTERNAAM & " " & Me.VOORNAAM) & ".jpg"
Me.foto = Dir(Foldername, vbNormal)
       
       Do While Len(Foldername) <> 0
          
          
          Me.foto.OLETypeAllowed = acOLEEmbedded
          Me.foto.SourceDoc = [Foldername]
          Me.foto.Action = acOLECreateEmbed
          DoCmd.RunCommand acCmdRecordsGoToNew
            'dit heb ik er al eens uitgehaald, maar dan krijg ik een out of memory melding
        
       Loop



End Sub
 
Wat wil je precies? Ik vind het een erg onhandige manier van werken, en ik vrees met grote vreze dat je probeert om de foto als object in de db op te slaan. Tip één: doe dat niet! En waarom gebruik je een loop? Is er meer dan één foto? Ik vind de mapnamen ook niet geweldig; een mapnaam hoort geen extensie te hebben. Dat hebben de foto's uiteraard wel. Maar het belangrijkste: sla alleen de verwijzing naar de foto op in een tekstveld. Eventueel zonder pad, als dat simpel te herleiden is uit de andere gegevens.
 
OctaFish bedankt voor je reactie.

De foto's zijn foto's van een paspoort (belgische identiteitskaart) die worden ingelezen via een kaartlezer, en hebben een grootte van +/ 4kb.
Daarom dat ik ze wou 'embedden'. Ik zal er uiteindelijk maximum zo'n 1000 hebben denk ik.
Ik wil ze op mijn scherm krijgen van zodra ik de klantenfiche van de desbetreffende
persoon oproep.

Maar wat bedoel je met de extensie in mijn mapnaam? (enige map is fotostest zonder
extensie)...

Als ik de verwijzing opsla, krijg ik dan de foto meteen op het scherm of moet ik het
on update doen?


Die 'loop' komt doordat ik gewoon copy en paste heb gedaan van een code. En als ik
die delete, dan werkt de code niet meer. Vond ik zelf ook een beetje vreemd, maar
in access verschiet ik van niets meer...

Ter info: Dit is de oorspronkelijke code met de loop action - oorspronkelijke bedoeling was van alle gegevens meteen in de database te laden, maar dat gaat momenteel boven mijn petje....

Code:
Private Sub cmdLoadOLE_Click()
' code van Jesper De Temmerman  om foto uit cardreader te halen
' zie ook https://github.com/jdt/EID.Wrapper/blob/master/README.md
Dim wrapper As New EID_Wrapper.Wrapper
Dim data As EID_Wrapper.CardData

Set data = wrapper.GetCardData()
' Check that a card was read correctly
If Not data.FirstCard Is Nothing Then
	' Save the photo to the disk. Make sure this is a user-accessible directory!
	data.FirstCard.SavePhoto ("C:\photo.jpg")
	' Now display the picture in an imagebox
	ImageBox.Picture = "C:\photo.jpg"
End If


Vervolgens vond ik deze code (die ik dan aangepast heb)

Code:
      Dim MyFolder As String
       Dim MyExt As String
       Dim MyPath As String
       Dim MyFile As String
       Dim strCriteria As String

       MyFolder = SearchFolder
       ' Get the search path.
       MyPath = MyFolder & "\" & "*." & [>jpeg]
       ' Get the first file in the path containing the file extension.
       MyFile = Dir(MyPath, vbNormal)
       Do While Len(MyFile) <> 0
          [OLEPATH] = MyFolder & "\" & MyFile
          [OLEFILE].Class = [OLEClass]
          [OLEFILE].OLETypeAllowed = acOLEEmbedded
          [OLEFILE].SourceDoc = [OLEPATH]
          [OLEFILE].Action = acOLECreateEmbed
          ' Check for next OLE file in the folder.
          MyFile = Dir
          ' Go to new record on form.
          ' For Access 95 only, use the following Line of code:
          DoCmd.DoMenuItem acFormBar, acEditMenu, 12, 4, acMenuVer70

          ' For Access 97 only, use the following line of code:
          DoCmd.RunCommand acCmdRecordsGoToNew
       Loop
End Sub

Alvast bedankt voor je advies
 
Een Belgisch EID is steeds rond de 83Kb, dat is dus wel iets mer dan dat je 4Kb, neem dan X 1000 en door de bloat zal je DB snel exponentieel groeien. Koppel dus die EID's zoals Michel aangeeft in bv. een mapje in dezelfde directory van je DB
En je hebt geen loop nodig.
En de Wrapper met de code van Jesper gebruikt geen OLE binding. Ik heb indertijd de functie gepost op dit forum
 
De foto's zijn foto's van een paspoort (belgische identiteitskaart) die worden ingelezen via een kaartlezer, en hebben een grootte van +/ 4kb. Daarom dat ik ze wou 'embedden'.
Zelfs met deze afmetingen zal je database buitensporig groeien. Access maakt nu eenmaal een zooitje van afbeeldingen in een database. Gewoon nooit doen. Bovendien is het onderhoud en gebruik van los opgeslagen foto's ook veel makkelijker.

Maar wat bedoel je met de extensie in mijn mapnaam? (enige map is fotostest zonder extensie)...
Ik zou je ook aanraden om de naamgeving van je objecten/variabelen eens onder de loep te nemen. Als ik een variabele de naam Foldername geef, dan kun je er een liter gif op innemen dat er ook echt een mapnaam in die variabele zit, en geen naam van een foto. Ik zou persoonlijk gek worden van een database waarin niets is wat het lijkt te zijn... :)

Maar om op je echte vraag terug te komen: Zodra je een formulier laadt, en door de records bladert, kun je bij de gebeurtenis <Bij aanwijzen> (<OnCurrent>) code meegeven die de afbeelding op het formuiler/rapport zet. Dat gaat razendsnel, dus voor de uitvoering maakt het niet uit of je de afbeeldingen in de db opslaat of niet. En je houdt de db dus schoon en klein.
 
Ik ben er even tussenuit geweest, maar bedankt voor de opmerkingen.

Johan, sorry dat ik je credits niet had vernoemd. Maar de code komt inderdaad van jou. Ik heb er nog wat moeilijkheden
mee, maar ik denk dat ik in access 97 en 2003 een aantal functies niet heb. Maar dat is dan voor een ander topic.

Octafish, ik heb het op de aangegeven manier gedaan (dus mijn dank voor het advies):

1)Eerst een unbound imageframe gecreëerd,
2)dan een textbox gecreërd met als naam [imagepath] en als besturingselement:
HTML:
="C:\Users\Documents\test\" & ([ACHTERNAAM] & " " & [VOORNAAM]) & ".jpg"
(ik sla het pad overigens niet op in de database)

(en let niet op de benaming 'test', want dat is maar een voorlopige naam, uiteindelijk komen de foto's uit een map in de networkdrive)

3)dan in het formulier bij on current de volgende code

HTML:
Private Sub Form_Current()
On Error GoTo Err_Form_Load

If IsNull(Me![ImagePath]) Then
Me![imageframe].Picture = "C:\Users\Documents\test\Geenafbeelding.jpg"
'waarbij Geenafbeelding.jpg de standaardafbeelding is die wordt getoond als er geen foto voorhanden is
Else
Me![imageframe].Picture = Me![ImagePath]
End If

Exit_Form_Load:
Exit Sub

Err_Form_Load:
Select Case Err.Number
Case 2220
'ignore the Can't Load Image error
Case Else
MsgBox [geen image]
Resume Exit_Form_Load
End Select
End Sub

Dit werkt perfect, behalve wanneer er geen foto voorhanden is voor een bepaalde record. Dan geeft hij gewoon de laatste foto weer
die wel voorhanden was, terwijl hij de standaardfoto 'Geenafbeelding' zou moeten geven.

Wat doe ik hier nog fout?
 
Dit werkt perfect, behalve wanneer er geen foto voorhanden is voor een bepaalde record. Dan geeft hij gewoon de laatste foto weer die wel voorhanden was, terwijl hij de standaardfoto 'Geenafbeelding' zou moeten geven.
Wat doe ik hier nog fout?

Je test denk ik op de verkeerde manier op een leeg veld. We hebben het hier over een tekstveld, niet over een getal. Probeer deze variant eens:
Code:
Private Sub Form_Current()
On Error GoTo Err_Form_Load
 
    If Not Me.ImagePath = vbNullString Then
        Me.imageframe.Picture = "C:\Users\Documents\test\Geenafbeelding.jpg"
    Else
        Me.imageframe.Picture = Me.ImagePath
    End If
    Exit Sub
     
Err_Form_Load:
    If Not Err.Number = 2220 Then        'ignore the Can't Load Image error
        MsgBox "geen image geladen"
    End If
End Sub

Overigens ziet code er in de HTML tag nog steeds niet geweldig uit, pak de buurman (CODE) :).
 
Probleem is volgens mij dat het tekstveld altijd vol is (door de code die ik erin heb gezet), ook al bestaat het bestand zelf niet.
Ik heb de variant uitgeprobeerd, maar dan bekom ik enkel de standaardfoto ('Geenafbeelding.jpg') altijd en niet de bestaande foto's.
Ik weet niet waarom, maar ik heb wel vaker problemen met 'modernere' codes die wel werken in 2007 en volgende, maar niet in
97 en 2003.

Ik heb het intussen wel kunnen oplossen met de volgende code

Code:
Private Sub Form_Current()



On Error GoTo Err_Form_Load
[COLOR="#008000"]'dit regeltje erbij gezet
'checken of er wel een foto voor deze persoon bestaat[/COLOR]
[COLOR="#008000"]'als er geen foto voorhanden is wordt een standaardfoto gebruikt[/COLOR]


If Len(Dir(Me![ImagePath])) = 0 Then

Me![imageframe].Picture = "C:\Users\Documents\test\Geenafbeelding.jpg"
Else
Me![imageframe].Picture = Me![ImagePath]
End If

Exit_Form_Load:
Exit Sub

Err_Form_Load:
Select Case Err.Number
Case 2220
'ignore the Can't Load Image error
Case Else
MsgBox [geen image]
Resume Exit_Form_Load
End Select


End Sub


Alleen de paspoortfoto automatisch inladen met de kaartlezer lukt nog niet (conflict met de eid-wrapper dll's)
Bedankt voor alle hulp, weer wat bijgeleerd!
 
Je haalt nu een hele boel dingen door elkaar. Om te beginnen: codes (VBA neem ik dan aan) die in 2007+ werken, doen het vaak ook in oudere versies, mits je geen functionaliteit aanroept die in die versies niet bestaat. Maar dat is volslagen logisch. Deze code zou zelfs in de allereerste versie van Access moeten werken, want daar zitten alle elementen ook al in. Dus dat is echt het probleem niet.
Verder snap ik dit:
Probleem is volgens mij dat het tekstveld altijd vol is (door de code die ik erin heb gezet), ook al bestaat het bestand zelf niet.
niet met deze code:
If Len(Dir(Me![ImagePath])) = 0 Then
Je beweert dat het tekstveld nooit leeg is. Waarom ga je dan testen op de lengte 0? Makes no sense. En dan werkt het ook nog? Dan ben je mij dus echt kwijt...
 
probleem met de wrapper (programma om de identiteitskaartfoto in te lezen in access) is dat ik een aantal dll's niet kan aanroepen (bij de tools - verwijzingen, ook
niet als ik blader, kan geen verwijzing geven naar het opgegeven bestand. (er staat dan een sleuteltje voor). Ik krijg het programma dus best zelf wel aan de praat,
maar ik krijg foutmeldingen als ik het tracht te integreren in access.)
(windows 10 = 64 bit, access = 32bit)
-------------


Voor wat de code met de Len(dir) = 0 betreft. Tja, ik volg je wel, maar het werkt.
Mijn idee is dat ik hiermee niet naar het tekstveld kijk, maar wel naar het bestand
zelf dat ik ermee oproep. En als dat er niet is, dan komt de standaardfoto tevoorschijn.

Je mag me altijd verbeteren, maar het werkt wel degelijk.
 
Ik raad je trouwens aan om met de punt te werken en niet met het uitroepteken. Vergelijk jouw code maar met mijn voorbeeld. Maak het jezelf makkelijker als het kan, niet moeilijker.
 
die opmerking ben ik even gaan opzoeken... (verstond ze eerst niet )

VBA will tolerate the use of a dot where there should be a bang:
Forms.formname.controlname.Value
Me.controlname

It won't tolerate a bang where there should be a dot:
Forms!subcontrolname!Form!controlname (does not work)

Dus je hebt gelijk, weet ik weer wat meer!
 
De verklaring is erg cryptisch, en eerlijk gezegd zou ik het op basis van de gevonden tekst nog steeds niet snappen :). Maar als jij dat wel doet: prima natuurlijk!
 
Geen idee waar die bang en dot stuff vandaan komen en voor de installatie van die Wrapper moet je bij netwerk gebruik bij de beheerder zijn om die te installeren in de windows van de serveromgeving.
Duurt maar een paar seconden als die admin tenminste van goede wil is. Dan kun je na herstartten de Wrapper in de Access VBA module gewoon bij de referenties aanvinken (zie afbeelding)
 

Bijlagen

  • Wrapper_referentie.JPG
    Wrapper_referentie.JPG
    20,3 KB · Weergaven: 47
Laatst bewerkt:
:dbang en dot stuff:

https://access-programmers.co.uk/forums/showthread.php?t=202806&page=2


:rolleyes:Johan, bij de eid-wrapper krijg ik de foutmelding
Fout 429 tijdens uitvoering: ActiveX-onderdeel kan geen object maken

Set data = wrapper.GetCardData()

De EID_Wrapper is aangevinkt
maar volgens mij moet ik ook de beid.drv32.dll en beidpkcs11.dll toevoegen,
die vind ik wel in system32 maar daar staat bij mij een soort sleuteltje voor
- foutmelding is dan: kan geen verwijzing toevoegen aan het opgegeven bestand

Dat zal wel zijn reden hebben, maar voor mij is het een raadsel...


(de EID.Wrapper.Console.exe werkt overigens wel)
 
Ok, bedankt Johan, zal ik doen

(geen administrator problemen, maar ik denk dat ik ga updaten naar 2010
ik heb al gemerkt dat ik dll's die wel in 2003 werken niet aan de praat krijg
in access 97)
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan