Eli mulla on ohjelma jolla saa luotua tietokannan kenttineen päivineen. Ongelmana on etten ole hoksannut miten saadaan VB:llä luotua laskuri-kenttä (autonumber), joka määrittelisi juoksevat numerot?
Olisko jollain tietoa asiasta?
tietokannan luomiseen käytän ADOX:ia ja yhteytenä on MS Jet. Tietokantana on Access
Ohessa pieni esimerkki Autonumberin käytöstä...
Huom. Aseta Project\References...\"Microsoft ADO Ext. 2.x for DLL And Security" päälle, jos ei jo ole.
Option Explicit
Private Sub Form_Load()
Dim cat As ADOX.Catalog
Dim col As ADOX.Column
Dim key As ADOX.key
On Error GoTo TheEnd
'Avataan yhteys tietokantaan
Set cat = New ADOX.Catalog
cat.ActiveConnection = _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Test.mdb"
'Luodaan uusi sarake, joka on muotoa Autonumber
Set col = New ADOX.Column
With col
.Name = "MyID"
.Type = adInteger
Set .ParentCatalog = cat
.Properties("Autoincrement") = True
End With
'Lisätään Table1-tauluun äsken määrittämämme Autonumber-sarake
cat.Tables("Table1").Columns.Append col
'Asetetaan luomamme sarake pääavaimeksi Table1-tauluun
Set key = New ADOX.key
With key
.Name = "PrimaryKey"
.Type = adKeyPrimary
.RelatedTable = "Table1"
.Columns.Append "MyID"
End With
cat.Tables("Table1").Keys.Append key
TheEnd:
'Virheiden käsittely
If Err.Number <> 0 Then
MsgBox Err.Number & ": " & Err.Description, , "ErrorTerror"
Err.Clear
End If
Set key = Nothing
Set col = Nothing
Set cat = Nothing
End SubEdit: Taulun luonnin yhteydessä "Microsoft ActiveX Data Objects 2.x Library" -referenssiä käyttämällä...
Private Sub Form_Load()
Dim cnn As ADODB.Connection
Set cnn = New ADODB.Connection
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Test.mdb"
cnn.Execute "CREATE TABLE Table2 (MyID COUNTER PRIMARY KEY)"
cnn.Close
Set cnn = Nothing
End Subkiitos neuvosta! nyt pääsen eteenpäin...
Seuraava ongelma onkin omituinen...elikkäs lisään uuden tietueen tietokantaan seuraavalla koodilla:
Public Sub cmdUusi_Click()
Dim vapaa As String
Dim max_tietue As String
Dim nykyinen As String
' Lisää uuden tietueen syöttöä varten
' ---------------------------------------------------------------
'rsArkisto.Update
On Error GoTo virhe_uusi
Call Talleta_tiedot
' tarkistetaan montako tietuetta syötetty
Set rsArkisto = dbYhteys.Execute("select max(numero) as SuurinTietueID from arkisto")
max_tietue = rsArkisto("SuurinTietueID")
rsArkisto.Close
dbYhteys.Close
Call AvaaYhteys
rsArkisto.MoveLast
nykyinen = lbl_tietueNro.Caption
' tarkistetaan demo-version rajoitteet (20 tietuetta...)
If demo = 1 And max_tietue >= p_demo_max Then
MsgBox "Demoversio, vain 20 tietuetta"
Call SuljeYhteys
Call AvaaYhteys
rsArkisto.MoveFirst
rsArkisto.Find "numero = '" & nykyinen & "'"
Call Lisaa_Tiedot
Exit Sub
End If
vapaa = "vapaa"
Call AvaaYhteys
rsArkisto.MoveFirst
' tarkistetaan, onko tietokannassa vapaita tietueita...
If vapaa <> "" Then
rsArkisto.Find "omistaja = '" & vapaa & "'"
If rsArkisto.EOF Then
rsArkisto.Close
dbYhteys.Close
Call AvaaYhteys
Call Lisaa_Uusi
Else
Call Lisaa_Tiedot
txt_omistaja.SetFocus
End If
End If
virhe_uusi:
If Err.Number <> 0 Then
msg = "Error # " & Str(Err.Number) & " was generated by " _
& Err.Source & Chr(13) & Err.Description
MsgBox msg, , "Error", Err.HelpFile, Err.HelpContext
End If
End Sub
Sub Lisaa_Uusi()
Dim tieto As String
' Set rsArkisto = dbYhteys.Execute("select max(numero) as SuurinNRO from arkisto")
' nro = rsArkisto("SuurinNRO") + 1
On Error GoTo virhe_lisaa_uusi
tieto = ""
rsArkisto.Close
dbYhteys.Close
Call AvaaYhteys
rsArkisto.MoveLast
rsArkisto.AddNew
' rsArkisto.Fields("numero").Value = nro
' ---------
rsArkisto!omistaja = tieto
rsArkisto!kategoria = "0"
rsArkisto!alakategoria = tieto
rsArkisto!pvm = tieto
rsArkisto!tapahtuma = tieto
rsArkisto!Teksti = tieto
rsArkisto!henkilöt = tieto
rsArkisto!kunto = tieto
rsArkisto!materiaali = tieto
rsArkisto!Tekijä = tieto
rsArkisto!kuvaus = tieto
rsArkisto!Käyttöoikeus = tieto
rsArkisto!Säilytyspaikka = tieto
rsArkisto!Lähteet = tieto
rsArkisto!lahjoittaja = tieto
rsArkisto!saatu = tieto
rsArkisto!ostettu = tieto
rsArkisto!ostopvm = tieto
rsArkisto!osoite = tieto
rsArkisto!Puhelin = tieto
rsArkisto!Kuvapolku = tieto
rsArkisto.Update ' päivitetään tietokanta
' Call Talleta_tiedot
Call Lisaa_Tiedot
cbo_kategoria.SetFocus
Call Lisaa_Tiedot
cbo_kategoria.SetFocus
virhe_lisaa_uusi:
If Err.Number <> 0 Then
msg = "Error # " & Str(Err.Number) & " was generated by " _
& Err.Source & Chr(13) & Err.Description
MsgBox msg, , "Error", Err.HelpFile, Err.HelpContext
End If
End SubNumero-kenttä on laskuri-muotoa. Tietokantaan tietueet 1-13 menee ihan hyvin, mutta sitten tietueesta 14 tallennus pomppaa ihan alkuun ja jatkuu siitä... (eli 14,15,16,17,18,19,20,1,2,3,4,5,6,7,8,9,10,11,12,13) vaikka ne pitäisi mennä numerojärjestyksessä...Jos joku keksii tähän ratkaisun niin olisin erittäin kiitollinen.
Nyt se on vähän paremmin luettavissa...
Hyvin sisennettyä koodia :), kantsii aloittaa varmaan sisentämisestä toi ongelman ratkominen :D
qwauk kirjoitti:
Hyvin sisennettyä koodia :), kantsii aloittaa varmaan sisentämisestä toi ongelman ratkominen :D
Asia hoidettu...
Tiedot voivat olla missä tahansa järjestyksessä kannassa, mutta muotoile haun tulosteen muotoa ORDER BY-komennolla.
Seuraava tulostaa arvot järjestyksessä, joka välillä tuntuu johtuvan kuun asennosta, sukkien väristä ja onko reiällinen sukka vasemmassa vai oikeassa jalassa.
SELECT Arvo1, Arvo2 FROM Taulu
Arvo1 Arvo2 AA 11 BB 22 AA 22 CC 11
Kun arvot halutaan aina tiettyyn järjestykseen, niin ORDER BY järjestää tulokset nousevaan (ASC) tai laskevaan (DESC) järjestykseen.
SELECT Arvo1, Arvo2 FROM Taulu ORDER BY Arvo1 DESC, Arvo2 ASC
Arvo1 Arvo2 CC 11 BB 22 AA 11 AA 22
Edit: Muotoilua
Aihe on jo aika vanha, joten et voi enää vastata siihen.