Mischien wel ouderwets, maar...

Status
Niet open voor verdere reacties.

ernstcramer

Gebruiker
Lid geworden
14 dec 2015
Berichten
66
ik heb ooit de Acces Professional versie 2003 aangeschaft en die gebruik ik nog steeds.
Recent ben ik overgestapt naar Windows 10. Ik merk dat de DB, die ongeveer 200 Mb groot is, bij openen gigantisch groeit: tot wel bijna 2 Gb. En dat terwijl ik er nog maar 6 items in opgeslagen heb.

Ik laad wel bij het eerste te openen record een aantal afbeeldingen. Die zijn nu nog allen groot (pakweg 4,5 Mb per stuk). Inmiddels ben ik begonnen deze te comprimeren.

Mijn vraag is echter: de omvang blijft groeien ook al heb ik uit de records de plaatjes nu verwijderd. Ik kan de Db comprimeren, maar dat lijkt slecht een tijdelijke oplossing. Kent iemand dit probleem? En zo ja, is er dan wat aan te doen?
Is de combinatie Access 2003 met Windows 2010 geen gelukkige?

Ik hoor graag jullie reacties,

ernst cramer

Ik heb een Lenovo laptop met 4Gb intern geheugen. "gebouwd voor windows 7".
 
Ik heb A2k3 nooit onder W10 gedraaid, maar wel onder W7 en dat gaf nooit problemen. Afbeeldingen in de database opslaan is altijd een slecht idee; de database groeit dan in no-time volledig uit de klauwen. Ongeacht de versie. Dat het bij jou nu wel heel erg hard gaat, komt misschien door het bestandssysteem van je harde schijf. Afbeeldingen verwijderen doet in eerste instantie niks, omdat de grootte van de db er niet door verkleint. Dat gebeurt pas als je de db comprimeert, dan wordt de vrijgekomen ruimte ook echt opgeruimd. Als je de afbeeldingen daarna weer terugzet (en ik heb het idee dat je dat doet) dan begint het circus weer van voren af aan.
De enige oplossing is dus: geen afbeeldingen in de db! Sla ze op in een map onder de map waar je db staat, en gebruik tekstverwijzingen. Die sla je uiteraard wél op in je database.
 
Dank OctaFish voor je commentaar. Ik sla inderdaad de afbeeldingen NIET op in de DB; ik gebruik alleen de verwijzing naar de map. Alleen bij het openen van het formulier laadt ik dan de bijbehorende afbeeldingen.
Ik comprimeer zoals je aangeeft de DB; deze is nu ca. 120 Mb groot.
Feit blijft dat als ik de formulieren wil aanpassen, of VBA codes wil aanpassen, de toepassing eerst op slot slaat (reageert niet) en dan pas weer terugkomt. En dat bij zowat iedere actie.

Wat nu wel weer goed loopt is het vullen van de records.
Probleem van het geheugen lijkt echter dus nog steeds aanwezig.
 
Je gaf aan dat er nog maar 6 records in de db zitten (je vertelt er overigens niet bij hoeveel tabellen, hoe groot de tabellen etc.); dan zou de db nooit 120 MB mogen zijn. Prima trouwens dat je geen afbeeldingen in de db opslaat. Wat voor plaatjes geldt, geldt uiteraard ook voor andere vormen van bijlagen, dus wellicht een knal voor open doel, maar als je Bijlagevelden hebt, dan zou ik die op dezelfde manier behandelen als afbeeldingen, dus opslaan in een eigen map en de tektsverwijzing naar pad en afbeelding opslaan.
Als je afbeeldingen op de (ook door jou) correcte manier laadt in formulieren, mag dat geen enkele invloed op een formulier hebben. En dus ook niet op de grootte van de db. De plaatjes maken namelijk geen onderdeel uit van de db. Dus ik ben eigenlijk wel benieuwd naar de db, want er zit toch iets niet jofel. Is het mogelijk om een kopie te maken die onder de 100 Mb blijft? Die kun je dan op een fileshare als Wikisend.com neerzetten.
 
Dank weer voor je bericht.
Ik heb 1 tabel waarin de data zit en een aantal kleinere waarin ik gegevens heb zitten als fabrikantnaam of andere referentiegegevens. Door hier een koppeling te maken wordt in de hoofdtabel alleen maar het id nummer opgeslagen en niet de hele tekst van wat je als gebruiker wilt zien.
Ik heb nu nog geen andere bijlagen als plaatjes, maar mocht voorkomen was ik wel van plan dat op dezelfde wijze te doen.
Ik kan de DB op dit moment houden op ca 120 Mb, ik zou niet weten hoe ik functionaliteit eruit kan halen om de DB kleiner te krijgen. Ik kan een dump maken van de VBA codes, maar dan weet je nog niets over de omvang van de tabel als geheel.
Ik zal er nog eens mee stoeien.
 
In het draadje van Dolfke speelt misschien wel hetzelfde probleem, als ik je berichten zo lees. Daar was het simpel op te lossen. Wellicht dat bij jou dezelfde oplossing werkt? Hier de code die ik in dat draadje heb gegeven:
Code:
    fName = "\Icons\Header.png"
    fName = Path & "\" & fName
    With Me.ImageFrame_Header
        .Picture = fName
        .SizeMode = 1
        .PictureType = 1
    End With
 
Eerst even een vraag inlossen. Bijgaand de link naar DropBox. Ik heb daarin de omgeving neergezet; expres, omdat anders het gebruik van de DB tot foutmeldingen leidt omdat deze de padnaam van de foto's checkt.

https://www.dropbox.com/sh/sswkopcqjgayrps/AAASfNt5vb8KcQRQMFsFQeGva?dl=0

ik hoop dat dit werkt.
Even hoe ik met de foto's omga. Het is een DB om modelbaan materieel in vast te leggen. Van het actieve item/record kunnen maximaal 5 afbeeldingen getoond worden. daarvan is er maar 1 op "ware" grootte; 4 anderen zijn uitsluitend als pictogram op een drukknop te zien.
Ik heb alle foto's grafisch verkleind naar ergens tussen 250 - 350 kB. Dit ook al om niet teveel geheugenruimte in beslag te nemen.

Na gecomprimeerd zijn is de DB ca 125 Mb groot. Ik heg er gisteravond 5 items aan toegevoegd; en net bij openen zag ik dat de file 1,3 Gb groot was. Dat terwijl de foto's dus NIET in de DB opgeslagen worden.

Dan wat betreft je laatste bericht @OctaFish: wat gebeurd er precies met deze commando's?
 
Je probleem wordt, zoals ik al vermoedde, veroorzaakt door hetzelfde probleem als dat in de draad van Dolfke. Je hebt de afbeeldingen niet gekoppeld, maar ingesloten. En dan krijg je dat elke afbeelding die je inleest gewoon in de db wordt opgeslagen. Daarbij maakt het niet uit of je de plaatjes groot maakt of verkleint, of jpg-tjes gebruikt, want Access gebruikt intern het bmp formaat. En veel groter worden plaatjes niet :). Ik heb de 5 plaatjes in je formulier F_data omgezet naar gekoppelde afbeeldingen, en de db is ineens na comprimeren nog maar 21 Mb. Dat scheelt dus gelijk al 100 Mb. Ik denk dat er nog wel meer te winnen is, maar daar mag je zelf even naar kijken; je kent je db tenslotte beter als ik. Hier een gezipte versie van de db zoals ik hem nu heb.
 

Bijlagen

bedankt OktaFish, de DB is inderdaad behoorlijk "gekrompen" zeg! Ik ben er erg blij mee!

Ik heb zowel de definities als de VBA code doorgelopen, maar ik zie eigenlijk helemaal geen wijzigingen... :shocked: ik zal wel zitten te snurken :rolleyes:

Je gaf aan dat er misschien nog wel meer te halen is... Mogelijk wel, maar voor mij blijft VBA een heel avontuur. Zo ben ik aan het stoeien geweest om de loop voor ieder plaatje uit te voeren met een for...then loop. Maar het commando om het plaatje te lezen (Me.Afb(x).Picture) kreeg ik niet "variabel". Nu moest ik dus voor alle knoppen de volledige code herhalen...

Maar voor nu heel erg bedankt. En ik ben benieuwd naar je hint waar de wijzigingen zitten.
 
Wat er sowieso verbeterd (is ingekort) kan worden is de manier waarop je de verschillende objecten vult of leegmaakt. Vergelijk jouw oorspronkelijke code van deze knop maar eens met mijn code:
Code:
Private Sub cmdDelPict_Click()
Dim Cancel As Integer
Dim i As Integer
Dim hulpPic(5) As String, wisselPic(5) As String
    For i = 0 To 4
        hulpPic(i) = Me("Afb" & i)
        wisselPic(i) = Me("Afb" & i & "old")
        If Me("Pict" & i).SpecialEffect = 2 Then
            If wisselPic(i) <> afbStandaardOld Then
                If MsgBox("Wilt u bestaande afbeelding verwijderen?", vbYesNo + vbQuestion, "Wijzigen afbeelding") = vbNo Then
                    MsgBox ("Afbeelding wordt niet verwijderd")
                    Cancel = True
                Else
                    Me("Afb" & i & "old") = hulpPic(i)
                    Name padDBgallerij & hulpPic(i) As padDBcur & wisselPic(i)
                    Me("Afb" & i & "old") = "geen"
                    Me("Afb" & i) = afbStandaard
                End If
            End If
            DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
            Call Pict0_Click
        End If
    Next i
End Sub
Jij hebt voor elke afbeelding (met eigen naam) aparte variabelen gemaakt. Ik doe dat in een loop die 5 keer wordt doorlopen. Mijn code is veel korter, beter leesbaar en ook veel makkelijker aan te passen, want dat hoef je maar één keer te doen. Jij moet elke knop apart nalopen. Met de kans dat je routines vergeet.

De échte aanpassingen zitten in de eigenschappen van het plaatje, en hebben niks met de code te doen. Al kun je de gewenste instelling dus wel met VBA doen, zoals in het andere draadje uitgelegd. Kijk maar eens naar de Eigenschappen van je plaatjes. Daar heb ik de eigenschap <Afbeeldingstype> veranderd van "Ingesloten" naar "Gekoppeld". De eerste variant slaat het plaatje op in de db, de tweede niet. Met de eerste groeit de db dus naar 120 Mb, met de 2e verlies je 100 Mb. De 'opdracht' die ik gaf was dus dat je de overige formulieren, waar wellicht ook objecten met ingesloten afbeeldingen staan, die objecten omzet naar Gekoppeld.
 
Briljant! Naar die truc om een loop te gebruiken ben ik denk ik wel een week op zoek geweest en internet afgestruind naar een oplossing. Ik kwam telkens een stapje verder, maar struikelde dus op de syntax voor dat "me" commando. Ik ga het erin verwerken, want dit komt vaker voor, ook wel in andere db's.
Overigens heb ik in andere formulieren (nog) geen gekoppelde zaken staan; misschien als ik onderhoudsschema's van het materieel nog eens digitaal krijg dat ik die er dan bij in kan zetten.

Nogmaals hartelijk dank voor de supersnelle service!
 
Graag gedaan :). Ik zal ook nog eens kijken wat de grootte van de db tegenhoudt, want 21 Mb vind ik nog steeds aan de pittige kant voor de inhoud die je hebt. Kom ik nog op terug :). Overigens gebruik de loop techniek heel vaak, en hij staat ook uitgebreid in de Access cursus uitgelegd. Bekijk die maar eens in de Handleidingen sectie.
 
Beste OctaFish

toch nog even een vraag. Ik sluit de routine af met het call-commando, maar die verwijst (in volgorde) naar een plaatje. Kan je variabele i van de loop ook in dat call-commando verwerken?
op Call Pict(i)_click geeft VBA een foutmelding op de _ : "ongeldig teken"...
 
Van die constructie snap ik eerlijk gezegd niet zo bar veel. Uiteraard de code wel (ben niet helemaal blond) maar het waarom ontgaat mij volledig. Wat ik in ieder geval wél zie, is dat ook dat volgens mij allemaal weg kan en kan worden vervangen door één functie.
 
Ik heb van het "kleine" plaatje een drukknop gemaakt. Door op het plaatje te klikken wordt de knop "ingedrukt" (picture is verlaagd), de andere knoppen moeten dan omhoog staan. Ik wissel ook de afbeelding zodat ik grafisch kan zien welke afbeelding getoond wordt.

Voor zover ik weet kun je niet achter de verschillende plaatjes dezelfde routine hangen. Vandaar een commando uitwerking per knop.
Om na het wisselen/toevoegen van een afbeelding het totale beeld te verversen roep ik dus de routine aan die bij die knop hoort.
Als het nieuwe/volgende record opgeroepen wordt moet ik ook dezelfde routine aanroepen, omdat anders de plaatjes niet ververst worden...
 
Het gaat steeds om dezelfde knoppen, dus natuurlijk kun je daar een universele functie van maken. Zoals je zelf zegt:
Door op het plaatje te klikken wordt de knop "ingedrukt" (picture is verlaagd), de andere knoppen moeten dan omhoog staan.
Dat is prima in een functie te vangen waarbij je de knop die ingedrukt is meegeeft als parameter. Dan weet je ook welke afbeelding daar op hoort, en dat de andere knoppen omhoog moeten staan.
 
Dank voor je antwoord.
Functies is voor mij nog een duister terrein. Degene die ik in deze DB heb gebruikt heb ik gekopieerd uit een ander voorbeeld, en ik kan die maar deels volgen. Ik zal die cursus eens napluizen waar je naar verwijst. :o
 
Databases kopiëren vind ik zelf een slecht idee; je erft dan de ideeën van een andere ontwerper. Zelf heb ik nog nooit iemand ontmoet, of diens werk gezien, dat ook maar enigszins in de buurt komt van hoe ik zelf ontwerp en werk. Als ik een database van een andere ontwerper over moet nemen, en dat komt nogal eens voor in mijn werk, dan ben ik behoorlijk wat tijd kwijt om te doorgronden hoe die te werk is gegaan. In veel gevallen zou ik liever overnieuw beginnen, maar dat is vaak niet mogelijk. Dus als je in een db van een ander doorgaat, dan moet je donders goed weten hoe die db werkt. Ik was dus, in jouw geval, overnieuw begonnen. Met het voorbeeld als.... voorbeeld :). Neem alleen al deze code, die in mijn ogen heel ongebruikelijk is:

Private Sub Filter_Enter()
'---ingesteld filter verwijderen; dus alle records zichtbaar
DoCmd.DoMenuItem acFormBar, acRecordsMenu, 3, , acMenuVer70
End Sub[/code]
en
Code:
Private Sub goederen_filter_Click()
'---filteren op alle goederenmaterieel
Dim DocName As String
Dim LinkCriteria As String
    DocName = "F_data"
    LinkCriteria = "[materieelsoort]=2"
    DoCmd.OpenForm DocName, acNormal, , LinkCriteria
End Sub

Dit is de code van 2 knoppen; één knop om een filter leeg te maken en één om een filter in te stellen. De eerste knop maakt gebruik van volslagen onleesbare opdrachten, althans: ik heb geen idee waar ze voor staan. Moet ik opzoeken. De tweede knop opent het formulier opnieuw met een filter. Je hebt mazzel dat Acces uit zichzelf een formulier maar één keer opent, de puinhoop zou niet te overzien zijn :).
Ik zou het dus zo doen:

Code:
Private Sub Filter_Enter()
    Me.Filter = ""
    Me.FilterOn = False
End Sub
en
Code:
Private Sub goederen_filter_Click()
    Me.Filter = "[materieelsoort]=2"
    Me.FilterOn = True
End Sub
Eigenlijk zou ik het nog veel universeler doen, maar daar gaat het hier niet om. Nog een voorbeeldje: de cmdAddPict procedure kan ook een stuk korter.

Code:
Private Sub cmdAddPict_Click()
Me.cmdAddPict.SpecialEffect = 2 'knop ingedrukt
Dim Cancel As Integer
Dim strHulp As String
Dim curAfb As String 'resultaat is filename uit functie fGetPictureName
Dim newAfb As String 'nieuwe naam voor afbeelding AfbX
Dim extAfb As String 'is de extensie voor de afbeelding
Dim i As Integer
Dim hulpPic(5) As String
Dim wisselPic(5) As String

    strHulp = padDBpluk
    For i = 0 To 4
        hulpPic(i) = Me("Afb" & i)
        wisselPic(i) = Me("Afb" & i & "old")
        If Me("Pict" & i).SpecialEffect = 2 Then
            If wisselPic(i) <> afbStandaardOld Then
                If MsgBox("Wilt u bestaande afbeelding wijzigen?", vbYesNo + vbQuestion, "Wijzigen afbeelding") = vbNo Then
                    MsgBox ("Afbeelding wordt niet gewijzigd")
                    Cancel = True
                Else
                    Me("Afb" & i & "old") = hulpPic(i)
                    Name padDBgallerij & hulpPic(i) As padDBcur & wisselPic(i)
                    Me("Afb" & i & "old") = "geen"
                    Me("Afb" & i) = afbStandaard
                End If
            End If
            DoCmd.RunCommand acCmdSaveRecord
        End If
    Next i
End Sub

Zoals je ziet is er nog een regel vervangen:
Code:
            DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
door
Code:
            DoCmd.RunCommand acCmdSaveRecord

En zo zou ik nog wel even door kunnen gaan :).
 
En om te laten zien hoe je de 5 knoppen instelt: kijk eens naar deze functie.
Code:
Function LoadPic(Knop As String)
Dim i As Integer
Dim hulpPic(5) As String
Dim wisselPic(5) As String
Dim strHulp As String

    strHulp = padDBpluk
    For i = 0 To 4
        hulpPic(i) = Me("Afb" & i)
        If hulpPic(i) = afbStandaard Then
            Me.imgAfbeelding.Picture = ""
            Me.lblStatus.Caption = "Geen afbeelding opgegeven"
            Me("Pict" & i).Picture = afbStandaardPad
        Else
            Me.imgAfbeelding.Picture = (padDBgallerij & hulpPict0)
            Me.lblStatus.Caption = ""
            Me("Pict" & i).Picture = (padDBgallerij & afbLoep_ok)
        End If
        If Me("Pict" & i).Name = Knop Then
            Me("Pict" & i).SpecialEffect = 2
        Else
            Me("Pict" & i).SpecialEffect = 1
        End If
    Next i
    
End Function
Meer heb je volgens mij niet nodig. Bij de knoppen zelf geef je dan deze regel op bij de gebeurtenis <Bij klikken>
Code:
=LoadPic("Pic0")
 
Beste OctaFish
Dank weer voor je uitgebreide uitleg.
Ik heb Access ooit een basiscursus gedaan, en daarna een vervolgcursus, maar van die laatste had ik vreselijk spijt, omdat dat meer was van hoe maak je een rapport of os zo. Zelfs intelligente query's of tabelkoppelingen kwamen daar niet aan de orde... Ik heb altijd meer geleerd van naar andere voorbeelden kijken, proberen te snappen wat er gebeurd, en dat dan kopiëren.
Dus ja, ik heb veel gekeken naar andere bouwers, maar altijd geprobeerd dat tot te passen op een manier die ik ook nog begrijp. Zoals ik al schreef: die functies, vooral wat ik nu al in de huidige DB heb zitten, heb ik gewoon gekopieerd, maar echt begrijpen deed ik het voor een deel niet.

Ik ga ermee aan de slag met wat je nu gepost hebt! :thumb:

nog even een kort vraagje: die code voor een Function zet je in een module? Of kan die ook in de code voor een formulier?
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan