|
|
| Auteur |
Bericht |
The_Vicar
|
|
Onderwerp: transferspreadsheet GROTE tabel
Geplaatst: 25 mrt 2010 - 14:12
|
|
Senior Developer
Geregistreerd op: 28-apr-2008
Berichten: 106
Status: Offline
|
|
Hallo,
Met "DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9" exporteer ik een tabel naar excel.
Het probleem is dat die tabel 300000 records bevat, en er op deze manier slechts +/- 64000 records max kunnen geëxporteerd worden. Dat zal wel zijn redenen hebben, maar is er een manier om grotere tabellen te exporteren?
ALvast bedankt voor een antwoord.
Vic. |
|
|
| |
|
|
|
 |
Jenny
|
|
Onderwerp: Re: transferspreadsheet GROTE tabel
Geplaatst: 25 mrt 2010 - 15:15
|
|
Professional Developer
Geregistreerd op: 01-feb-2007
Berichten: 363
Status: Offline
|
|
tja,excel 2003 beperkt het aantal rijen in een sheet tot +-65.000
in excel 2007 zal het vermoedelijk wel gaan (een sheet kan +-1.000.000 rijen bevatten)
wat je zou kunnen doen is die tabel over 6 tabellen verdelen van elk 50.000 records(query generator-make table query)
en die 1 voor 1 naar excel transfereren
dan wordt elke tabel in een ander sheet gezet,sheet met de naam van die tabel
ik heb geen idee of dit onderhevig is aan geheugen beperking |
|
|
| |
|
|
|
 |
The_Vicar
|
|
Onderwerp: Re: transferspreadsheet GROTE tabel
Geplaatst: 25 mrt 2010 - 15:23
|
|
Senior Developer
Geregistreerd op: 28-apr-2008
Berichten: 106
Status: Offline
|
|
Hey,
bedankt voor je antwoord. ja, ondertussen ook nog wat verder op het net gezocht, en bij volgende uitgekomen: de export naar excel is beperkt tot 65000 rijen (zelfs nu met 2007, waar ik mee werk, die tot 1M kan gaan), maar blijkbaar heeft access2007 nog steeds de beperking van excel2003 als het op exporteren aan komt.
dat met die 50000 lijnen ben ik nu aan het testen, maar ben het veel te ingewikkeld aan't maken denk ik. wat bedoel je precies met query generator?
Groeten. |
|
|
| |
|
|
|
 |
Jenny
|
|
Onderwerp: Re: transferspreadsheet GROTE tabel
Geplaatst: 25 mrt 2010 - 15:57
|
|
Professional Developer
Geregistreerd op: 01-feb-2007
Berichten: 363
Status: Offline
|
|
in access kan je query's aanmaken
maak een nieuwe query
kies de tabel die je in meerdere tebellen wil splitsen
en specifieer dat het een make-table query moet zijn
kies alle velden
en bepaal dan de selectie criteria
een voorbeeldje in SQL:
SELECT Tabel1.* INTO Tabel2 FROM Tabel1 WHERE (((Tabel1.ID) Between 7 And 12));
dit doe je dan 6 maal:
INTO Tabel2
INTO Tabel3
INTO Tabel4
INTO Tabel5
INTO Tabel6
INTO Tabel7
en je hebt Tabel1 dan gesplits in Tabel2/3/4/5/6/7
dat veranderd niets aan de originele tabel hoor
ps:
in het draadje 'constant uur opzoeken'
ben je er ondertussen al achter gekomen dat je definitie van 'stabiele verzameling' wel eens totaal niet het verwachte resultaat kan opleveren ?
met die definitie kan de temperatuur van bv 50 graden oplopen tot bv 200 graden
en toch zal elke deelverzameling 'stabiel' zijn,als de temperatuur maar langzaam genoeg oploopt |
|
|
| |
|
|
|
 |
The_Vicar
|
|
Onderwerp: Re: transferspreadsheet GROTE tabel
Geplaatst: 25 mrt 2010 - 16:04
|
|
Senior Developer
Geregistreerd op: 28-apr-2008
Berichten: 106
Status: Offline
|
|
Hey bedankt... maandag uitproberen, vanaf nu is het verlengd weekend voor mij.
ivm stabiel uur, nee hier ben ik nog niet uit, ik kom regelmatig problemen tegen als ik het wil opzetten.
Probleem is dat ik niet rechtstreeks kan zeggen "ga naar record 5632", 't is altijd met movenext en moveback... of kan dat wel?
nogmaals bedankt!
Groeten
V. |
|
|
| |
|
|
|
 |
Jenny
|
|
Onderwerp: Re: transferspreadsheet GROTE tabel
Geplaatst: 25 mrt 2010 - 17:43
|
|
Professional Developer
Geregistreerd op: 01-feb-2007
Berichten: 363
Status: Offline
|
|
tja,een tabel in een relationele db is nu eenmaal een ongeordende verzameling records
maw:
je kan nooit met zekerheid weten op welke fysieke positie in de tabel een record opgeslagen wordt
het dbms heeft de volledige vrijheid om dat te bepalen
er bestaat dus niet zoiets als een 'eerste','tweede'...enz record in een tabel
maar wat ik denk dat je wil (naar een bepaald record gaan)is wel mogelijk
voorwaarde is dat er in je tabel een numeriek veld is (autonummer is ideaal) en dat er op dat veld een (liefst unieke) index staat
je moet dan specifieeren dat die index gebruikt moet worden,en dan kan je 'seek'-en op die index
ik maak tegen maandag wel een voorbeeldje
er zijn nog wel andere methodes om naar een bepaald record te gaan maar die zijn niet 100% betrouwbaar |
|
|
| |
|
|
|
 |
The_Vicar
|
|
Onderwerp: Re: transferspreadsheet GROTE tabel
Geplaatst: 29 mrt 2010 - 07:46
|
|
Senior Developer
Geregistreerd op: 28-apr-2008
Berichten: 106
Status: Offline
|
|
Hey Jenny,
Een voorbeeldje zou fantastisch zijn, dankuwel hiervoor!
Als ik al op record zou kunnen zoeken (met die index), kom ik er wel uit.
Groetjes,
V. |
|
|
| |
|
|
|
 |
Jenny
|
|
Onderwerp: Re: transferspreadsheet GROTE tabel
Geplaatst: 29 mrt 2010 - 15:37
|
|
Professional Developer
Geregistreerd op: 01-feb-2007
Berichten: 363
Status: Offline
|
|
om direct naar de positie van eender welk record te springen
voorwaarde is uiteraard dat er een veld is dat voor elk record per 1 oploopt
en dat het veld uniek geindexeerd is, en dat die index de aktieve index is
in onderstaand voorbeeld is dat veld een long met naam 'ID' en de naam van de tabel is "Klant"
Visual Basic code: Sub Doehet() Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("Klant", dbOpenTable) rs.Index = "ID" rs.Seek "=", 610 If rs.NoMatch Then Debug.Print "Niet gevonden" rs.MoveFirst Else Debug.Print rs!id, rs!naam End If rs.Close Set rs = Nothing db.Close Set db = Nothing End Sub
|
|
|
| |
|
|
|
 |
The_Vicar
|
|
Onderwerp: Re: transferspreadsheet GROTE tabel
Geplaatst: 29 mrt 2010 - 15:47
|
|
Senior Developer
Geregistreerd op: 28-apr-2008
Berichten: 106
Status: Offline
|
|
Hey Jenny,
Dat is, en niet overdreven gesteld, fantastisch! wist niet dat het zo simpel was.
Kga er morgen mee aan de slag!
tx!
Groeten,
V. |
|
|
| |
|
|
|
 |
The_Vicar
|
|
Onderwerp: Re: transferspreadsheet GROTE tabel
Geplaatst: 30 mrt 2010 - 08:17
|
|
Senior Developer
Geregistreerd op: 28-apr-2008
Berichten: 106
Status: Offline
|
|
Hey,
met die auto-ID lukt toch niet. Probeer deze toe te voegen, gewoon met de hand via design-view van de tabel, maar lukt niet... "File sharing lock count exceeded. Increase MaxLocksPerFile registry entry" is de boodschap die erop komt.
Maar zou dit rechtstreeks in VBA met SQL willen doen. Dat heb ik al helemaal, tabel wordt gemaakt, maar weet jij hoe ik in SQL dan een autoID-kolom kan creëren?
tx,
V. |
|
|
| |
|
|
|
 |
The_Vicar
|
|
Onderwerp: Re: transferspreadsheet GROTE tabel
Geplaatst: 30 mrt 2010 - 08:36
|
|
Senior Developer
Geregistreerd op: 28-apr-2008
Berichten: 106
Status: Offline
|
|
Ondertussel lukt het wel met de autonummer. Heb een functie op't net gevonden waar dit mee lukt.
Nu nog opsplitsen, maar dat gaat geen probleem zijn.
tx!
V. |
|
|
| |
|
|
|
 |
Jenny
|
|
Onderwerp: Re: transferspreadsheet GROTE tabel
Geplaatst: 30 mrt 2010 - 11:22
|
|
Professional Developer
Geregistreerd op: 01-feb-2007
Berichten: 363
Status: Offline
|
|
tja,je moet altijd in gedachte houden dat een tabel een ongeordende set records is
het systeem van een autonummer aan de tabel geven, zal enkel goed werken als dat autonummer aangemaakt is VOOR de tabel met data gevuld is, en er nooit records in die tabel verwijderd werden, en er nooit een addnew gedaan is zonder een update
een autonummer toevoegen aan een reeds gevulde tabel, geeft geen enkele garantie dat opeenvolgende autonummers overeenkomen met de volgorde waarin records aan de tabel toegevoegd werden
als je achteraf autonummers toevoegd, en als er in die tabel nooit records verwijderd werden, zal dat WAARSCHIJNLIJK wel overeenkomen, maar zekerheid is er nooit
als je zekerheid wil hebben om naar een positioneel bepaald record te gaan, dan zal je die recordset moeten ordenen met sql 'order by'
en dan kan je naar een positioneel bepaald record gaan
stel je ordend je recordset op datum,en je wil nu naar het positioneel 50ste record gaan:
a)je gaat naar het eerste record: recordset.movefirst
b)je gaat naar het 50ste record: recordset.move 49
en je hebt het positioneel 50ste record te pakken
eventueel kan je ook de absoluteposition eigenschap van een recordset gebruiken
in dat geval kan ik je aanraden van snapshot-type recordsets te gebruiken en geen dynaset-type
info:
http://msdn.microsoft.com/en-us/library/bb221051.aspx
http://msdn.microsoft.com/en-us/library/bb221121.aspx
http://msdn.microsoft.com/en-us/library/bb243792.aspx |
|
|
| |
|
|
|
 |
|
|
|
|