Toon posts:

[ACCESS] inhoud rapport bepalen vanuit vba

Pagina: 1
Acties:
  • 1.006 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
ok, ik wil dus de inhoud van een rapport bepalen vanuit vba
als ik het rapport wil afdrukken kan ik mooi in vba een filter opgeven om de gegevens te bepalen.

maar zodra ik datzelfde rapport wil exporteren naar excel, kan ik in vba geen filter meer opgeven.

nu zou je zeggen... dan baseer je het rapport toch op een gewone query...
maar de inhoud van de query's worden dynamisch bepaald aan de hand van welke gegevens in de tabel staan.

en aangezien het onmogelijk is om voor alle mogelijkheden een aparte query te maken zit ik een beetje met en probleem nu.

ik heb nu dit geprobeerd
code:
1
2
3
Report_verspenen.Filter = "(order_locatie='ergens') AND (verspeen_lokatie='ergens_anders') AND (verspeen_datum BETWEEN begin_volgende_week"# AND #" eind_volgende_week#)"
Report_verspenen.FilterOn = True
DoCmd.OutputTo acOutputReport, "verspenen", acFormatXLS, ("O:\Planning\Prognose\Prognose " + hl + "\verspenen " + RS.Fields("verspeen_lokatie") + ".xls")

doch, dit word straal genegeerd door access :(, die zet gewoon de hele inhoud van de brontabel in het rapport

alvast heel erg bedankt voor de hulp,

ohja, het gaat hier om Access 97 als front-end met een MySql back-end

[ Voor 23% gewijzigd door Verwijderd op 25-06-2003 11:11 . Reden: code iets ingekort ]


Verwijderd

Kan je niet in je rapport tijdelijk vanuit vba een filter opslaan ?
Dus echt je rapport definitie aanpassen en dan openen en daarna eventueel weer verwijderen ?
Ben bang dat ie nu nl niet je filter onthoudt en dat het echt in het rapport moet staan.

Verwijderd

Topicstarter
dat filter opslaan in m'n rapport zou bovenstaand stukje dus moeten doen, maar zelfs als ik 't rapport open ipv exporteer staat die filter gewoon niet ingesteld...

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Om te beginnen: misschien is het verstandig je post even te editten zodat lezers niet drie schermen breed hoeven te scrollen...

Ontopic:
Je hebt een tabel/query waar je een filter overheen gooit, in principe, omdat je rapport wordt gegenereerd aan de hand van gegevens uit een recordset. Is het dan misschien een idee dat filter direct over je recordset heen te gooien en vervolgens deze recordset te exporten? En als dat niet lukt maak je een tijdelijke tabel aan (cloontje) om de gegevens met een loopje in te zetten, kun je daarna exporteren.

Trouwens... volgens mij is die filter hetzelfde als een query die Select * from tabel where FILTERTEKST doet... :? Je kunt die query toch dynamisch opbouwen en de result-recordset exporteren?

My personal website


Verwijderd

Verwijderd schreef op 25 juni 2003 @ 11:02:
dat filter opslaan in m'n rapport zou bovenstaand stukje dus moeten doen, maar zelfs als ik 't rapport open ipv exporteer staat die filter gewoon niet ingesteld...
Als je een filter wilt opslaan in een rapport dan zal je de rapport definities open moeten maken in VBA. Je moet dan het Report object openen en daar een filter hard in opslaan.

Verwijderd

Topicstarter
@OZ-Gump
ok... misschien een domme vraag... hoe exporteer ik een recordset :?
ik heb er wel naar gezocht, maar nooit kunnen vinden...
rapport baseren op een recordset-object zou ook helpen, maar ook daar weet ik niet hoe dat moet...

@ErikvSon
uit je tekst maak ik op dat dat dus nu niet gebeurd..

/me ziet zijn vba kennis zienderogen slinken

Verwijderd

Misschien gek, maar als je gewoon een csv file wilt maken, dan kan je dat ook zelf doen ipv een rapport te gebruiken.
Je maakt de query en loopt in VBA door alle records heen. Is zo gemaakt. Alleen moet je dan wel zelf de opmaak in Excel doen ...

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Om mijn eerste cryptische post dan maar een beetje duidelijk te maken:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Dim dat as database
Dim rs as RecordSet
Dim SQL as String
Set dat = CurrentDb

  SQL = "Select * from TABELNAAM 
         where (order_locatie='ergens')
               AND (verspeen_lokatie='ergens_anders')
               AND (verspeen_datum BETWEEN #" & begin_volgende_week & "#
                     AND #" & eind_volgende_week" & "#)"
  Set rs = dat.OpenRecordSet(SQL)
  DoCmd.TransferSpreadsheet acExport, , rs, Bestandsnaam

  rs.Close
  set rs = nothing
  set dat = nothing

TransferSpreadSheet is speciaal voor import en export van Excel-bestanden. Je kunt ook DoCmd.OutPutTo gebruiken, dan kun je ook exporteren naar TXT, HTML, enzovoorts...

Het kan trouwens zijn dat je de recordset eerst (tijdelijk) moet opslaan, omdat TransferSpreadSheet keihard een tabel of query nodig heeft, maar dat durf ik niet met zekerheid te zeggen. Ook dat is niet heel ingewikkeld lijkt me.

[ Voor 37% gewijzigd door OZ-Gump op 25-06-2003 11:32 ]

My personal website


Verwijderd

Topicstarter
't lijkt erop dat ze dan voor de opmaak idd maar in excel moetten gaan klussen...
maar dat cvs bestand wil ik eigenlijk slechts als laatste redmiddel houden....

weet er misschien iemand hoe ik de inhoud van een recordset in een tabel zet?
dan kan ik 't rapport baseren op die tabel...

moet sneller typen :+

@OZ-Gump
_/-\o_ dat gaan we eens even proberen

[ Voor 14% gewijzigd door Verwijderd op 25-06-2003 11:39 ]


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Is de opzet van de tabel altijd hetzelfde? (qua velden). Want dan maak je gewoon een tmp tabel waar je de gegevens van de query inzet, en vervolgens gooi je hem leeg na de export. Anders moet je met een tabel-maak-query aan de slag (hint hint).

Ook heel interessant ;)

My personal website


  • ATS
  • Registratie: September 2001
  • Laatst online: 12-02 13:46

ATS

Om de zaak nog wat te compliceren: het aanmaken van tijdelijke tabellen is op zich een goede methode, maar heeft ook één belangrijk nadeel. Access gooit verwijderde objecten niet weg, maar markeert ze slechts als verwijderd. Als je frequent gebruik maakt van tijdelijke objecten in je database, dan groeit die nogal qua bestandsgrootte. De data raakt dan ook gefragmenteerd binnen het bestand, wat de snelheid van je database niet ten goede komt. Je kan de database wel weer 'comprimeren', maar dat gaat helaas niet (makkelijk) vanuit vba. Dat zal dus handmatig onderhoud moeten zijn.
Als je dit een probleem vind, dan kan je een omweg gebruiken:
-maak een database aan met een lege tabel waar je data heen moet gaan
-copieer dit bestand in je vba code
-link de tabel uit dit tijdelijke bestand in je eigen database
-doe wat je wil met die tabel
-unlink de tabel weer
-delete het tijdelijke bestand.

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


Verwijderd

Als je een filter 'hard' wilt opslaan in een rapport kan je dat doen met de volgende code:
code:
1
2
3
DoCmd.OpenReport "Naam rapport", acViewDesign
    Reports.naam van je rapport.Filter = "vul hier je filter in"
    DoCmd.Close acReport, "Naam van je rapport", acSaveYes

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

ATS heeft gelijk wat betreft de grootte en het moeilijk comprimeren binnen VBA zelf. Dat is ook de reden dat, als je Access ge-/misbruikt op die manier, je ook bereid moet zijn om een onderhoudsapp te schrijven. Mijn onderhoudsappje heeft de volgende kenmerken:

• Losse applicatie
• Aan te roepen met command-line parameter -> pad naar Access-DB
• Controleert of DB vrij is (iedereen eruit)
• Compact & repair uitvoeren op db uit commandline parameter
• Herstart van DB indien gewenst

My personal website


Verwijderd

Topicstarter
@ErikvSon
volgens mij krijg je dan zo'n spastiche knipperlichtaanval als ik dat voor 30 formpjes ga doen ;)

@ATS
gaat dat ook zo met records?
dus als ik een vaste tabel heb voor tijdelijke gegevens gaat die ook groeien?

jadus

voornaamste vraag is nu:
hoe zet ik gegevens uit een recordset in een tabel.....
de oplossing van OZ-Gump wil dus een harde tabel hebben

[ Voor 3% gewijzigd door Verwijderd op 25-06-2003 12:02 ]


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Nogmaals: is de opzet voor de resultset altijd gelijk? In dat geval kun je namelijk standaard een tabel (bijvoorbeeld tblTmpExport) opnemen in je database, die je leegmaakt voor de actie, vult met de gegevens (toevoegquery), exporteert en vervolgens weer leeggooit (voor de zekerheid).

Anders zou ik toch gaan denken aan een Tabelmaakquery (hint hint). Daarmee maak je de tabel, die exporteer je en vervolgens zou je hem weer kunnen deleten (oftewel, voor ATS: markeren voor verwijdering ;) ).

My personal website


  • ATS
  • Registratie: September 2001
  • Laatst online: 12-02 13:46

ATS

Dat knipperen kan je voorkomen. Er is een commando om de scherm-updates uit te zetten. Doe dat voor wat ErikvSon zegt en zet het daarna weer aan.

Over het in een tabel krijgen van een Recordset: dat ligt eraan hoe je aan die recordset gekomen bent! Het makkelijkste is via een insert query. Ik neem even aan dat je je recordset samenstelt als een query. Als je inplaats van een SELECT query een INSERT INTO query maakt, dan kan je de gegevens direct in een tabel dumpen. Kan dat om de een of andere reden niet, dan kan je altijd nog met een loop door de data heenwandelen en record voor record inserten...

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


Verwijderd

Topicstarter
ik heb al een standaard Temp_Tabel
(ik dacht dat ik dat al gezecht had, maar blijkbaar dus niet)
opzet voor de resultset is dus altijd gelijk
kom ik er weer op...
hoe zet ik de inhoud van een recordset in een tabel
of, hoe maak ik een dynamische query in access...

moet sneller leren typen.. :P

insert into ga ik proberen..
en hoe insert ik een record van een recordset in een tabel?

[ Voor 19% gewijzigd door Verwijderd op 25-06-2003 12:12 ]


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

insert into ga ik proberen..
en hoe insert ik een record van een recordset in een tabel?
Als je het resultaat van de eerste zin afwacht, kom je vanzelf op 't antwoord van de tweede ;)
Kijk ook eens naar hoe Access zo'n query opbouwt en wat hij doet... Als je trouwens op het data-knopje klikt zal hij de insert-query niet uitvoeren, maar alleen laten zien WAT hij zou uitvoeren. Om hem echt te laten inserten, moet je het rode uitroeptekentje hebben.

Als je niet met de insert-query werkt zul je in code een recordset moeten doorlopen en elke waarde moeten kopieren naar de temptabel.

My personal website


Verwijderd

Topicstarter
ok, het werkt:
Visual Basic .NET:
1
2
3
4
5
6
CurrentDb.Execute "DELETE * FROM temp_p;"
QueryStr = "INSERT INTO temp_p 
            SELECT * FROM partij WHERE (order_locatie='ergens'
              AND zaaidatum BETWEEN #begin week# AND #eind week#);"
CurrentDb.Execute QueryStr
DoCmd.OutputTo acOutputReport, "zaaien", acFormatXLS, ("O:\Planning\Prognose\Prognose West\zaaien.xls")

mijn dank is groot _/-\o_

[ Voor 18% gewijzigd door Verwijderd op 25-06-2003 14:33 . Reden: typo ]


Verwijderd

volgens mij heb ik een keer de truc gebruikt door het on open of het on load event te gebruiken en daar de recordset aan te passen.
Welke recordset ergebruikt diende te worden was gebaseerd op een global variabele

Maar een temp tabelletje werkt ook altijd heel soepel
Pagina: 1