|
[ Robinsonk@ @ 18.09.2003. 14:23 ] @
| Sledeci kod upisuje novu vrstu u tabeli:
Private Sub cmdSave_Click()
On Error GoTo labela
adorecordset.MoveFirst
Do
If txtKolonaTabele.Text = adorecordset!KolonaTabele Then
MsgBox "Unesite drugu KolonuTabele, ovaj vec postoji u bazi"
Exit Sub
Else
adorecordset.MoveNext
End If
Loop Until adorecordset.EOF
adorecordset.Update
adorecordset.Requery
frmImeForme.Hide
Exit Sub
labela:
MsgBox "Greska", , "Error"
End Sub
Medjutim, on upise novu vrstu, ali ipak javi poruku:
MsgBox "Unesite drugu KolonuTabele, ovaj vec postoji u bazi"
Iako ime ne postoji u bazi. Postavi odgovarajuce textbox-ove na drugu vrstu koja postoji u bazi.
Bez do petlje program radi, u cemu bi mogao biti problem?
|
[ mladenovicz @ 18.09.2003. 14:45 ] @
Pretpostavljam da ti je to textualno polje boundovano. Kad uradis AddNew, broj zapisa u tom recordsetu se povecava za 1, iako nisi uradila Update (zapis u bazi jos uvek ne postoji). Taj novi zapis sadrzi podatke koji se trenutno nalaze u kontrolama koje su boundovane.
Znaci moras da promenis nacin provere duplikata. Resenje je da proveru duplikata radis sa drugim recordsetom. Znaci kreiras novi recordset sa istim sourceom i proveru radis sa njim, a ne sa recordsetom koji ti je datasource.
[ Robinsonk@ @ 18.09.2003. 17:43 ] @
Vjerovatno je tako.
Kreiram novi rekordset, ne stavljam da je datasource textbox-a taj recordset, ali kako da ga postavim da mi pokazuje na tu tabelu u bazi? Za prvi recordset sam to radila sa sgl upitom koji je u okviru procedure koju posle pozivam. Da li sad treba isto da pravim proceduru za drugi?
P.S. Sta znaci da je text polje boundovano?
Hvala.
[ mladenovicz @ 18.09.2003. 18:04 ] @
Kontrola je boundovana, ako je njen DataSource property podesen na neki DataSource, s tim sto treba setovati i DatField property na polje iz datasourcea.
Kod bi trebao otprilike ovako da izgleda (nisam testirao)
Code:
Private Sub cmdSave_Click()
Dim adoTempRS As ADODB.Recordset
Dim Qry As String
On Error GoTo labela
Set adoTempRS = New ADODB.Recordset
If Not adorecordset Is Nothing Then
Qry = adorecordset.Source ' SQL upit
Else
GoTo proc_exit
End If
' adorecordset.ActiveConnection konekcija koju koristi adorecordset objekat
adoTempRS.Open Qry, adorecordset.ActiveConnection
While Not adoTempRS.EOF
If txtKolonaTabele.Text = adoTempRS!KolonaTabele Then
MsgBox "Unesite drugu KolonuTabele, ovaj vec postoji u bazi"
GoTo proc_exit
Else
adoTempRS.MoveNext
End If
Wend
adorecordset.Update
adorecordset.Requery
frmImeForme.Hide
proc_exit:
adoTempRS.Close
Set adoTempRS = Nothing
Exit Sub
labela:
MsgBox "Greska", , "Error"
Resume proc_exit
End Sub
Znaci kreiras recordset koji ima isti source (SQL upit kao i adorecordset) i kroz njega ides i proveravas duplikate. Ovaj recordset moze da koristi postojecu konekciju ka bazi, a mozes i da kreiras novu. Ako izadjes iz petlje regularno (nije bilo duplikata) adorecordset ce biti updateovan, inace prikaze se msgbox i izadje se iz procedure.
[ Robinsonk@ @ 18.09.2003. 22:24 ] @
Otprilike tako nesto sam napisala.
Rijesen je ovaj problem, ne javlja da vec postoji u bazi ali uvijek odradi labelu za gresku.
Kad sam korak po korak gledala program vidjela sam da je greska u
Adorecordset.update
Time moram da se pozabavim sama jer samo ja mogu vidjeti gdje sam to napravila gresku pa ne moze da odradi update.
Hvala ti puno.
[ Robinsonk@ @ 19.09.2003. 12:52 ] @
Jos pitanja:
Nakon sto upisem novu vrstu u bazi ponudim mogucnost da upisem jos jednu vrstu.
Kada prihvatim onda moram da napisem isti kod kao kada iz druge forme pozivam sledecu:
To otprilike izgleda ovako:
adorecordset.Update
'adorecordset.Requery
LRValue = MsgBox("Nova vrsta je upisana u bazu" & "Zelite li da pokusate ponovo", vbYesNo, "Potvrda")
If LRValue = vbYes Then
adorecordset.AddNew
frmImeForme.txtPrvi.Text = CStr(adorecordset.RecordCount)
frmImeForme.txtDrugi.Text = ""
frmImeForme.txtTreci.Text = ""
frmImeForme.txtCetvrti.Text = ""
frmImeForme.txtPeti.Text = ""
'frmImeForme.txtSesti.Text = ""
Exit Sub
Else
frmImeForme.Hide
End If
Postoji li neki jednostavniji nacin?
A kada odradim adorecordset.Requery (koji je sada kao komentar) onda mi prilikom izbacivanja ovog MsgBox-a:
MsgBox("Novi radnik je upisan u bazu" & "Zelite li da pokusate ponovo", vbYesNo, "Potvrda")
U text box-u stoji prva vrsta tabele? Zasto? Mogu li adorecordset.Requery da izbacim onda?
I jos jedno pitanje:
Posto imam opciju brisanja vrste, kada npr. Obrisem 5-tu vrstu a ima ih 8, posle brisanja ce ih ostati 7 i izraz iz zagrade:
frmImeForme.txtPrvi.Text = CStr(adorecordset.RecordCount)
ce da upise broj 8 u prvom text box-u. Medjutim kako on vec postoji u bazi, a nema ponavljanja (jer je to (jedini) primarni kljuc u bazi) javlja gresku. Kako ovo treba da sredim?
Hvala Ti puno ( za ovo dosad i za ubuduce).
[ mladenovicz @ 19.09.2003. 13:19 ] @
Code:
adorecordset.AddNew
frmImeForme.txtPrvi.Text = CStr(adorecordset.RecordCount)
frmImeForme.txtDrugi.Text = ""
frmImeForme.txtTreci.Text = ""
frmImeForme.txtCetvrti.Text = ""
frmImeForme.txtPeti.Text = ""
'frmImeForme.txtSesti.Text = ""
Ovaj kod izdvoj u proceduru/funkciju, pa pozivas funkciju, a ne moras da radis copy/paste. Posto imas frmImeforme onda mozes da stavis to i u modul recimo.
Ako su ti polja boundovana, mislim da ti ne treba frmImeForme.txtDrugi.Text = "" i ostalo, posto bi polja trebalo da se sama obrisu posle addnew.
Razlog prikazivanja prvog zapisa je to sto radis Requery. Requery ce ponove povuci podatke iz baze i recordset ce biti pozicioniran na prvi zapis. Znaci Requery ti u principu ne treba. Bez Requery ostaces pozicinirana na poslednji zapis, tj. onaj koji je upravo dodat.
Sto se tice problema sa kljucem, resenje je to polje bude autonumber (ovo menjas u bazi), onda baza vodi racuna o tome i ne moze doci do dupliranja kljuca. Drugo resenje je da selektujes iz baze maksimalnu vrednost za to polje i na to dodas 1 i da ti to bude kljuc. Preporucio bih ti resenje sa autonumberom.
[ Robinsonk@ @ 19.09.2003. 15:26 ] @
Ok, ako ne moze drugacije onda ovako.
A za brojeve se nismo razumjeli. U bazi je podeseno da ne prihvati duplicate, ali on u kodu samo ode na labelu za gresku (jer je nedozvoljen unos).
Da li onda postoji mogucnost da mi prilikom brisanja vrste promijeni “redne brojeve”, da ih imam od 1 pa do broja vrsta? U tom slucaju ce mi
CStr(adorecordset.RecordCount)
Uvijek izracunati tacno sledeci redni broj.
[ mladenovicz @ 19.09.2003. 15:44 ] @
Ako stavis da je to polje autonumber, ono se ne unosi u aplikaciji, nego kad kazes AddNew baza sama uzima prvi sledeci slobodan i stavlja tu vrednost u polje.
Shiftovanje kljuca nakon brisanja nije lep nacin, osim toga kod velikog broja zapisa, ko zna kako bi to radilo, a brisanje i shiftovanje kljuca bi morala da radis u transakciji. Uz to, ako se taj kluc nalazi i u nekim drugim tabelama kao veza sa tom tabelom i tamo bi morao da se azurira i onda je to cirkus :)
[ Robinsonk@ @ 19.09.2003. 15:53 ] @
Da, opet si u pravu, shiftovanje bi napravilo cirkus, posebno zato sto je i vezano za druge tabele
Kako da uradim autonumber u access-u?
[ mladenovicz @ 19.09.2003. 15:59 ] @
Otvoris bazu, selektuj tabelu, desni klik pa Design View. Selektuj polje koje hoces da promenis i u Data Type stavi Autonumber, zatim dole imas General tab, tamo podesi NewValues na Increment recimo, i Indexed property na Yes (No Duplicates)
[ Robinsonk@ @ 19.09.2003. 21:33 ] @
Hm.. to resenje vodi i novom pravljenju baze(jer ne prihvata promjenu tipa) i mijenjaju koda.
Krenula sam sa tim, ali moguce je da cu napraviti neku f-ju koja ce provjeravati koji brojevi su zauzeti od 1 pa do maksimalnog, pa cu njima popunjavati.
Hvala ti. Puno si mi pomogao.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|