Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VBA: miten luodaan tietokannan Autonumber visual basicilla

Pallomasi [06.09.2005 12:28:11]

#

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

BadSource [06.09.2005 14:00:34]

#

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

Pallomasi [06.09.2005 19:02:05]

#

kiitos neuvosta! nyt pääsen eteenpäin...

Pallomasi [14.09.2005 08:56:43]

#

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

efteri [14.09.2005 09:18:02]

#

Hyvin sisennettyä koodia :), kantsii aloittaa varmaan sisentämisestä toi ongelman ratkominen :D

Pallomasi [14.09.2005 10:19:41]

#

qwauk kirjoitti:

Hyvin sisennettyä koodia :), kantsii aloittaa varmaan sisentämisestä toi ongelman ratkominen :D

Asia hoidettu...

BadSource [14.09.2005 12:56:47]

#

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

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta