Avatar billede per2edb Guru
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 ?
Avatar billede KHN Guru
03. juli 2020 - 21:57 #1
Avatar billede bvirk Guru
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
Avatar billede per2edb Guru
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
Avatar billede bvirk Guru
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?
Avatar billede per2edb Guru
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
Avatar billede bvirk Guru
04. juli 2020 - 19:06 #6
Jeg tror dine 'koder' skal optimeres helt væk ;)
Avatar billede per2edb Guru
04. juli 2020 - 19:19 #7
Jamen hvad skal der så indsættes for at åbne og lukke
Avatar billede bvirk Guru
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
Avatar billede per2edb Guru
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)
Avatar billede bvirk Guru
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
Avatar billede per2edb Guru
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
Avatar billede bvirk Guru
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
Avatar billede per2edb Guru
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
Avatar billede bvirk Guru
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
Avatar billede bsn Forsker
06. juli 2020 - 16:24 #15
#13
Access har en begrænsning på 2 Gb.
Avatar billede bsn Forsker
06. juli 2020 - 16:27 #16
Avatar billede per2edb Guru
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
Avatar billede 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. Der sættes "nofollow" på alle links.

Loading billede 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



IT-JOB

Cognizant Technology Solutions Denmark ApS

Senior Test Engineer

Netcompany A/S

IT Consultant

Dynamicweb Software A/S

Tech Team Lead