Toon posts:

Van Excel naar Access, dan een left join met gecreerde tabel

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

Verwijderd

Topicstarter
Beste,

De gebruiker importeert een excelsheet als gelinkte tabel naar access. Daarna kiest de gebruiker in een combobox voor de door hem net aangemaakte tabel (een kwestie van mij de naam door te spelen van de door hem aangemaakte tabel). Dus ik bezit nu de naam van de tabel in een string.
Wanneer ik echter deze tabelnaam gebruik in mijn sql left join doet acces moeilijk. Ik kan de tabel openen met vbacode, maar om de één of andere reden wilt de left join niet lukken, hij valt namelijk over de naam van de tabel. Hieronder een stukje van de door mij gebruikte code achter mijn knop continue... dus na de importatie van de tabel via een wizard en na keuze van de tabel in de combobox. Mijn code voor de sql is juist indien ik de echte naam van de geimporteerde tabel gebruik. Trouwens ik kan de geimporteerde tabel ook laten openen. Ik moet ergens iets over het hoofd zien. Het zit hem waar ik mijn query aanmaak en ik verwijs naar de string die de tabel voorstelt. In feite, welke syntax moet ik gebruiken om de naam van de tabel weer te geven in de sql code.

Van harte bedankt indien iemand dit moeilijke probleem kan oplossen, ik zocht me al rot om een voorbeeld te vinden.

Claudine


Private Sub cmdContinue_Click()
'On Error GoTo Err_cmdContinue_Click

'Een variable om de geimporteerde excelsheet in te zetten
Dim tblExcelsheet As New DAO.TableDef
Dim strImportedExcelsheet As String

'een variable om het sql statement in te zetten
Dim strSQL As String
Dim qdf As DAO.QueryDef
Dim db As DAO.Database
Set db = CurrentDb

'De waarde gekozen in de combobox opslaan in een str
strImportedExcelsheet = Me.cboNameImportedExlsht

Set tblExcelsheet = db.CreateTableDef("strImportedExcelsheet")
tblExcelsheet.Name = "strImportedExcelsheet"
DoCmd.OpenTable strImportedExcelsheet

'de tabel opent zich zonder problemen

'Zou nu nog graag testen op wat de laatste kolom van de tabel als naam heeft
' in deze naam zou zeker ergens site moeten zitten "*site*"
'code nog te zoeken om de naam van de laatste kolom te weten te komen en te testen of dit wel degelijk Site Code is (de veldnaam waarmee gelinkt wordt).

strSQL = "SELECT [strImportedExcelsheet].*, qryAlleGebouwenES.*" & _
"FROM [strImportedExcelsheet] LEFT JOIN qryAlleGebouwenES ON [strImportedExcelsheet].[Site Code]=qryAlleGebouwenES.gebSiteCodeId"

qdf.SQL = strSQL

DoCmd.OpenQuery "qryExcelsheet"
Set qdf = Nothing
Set db = Nothing

Verwijderd

Visual Basic .NET:
1
2
3
4
5
6
7
8
    strSQL = "SELECT [strImportedExcelsheet].*, qryAlleGebouwenES.*" & _
                "FROM [strImportedExcelsheet] LEFT JOIN qryAlleGebouwenES ON [strImportedExcelsheet].[Site Code]=qryAlleGebouwenES.gebSiteCodeId"
    
    qdf.SQL = strSQL
    
    DoCmd.OpenQuery "qryExcelsheet"
    Set qdf = Nothing
    Set db = Nothing


De fout zit het hem in het gebruik van [strImportedExcelsheet]. In VBA wordt dit letterlijk gebruikt en niet geparsed zoals in PHP. Je zou het volgende moeten doen:

Visual Basic .NET:
1
2
strSQL = "SELECT " & strImportedExcelsheet & ".*, qryAlleGebouwenES.*"  & _
                "FROM " & strImportedExcelsheet & " LEFT JOIN qryAlleGebouwenES ON " & _


edit:

Oja, het is een stuk overzichtelijker als je code ook tussen code-tags zet.. http://gathering.tweakers.net/forum/list_messages/583405/

[ Voor 40% gewijzigd door Verwijderd op 13-09-2007 10:46 ]


  • sanfranjake
  • Registratie: April 2003
  • Niet online

sanfranjake

Computers can do that?

(overleden)
Even een paar lidwoorden uit de titel, zodat deze wat duidelijker is :)

Mijn spoorwegfotografie
Somda - Voor en door treinenspotters


Verwijderd

Topicstarter
Fantastisch, werkt als geen bus.
Zou nu ook nog graag wat code krijgen om de kolomheadings van die geimporteerde tabel te zien of te voorschijn te toveren in een combobox om dan de query te koppelen aan de string die ik verkrijg wanneer de gebruiker in de combobox het veld waarin de sitecode staat kiest.

Van harte bedankt voor de snelle volmaakte ;-) reply,

Claudine

  • ATS
  • Registratie: September 2001
  • Laatst online: 12-02 13:46

ATS

Verwijderd schreef op donderdag 13 september 2007 @ 15:37:
Zou nu ook nog graag wat code krijgen om de kolomheadings van die geimporteerde tabel te zien of te voorschijn te toveren in een combobox om dan de query te koppelen aan de string die ik verkrijg wanneer de gebruiker in de combobox het veld waarin de sitecode staat kiest.
Hoho! Aan scriptrequests doen we hier niet. Wat heb je zelf al geprobeerd? Wat werkte daar niet aan?

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


Verwijderd

Topicstarter
Wel, in feite weet ik niet welke vba code me zou toelaten om kolomheadings te zien.
Heb zitten zoeken op internet en heb niets gevonden. Om al je tabellen in je database te lezen doe ik beroep op een select querry die op een combobox staat:
SELECT MSysObjects.Name FROM MSysObjects WHERE (((MSysObjects.Type)=6));

Wel moest er nu iets dergelijks bestaan om de kolomheads te laten zien zou ik dat willen gebruiken.

Ergens op de zoveelste bezochte site vond ik het volgende:
"Find out what columns are in the worksheet by examining the Fields
collection of the TableDef objct corresponding to the linked table."

Weet echt niet hoe ik daaraan moet beginnen en ik weet ook niet hoe ik kolomheadings of fieldnames moet laten zien in een combobox van een tabel of op een andere mannier. In feite zou het voldoende zijn moest ik kunnen lezen welke colomheading er gebruikt werd voor het laatste geimporteerde veld want die moet de join maken.

Als je vindt dat deze topic thuis hoort op een andere plaats, wil ik hem gerust verplaatsen hoor. Maar als ik dit zou weten, dan kan ik er zeker van zijn dat de join altijd doorgaat in die querry ook als de gebruiker een typfout maakte in zijn excelsheet maw het zou echt af zijn dan.

Alleszins nogmaals bedankt voor het oplossen van de moeilijkste brok, de sqlquerry.

Claudine

Verwijderd

de variabele tblExcelsheet is toch van het type tabledef?
maw, deze bevat na import de veldnamen in zijn .fields collectie!

Verwijderd

Topicstarter
Moet ik dan verder denken in de richting:

Dim objColomn As Object
Set objColomn = tblExcelsheet.Fields
Maar hoe kan ik dan de naam van het laatste veld te weten komen?

Verwijderd

bijna.
Visual Basic:
1
2
dim LaatsteKolomNaam as string
LaatsteKolomNaam = tblExcelsheet.fields(tblExcelsheet.fields.count-1).name

Verwijderd

Topicstarter
neen, dat werkt niet, krijg een foutmelding.
"Kan element niet vinden in deze collectie"
Veranderde de syntax in
LaatsteKolomNaam = strImportedExcelsheet.Fields(strImportedExcelsheet.Fields.Count - 1).Name

verwijzend naar de stringnaam van de tabel, foutmelding "ongeldige kwalificatie"

Veranderde de syntax in
LaatsteKolomNaam = [strImportedExcelsheet].Fields([strImportedExcelsheet].Fields.Count - 1).Name
foutmelding "ongeldige kwalificatie"

Probeerde dan de velden te tellen
LaatsteKolomNaam = tblExcelsheet.Fields.Count
resultaat was nul
Vervang ik daar de naam door de string krijg ik de foutmelding ongeldige kwalificatie.

Begrijp het niet goed???
Nochtans deze code gaat eraan vooraf
'de sting strImportedExcelsheet wordt toegekend aan een tabel
Set tblExcelsheet = db.CreateTableDef("strImportedExcelsheet")
tblExcelsheet.Name = "strImportedExcelsheet"

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Met createtabledef maak je een nieuwe, en dus zo goed als lege tabledef. Ipv daarvan gebruik je een toewijzing:
code:
1
2
3
4
dim t as tabledef, db as databse
set db=currentdb()
set t = db.tabledefs(varTableNaam)
debug.print t.fields(t.fields.count-1).name

en let op: variabele namen niet tussen "", want dan worden ze als letterlijke tekst geinterpreteerd.

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Verwijderd

Topicstarter
Hallo, hier ben ik weer. Was even afwezig doordat ik een cursus moest volgen.
Het probleem blijkt niet opgelost.

Ik gebruik volgende code en nog steeds zegt hij dat hij het element niet kan vinden???
Zou er iets verkeerd zijn met mijn mannier van werken?

'dit is de t in jouw voorbeeld
Dim tblExcelsheet As TableDef
'dit is de varTableNaam in jouw voorbeeld
Dim strImportedExcelsheet As String


'de naam van de db
Dim db As DAO.Database
Set db = CurrentDb
'de sting strImportedExcelsheet wordt toegekend aan een tabel
Set tblExcelsheet = db.CreateTableDef("strImportedExcelsheet")
'als ik volgende code schrijf geeft hij foutmelding, 'kan element niet vinden'
Set tblExcelsheet = db.TableDefs("strImportedExcelsheet")

tblExcelsheet.Name = "strImportedExcelsheet"
'en op de volgende code geeft hij opnieuw de foutmelding 'kan element niet vinden'.
Debug.Print tblExcelsheet.Fields(tblExcelsheet.Fields.Count - 1).Name

Verwijderd

je maakt dezelfde fout waar je al eerder (oa. 1 post hoger) op gewezen bent. ben je een php adept of zo? iig, wanneer je gaat programmeren in een andere taal kan je de aannames van de oorspronkelijke taal niet zomaar overnemen uiteraard.
doe eens het volgende. open je database, link-importeer handmatig een excelbestand.
ga dan naar de vb-editor dmv. alt+f11 (of extra->macro->visual basic editor) open het debug venster dmv. ctrl+g (beeld->venster direct) en plak de volgende
Visual Basic:
1
for each tb in currentdb.TableDefs:?tb.name,tb.fields(tb.fields.count-1).name:next
druk op enter. in het resultaat staat de naam van de tabledef die je moet gebruiken, en zie je ook hoe de laatste kolom van de geimporteerde excelsheet heet.
Set tblExcelsheet = db.CreateTableDef("naamvandetabel")
of
Set tblExcelsheet = db.CreateTableDef(variabeledienaamvandetabelbevat)
letterlijke naam met quotes, variabele die naam bevat zonder quotes

Verwijderd

Topicstarter
Ja, klopt inderdaad, ik zie de tabel die ik net geimporteerd heb en haar naam.
Maar, in een volgende stap op het formulier doe ik de gebruiker via een combobox (waarin al de tabelnamen zichtbaar zijn via een query op de Msysobjects) de tabelnaam van de door hem geimporteerde file aanduiden.
Daarna bij klik op een knop continue... gaat het programma aflezen wat de gebruiker heeft aangeduid in de dropdownlist. en stel ik de strImportedExcelsheet gelijk aan die net ingevoerde tabelnaam. Bedankt voor me wat wijzer te maken in heel dat gedoe met die ".
Heb mijn code nu veranderd in
Set tblExcelsheet = db.CreateTableDef(strImportedExcelsheet)
tblExcelsheet.Name = strImportedExcelsheet
Debug.Print tblExcelsheet.Fields(tblExcelsheet.Fields.Count - 1).Name
Maar op de debug krijg ik nog steeds de foutmelding object vereist???

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Lustucru in "Van Excel naar Access, dan een left join..."
code:
1
2
Set tblExcelsheet = db.CreateTableDef(strImportedExcelsheet)
tblExcelsheet.Name = strImportedExcelsheet


Zoek de verschillen ;)


code:
1
2
3
Set tblExcelsheet = db.CreateTableDef("naamvandetabel")
of
Set tblExcelsheet = db.CreateTableDef(variabeledienaamvandetabelbevat)

Dit is helaas ook niet goed. Het aanmaken van een tabledef met een al bestaande naam levert op zijn best een foutmelding op, namelijk op het moment dat je hem wilt toevoegen aan de tabledef-definitie.

[ Voor 43% gewijzigd door Lustucru op 25-09-2007 20:02 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Verwijderd

Topicstarter
Ik denk dat ik het begrepen heb. Ik verwijs eigenlijk 2 maal naar dezelfde tabel. Ik veranderde de code nu in:

Set tblExcelsheet = db.CreateTableDef(strImportedExcelsheet)
Debug.Print tblExcelsheet.Fields(tblExcelsheet.Fields.Count - 1).Name

Maar op de debug code krijg ik nog steeds een foutmelding object vereist.
Moet eerlijk zeggen dat ik wel veel bijleer van jou. Merciekes.

Misschien kan je me helpen bij volgend vraagje ook:
Nadat ik gegevens bijgezet heb in de geimporteerde tabel via een query, exporteer ik die tabel als een excelsheet met transferspreadsheet.

In de filename had ik graag de defaultpath gebruikt zodat iedereen die de database gebruikt automatisch de excelsheet wegschrijft naar het pad My Documents op de pc
Bij ons in het bedrijf ziet dit eruit als:
Filename:="D:\Documents and Settings\coclaes\Mijn documenten\
Hoe kan ik nu via code verwijzen naar die defaultpath?

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Ik denk het eigenlijk niet ;) Je moet geen nieuwe tabledef aanmaken maar gebruik maken van de al bestaande.
Ik verwijs eigenlijk 2 maal naar dezelfde tabel. Ik veranderde de code nu in:

Set tblExcelsheet = db.CreateTableDefTableDefs(strImportedExcelsheet)
Debug.Print tblExcelsheet.Fields(tblExcelsheet.Fields.Count - 1).Name
Filename:="D:\Documents and Settings\coclaes\Mijn documenten\
Hoe kan ik nu via code verwijzen naar die defaultpath?
een van beide
code:
1
2
environ("homedrive") & environ("homepath")
"D:\Documents and Settings\" & environ("username") & "\Mijn documenten\"

voldoet meestal wel aardig.

offtopic:
Bovendien is het handiger om als je een vraag hebt die weinig meer met de originele vraag of titel van doen heeft een nieuw topic te starten. Dit vindt een ander nooit meer terug op titel.

[ Voor 14% gewijzigd door Lustucru op 26-09-2007 10:16 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Verwijderd

Topicstarter
Bedankt voor de verwijzing naar de defaultpaths. Dat is in orde.
en nu uiteindelijk dank zij jou hulp kan ik het laatste field ook opvragen.
Van harte bedankt!
Pagina: 1