per2edb Professor
03. juli 2020 - 21:04 Der er 17 kommentarer

fejlen 3014 "Der kan ikke åbnes flere tabeller"

Jeg har mange forme der åbnes og lukkes efter hinanden.
På formene åbner jeg DB' er og lukker dem igen inden formen forlades.

Ikke desto mindre får jeg fejlen 3014 "Der kan ikke åbnes flere tabeller"
samt ofte efterfulgt af : Der er ikke mere hukommelse

DB åbnes i formen ved:

Dim SQL As String, Dba As Database, rs As Recordset
Set Dba = CurrentDb()
Set rs = Dba.OpenRecordset(SQL, dbOpenSnapshot)

DB lukkes på samme form ved:

Dim Dba As Database, rs As Recordset
rs.Close
Dba.Close
Set rs = Nothing
Set Dba = Nothing

Fejlen opstår når DB Åbnes efter flere kald (Måske 15-20 stk)

JEG HAR TJEKKET DER ER INGEN GLEMTE LUKKEDE

Kan jeg gøre noget for VIRKELIG at lukke efter hver form
og generhverve ressourcerne ?
KHN Professor
03. juli 2020 - 21:57 #1
bvirk Forsker
03. juli 2020 - 22:03 #2
Du viser ikke hvilke funktioner de ligger - er du sikker på at du har lavet det i vba så der er tilgang til de objekter der har variable dba og rs - at du skiver:

dim .....
om noget der er tildelt værdi (når det skal lukkes ) får mig til at betvivle det.

Nuvel - prøv at anbrige et stop (vba statement stop) før rs.close og - når der skiftes til vba editoren når formen lukkes - træk så  'rs' til watch vindue (det hedder nok noget andet på dansk) - her kan du se at den har noget i sig - i modsat fald står der at den ikke har nogen værdi.

variable i function og sub mm. er lokale varaible der deklareres med DIM - variable der deles mellem functions og/eller subs skal deklares i toppen af modulet med public eller private
per2edb Professor
04. juli 2020 - 09:49 #3
rs har ingen værdi når jeg ser den i Watch

Hvad gør jeg så ?
Kan de se om jeg har evt fejl i mine koder for DB åbne og lukke?
Eller kan de laves bedre?

Det er som om:
rs.Close
Dba.Close
Set rs = Nothing
Set Dba = Nothing

Ikke virker ordenligt.
Jeg har googlet mig til Access til styring har nogle tælleværker hvor max måske er overskredet.
Kan det tænkes, og i så fald hvordan kan jeg så få dem nulstillet??????
Nb Appen er enorm stor ca 150 forme og ca 60 tabeller  der fylder 220MB
bvirk Forsker
04. juli 2020 - 10:35 #4
Det jeg kender til er at en forms datakilde sørger for at tildele klassevariablen recordset værdi - og den bruges af controlelementerne
Når formen så lukkes antager jeg at der sker recordset.close


Hvorfor tildeler du variable dba og rs når formen åbnes? - hvad bruges det til?
per2edb Professor
04. juli 2020 - 16:30 #5
Hm..... Forstår ikke...
De koder jeg indledningsvis har listet, er de rigtige eller kan de optimere.
Finde der en kode der effektivt kan stoppe og nulstile databasen, hvorefter den så genstartes på ny
bvirk Forsker
04. juli 2020 - 19:06 #6
Jeg tror dine 'koder' skal optimeres helt væk ;)
per2edb Professor
04. juli 2020 - 19:19 #7
Jamen hvad skal der så indsættes for at åbne og lukke
bvirk Forsker
04. juli 2020 - 20:18 #8
Må man se lidt mere af sammenhængen:

Er det funktioner i et klassemodul eller et standard modul
Hvad kalder åben/lukke - er det en forms events?
Må man se de relvante funktions eller subs
per2edb Professor
05. juli 2020 - 10:14 #9
Der er mange forskellige konstellationer men jeg viser som eksempel en typisk nedenfor:
Nb: Ofte har jeg koderne liggende i moduler kaldt fra Formene
        OpenRecordset_Sub og CloseRecordset_Sub er beskrevet i #1


Eksempel: En form med 2-3 sub forme med  f.eks en Comboboxe i hændelsen: AfterUpdate:

Option Explicit
Option Compare Database

Private Sub PO_AfterUpdate()


CurrentDb.Execute "INSERT INTO Firma_Produkter([Linie],..........
                              LinieId = DMax("LinieId", "Firma_Produkter")
                       
                           
                              SQL = "SELECT GruppeId From Gruppe_Struktur WHERE LinieId= " & NiveauOprId
                              Call OpenRecordset_Sub(SQL, Dba, rs, 2)  '1=Tabel, 2=SQL query,3=SQL Server
                              If rs.RecordCount > 0 Then
                                  Do
                                      CurrentDb.Execute "INSERT INTO Gruppe_Struktur([LinieId],[GruppeId]) VALUES(" & LinieId & " .........
                                  rs.MoveNext
                                  Loop Until rs.EOF
                              End If
                              Call CloseRecordset_Sub(Dba, rs)
.
.
.
SQL = "SELECT Produkt_Gruppe.GruppeId ...........
                        Call OpenRecordset_Sub(SQL, Dba, rs2, 2)  '1=Tabel, 2=SQL query,3=SQL Server
 
                        If rs2.RecordCount > 0 Then
                            Do
                              FrmPV.Form![Gruppe2].Value = Nz(rs2!GruppeId, 0)
                              rs2.MoveNext
                            Loop Until rs2.EOF
                        End If
                        Call CloseRecordset_Sub(Dba, rs2)
bvirk Forsker
05. juli 2020 - 20:55 #10
Eftersom du ikke har fået kompileringfejl antager jeg at du kaldt paramerne til de subs eller functions hvis indhold er vist i #1 noget andet end dem du i koden anvender.

'dim' anvendes til lokale variabler - ikke parametre

Princippet for overførsel

sub setvar(var)
    var="test"
end dub

sub usevar()
    dim myVar
    call setvar(myVar)
    debug.print myVar
end sub
per2edb Professor
05. juli 2020 - 22:24 #11
Hm...
Jeg er ikke med..
Leder det frem til en løsning på mit problem:

fejlen 3014 "Der kan ikke åbnes flere tabeller"
samt ofte efterfulgt af : Der er ikke mere hukommelse

Nb husk der er flere tusinde kodelinier over 60 tabeller
flere hundrede moduler hvor alt er ok blot ikke fejlen 3014
bvirk Forsker
06. juli 2020 - 00:04 #12
'Leder det frem til en løsning på mit problem'
prøv!

Dette er  karakteristika for #10 koden:
  kan ikke kompilere pga.
      uerklærede variabler sammenhold med option explicit
  vil ikke kunnekøre pga.
    ugyldig sql
per2edb Professor
06. juli 2020 - 09:27 #13
Du skriver :  #10 koden
Mener du ikke #9

Du skriver kan ikke kompilere: 
Nej eksemplet kan ikke men det er jo også kortet ned. Se alle mine ......
Det fulde kan kompileres og kører korrekt i mange varianter masser af steder i appen

Jeg har ingen kodefejl. Det er slet ikke det der er problemet. Hele Appen kører men måske strukturen af DB start og slut kan optimeres så jeg ikke får fejl 3014

Kan det ikke lade sig gøre må jeg konkludere Access ikke kan anvendes til store Applikationer. Nb Min App er på 200Mb koder inklusiv lidt data
bvirk Forsker
06. juli 2020 - 13:34 #14
Bemær parameter navne og fravær af Dim

sub CloseRecordset_Sub(Dba,rs)
  rs.Close
  Dba.Close
  Set rs = Nothing
  Set Dba = Nothing
end sub
bsn Seniormester
06. juli 2020 - 16:24 #15
#13
Access har en begrænsning på 2 Gb.
bsn Seniormester
06. juli 2020 - 16:27 #16
per2edb Professor
06. juli 2020 - 17:01 #17
Venligst læs indledningen #1

DB åbnes i formen ved:

Dim SQL As String, Dba As Database, rs As Recordset
Set Dba = CurrentDb()
Set rs = Dba.OpenRecordset(SQL, dbOpenSnapshot)

DB lukkes på samme form ved:

Dim Dba As Database, rs As Recordset
rs.Close
Dba.Close
Set rs = Nothing
Set Dba = Nothing
Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links

Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester





Premium
Hackere har manipuleret med lækkede data fra Det Europæiske Lægemiddelagentur
Der er nye detaljer om de oplysninger, der blev stjålet i hacket af Det Europæiske Lægemiddelagentur. Udover at data er blevet lækket, er disse også blevet manipuleret for at undergrave tilliden.
Computerworld
IBM vinder millionaftale om nyt toldsystem
Skatteforvaltningen har tegnet en tiårig kontrakt IBM om levering af det sidste it-system til i en omfattende systemudskiftning i toldsystemerne og som først forventes afsluttet i 2025. Se alle detaljerne her.
CIO
Podcast: Hos Viking Life-Saving Equipment er it gået fra at være backend til at være noget, som kunderne spørger aktivt efter
Podcast, The Digital Edge: Viking leverer en stadig større del af deres produkt som en tjeneste. Som en del af tjenesten tager Viking ansvar for sikkerheden ved at levere, dokumentere og vedligeholde det nødvendige sikkerhedsudstyr. Hør hvordan Henrik Balslev senior digital director hos Viking har løftet den opgave.
Job & Karriere
Microsoft i kæmpe dansk satsning - åbner tre store datacentre i Danmark
Microsoft lancerer kæmpe satsning fra hovedkvarteret i Lyngby. Selskabet åbner tre store bæredygtige datacentre på Sjælland.
White paper
Sådan kan du arbejde effektivt uanset tid, sted og type af enhed
Hvad nu hvis dit arbejde, din information, dine processer og teknologien bag ved, var organiseret på en måde så det passede til din organisation – alt sammen guidet af en intelligent udgave af det digitale arbejdsrum? Det er visionen bag Atea og Citrix´s samarbejde med digital workspace – en smartere og mere effektiv måde at arbejde på. I dette whitetpaper kan du derfor læse om, hvordan du kan skabe et mere effektivt og brugervenligt arbejdsrum uanset tid, sted og enhed. En løsning der på en gang er både enkel og som sætter brugeren i centrum.