[Access/VBA] OLE koppeling automatiseren

Pagina: 1
Acties:
  • 2.388 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • Lennart_1337
  • Registratie: Juni 2004
  • Laatst online: 30-05 10:24
Ik heb een matige kennis van php, sql en java maar met visual basic ben ik nog helemaal nieuw.

Allereerst heb ik op internet lopen rondstruimen en ben ik bezig met de VBA syntax onder de knie te krijgen maar het lukt mij maar niet om duidelijke info te vinden met betrekking tot SQL en OLE koppelingen, het is voor mij dus een raadsel wat er onder de motor kap van access gebeurd als ik de OLE object toevoeg wizzard doorloop....
Vandaar deze post.

De bedoeling is dat de directory uitgelezen word en er voor elke .jpg die die tegen komt een toevoeg query gemaakt word die het bestandpad als koppeling in het OLE veld opslaat.
Nu is de moeilijkheid dat ik niet gewoon de string van het bestandpad erin kan zetten maar dat er eerst een object koppeling van gemaakt moet worden en dat vervolgens in de database gezet.

- Hoe van C:\Windows\Web\Wallpaper\test.jpg een object koppeling te maken?
- Hoe een nieuw access object met sql in de database te zetten?

Pseudo code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Sub knopje_Click()
        
$bestandspad = Dir("C:\Windows\Web\Wallpaper\*.jpg")

for($bestandspad != null)
{
 query
 {
  insert into tabel1 (oleveldje)
  values ($bestandpad)
 }
}
End Sub


Deze pseudo-code is hopelijk een beetje te begrijpen, alvast bedankt voor de feedback. :)

(Het gaat dus om om visual basic code in MS Access)

Acties:
  • 0 Henk 'm!

  • PhysicsRules
  • Registratie: Februari 2002
  • Laatst online: 31-03 07:26

PhysicsRules

Dux: Linux voor Eenden

Ik heb nog nooit eerder met dit bijltje gehakt, maar wat ik zou doen is een query maken die als parameter een OLE-object meekrijgt. Daarna kan je vanuit VBA die query aanroepen met het ADODB.Command object (Of DAO.QueryDef als je DAO ipv ADO gebruikt.)

Acties:
  • 0 Henk 'm!

  • Lennart_1337
  • Registratie: Juni 2004
  • Laatst online: 30-05 10:24
Ik snap niet helemaal wat jij bedoelt (ben nieuw met VBA) maar het idee begrijp ik wel.

Maar het moet toch ook mogelijk om gelijk SQL code in mijn code te zetten ipv. een externe query uit te voeren en de info met een parameter mee te geven?, daar hoord toch geen verschil in te zitten?

Mijn grootste struikel blok is hoe ik dat bestandspad als koppeling in een nieuwe record van een tabel met een veld van het type "OLE-object" krijg.

Als het een normaal veld van het type char oid. dan kon ik het volgende doen:

code:
1
2
insert into tabel2 (veld1)
values ('c:\map\test.jpg')


Maar met OLE-obeject koppelingen lukt dat niet...

Er is namelijk aan mij gevraagt of ik kon helpen met het automatiseren van het invoegen van OLE koppelingen naar jpg bestanden in een tabel (gaat nu nog elke keer handmatig met de wizzard)
Dit is de enige informatie die ik heb:
- Het moet als koppeling in een OLE obeject type veld in een tabel van een access database
- En het bestandpad is bekend en kan ik met
code:
1
bestandsnaam = Dir("C:\Windows\Web\Wallpaper\*.jpg")

het pad voor de plaatjes te voorschijn halen.

[ Voor 28% gewijzigd door Lennart_1337 op 07-12-2006 00:12 ]


Acties:
  • 0 Henk 'm!

  • PhysicsRules
  • Registratie: Februari 2002
  • Laatst online: 31-03 07:26

PhysicsRules

Dux: Linux voor Eenden

Lennart_1337 schreef op woensdag 06 december 2006 @ 22:12:
Ik snap niet helemaal wat jij bedoelt (ben nieuw met VB) maar het idee begrijp ik wel.

Maar het moet toch ook mogelijk om gelijk SQL code in mijn code te zetten ipv. een externe query uit te voeren en de info met een parameter mee te geven?, daar hoord toch geen verschil in te zitten?
Kan wel, maar is 'slecht' programmeerwerk. In welke taal dan ook. Ik zou in het geval van OLE - objecten ook niet weten hoe het wel moet, omdat je dan zelf al je object moet gaan serializen op de manier dan Access dat doen. Lijkt me een afrader.

Je komt een aantal problemen tegen in Access: het is niet altijd mogelijk om een object runtime aan te maken. De enige Image object kan dat bijvoorbeeld niet. De oplossing is dan om een form te gebruiken met een Image of OLE_object control waarin je het plaatje eerst laadt. Daarna roep je de query aan met vba code en voegt de OLE-object datastream erin.

Visual Basic:
1
2
3
4
5
dim command as New ADODB.Command
command.Activeconnection = "Moet je even opzoeken"
command.CommandText = "JeQueryNaam"

Nu je parameter toevoegen. Dit zul je even moeten googelen, want dat weet ik niet uit mijn hoofd.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 31-05 17:08

NMe

Quia Ego Sic Dico.

VB is heel wat anders dan VBA, wat weer heel wat anders is dan VBS en VB.NET. Je werkt nu met VBA, en het zou wel handig zijn als je dat zelf eens wist. ;)

Verder zou ik je graag wijzen op Waar hoort mijn topic? Je topic hoort niet hier, maar in Officesuites en -software. Ik zal je topic verplaatsen.

PRG>>OFF

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Lennart_1337
  • Registratie: Juni 2004
  • Laatst online: 30-05 10:24
Ik had idd. helemaal geen idee dat dit toppic verkeerd stond.

Bedankt voor de feedback, ik ga er mee aan de slag;
Maar ik zie dat ik nog een hoop te leren heb voordat ik de hier aangereikte code helemaal snap.

Weet iemand waar ik de werking en uitleg van de classen/methodes zoals "command.Activeconnection" & " command.CommandText" kan zien?

Heeft iemand nog een goede link voor een goede VBA turorial/cursus zodat ik meer grip krijg op de stof?

Zelf had ik al deze gevonden: http://www.functionx.com/vbaccess/index.htm
Maar er zijn vast wel betere.

[ Voor 10% gewijzigd door Lennart_1337 op 07-12-2006 00:41 ]


Acties:
  • 0 Henk 'm!

  • PhysicsRules
  • Registratie: Februari 2002
  • Laatst online: 31-03 07:26

PhysicsRules

Dux: Linux voor Eenden

Ben je trouwens aan Access als "ontwikkeltool" gebonden? Je hebt veel meer mogelijkheden als je Access vanuit een andere taal aanspreekt. Je kan een applicatie bouwen in .Net (of Java of PHP) die Access als achterliggende database gebruikt (via OleDB, ODBC of misschien zelfs JDBC als database connectie systeem).

Acties:
  • 0 Henk 'm!

Anoniem: 113297

bekijk eens ms knowledge base artikel Reading, Storing, and Writing Binary Large Objects (BLOBs)

Acties:
  • 0 Henk 'm!

  • Lennart_1337
  • Registratie: Juni 2004
  • Laatst online: 30-05 10:24
PhysicsRules schreef op donderdag 07 december 2006 @ 10:29:
Ben je trouwens aan Access als "ontwikkeltool" gebonden?
Ik ben niet aan access als ontwikkeltool gebonden als ik maar wel nieuwe records met OLE koppelingen kan aanmaken direct in aan acces database of via ODBC.
Alleen heb ik nog nooit met ODBC gewerkt maar ik heb begrepen dat het een soord tussen laagje tussen de sql database op een server en een client is.

Is het via een andere ontwikkeltool makkelijker om voor erlkaar te krijgen wat ik wil?
Kan ik met bijv. php ook OLE koppelingen in een access database zetten?

@Door: _heretic_
Ik ga die link ook even bekijken.

[ Voor 4% gewijzigd door Lennart_1337 op 07-12-2006 10:59 ]


Acties:
  • 0 Henk 'm!

  • PhysicsRules
  • Registratie: Februari 2002
  • Laatst online: 31-03 07:26

PhysicsRules

Dux: Linux voor Eenden

Ik heb geen verstand van php. Met .Net is het een eitje. Je zult ook in .Netof php een query moeten aanroepen, maar het is veel makkelijker om een object aan te maken.

Acties:
  • 0 Henk 'm!

  • Boss
  • Registratie: September 1999
  • Laatst online: 31-05 15:38

Boss

+1 Overgewaardeerd

Ik heb de laatste tijd heel veel met OLE gedaan, en als je de afbeeldingen gaat linken zou ik je afraden om OLE te gebruiken. Je hebt er namelijk geen enkel voordeel van. Je kan net zo goed het pad + naam opslaan.

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


Acties:
  • 0 Henk 'm!

  • Lennart_1337
  • Registratie: Juni 2004
  • Laatst online: 30-05 10:24
Boss schreef op donderdag 07 december 2006 @ 11:12:
Ik heb de laatste tijd heel veel met OLE gedaan, en als je de afbeeldingen gaat linken zou ik je afraden om OLE te gebruiken. Je hebt er namelijk geen enkel voordeel van. Je kan net zo goed het pad + naam opslaan.
Ik vond het ook al raar dat het pad + naam als koppeling in een OLE bijgehouden werd. Het punt is dat er ooit voor gekozen is door iemand om dat veld in de database van het type OLE te maken en dat ik het er nu maar mee moet doen.

De gedachte hierachter is dat er nu makkelijk met crystal reports en de database gewerkt kan worden, dit werkt op dit moment goed alleen moet het aanmaken van nieuw records met OLE koppelingen aan de hand van een directory van plaatjes geautomatisseerd worden.

Acties:
  • 0 Henk 'm!

  • Lennart_1337
  • Registratie: Juni 2004
  • Laatst online: 30-05 10:24
Ik ben de link nu aan het doorlezen en het gaat over het ophalen en wegschrijven van data in OLE velden dus eigenlijk bijna precies wat ik zoek.

Maar ik hoef niet de data (jpg) zelf weg te schrijven maar een verwijzing/koppeling naar de jpg file, ik ga even zoeken of dat ook in dit document zit maar je hebt me in ieder geval de goede richting gewezen. :)

Acties:
  • 0 Henk 'm!

Anoniem: 113297

enkel een verwijzing? dan maak je toch een veld van het type hyperlink ipv. oleobject?

Acties:
  • 0 Henk 'm!

  • Lennart_1337
  • Registratie: Juni 2004
  • Laatst online: 30-05 10:24
Je bedoelt dat ik niet het veldtype OLE object moet gebruiken maar een veld van het type tekst om het pad van het gelinkte bestand op te slaan?

Het probleem is dat ik te maken heb met een bestaande database tabel waar een veld van het type OLE-object word gebruikt, en crystalreports die daar gebruik van maakt. Aan de databasestructuur mag ik niks veranderen.
Vandaar dat ik het met een veld van het type OLE object moet doen, in het OLE object moet dan een hyperlink/koppeling komen naar jpg files.

Dit is de actie die nu handmatig gebeurd en geautomatiseerd moet worden:

Een nieuwe record aanmaken door op een nieuwe regel te klikken in gegevensblad-weergave van de tabel -> Rechtermuisknop in het veld -> object invoegen -> keuze: bestand gebruiken, koppelen aanvinken, met bladeren het bestand op zoeken -> ok

Dit wil ik dus automatiseren en daarom wil ik graag de VBA code die bij deze actie onder de motorkap zit zodat ik deze actie kan automatiseren en ook nog string manupulatie en andere query's etc. kan uitvoeren.

[ Voor 6% gewijzigd door Lennart_1337 op 08-12-2006 00:02 ]


Acties:
  • 0 Henk 'm!

Anoniem: 113297

met sql een gelinkt oleobject invoegen is niet mogelijk. maar aan de hand van de volgende 2 ms kb artikelen (het 1ste in het bijzonder) kan de nodige code opgebouwd worden:
How to Load OLE Objects from a Folder into a Table
How to Programmatically Change the Paths to Linked OLE Objects

Acties:
  • 0 Henk 'm!

  • Lennart_1337
  • Registratie: Juni 2004
  • Laatst online: 30-05 10:24
Edit: vraag in deze post is al opgelost
Ik ben hard bezig met coden aan de hand van KB en het gaat steeds beter.
Bijna alles wat ik wil weten staat erin.

Nu heb ik alleen een ander probleemje waar ik niet uit kom:
code:
1
2
3
4
5
Bestand = Dir("C:\Windows\Web\Wallpaper\*.jpg")
Do While Bestand <> ""
    DoCmd.RunSQL "INSERT INTO tabeltest ([koppeling]) VALUES ('" & Bestand & "');"
    Bestand = Dir
Loop

Deze code werkt goed alleen komt er nu bij elke record een info boxje tevoorshijn met:
"U staat op het punt 1 rij toe te voegen blabla..." en dan moet ik op ja klikken. Nu is dat aardig irritant dus ik vraag me af hoe en of deze melding te onderdrukken is?

Oplossing:
[DoCmd.SetWarnings (False) voor de query zetten, dus zo:
[code}
Bestand = Dir("C:\Users\master\Desktop\*.jpg")
Do While Bestand <> ""
DoCmd.SetWarnings (False)
DoCmd.RunSQL "INSERT INTO tabeltest ([koppeling]) VALUES ('" & Bestand & "');"
Bestand = Dir
Loop
[/code]

[ Voor 21% gewijzigd door Lennart_1337 op 10-12-2006 20:05 ]


Acties:
  • 0 Henk 'm!

  • Lennart_1337
  • Registratie: Juni 2004
  • Laatst online: 30-05 10:24
Even een update:
2 dagen geleden wist is geneens wat VBA was maar nu heb ik toch al iets leuks gemaakt.

Korte beschrijving van wat het kan:
- Alle .jpg bestandnamen uitlezen vanaf het bureaublad (kan ook een ander map)
- Kijken of de de .jpg bestandnaam al in de database zit
- Als de .jpg bestandnaam nog niet in de database zit word er een nieuw record aangemaakt en de jpg bestandnaam als tekst ingevoegd.

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Private Sub Knop6_Click()

Dim strSQL As String
Dim Bestand As String

Bestand = Dir("C:\Users\master\Desktop\*.jpg")
Do While Bestand <> ""

    Dim SQL As String
    Dim Rs As Recordset
    
    SQL = "SELECT koppeling FROM tabeltest WHERE koppeling = '" & Bestand & "' "
    Set Rs = CurrentDb.OpenRecordset(SQL)

    If Rs.EOF Then
        DoCmd.SetWarnings (False)
        DoCmd.RunSQL "INSERT INTO tabeltest ([koppeling]) VALUES ('" & Bestand & "');"
        
    End If
    Bestand = Dir
Loop

End Sub


Alvast bedankt voor alle hulp anders was ik niet zover gekomen :)

De volgende stap is via het form de OLE object koppelingen invoegen, dit word denk ik het moeilijkst.

[ Voor 188% gewijzigd door Lennart_1337 op 09-12-2006 17:20 ]


Acties:
  • 0 Henk 'm!

  • Lennart_1337
  • Registratie: Juni 2004
  • Laatst online: 30-05 10:24
Edit:
Ik heb weer een hoop geexpirimenteerd en de code ingekort en veranderd om beter de oorzaak van het probleem te kunnen vinden.

Beschrijving:
Als basis heb ik deze KB gebruikt:
ACC2000: How to Load OLE Objects from a Folder into a Table
- Deze code maakt voor elke gevonden file met de opgegeven extentie een nieuwe record aan en embbed of linked het OLE-object naar het bestand.
- Het bovenste gedeelte van de code linked het bestand
- Het onderste gedeelte embbed het bestand.

Wat gaat er goed?
- Beide gedeelte code maken een nieuwe record aan
- Beide stoppen ze iets in het OLE-veld

OLE-Object linken, zie bovenste gedeelte code
Bij het linken gaat fout, als ik de form actie uitvoer en naar de tabel ga dan staat er in de record in het OLEveld "HTML Document", en als ik daar op klik verschijnt er de volgende melding:
"De bewerking voor het object HTML Document is afgebroken
HEt OLE-bronprogramma is mogelijk niet geregisteerd.
Installeer het OLE-bron programma opnieuw om het bronprogramma te registereren"


In de eerste plaats hoord er niet geen "HTML Document" te staan in de record maar "Pakket", dat krijg ik namelijk als ik handmatig een object in het veld zet.

OLE-Object embedden, zie onderste gedeelte code
Het embedden gaat helemaal goed, er komt netjes "Pakket" te staan in het OLE-veld van de record in de tabel.
Als ik dubbelklik dan opent het bestand netjes in de daarvoor bestemde applicatie.

Invoer vanuit het from:
Searchfolder = c:\
SearchExtention = jpg
OLEClass = (hier heb ik niks ingevult omdat ik de van de code een comment heb gemaakt)

(op c:\ staan Afbeelding1.jpg & Afbeelding2.jpg)

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Option Compare Database

Private Sub cmdLoadOLE_Click()

   Dim MyFolder As String
   Dim MyPath As String
   Dim MyFile As String
   Dim strCriteria As String

   MyFolder = Me!SearchFolder
   ' Get the search path.
   MyPath = MyFolder & "\" & "*." & [SearchExtension]
   
   ' Get the first file in the path containing the file extension.
   
   ' Maak voor elke file een record en link het OLE-object
   MyFile = Dir(MyPath, vbNormal)
   Do While Len(MyFile) <> 0
      [OLEPath] = MyFolder & "\" & MyFile
      '[OLEFile].Class = [OLEClass]
      [OLEFile].OLETypeAllowed = acOLELinked
      [OLEFile].SourceDoc = [OLEPath]
      [OLEFile].Action = acOLECreateLink

      ' Check for next OLE file in the folder.
      MyFile = Dir
      ' Go to new record on form.
      DoCmd.RunCommand acCmdRecordsGoToNew
   Loop

   ' Maak voor elke file een record en embbed het OLE-object
   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.
      DoCmd.RunCommand acCmdRecordsGoToNew
   Loop

End Sub


Uitvoer, wat in de tabel staat
OLEIDOLEPathOLEFile
1c:\Afbeelding1.jpgHTML Document
2c:\Afbeelding2.jpgHTML Document
3c:\Afbeelding1.jpgPakket
4c:\Afbeelding2.jpgPakket


Waar gaat het waarschijnelijk fout?
Ik moet in de code ergens een OLE-Class opgeven, maar ik weet niet wat ik daar moet neerzetten. Nu heb ik van de regel een comment gemaakt:
Visual Basic:
1
 '[OLEFile].Class = [OLEClass]

Met het embedden van een object lijkt hij deze regel niet nodig te hebben want dat werkt goed maar bij het linken naar een object gaat het niet goed, moet ik bij OLEclass wat invullen; wat moet er komen?

Als ik van de regel geen comment maak maar code laat; en ik run de form zonder in het "OLEClass" veld wat in te voeren dan krijg ik de volgende melding:
"Fout 94 tijdens uitvoering:
Ongeldig gebruik van Null


En bij foutopsporing geeft hij aan dat het aan deze regel ligt.

Dus er moet wat ingevult worden in het "OLEClass" veld van de form als ik een object wil linken maar wat?

[ Voor 103% gewijzigd door Lennart_1337 op 10-12-2006 19:49 ]


Acties:
  • 0 Henk 'm!

  • Lennart_1337
  • Registratie: Juni 2004
  • Laatst online: 30-05 10:24
Kickje :P

Acties:
  • 0 Henk 'm!

  • Lennart_1337
  • Registratie: Juni 2004
  • Laatst online: 30-05 10:24
Is er helemaal niemand die een andwoord weet op dit specifieke probleem?

Kan iemand mij een aantal forums wijzen waar mensen zitten die het misschien wel weten?
Ik ben gewoon een student en niet een bedrijf ofzo dus op een KB forum ofzo van microsoft kom ik niet op.

Acties:
  • 0 Henk 'm!

Anoniem: 113297

waarschijnlijk is dat de clsid van het programma waarmee het bestand geopend kan worden. deze vind je terug in de windows registry onder de sleutel HKEY_CLASSES_ROOT\.jpg\persistanthandler. de waarde ziet er ongeveer zo uit:
{012a3456-bcd7-89ef-a123-45678b90cdef}

Acties:
  • 0 Henk 'm!

  • Lennart_1337
  • Registratie: Juni 2004
  • Laatst online: 30-05 10:24
Je hebt het nu toch over het feit dat hij er "HTML Document" ipv. "Pakket" in de tabel zet toch?
Of over de fout die er gegeven word als ik het HTML document probeer te openen?

Edit: ik had niet goed gekeken, de sleutel is er wel, ik had de . over het hoofd gezien in .jpg
En over die key, ik heb nog nooit wat in het register gedaan/hoeven doen dus ik heb er niet zoveel verstand van.

- Ik open regedit en zoek de key die jij bedoeld in HKEY_CLASSES_ROOT, daar staat (zowel in XP als Vista) geen ".jpg" maar "jpegfile", maar zelfs in jpegfile is er geen subfolder "persistanthandler".

Als ik in het register zoek kom ik wel deze 2 tegen:

In Windows xp: HKEY_CLASSES_ROOT\Media Type\Extensions\.jpg
In Windows vista: HKEY_CLASSES_ROOT\Media Type\Extensions\.jpg

Maar wederom geen subfolder "persistanthandler".

Bij mij bestaat die register vermelding + waarde er dus niet in, ik neem aan dat ik 'm zelf aan moet maken?

Hoe komt het dat deze standaard niet aangemaakt is er er in geen enkel KB artikel over OLE links waar ze ze het over deze registerwaarde hebben?


In iedergeval bedankt voor de tip, ik ga er mee aan de slag :)

Update:
Bij mij is de sleutel van .jpg/persistanthandler/(standaard):
{098f2470-bae0-11cd-b579-08002b30bfeb}
Zowel in windows vista als XP heb ik deze waarde.

En jij zegt dat het hetvolgende moet zijn:
{012a3456-bcd7-89ef-a123-45678b90cdef}
Dus dat ga ik even wijzigen.

[ Voor 14% gewijzigd door Lennart_1337 op 12-12-2006 17:29 ]

Pagina: 1