Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Recordset problem?!@

[es] :: Access :: Recordset problem?!@

[ Pregleda: 1960 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

bestlight
Sasa Oravec
Beograd

Član broj: 52189
Poruke: 12
195.252.85.*



Profil

icon Recordset problem?!@03.04.2005. u 01:47 - pre 232 meseci
Da li neko moze da mi objasni u cemu gresim?

Sta se desava! Zadatak je da u formi, dodelim automatski vrednost txt polju po principu poslednja_vrednost_u_tabeli+1. Radi se o serijskim brojevima koji idu po redu, ali nije primenjivo autoNumber, jer se trazi mogucnost da se neki preskoce, pa imamo situaciju npr:
1
2
3
4 necemo nego ukucamo 7
pa ide 8
9
10
itd...

Samo polje nije primarni kljuc, nego je indexirano i nisu dozvoljene duple vrednosti.
Najcudnije je da je kod radio neko vreme, a onda sam nesto menjao, ali ne u samom kodu, nego u relacijama (mislim da se nakon toga poremetilo, ali nisam siguran). Sam kod izgleda ovako:

Citat:

Private Sub br_karte_GotFocus()

invoice_id.Value = Forms![invoice1]![txtInvoiceNo]
Dim MyDB As Database, rsRacuni As Recordset

Set MyDB = CurrentDb()
Set rsRacuni = MyDB.OpenRecordset("racuni_detalji", dbOpenSnapshot)
Set rsKarta = MyDB.OpenRecordset("karta", dbOpenSnapshot)

strKarta = "[karta_uvek]='" & "176" & "'"
rsRacuni.Sort = "racundet_id"
rsRacuni.MoveLast
rsKarta.FindFirst strKarta
If rsRacuni.BOF Then
br_karte.Value = rsKarta![karta_cesto]
Else
br_karte.Value = rsRacuni![br_karte] + 1
End If

rsRacuni.Close
rsKarta.Close
End Sub


Debil se zalepi za jedan record, koji nije poslednji, nego 2-3 mesta pre kraja i ni makac odatle, bez obzira sta ja probao.

U cemu je fora?

Na rsKarta ne obracajte paznju jer je nesto sto se koristi jednom u sto godina i koristi drugu tabelu pa nema veze sa problemom, ali treba biti u proceduri za nedaj boze.

Pušenje je štetno za zdravlje :)
 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.eqao.com.



+79 Profil

icon Re: Recordset problem?!@04.04.2005. u 22:48 - pre 232 meseci
Gresis u nekoliko stvari.

Prvo, lokacija za kod nije dobra. OnFocus za kontrolu nije dobro mesto za ovakvu vrstu koda. Tvoj kod ce se odraditi kad god korisnik klikne na ovo polje i to moze da pravi probleme. Bolje je da koristis formine evente. Moze Form_OnInsert ili Form_BeforeUpdate. Form On Insert se desava tacno jednom, kad se forma otvori za dodavanje novog rekorda, u momentu kad otucas prvo slovo ili broj u bilo kom polju. Znaci, cim pocnes da kucas bilo sta, pojavi se tvoj InvoiceNo. medjutim, nije dovoljno dobro. Kod za ovakve zadatke cita neku 'poslednju' vrednost iz neke tabele i dodaje jedan na to. Sta ako dva korisnika u isto vreme (ili priblizno isto vreme) krenu da insertuju rekord. Moze se desiti da obojica procitaju i izracunaju istu vrednist za InvoiceNo. Ocekujem da je InvoiceNo UNIQUE, i eto nevolje. Jedan od njih nece moci da snimi rekord. Zato je bolje formin BeforeUpdate. Tesko da ce dvojica u istom momentu da pritisnu Save record. Ako bas to i urade, Access ce procesirati jednog po jednog i nece doci do konflikta. Jedino sto je neobicno jest sto broj InviceNo ne dobijes sve dok ne sacuvas rekord. Ako odustanes u pola posla, nista se nece desiti - before update se nece desiti. treba primetiti da se BeforeUpdate za formu desava i posle UPDATE operacija. A ne zelimo da se promeni broj InvoiceNo kad ispravimo pogresno ukucanu adresu. Zato treba proveriti da li se radi o novom rekordu pre izracunavanja novog broja InvoiceNo , otprilike

IF NOT me.newrecord THEN izracunaj novi broj ENDIF

Drugi problem sa kodom je sto ovakav kod treba da sedi u funkciji, i samo se poziva iz nekog forminog eventa. Imas u top temi 'Baza znanja' primer funkcije koja izracunava sledeci sekvenciajlni broj za neki dokument. Potrazi malo i naci ces.

Treci problem je upotreba rs.MoveLAst. Nije dobro jer se ne zna redosled rekorda u rekordsetu - nisi ga nigde naveo. ko se ne navede redosled, Access najcesce (ali ne uvek i ne zna se kada tacno) upotrebi PK. posto tvoje polje nije PK, nego je samo UNIQUE, nema garancije da ce MoveLAst otici na rekord sa najvecim brojem InvoiceNo ili Br_Karte. Bolje ti je da koristis ovo:

dim strSQL as string
dim rs as recordset
strSQL = "SELECT MAX(br_karta) FROM racuni_detalji"

To ce ti UVEK dati najveci broj, na koji posle dodas 1.

Dalje, ako se ovo radi cesto, funkcija CurrentDB moze da bude spora. Nadji u bazi znanja funkciju GetCurrentDB i ubaci je u neki modul, pa je koristi umesto CurrentDb.

Ako nam kazes kako ti izgledaju tabele i relacije, mozda pronadjemo jos nesto.

Inace je sam kod sintaksno pravilan i uredno napisan. Losa je jedino ideja, a to ce doci sa iskustvom.

:-)
 
Odgovor na temu

bestlight
Sasa Oravec
Beograd

Član broj: 52189
Poruke: 12
*.beotel.net.



Profil

icon Re: Recordset problem?!@08.04.2005. u 00:42 - pre 232 meseci
Hvala na odgovorou i trudu ulozenom u njega.

Dobro si primetio sta mi ustvari predstavlja najveci problem. Nikako da sednem i naucim kojim redosledom se desavaju eventi. Iz lenjosti pocnem da "punim" event po event sa istim kodom "za svaki slucaj. Inace, problem sam resio kad sam uzeo da proverim kako se ponasa MoveLast metod. Nesreca, kako si ti i naveo, uzima poslednji index za tu tabelu pa se njim koristi.

Inace,

Code:

dim strSQL as string
dim rs as recordset
strSQL = "SELECT MAX(br_karta) FROM racuni_detalji"


je toliko jednostavno, a nije mi palo napamet, da bi mozda trebalo da pocnem da popravljam auspuhe, a ne da se glumatam po kompjuteru. Svaka cast!!
Pušenje je štetno za zdravlje :)
 
Odgovor na temu

[es] :: Access :: Recordset problem?!@

[ Pregleda: 1960 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.