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 Sub
Edit: 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 Sub
kiitos 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 Sub
Numero-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.