[ 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.