[ timberman @ 22.06.2017. 22:10 ] @
Prvo da napomenem da koristim program Faktura koji je postavio korisnik FOX028. U formi Faktura, ako se prvo počnu unositi artikli u subformi, javlja da nije unesen IDFaktura. Ja sam hteo da mi je subforma nevidljiva dok se ne unese IDFaktura. To sam uradio sledećim kodom
Code:
Private Sub Form_Current()
    If IsNull(Me.BrojFakture) Then
        Me.FakturaArtikli.Visible = False
    Else
        Me.FakturaArtikli.Visible = True
        
    End If
End Sub

Ovim sam uspeo da sakrijem subformu, ali ona se prikazuje tek kad refresh-ujem formu, s tim da posle refresh-a me vraća na prvu fakturu. Da bi me vratilo na trenutnu fakturu koristio sam kod
Code:
Private Sub BrojFakture_AfterUpdate()
Dim recordbr As Integer
recordbr = Me.CurrentRecord
Me.Requery
DoCmd.GoToRecord , , acGoTo, recordbr
End Sub

Ovo radi ono što mi treba al mi iskreno smeta "treptanje" prilikom Requery-ja. Isto se dešava i ako umesto Visible probam sa Locked. Ima li neko elegantnije rešenje?

[ Getsbi @ 23.06.2017. 06:20 ] @
Ti očigledno znaš ali da objasnimo i drugima. Me.Refresh osvežava sadržaj tekućeg zapisa, a Me.Requery ponovo učitava celu formu. Probaj da prođeš što jeftinije i ovo drugo upotrebljavaj samo kad moraš. Uz to, isprobaj kako ti program radi na nekoj jačoj mašini. Kod mene recimo nema takvih efekata na 64 bitnoj mašini sa procesorom 3,3 MHz i 8 GB Rama.
[ timberman @ 23.06.2017. 11:44 ] @
Trenutno nemam gde isprobati na boljoj mašini, al ok ako ne može drugačije. Hteo sam malo promeniti, tj. da mi ne proverava za BrojFakture već za IDFaktura koji je autonumber. Ovo iz razloga jer ako želim promeniti BrojFakture pa ga izbrišem subforma mi se vidi pa nevidi itd.. To sam uspeo sa
Code:
Private Sub Form_Current()
    If Me.NewRecord = True Then
        Me.FakturaArtikli.Visible = False
    Else
        Me.FakturaArtikli.Visible = True
        
    End If
End Sub

Problem nastaje sa Requery-jem. Sa kodom
Code:
Private Sub IDFaktura_AfterUpdate()
Dim recordbr As Integer
recordbr = Me.CurrentRecord
Me.Requery
DoCmd.GoToRecord , , acGoTo, recordbr
End Sub

ništa se ne dešava.
Jedino ako se vratim jednu fakturu nazad pa se vratim na trenutnu onda prikazuje subform-u. Kako da osvežim formu kada se promeni IDFaktura koji je autonumber? I da li se to uopšte ovako radi, mislim na postupak kako "naterati" korisnika da prvo unese BrojFakture(IDFaktura) pa tek onda artikle?
[ Getsbi @ 23.06.2017. 12:23 ] @
Gebneralno nisam imao problema sa osvežavanjem zapisa i ponovnim učitavanjem formi ni na slabijim mašinama. Bar ne takvih da su iritirale korisnika. Odgovoriću samo na zadnje pitanje. Autonumber nije najsretnije rešenje za PK kod relacionog modela. Korisnika ne možeš da nateraš da ga unese prvog, jer je to posao Access Jet mašine, a ona to radi tek kad se izađe iz zadnjeg polja. Ja autonumber koristim samo tamo gde nisam zainteresovan za kasnije pretraživanje. Obično su to tabele činjenica u dimenzionim modelima i tabele u relacionim modelima kad nešto istražujem pa me mrzi da pravim validaciju koja mi kasnije neće trebati.

Ako nije kasno zameni sve te Autonumber kolone sa Number, Long Integer. Postavi validaciju kroz forme i automatsko dodavanje prvog većeg broja (n+1). Korisnik će imati osećaj da kontrola stvarno postoji. Ima dosta primera za to na forumu u temi Gotovi programi članova foruma. I koristi eksplicitnu validaciju. Option explicit u VBA modulima. To je samo savet. Inače je sve dobro iskompajlirano.

Taj Autonamber te je i naveo da sakrivaš podforme. Podforme su napravljene da budu sinhronizovane sa glavnom formom.


[Ovu poruku je menjao Getsbi dana 23.06.2017. u 14:13 GMT+1]
[ Miki2013 @ 23.06.2017. 16:07 ] @
Prepravljam staru bazu jer sam gotovo došao do kraja i ovo moram ici postupno da prilagodim kako si mi predložio.

Sljedeći korak gdje sam zapeo mi je automatsko dodavanje TestID

probao sam sa ovim što sam našao ovdje na forumu
Citat:
Private Sub Form_Current()
On Error GoTo FirstRec
Dim LastVal As Long
ZadnjiBroj = DMax("[BrojUnosa]", "Unosi")
If Me.NewRecord Then
Me.BrojUnosa = ZadnjiBroj + 1
End If
Exit Sub

FirstRec:
ZadnjiBroj = 0
Resume Next
End Sub


ali mi to ne odgovara jer ova procedura uvećava brojeve i dok skrolaš bez obzira što nema novih unosa.
Odjednom u tabeli imam beskonačno praznih unosa.

Imaš li kakav prijedlog?
[ Getsbi @ 23.06.2017. 17:43 ] @
Ne treba ti VBA procedura. U polju BrojUnosa na formi otvori Properties i u redu Default Value napiši:

= Nz(DMax("[BrojUnosa]";"NazivTvojeTabele");0) +1

Kad otvoriš formu i uđeš kursorom u to polje dobićeš ponuđeni broj za jedan veći od postojećeg. Ako odlučiš da ne završiš zapis, samo izađeš iz forme.
[ Miki2013 @ 23.06.2017. 18:00 ] @
Private Sub Form_BeforeInsert(Cancel As Integer)
If Me.NewRecord Then
TestID = Nz(DMax("TestID", "tblTest")) + 1
End If
End Sub

Išao sam na BeforeInsert i izgleda da ce moci ovako.
[ timberman @ 23.06.2017. 23:55 ] @
Uključio sam Require Variable Declaration. Zamenio sam Autonumber sa Number i u formi dodao kod
Code:
Private Sub Form_Current()
If Me.NewRecord Then
   Me!IDFaktura = Nz(DMax("IDFaktura", "Faktura"), 0) + 1
End If
End Sub

Ovim se svaki put IDFaktura povećava za jedan. Problem je, koliko god puta kliknem na Next on dodaje novi IDFaktura. Ovo verovatno treba rešiti preko validacije ali nemam ideju. Vi rekoste da ima primera u Gotovim programima al nisam uspeo naći.
[ Miki2013 @ 24.06.2017. 00:46 ] @
Ja sam to baš danas rijesio ovako

Private Sub Form_BeforeInsert(Cancel As Integer)
If Me.NewRecord Then
TestID = Nz(DMax("TestID", "tblTest")) + 1
End If
End Sub
[ timberman @ 24.06.2017. 12:05 ] @
Hvala, Miki. Ako ja dobro vidim ovome fali kad se klikne da se doda novi zapis da on to ne uradi. Možda bi trebalo na dugme za dodavanje novog zapisa staviti kod
Code:
Private Sub NoviZapis_Click()
DoCmd.GoToRecord , , acNewRec
If Me.NewRecord Then
   Me!IDFaktura = Nz(DMax("IDFaktura", "Faktura"), 0) + 1
   End If
End Sub

Nije mi jasna validacija koju je pomenuo gospodin Getsbi. Ima li neki primer?
[ Miki2013 @ 24.06.2017. 17:36 ] @
Citat:
Hvala, Miki. Ako ja dobro vidim ovome fali kad se klikne da se doda novi zapis da on to ne uradi. Možda bi trebalo na dugme za dodavanje novog zapisa staviti kod

Pa nisi testirao... Kad klikneš novi unos "kao da se ništa ne dešava" međutim, čim uneseš bilo šta u bilo koje polje on se dodaje. A ako odustaneš od snimanja on se poništi. Probaj...
[ timberman @ 26.06.2017. 14:33 ] @
Probao, i to je tačno kad se bira nešto iz forme. Međutim, kad se bira nešto iz subforme javlja da nedostaje PK. Isti problem kao ranije.
[ Getsbi @ 26.06.2017. 17:55 ] @
Isprati ovu temu http://www.elitesecurity.org/t438557-0#2971236
Možda pomogne. Ima primer Brojac ZE.zip.
[ timberman @ 12.07.2017. 09:25 ] @
Čim sam se vratio kući vraćam se i vama sa pitanjima. Naime, mnogo više mi se sviđa Getsbijev predlog da umesto autonumber koristim number. Podesio sam da mi se npr. svaki put IDFakture inkrementira za 1. Kada pokušam da kroz formu Faktura odmah krenem sa unošenjem artikala javlja mi grešku You cannot add or change a record because a related record is required in table 'Faktura' iako je za IDFakture upisan npr. broj 9. Ako ja obrišem i ponovo upišem taj isti broj bez problema unosim artikle. Ima li rešenja?

[ BiloKoje @ 12.07.2017. 10:44 ] @
Ako bi uneo još jedan podatak u formu Faktura, pa prešao na podformu Access bi snimio zapis i znao bi da su zapisi u podformi povezani sa zapisom na Fakturi.
Ako ideš odmah u podformu, na formi vidiš novi broj fakture ali to je podrazumevan vrednost, nije snimljen zapis. Kad napustiš formu, pogledaj u tabeliu, taj zapis nije upamćen.
Faktura svakako ima još neki neophodan podatak, datum, kupac ne vidim nio razlog da se unose stavke a da nije unet nijedan od tih podataka.
[ timberman @ 12.07.2017. 11:05 ] @
Sve ste u pravu što kažete, ja samo pokušavam da nađem način da korisnik odmah počne unositi artikle. Što se tiče razloga zašto odmah "napadaju" artikle ne znam, možda prvo hoće da vide cenu. Možda da ako se prvo klikne na artikle da se stavi upozorenje da se mora uneti datum, mada to nije ono što sam hteo.
[ BiloKoje @ 12.07.2017. 12:34 ] @
Mislim da ne treba uvek uvažavati zahteve korisnika.
Ima načina da se uradi to što šeliš, ali ja nikako ne vidim svrhu toga, može da napravi probleme, a štedi jedan klik, umesto da se unese datum ili broj fakture ide se direktno na artikle, sava ušteda.
Ja sam uradio jedan primer kako se može raditi direktno sa artiklima, čisti kao ideju, u praksi nikada ne bih to koristio.
Inače, mislim da imaš i drugih slabosti u bazi, recimo, rad sa cenama iz tabele artikli. Šta akko se cena promeni, stare fakture neznaju koja je cena bila.
[ Getsbi @ 12.07.2017. 12:56 ] @
Slažem se sa kolegom BiloKoje.
Ti kao programer određuješ kako će se raditi unos i šta je prioritetno. Dokument se sastoji od zaglavlja i satvki. Ispoštovao si pravilo identifikujuće veze da je stavka egzistencijalno i identifikaciono zavisna od računa, da stavka mora da pripada jednom (One) računu i da račun može da ima jednu (One) ili više (More) stavki.
Unos u program možeš da zaustaviš (recimo zbog ispijanja kafe) posle popunjavanja zaglavlja koje se sastoji od: BrojRacuna, DatumRacuna, Isporucilac, Kupac......etc i to ima smisla. Nakon kafe ili sutradan, pokreneš aplikaciju i ona bi trebalo da te podseti ako postoje računi koji nemaju stavke. To se takođe može uraditi i ima smisla. Ono što nema smisla je da dozvoliš operateru da unosi stavke a da prethodno nije popunio zaglavlje. Praksa ručnog popunjavanja računa ili fakture gde se to ponekad radilo obrnutim redosledom nije baš poželjna u relacionim bazama podataka. Zamisli da sutra pokušaš da nađeš stavke koje nemaju zaglavlje. Nema primarnog ključa koji će da ih identifikuje.
Zato slušaj operatere i njihove želje samo ako imaju smisla. Ti se pitaš kako će program da radi.
[ timberman @ 13.07.2017. 13:03 ] @
Poslušao sam vaše savete, samo sam stavio upozorenje da se nešto mora prvo uneti u glavnoj formi. BiloKoje, potpuno ste u pravu što se tiče cena. Ovo je program kolege Fox028 na kojem se ja učim. Kako da se reši ovo sa cenama, jel treba neka tabela promena il nešto drugo?
[ BiloKoje @ 13.07.2017. 16:28 ] @
Imali smo na ovom forumu u više navrata razgovor oko vođenja evidencije robe, ulaza i izlaza, praćenja stanja zaliha, fakturisanja prodate robe. Uvek postoji više načina da se posao obavi, koji je najbolji zavisi od konkretnog zadatka, stvar je znabha i veštine programera koji će pristup izabrati, naravno, uvek vodeći računa i o budućim dogaćanjima, kako se može program prilagoditi nekom novim okolnostima.
Konkretno, za jednostavan ulaz i izlaz robe ja bih napravio tabelu artikala koja bi saddravala šifru, naziv i cenu. Cena može biti nabavna ili prodajna ili obe. Zatim bih napravio tabelu Promene, koja bi sadržala pored ključa, datum promene, vrstu promene, recimo, nabavka, početno stanje, popis, manjak, višak, prodaja, otpis. Za tabelu promene bi bila vezana tabela StavkePromena, imala bi primarni ključ i spoljni ključ prema tabeli Promene. U stavke se unosi artikal iz tabele Artikli, količina, cena, eventualno popust, rabat, poreska stopa.
Baza bi imala i tabelu Komitenti, sadržala bi podatke o kupcima i dobavljačima.
Različite vrste promena koje sam pomenuo kod tabele Promene, takođe, mogu biti smeštene u jednu tabelu, pa da se u Promenama biraju sa liste.
Svaka vrsta promene proizvodi odgovarajući dokumenat, prijemnica, popisna lista, dostavnica, faktura.
Stanje robe bi se dobijalo pomoću upita, saberu se sve količine ulaza jednog artikla i oduzmu se sve količine sa izlaze stavke. Upit bi davao karticu artikla.

Naravno, ovo je samo jedan od načina, i to je malo grubo nabacano, pre početka rada na programu treba što detaljnije analizirati poslovanje, postupke, dokumentaciju pa se odlučiti za jednu šemu iz koje se posle dolazi da tabela, kolona, tipa podataka, relacija.
[ izonic @ 13.07.2017. 22:55 ] @
Private Sub Form_Current()
If IsNull(Me.BrojFakture) Then
Me.FakturaArtikli.Enabled = False
Else
Me.FakturaArtikli.Enabled = True

End If
End Sub
Private Sub BrojFakture_AfterUpdate()
Dim BrFak
BrFak = Me.BrojFakture

If Format$(BrFak) <> "" Then
Me.FakturaArtikli.Enabled = True
End If

End Sub

Atomatski unos (Idfaktura) se postavlja kod na default value.
Nevalja na bilo koji drugi dogadjaj jer onda ostaju u bazi fakture koje nemaju artikle ako se operator predomisli.

Ako hoces prvo unostiti atikle onda napravi jos jednu tabelu tmpartikli sa istim poljima pa od nje napravi formu.
Pri izllazu iz te forme podizi formu za unos faktura te kad se unesu podaci o fakturi na neki taster fakturisi ili na izlaz prenesi podatke iz tem tabele u pravu.
Ako ukines relacijsku vezu izmedju faktura i fakturaartikli onda se to moze i elegantnije rijesiti.
[ timberman @ 17.07.2017. 18:25 ] @
Izonic, ovo Vaše rešenje radi odlično. Hvala, al ja sam ipak odlučio poslušati Gesbija i BiloKoje.
BiloKoje, hvala na pojašnjenju. Što se tiče nivelacije za ovaj moj primer iskoristio sam primer korisnika Zoran.Eremija iz teme Update podataka u tabeli iz neke druge tabele ili upita i odlično radi. Jedina mi je greška što sam od istog gospodina našao i login formu koja je preteška za mene i nekoliko dana izgubih da je prilagodim. Da se ne gubi smisao otvoriću novu temu za login form. Hvala još jednom.
[ timberman @ 24.07.2017. 23:40 ] @
Ponovo ja. Postaviću pitanje ovde jer se radi o zaključavanju i program je od FoX028. Kako npr. da se zaključa određena faktura, npr pod brojem 1 a da pod brojem 2 ostane otključana. Dodao sam kolonu zaključano tipa yes/no u tabeli faktura. Na formi imam dugmad oključaj i zaključaj koja postavljaju vrednost na true i false.
Dodao sam i sledeći kod
Code:
Private Sub Form_AfterUpdate()
If Me.Check38 = True Then
Me.AllowEdits = False
Me.AllowDeletions = False
Me.Obracunaj.Visible = False
Form_FakturaArtikli.AllowEdits = False
Form_FakturaArtikli.AllowDeletions = False
Else
End If
Me.AllowEdits = True
Me.AllowDeletions = True
Me.Obracunaj.Visible = True
Form_FakturaArtikli.AllowEdits = True
Form_FakturaArtikli.AllowDeletions = True
End Sub

i ne radi.
[ BiloKoje @ 25.07.2017. 05:56 ] @
Ovaj kod stavi na OnCurent forme i prebaci End if, na karaj, ispred End Sub. Ovako kako si napisao Forma se zaključava ako je Chech38 na True i odmah se otključava jera za deo koda posle End if nema nikakvog uslova.
[ timberman @ 25.07.2017. 07:41 ] @
Hvala. Ovo end if ni sam ne znam kako se tu našlo. Na OnCurent forme radi, samo ne radi trenutni. Npr. ako trenutno radim sa fakturom br 2 i zaključam je, izmene su moguće sve dok je ne napustim. Verovatno treba posle klika na dugmad staviti Me.Refresh.

[Ovu poruku je menjao timberman dana 25.07.2017. u 08:55 GMT+1]
[ BiloKoje @ 25.07.2017. 08:03 ] @
>
[ timberman @ 25.07.2017. 14:56 ] @
Sa refresh sam uspeo da osvežim formu, al ne i podformu, tako da posle otključavanja ne mogu da vršim izmene. Da li je za podformu moguć refresh ili treba requery?