[ chupo1 @ 23.12.2013. 07:55 ] @
Pozdrav,

novi sam na forumu. Zaposlen sam u proizvodno-trgovačkoj firmi i trenutno učestvujem u razvoju knjigovodstvenog programa za naše potrebe. Posjedujem solidno znanje iz Access paketa, ali ima i nekih stvari za koje mi treba pomoć stručnijih.

Npr, ako imam dvije tabele sa istim(približno istim) setom kolona i potrebno je kopirati više redova odjednom preko VBA, kako to izvesti, tj. kako napraviti provjeru da li su svi redovi kopirani? Imam takvih situacija(npr. automatsko kontiranje u glavnu knjigu) i radim preko recordset-a, ali iskusio sam to da prilikom kopiranja recimo 100 redova dođe do greške(nestanak struje, prekid konekcije itd.) i u tom slučaju samo dio podataka je kopiran, što je ogroman problem jer sistem smatra da su svi redovi kopirani.

Šta je po mišljenju forumaša adekvatan način rješavanja ovog problema?
[ Getsbi @ 23.12.2013. 08:42 ] @
Ukoliko je razlog nestanak struje, bez sumnje UPS. Ako je konekcija u pitanju, na kraju VBA koda staviš MsgBox koji će ti reći da li je svih 100 zapisa ažurirano.
Inače u Top temi Često postavljana pitanja, na ovom linku postoji VBA kod koji će ti pomoći.
2) Kako pomoću VBA koda popuniti jednu tabelu na osnovu podataka druge:
http://www.elitesecurity.org/t...odateke-iz-jedne-tablice-drugu
[ chupo1 @ 23.12.2013. 09:16 ] @
Pogledaću te kodove večeras, pa javim svoje mišljenje.

Međutim, imam osjećaj da me niste razumjeli najbolje. Moj problem nije kopiranje podataka, nego provjera nakon kopiranja u cilju utvrđivanja da li su svi redovi kopirani. Jedan prost primjer: obe tabele imaju kolone: id, kolicina. Suma kolone kolicina tih 100 redova iz prve tabele koje želimo kopirati u drugu je recimo 500. Prilikom kopiranja na 60% pukne veza i samo prvih 60% redova je preneseno u novu tabelu. Suma kolone kolicina tih 60 redova u drugoj tabeli nije 500 i to je problem. Na koji način označiti da ti redovi nisu kompletni i da ih pri sljedećem pokretanju treba obrisati ili bar prijaviti da kopiranje nije bilo uspješno? Ako stavim MsgBox, to će dati korisniku informaciju da je sve kopirano i to je ok, ali ako na 60% pukne veza kako sistem da zna da nisu svi redovi kopirani? Da li postoji neki standardizovan pristup rješavanju ovog problema?
[ Getsbi @ 23.12.2013. 11:28 ] @
Za kontrolu uparenosti dve tabele koristiš query Without Matching.
[ izonic @ 23.12.2013. 18:56 ] @
Ukoliko zelis da prebacis podatke iz jedne tabele u drugi i da poslije znas sta si prebacio onda bi to morao i pribiljeziti za svaki prebaceni red iu osnovnoj tabeli, sto iziskuje kreiranje jednog polja gdje ce se to pribiljeziti.
Drugi nacin je da pri prebacivanju svakog reda podataka pojedinacno provjeravas dali se taj red podatak nalazi u sekundarnoj tabeli sto je poprilicno nezgodno.
Postoji vjerovatno i trece rjesenje koje je po meni najbolje a to je da se ne prebacuju podaci tj da imas jednu tabelu samo a da imas jedno opciono polje gdje ces razvrstati podatke po svojstvima.

Moras se odluciti za jednu variantu i postaviti primjer ako hoces da ti neko uradi kod.
[ SLOJ.1973 @ 24.12.2013. 09:48 ] @
Odradio sam nesto,pa proveri da li odgovara. Pogledaj opis u kodu.Pozdrav.
[ SLOJ.1973 @ 24.12.2013. 11:36 ] @
Gornji primer ,nekad odradi kako valja a nekad ne.Znaci ne valja. Jedino sto mi pada na pamet je sledece:
1.Napraviti batch file koji snima kompletnu bazu sa servera u kojoj se nalaze podaci za prebacivanje( u mom slučaju sa Z: ) na disk C:(možes i u neki folder na C:,bitno je da bude na istom disku kao i baza sa koje pokrećeš snimanje. Batch fajl snima brzo,a iako se desi da pukne veza,znaćeš,jednostavno nećeš imati tabelu za linkovanje (tblPrva) pa nećeš ni moći da pokreneš prebacivanje podataka.
2.Potrebna je baza na serveru,iz koje vučeš tabelu u svoju bazu,
3.Najpre pokrećeš dugme Preuzmi sa servera,pa zatim pokrećeš dugme Prebaci podatke,i posle 1sec na silu isključi bazu.
Sada bi trebalo da odradi kako treba.
Znači.lakša varijanta da povučeš sa servera kompletnu bazu,pa kroz lokal da snimaš podatke u svoju bazu.to je jedino što mi pada na pamet.Probaj pa javi.
U prilogu batch fajl,Test.mdb koju kačiš na server i dao4.mdb ,koju kopiraš na lokalni disk.
[ Getsbi @ 24.12.2013. 16:01 ] @
Možda najbolji način da ne dođeš u sitaciju da ti se deo zapisa iskopira, a deo ne, je da koristiš Transakcije. Kood bi izgledao ovako:
Code:
Private Sub Knjizenje_Click()
    On Error GoTo Knjizenje_ERR
    
    Dim Transakcija As Workspace
    
    DoCmd.RunCommand acCmdSaveRecord
    
    DoCmd.Hourglass True
    Set Transakcija = DBEngine.Workspaces(0)
    Transakcija.BeginTrans

    KnjiziGlavnuKnjigu     ' ova procedura ili pozvana funkcija vrši kopiranje                          
   
    Transakcija.CommitTrans
    DoCmd.Hourglass False
    DoCmd.RunCommand acCmdRefresh

‘ ovde dođe poruka korisniku da je sve OK.

    
Knjizenje_ERR:
    Transakcija.Rollback
    DoCmd.Hourglass False
      Select Case Err.Number
        Case 94: MsgBox "Nema podataka"
        Case 3021: MsgBox "Nema sloga"
        Case Else: MsgBox Err.Number & " " & Err.Description
      End Select
    Exit Sub
End Sub


Red između Transakcija.BeginTrans i Transakcija.CommitTrans je procedura koju pozivaš sa ili bez parametra.
Transakcija obezbeđuje da ako prenos podataka pukne na 99. zapisu ništa se ne upisuje u drugu tabelu.
Kao što vidiš, mora postojati obrada greške i naredba Transakcija.Rollback, za vraćanje na početak, ispred Transakcija.BeginTrans.
Tek ako je sve prošlo kako treba, korisnik dobija poruku da je sve OK.





[Ovu poruku je menjao Getsbi dana 24.12.2013. u 17:20 GMT+1]
[ chupo1 @ 24.12.2013. 17:22 ] @
Citat:
SLOJ.1973:
Probaj pa javi. U prilogu batch fajl,Test.mdb koju kačiš na server i dao4.mdb ,koju kopiraš na lokalni disk.


Stvarno nisam očekivao da će mi neko uraditi kompetan .mdb kao primjer. Hvala Vam, međutim ovo rješenje nije odgovarajuće jer ne može se osloniti na kopiranje kompletne baze iz mnogo razloga: prevelika baza, puno korisnika, prečesto se dešava itd..

Citat:
Getsbi: Možda najbolji način da ne dođeš u sitaciju da ti se deo zapisa iskopira, a deo ne, je da koristiš Transakcije. Kood bi izgledao ovako:
Code:
Private Sub Knjizenje_Click()
    On Error GoTo Knjizenje_ERR
    
    Dim Transakcija As Workspace
    
    DoCmd.RunCommand acCmdSaveRecord
    
    DoCmd.Hourglass True
    Set Transakcija = DBEngine.Workspaces(0)
    Transakcija.BeginTrans

    KnjiziGlavnuKnjigu     ' ova procedura ili pozvana funkcija vrši kopiranje                          
   
    Transakcija.CommitTrans
    DoCmd.Hourglass False
    DoCmd.RunCommand acCmdRefresh

‘ ovde dođe poruka korisniku da je sve OK.

    
Knjizenje_ERR:
    Transakcija.Rollback
    DoCmd.Hourglass False
      Select Case Err.Number
        Case 94: MsgBox "Nema podataka"
        Case 3021: MsgBox "Nema sloga"
        Case Else: MsgBox Err.Number & " " & Err.Description
      End Select
    Exit Sub
End Sub


Red između Transakcija.BeginTrans i Transakcija.CommitTrans je procedura koju pozivaš sa ili bez parametra.
Transakcija obezbeđuje da ako prenos podataka pukne na 99. zapisu ništa se ne upisuje u drugu tabelu.
Kao što vidiš, mora postojati obrada greške i naredba Transakcija.Rollback, za vraćanje na početak, ispred Transakcija.BeginTrans.
Tek ako je sve prošlo kako treba, korisnik dobija poruku da je sve OK.


Da, mislim da je ovo to što mi treba. Konkretno meni i treba zbog upisa u glavnu knjigu(jer jedna faktura se rasknjižava na više konta i nalog mora biti balansiran), ali sam dao primjer kopiranja između dvije tabele jer je jednostavniji. Ovo rješava problem greške, samo i dalje treba riješiti problem prilikom nestanka struje ili nekog hardverskog kvara jer će u tom slučaju u glavnoj knjizi postojati nebalansiran unos.

P.S. Vidim da se u primjeru koji ste naveli navodi procedura KnjiziGlavnuKnjigu, možete li mi reći odakle ste kod preuzeli, mislim da mi može pomoći?

[ Getsbi @ 24.12.2013. 19:00 ] @
Nisam ga preuzeo. Napisao sam za svoju aplikaciju. Što se tiče nebalansiranog unosa, to zavisi šta radi pozvana procedura i odakle se poziva.
Znači trebalo bi ovako. Na formi (koja je zasnovana na privremenoj tabeli) se unosom postiže ravnoteža naloga, dugovne i potražne strane. Sa iste forme se komandnim dugmetom poziva Knjizenje_Click(), koja odrađuje KnjiziGlavnuKnjigu. Nakon toga se privremena tabela prazni.

Evo ovde sam to skoro spominjao. http://www.elitesecurity.org/t471400-pomoc-access-racunovodstvo
[ chupo1 @ 24.12.2013. 19:15 ] @
Da, ali teoretski do hardverskog problema može doći nakon što kliknete na Knjizenje_Click(), tako da će par redova biti preneseno, a par ne. Malo sam čitao o ovome maloprije, neki RDBM sistemi imaju na nivou baze riješene transakcije, tako da(ako sam dobro shvatio) rješavaju i "hardware malfunction" situaciju. Access transakcije na nivou baze(ne na nivou VBA) ima u verziji 2010, ali ne radi za linkane tabele, tako da nije iskoristiv u mrežnom okruženju. Možda sam ja nešto pogrešno protumačio, moguće je.

Jedna digresija, ako ste upoznati sa modelom baze za finansijsko, možete li mi okačiti linkove gdje bih se mogao više informisati ili dati neke smjernice? Pošto nisam puno upoznat sa knjigovodstvom, malo sam se izgubio. Da li mi trebaju i tabele Dnevnika i Glavne knjige, gdje bih u Dnevnik prenosio npr fakture iz tabele izlaznih faktura kada želim proknjižiti(kako se to radilo ručno) ili mogu preskočiti Dnevnik?
[ Getsbi @ 24.12.2013. 20:03 ] @
Ovde ima jedan model baze koji sam ranije napravio. http://www.elitesecurity.org/t291202-0#1742519

Za sva ostala pitanja najbolje je da pitaš svog knjigovođu. Kod mene je tblPromene ustvari glavna knjiga ili mesto gde se slivaju sve proknjižene stavke. Dnevnik je običan izveštaj koji se po kriterijumu štampa. Fakture su mi dokumenta u tblDokumenta. Sem njih postoje i druge vrste dokumentata u tblVrstaDokumenta.

U savkom slučaju ovaj model može da ti bude okosnica, a sve ostalo uz dogovor sa knjigovođom.
[ SLOJ.1973 @ 25.12.2013. 07:44 ] @
Citat:
Stvarno nisam očekivao da će mi neko uraditi kompetan .mdb kao primjer. Hvala Vam, međutim ovo rješenje nije odgovarajuće jer ne može se osloniti na kopiranje kompletne baze iz mnogo razloga: prevelika baza, puno korisnika, prečesto se dešava itd..

Ne znam da li si uopste isprobao ovo sto sam ti poslao ili jednostavno mislis da nece raditi? Na poslu koristimo ovakav primer,umrezeno 6 racunara,pomocu batch fajla se kopiraju dve baze od po 40mb i to traje 2-3 sekunde(za obe u isto vreme),bez obzira da li ostali korisnici koriste bazu ili ne.Nema nikakvih problema.Manja je verovatnoca da ce se nesto desiti u te 2-3sec (nestanak struje,prekid veze i td) a iako se desi baza nece biti kopirana i prilikom pokusaja da odradis prenos podataka dobijes poruku da baza ne postoji,pokrenes ponovo dugme za snimanje baze i to je to.A u lokalu kada se desi,moj kod vec moze da se nosi sa tim,tj,videces koji su podaci kopirani a koji ne. Sto se tice velike baze,kako si naveo,ja se samo nadam da si podelio tu svoju bazu na FE i BE,pa prilikom zatvaranja BE postavis da se odradi Compact i nema bespotrebnog zauzumanja memorije. Mada sada racunari imaju monogo memorije,pa ne vidim zbog cega je problem "prevelika baza". Toliko od mene,verovatno i Getsbijev primer odradjuje posao,pa ti izvoli probaj.Pozdrav.
[ Getsbi @ 25.12.2013. 14:42 ] @
Citat:
chupo1: Da, ali teoretski do hardverskog problema može doći nakon što kliknete na Knjizenje_Click(), tako da će par redova biti preneseno, a par ne. Malo sam čitao o ovome maloprije, neki RDBM sistemi imaju na nivou baze riješene transakcije, tako da(ako sam dobro shvatio) rješavaju i "hardware malfunction" situaciju. Access transakcije na nivou baze(ne na nivou VBA) ima u verziji 2010, ali ne radi za linkane tabele, tako da nije iskoristiv u mrežnom okruženju. Možda sam ja nešto pogrešno protumačio, moguće je....


Nisi u pravu ili nisi dobro razumeo. Transakcije rade i sa ulinkovanim tabelama (frontend-backend), bilo da su Access-ove, MS-SQL ili iz neke druge relacione priče. Ne rade sa ulinkovanim .dbf ili .xls ali to verovatno i ne očekuješ.

Ono što nisi razumeo je rezultiralo tvojom prvom rečenicom. Ma gde god da dođe do hard problema, rezultat transakcije se ne upisuje u tabelu na disku ukoliko nije kompletan. Uostalom probaj i na lokalu i u mrežnom okruženju, pa ćeš videti. Multiplikuj bazu na 3K ili 4 K zapisa i pusti kopiranje. Posle sekund ili dva prekini nasilno program. Ništa neće biti preneseno. Kad korisnik dobije poruku sa mesta gde sam ti napisao da je staviš, onda je siguran da je sve prošlo kako treba.
[ chupo1 @ 26.12.2013. 07:32 ] @
Citat:
SLOJ.1973: Ne znam da li si uopste isprobao ovo sto sam ti poslao ili jednostavno mislis da nece raditi? Na poslu koristimo ovakav primer,umrezeno 6 racunara,pomocu batch fajla se kopiraju dve baze od po 40mb i to traje 2-3 sekunde(za obe u isto vreme),bez obzira da li ostali korisnici koriste bazu ili ne.Nema nikakvih problema.Manja je verovatnoca da ce se nesto desiti u te 2-3sec (nestanak struje,prekid veze i td) a iako se desi baza nece biti kopirana i prilikom pokusaja da odradis prenos podataka dobijes poruku da baza ne postoji,pokrenes ponovo dugme za snimanje baze i to je to.A u lokalu kada se desi,moj kod vec moze da se nosi sa tim,tj,videces koji su podaci kopirani a koji ne. Sto se tice velike baze,kako si naveo,ja se samo nadam da si podelio tu svoju bazu na FE i BE,pa prilikom zatvaranja BE postavis da se odradi Compact i nema bespotrebnog zauzumanja memorije. Mada sada racunari imaju monogo memorije,pa ne vidim zbog cega je problem "prevelika baza". Toliko od mene,verovatno i Getsbijev primer odradjuje posao,pa ti izvoli probaj.Pozdrav.


Nisam isprobao, ali sam pogledao kod detaljno i jasno mi je šta radi. Po meni, to rješenje bi bilo ok da se radi kopiranje i provjera u jednom smjeru. Međutim, kako sam u prethodnim postovima napisao, mene u suštini muči upis u glavnu knjigu koji ne smije ostati nebalansiran, ovo rješenje ne pomaže jer treba raditi upis na serveru. Postoji puno situacija kada je potrebno raditi ovu provjeru(upis u glavnu knjigu, kreiranje više faktura na osnovu otpremnica, zatvaranje faktura po računima itd.), tako da mi se "ne isplati" stalno kopirati bazu. U suštini meni su sve tabele u BE na serveru, i ja hoću da napravim rješenje koje će obraditi sve moguće greške.

Citat:
Getsbi: Nisi u pravu ili nisi dobro razumeo. Transakcije rade i sa ulinkovanim tabelama (frontend-backend), bilo da su Access-ove, MS-SQL ili iz neke druge relacione priče. Ne rade sa ulinkovanim .dbf ili .xls ali to verovatno i ne očekuješ.

Ono što nisi razumeo je rezultiralo tvojom prvom rečenicom. Ma gde god da dođe do hard problema, rezultat transakcije se ne upisuje u tabelu na disku ukoliko nije kompletan. Uostalom probaj i na lokalu i u mrežnom okruženju, pa ćeš videti. Multiplikuj bazu na 3K ili 4 K zapisa i pusti kopiranje. Posle sekund ili dva prekini nasilno program. Ništa neće biti preneseno. Kad korisnik dobije poruku sa mesta gde sam ti napisao da je staviš, onda je siguran da je sve prošlo kako treba.


Ja se nadam da je tako i to bi baš bilo kvalitetno rješenje. Čim budem imao vremena da testiram napisaću rezultate. Očekivao sam da to ne radi jer je u Error kodu Rollback, a ako program "pukne" Rollback se neće ni izvršiti, ali ako to radi na nekom nižem nivou onda ok.