[ Brodoplovac @ 30.06.2014. 19:10 ] @
Cilj mi je da napunim izveštaj direktno iz posojećeg recordseta, a da ne moram da dovlačim podatke iz tabela. Pošto to nije moguće onda koristim trik gde jedna jednostavna tabela pokreće kreiranje izveštaja, a ostali podaci se dodaju iz VBA.

U pitanju su sledeći koraci:
1) Napravim rekordset.
2) Imam tabelu sa 10.000 rekorda i jednim fildom. Pomoću SQL upita uzimam iz te tabele onoliko rekorda koliko ima prethodno kreirani rekordset i sa tim upitom pokrećem OpenReport komandu.
3) Izveštaj ima neke unboundovane fildove. Njih punim u Detail_Print eventu sa podacima iz rekordseta. Tako dobijamo izveštaj koji je uglavnom napunjen dinamički.

Dešava se da dobijam korektni izveštaj, ali on neće da se štampa kako treba. Ako ga štampam direktno (acViewNormal) onda se odštampa kako treba. Ako ga otvorim u Preview-u, on se otvori kako treba ali posle toga nastaju sledeći problemi prilikom štampanja:

- Prvih n-1 rekorda se ne odštampa, a poslednji rekord se pojavljuje n puta (Windows XP i Access 2003).
- Uopšte neće da se štampa (Windows 7 i Access 2010).
- Da se izveštaj delimično odštampa, ali na poslednjoj stranici piše tekst (Windows 7 i Access 2010):
ERROR: syntaxerror
OFFENDING COMMAND: --nostringval--
STACK:


Ono što sam probao bez uspeha je:
- Da report inicijalno bude (ili ne bude) baundovan za ovu tabelu sa 10000 rekorda.
- Da report ima (ili nema) jedan boundovan fild iz te tabele od 10000 rekorda.
- Da rekordset bude DAO tipa dobijen boundovanjem forme (kao u atačovanom fajlu) ili da koristimo ADO diskonektovani rekordset dobijen preko VBA.
- Da napravimo novi fajl u kome ću rekonstruisati čitav proces. Ni ovo ne pomaže. Znači, ista stvar i sa MDB i sa ACCDB.


U prilogu je primer. U ovom primeru tblReportDriver je tabela sa 10000 rekorda. tblPodaci je tabela na osnovu koje je napravljen rekordset.
Forma frmPodaci sadrži dugme koje pokreće izveštaj u ReportView-u. Kada se izveštaj otvori u ReportView-u on izgleda kako treba, ali neće da se štampa.

Znači, kada otvorite atačovani fajl u formi frmPodaci kliknete na dugme. Otvoriće se izveštaj koji će OK izgledati. Probajte da odštampate u PDF virtuelnom štampaču i tada će se pojaviti neki od navedenih problema.

Da li ima leka?

[ Zoran.Eremija @ 30.06.2014. 21:05 ] @
Jesam plovio brodom, ali moram priznati da iz svega napisanog i priloženog nisam razumeo koja Vam je funkcija cilja?!?!?
Najviše zbunjuje naslov teme "Dinamički napunjen report" ?!?
[ captPicard @ 01.07.2014. 08:26 ] @
Nisam pogledao kod, ali provjeri da nemaš negdje BeforePrint postavljanje nekih varijabli ili slično a da ih ne postavljaš na nulu. Jer BeforePrint se okida dva puta, kod Previewa i kod ispisa.
[ Brodoplovac @ 01.07.2014. 10:21 ] @
Citat:
Jesam plovio brodom, ali moram priznati da iz svega napisanog i priloženog nisam razumeo koja Vam je funkcija cilja?!?!?

Cilj je da se otvaranjem forme puni recordset, a da se onda iz tog recordseta puni izveštaj. Želim da izbegnem ponovno povlačenje podataka iz tabela.
Citat:
Najviše zbunjuje naslov teme "Dinamički napunjen report" ?!?

Mislim na izveštaj kome su podaci naknadno ubačeni iz postojećeg rekordseta.

Citat:
Nisam pogledao kod, ali provjeri da nemaš negdje BeforePrint postavljanje nekih varijabli ili slično a da ih ne postavljaš na nulu. Jer BeforePrint se okida dva puta, kod Previewa i kod ispisa.

Ne znam koji je to event, niti čiji je to event. Ja radim sa Detail_Print eventom. Nešto mi nema logike da se neki event okida kada se Report pošalje na štampu. Mislim da bi svaka naknadna promena narušila verodostojnost Print Preview-a.
[ Getsbi @ 01.07.2014. 12:55 ] @
Citat:
Brodoplovac: Cilj mi je da napunim izveštaj direktno iz posojećeg recordseta, a da ne moram da dovlačim podatke iz tabela. Pošto to nije moguće onda koristim trik gde jedna jednostavna tabela pokreće kreiranje izveštaja, a ostali podaci se dodaju iz VBA.


Koncept Recordseta je osmišljen da bi se radilo sa kopijom tabele. To podrazumeva insertovanje, ažuriranje i brisanje zapisa. Za štampanje nema smisla sem ako ne želiš da štampaš zapis po zapis odnosno da kontrolišeš zaustavljanjem i ponovnim pokretanjem. A za to je potreban sasvim drugi pristup.
Za nedovlačenje podataka iz tabele je dovoljan SQL upit kao izvor podataka za izveštaj. Upit je u stvari virtuelni pogled nad tabelom. To najbrži i najefikasniji pristup.
[ Brodoplovac @ 01.07.2014. 13:35 ] @
Citat:
Za nedovlačenje podataka iz tabele je dovoljan SQL upit kao izvor podataka za izveštaj. Upit je u stvari virtuelni pogled nad tabelom. To najbrži i najefikasniji pristup.

SQL jeste efikasan način jer uvek radi. Najbrži nije sigurno jer se podaci moraju uzimati sa hard diska. Ja bih hteo da ih uzmem iz RAM memorije. Samo kada bih još mogao normalno da štampam.
[ captPicard @ 01.07.2014. 14:40 ] @
Ako želiš brzinu stavi u string listu i onda kupi podatke iz string liste.
[ Brodoplovac @ 01.07.2014. 14:59 ] @
Citat:
Ako želiš brzinu stavi u string listu i onda kupi podatke iz string liste.

Šta tačno podrazumevate pod string listom?
Mada, meni nije problem odakle da uzmem podatke jer imam na raspolaganju rekordset koji je u RAM memoriji. Meni je problem kako da te podatke pretvorim u odštampanu kopiju.