in query gekozen tabel dynamisch kiezen op jaar toevoeging

Status
Niet open voor verdere reacties.

Friend

Verenigingslid
Lid geworden
31 jan 2009
Berichten
1.128
Beste forummers,

Is het mogelijk om als ik de query qwrJaren run de tabelkeuze tblJaren-....... te laten bepalen door het jaartal in de tabel :tblJaar.

Dus bij 2019 in de tblJaar kiest hij in de qwrJaren: tblJaren-2019 / bij 2020 : tbljaren-2020 etc.

Ben benieuwd.

Friend
 

Bijlagen

  • jaarafhankelijk.rar
    20,4 KB · Weergaven: 14
Je zou je query kunnen maken door middel van VBA.
Maar haal je je hierdoor geen extra moeilijkheden op de hals?
Waarom zou je niet 1 tabel maken, met een extra veld, waarin je het jaartal zet?
 
Luc,
Hartelijk dank voor je reactie!
De bestanden worden per jaar gemaakt/geïmporteerd in de tabel van dat jaar. Worden anders ook veel te groot
Voor mij is het geen optie om een veld van jaar toe te voegen.
Ik zoek dus eigenlijk echt een oplossing zoals aangegeven.
Maar misschien kan dit helemaal niet?

Friend
 
Code:
Function YearQuery (lngJaar as Long) as String
Dim sql as String
sql = " Uw query zonder het jaartal" & lngJaar & "De rest van je query"

enz.
End Function

en die query roep je dan op als volgt:

Code:
docmd.runsql YearQuery 2019

Toch lijkt het me niet echt een goed idee om het telkens in een nieuwe tabel te gieten. Gaat het dan echt om miljoenen records?
 
Laatst bewerkt:
Luc,

Dank je wel voor je aanvulling en code.

Nee het zijn absoluut geen miljoenen recods :D

Alleen ik kan die jaren gewoon niet samenvoegen in één tabel.

Friend
 
Als het de database is die ik gezien heb, mag dat geen enkel probleem zijn. Ik zou in beginsel de database gewoon zo simpel mogelijk houden, zoals een database bedoeld is. Het idee dat je de tabellen moet opsplitsen zit meer in je hoofd dan in de technische aspecten van Access :).
 
Mijn excuses voor het even 'doordrammen' op hetzelfde. Maar ik heb je database nog 's bekeken, en ik vermoed dat ik je probleem al een beetje kan begrijpen.
Je tabellen hebben 1 sleutelveld (ID).
Als je nu de verschillende tabellen gaat importeren in 1 tabel die identiek zijn opgebouwd, heb je inderdaad een probleem vermits je dubbele sleutelvelden zal krijgen.
De oplossing is nog steeds om je tabellen te importeren in 1 en dezelfde tabel, maar die tabel moet dan wel een beetje anders opgebouwd worden. Je moet er een tweede sleutelveld aan toevoegen met een getal (Jaar).
Vervolgens importeer je al je tabellen in die éne tabel, die vervolgens veel makkelijker hanteerbaar zal zijn.

Ik voeg je bestand opnieuw toe, maar met die extra tabel er bij + VBA code, om al die tabellen in één keer te importeren.
Voer de VBA code als test maar 's uit.

Uiteraard zal je nog werk hebben om je bestand gebruiksvriendelijk te maken, maar (indien je overtuigd bent van deze werkwijze natuurlijk) dan kan je in deze richting verder denken.
PS Zelfs een extra veld is niet echt nodig. Je kan ook het ID veld wat anders opbouwen.

Stel in het jaar 2019 bouw je je ID nummer als volgt op: 2019000000 + ID
Waarbij uiteraard 2019 voor het jaartal staat. als je het jaargetal maar groot genoeg maakt, loop je het risico niet dat je per ongeluk al van 2019 in 2020 komt.
 

Bijlagen

  • jaarafhankelijk.zip
    33,1 KB · Weergaven: 14
Laatst bewerkt:
OctaFish,

Dank je wel voor je reactie en aanvulling!

De database is "ietsjes" anders dan het voorbeeldje natuurlijk.

In het voorbeeld slecht een simpele weergave van de structuur van de tabellen en de query.

Maar wil goed nadenken over je opmerking!

Thanks

Friend
 
DagLuc,

ik vind je eerste idee beter: gewoon een autonumber (misschien in deze situatie beter random new values in plaats increment ) als nieuw PK veld en een apart geïndexeerd veld met het jaartal . Op het jaartal gaat veel gezocht worden, dus willen we een snel zoekveld en zoeken op een deel van het veld is allesbehalve snel. Daarenboven ben ik geen fan van een ID-veld dat een speciale betekenis heeft voor de gebruiker. Het ID veld is alleen een uniek sleutelveld, niets meer. Zelf gebruik ik in mijn databases veelal een uniqueidentifier veld.
 
Hallo Luc,

Dank je wel voor je extra input. Fijn dat je er nog even extra aandacht en tijd aan hebt gegeven. Ja dat is heel mooi als je ze wilt samenvoegen.
Ik begrijp dat het lastig is om uit te leggen voor mij waarom ik nu juist niet wil samenvoegen dan zou ik mijn hele bestand moeten laten zien aan jullie en wat er precieus meegedaan wordt.
Het is voor mij echt van belang dat ik de jaren gescheiden hou in een aparte tabel per jaar.

Ik ga toch proberen jouw eerste code te plaatsen en kijken of dat voor mij goed werkt.

Friend
 
Noella,

Hartelijk dank voor je reactie en aanvulling.

Voor mij gaan sommige dingen echt boven mijn pet!

Daar ontbreekt het mij aan kennis van het een en ander.

Maar ik hoop altijd met jullie kennis en bijdrage toch iets te verwezenlijken wat ik voor ogen heb.

Maar alle credits naar jullie!

Friend
 
Begin eens met een reëel voorbeeldje te maken van de situatie. Je huidige voorbeeld is daar totaal ongeschikt voor. Ik heb nog steeds geen flauw idee waarom je niet wilt samenvoegen, en je uitleg helpt daar ook totaal niet bij. Je hebt nu van 3 redelijk ervaren mensen gehoord dat ze geen noodzaak zien van aparte tabellen, en dan heb je het over mensen die bij elkaar vermoedelijk honderden, zo niet duizenden databases door hun vingers hebben laten glijden. Wat maakt jouw database dan zo uniek dat het bij jou niet anders kan?

De oplossing om de databases samen te voegen met een extra sleutel lijkt mij eerlijk gezegd niet nodig; wél heb je in de nieuwe database een nieuwe sleutel nodig die de gegevens identificeert. Ik zou daar een tekstveld voor gebruiken in combinatie met een functie die op basis van de input (het jaartal) een volgnummer genereert, zodat elk record een nummer krijgt in de trant van 2018-0001, 2018-0002, 2018-0003, 2019-0001, 2019-0002, 2019-0003, 2020-0001, 2020-0002, 20200003 etc. Heb je écht zoveel records dat je meer dan 9999 records hebt per jaar, dan maak je het volgnummer gewoon langer.
Bij het importeren in die tabel gebruik je dan een functie zoals die van Luc, al ziet die van mij er dan wat anders uit omdat je het ID veld anders opbouwt.
Wat je sowieso moet doen, is in de tabellen die gekoppeld zijn aan de jaartabellen (ben ook heel benieuwd hoe je dat dan nu doet; lijkt mij bepaald geen sinecure om dat netjes op te bouwen) de koppeling opnieuw maken, omdat je uiteraard geen correcte koppeling meer hebt. Ook dat is prima te doen trouwens, en een eenmalige actie.

Kortom: bezin je eerst eens goed op wat nu écht de bedoeling is, en wat de achterliggende reden is dat jij vindt dat het samenvoegen niet kan. Als die reden ligt in gebrekkige kennis, of geen tijd, dan zijn dat argumenten waar je iets aan kan/moet doen. Dat mag geen excuus zijn om het niet te doen. Heb je wél een moverende reden, dan ben ik wel héél erg benieuwd, want dan valt er voor ons denk ik ook nog wat te leren :).
 
Als aanvulling op de code van luc mijn versie. Daarbij heb ik een kopie van één van de brontabellen van jou gemaakt, en het veld ID omgezet naar een tekstveld. Vervolgens lees ik de brontabellen uit, en vul ik ze met de juiste gegevens.
Met een kleine aanpassing, mocht dat nodig zijn, kun je hem wel toepassen op je eigen systeem.
Code:
Sub VoegTabellenToe()
Dim SQL As String, lng As Long
Dim tbl As AccessObject

    DoCmd.SetWarnings False
    For Each tbl In Application.CurrentData.AllTables
        If IsNumeric(Right(tbl.Name, 4)) And Left(tbl.Name, 8) = "tblJaren" Then
            lng = Right(tbl.Name, 4)
            SQL = "INSERT INTO tblJaargegevens ( JaarID, bedrag, klantnr )" _
                & "SELECT """ & lng & "-"" & Right(""00000"" & [Id], 5), bedrag, klantnr " _
                & "FROM [tblJaren-" & lng & "];"
            CurrentDb.Execute SQL, dbFailOnError
        End If
    Next tbl
    DoCmd.SetWarnings True
End Sub
 
OctaFish,

Hartelijk dank voor je zeer uitgebreide uitleg en opmerkingen.

Als ik ergens van overtuigd ben is het jullie ervaring en kennis. Laat er daar geen misverstand over zijn. Dat jullie een andere opzet kiezen is duidelijk.

Octafish/Luc/Noella,

Ik krijg uit een ander softwarepakket (vanuit hier wordt het een export naar Excel) elk jaar ongeveer 30000 records. In access (in de tbl van het betreffende jaar) importeer ik dan het excel bestand. Gaat allemaal vrij snel met zo min mogelijk handelingen. Dit wordt enkele malen aan het einde van het jaar en begin van het nieuwe jaar herhaald/overschreven.

Ja hoe kan ik uitleggen dat we al die jaren niet in één bestand/tabel willen. Dat is lastig.

Maar ik zal eens gaan experimenteren met het samenvoegen.

Toch deze simpele vraag nog zou het wel kunnen wat ik wil ook al vinden jullie dat niet de beste oplossing is.

Friend
 
Wat je wil kan uiteraard. Afhankelijk van wat je wil doen soms zéér eenvoudig.
Zie mijn bijgevoegde bestand, en open dan het formulier. Vervolgens jaartal kiezen.

Hou er vooral rekening mee dat het nu nog eenvoudig lijkt op te lossen, maar dat dat zo niet blijft :(.
Ik veronderstel dat het van bovenaf komt dat er iemand zegt dat hij geen tabellen wil samenvoegen (meestal een gevolg van onvoldoende kennis van databases).

Een van de volgende vragen zal dan wellicht zijn: kan je kijken welke klant er méér, en welke klant er minder gekocht heeft dan het vorige jaar.
Of wil je een lijst maken van alle onbetaalde facturen (uiteraard wordt met nieuwjaar niet elke openstaande schuld kwijtgescholden).
Of kan je de adresgegevens van een klant niet aanpassen... en dat uiteraard voor elk jaar.

Wil je jijzelf/je baas/je klant ... om het even wie, wie de rekening uiteindelijk betaalt later extra zware kosten betalen, omdat iets eigenlijk al van bij de basis fout is opgebouwd?
 

Bijlagen

  • jaarafhankelijk.zip
    37,9 KB · Weergaven: 12
Laatst bewerkt:
Ik krijg uit een ander softwarepakket (vanuit hier wordt het een export naar Excel) elk jaar ongeveer 30000 records. In access (in de tbl van het betreffende jaar) importeer ik dan het excel bestand. Gaat allemaal vrij snel met zo min mogelijk handelingen.
Met exact dezelfde moeite, en vermoedelijk ook met exact dezelfde handelingen, doe je de hele import in één tabel, en zijn al je problemen opgelost. En wie wil dat nou niet? :D
 
Luc,

Dank voor je uitwerking in het voorbeeld. Ik ga ernaar kijken.

Hartelijk dank voor je inzet.

Friend
 
OctaFish,

Ik ga er eens mee stoeien kijken hoe het een en ander dan uitwerkt in mijn database.

Hartelijk dank voor je input.

Friend
 
Hallo,

nog eventjes een andere kijk op het probleem: je zegt dat je elk jaar zo'n 30.000 records krijgt uit een ander softwarepakket, ik neem aan een ERP pakket waar de gegevens beheerd en gestockeerd worden. Wat is het doel van je applicatie, reporting? Dan kan dit waarschijnlijk beter rechtstreeks vanuit het ERP pakket (BI, reporting services, ...). Als we het doel weten kunnen we ook beter meedenken naar een geschikte oplossing. Als je Excels aankrijgt kan dit misschien gewoon in Excel? Eén excel per jaar? Als de gegevens al in een database beheerd worden is het meestal contra-productief om die nog eens in een tweede database bij te houden. Wat als de gegevens van 2020 in 2021 nog gecorrigeerd worden? Dan is je tweede database foutief. Als je een Excel/jaar hebt maak je een macro om de import te doen en te formateren en moet je gewoon de oude excel weggooien en een nieuwe import doen met die macro.
 
Noella, hartelijk dank voor je uitgebreide toelichting en advies. Ik moet dit eens in zijn totaliteit gaan bekijken. Dit gaat verder dan mijn oorspronkelijke vraag en wat ik dacht even te doen. Ja het komt uit een erp pakket Nu in access doen wij er nog iets moois mee qua mailing, overzicht, per post of e-mail. Ga dat hele proces weer eens evalueren. Hartelijk dank voor je gedachten hieromtrent. Hele fijne Kerstdagen!
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan