Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C, VB.NET: Access 2007 ja listaohjaus

Sivun loppuun

kisahalo [10.08.2010 11:12:41]

#

Minun pitäisi tehdä tämännäköinen ohjelma uudestaan Access 2007:llä (alkuperäinen koodi ei käytettävissä).

Ohjelmassa klikataan jotain riviä, jolloin osa sen tiedoista näkyy yläosan muokkausruuduissa, mistä ne voi tallentaa Korvaa tiedot -napilla. En saa tätä yhteyttä millään toimimaan Accessissa, miten se tehdään?

Tähän mennessä olen saanut vain yläosan kentät seuraamaan alaosan listan (alilomakkeen) valittua riviä, mutta muokkaus ei onnistu.

Grez [10.08.2010 11:20:32]

#

Itse pohtisin ehkä miksi se pitää ylipäätään tehdä Accessilla, eikä esim. C#:lla ja SQL Serverillä. (Jos hinta on ongelma niin molemmistahan saa ilmaiset Express Editionit).

kisahalo [10.08.2010 11:24:20]

#

Jaa-a, sen kun tietäisi. Yksi syy on kuulemma ylläpidon helppous, minkä lisäksi tietokanta on .mdb. Ohjelma on myös melko simppeli, eli jos tuon yhteyden saisi toimimaan, loppu menisi nopeasti. Joten toivon edelleen rakentavia vastauksia.

groovyb [10.08.2010 13:45:27]

#

paha sanoa. en osaa auttaa, ellet sitten tee C#/VB/Visual C++ + Access yhdistelmällä. Ei ole ikinä ollut tarvetta tehdä formeja accessilla suoraan

Grez [10.08.2010 14:01:28]

#

Itse sanoisin että tuo .mdb -tietokanta on enemmän negatiivinen kuin positiivinen asia. Teoriassa sitä voi käyttää verkon yli useampikin käyttäjä, mutta minä sen paremmin kuin Microsoftkaan ei suosittele. Vaikea uskoa että tuollaista järjestelmää käyttäisi nyt ja aina tulevaisuudessa vain yksi käyttäjä, joten väite että tuo olisi helposti ylläpidettävä on minusta perusteeton.

kisahalo [10.08.2010 15:24:47]

#

Alan itsekin olla samaa mieltä, mutta tällainen annettiin tehtäväksi. Oletetaan, että tietokanta muunnettaisiin lokaalista .mdb:stä SQL-serveriksi: Millä homma kannattaisi tehdä, kun tiedetään, että kieli pitää opetella alusta lähtien, eikä ohjelma ole kovin suuri?

groovyb [10.08.2010 17:24:15]

#

no makuasioita, mutta itse pidän visual basicin opettelua nopeampana kuin C# / C / C++ tai vastaavan syntaksin. luulen että googlella löytyy muuntimia jolla voi mdb:n muuntaa Sql kannaksi, ainakin pikaisesti löytyi tälläinen: http://www.dbforums.com/mysql/1625478-how-convert-mdb-sql.html

Grez [10.08.2010 18:10:32]

#

No se nyt on ihan sama että C# vai VB.Net..

Ihmettelen toisaalta väitettä että jomman kumman opettelu olisi merkittävästi nopeampaa kuin toisen, koska niillä ei mitään merkittävää eroa ole. Toisessa tarvii laittaa ; loppuun ja avainsanat on pikkuisen erilaisia. Tyyliin

var ent = new OhjelmanEntities();

vs.

Dim ent As New OhjelmanEntities()

Tietty jos VBA on hyvin hallussa, niin onhan sitten ei ole välttämättä järkevää pikkujuttua varten opetella .Netiä. Mutta väittäisin että VBA:kaan nyt ei ihan suvereenisti ole hallussa, jos tuo tiedon siirtäminen tuottaa ongelmaa. Itsekin varmaan saisin sen tehtyä nopeasti vaikka en VBA:ta juuri käytä. Mutta en jaksa alkaa väsäämään vastaavaa projektia tyhjästä vain testatakseni, miten se tehdään. Muutenkin kun uusien projektien osalta tuosta accessista olen päässyt eroon joskus 10 vuotta sitten, niin ei huvittaisi alkaa uudestaan säätämään. :D

neau33 [10.08.2010 19:05:10]

#

Moi kisahalo!

oheinen esimerkki valottanee homman kulkua MsAccess/VBA:lla...

'Form_Lomake1
Private Sub Korvaa_Click()

   Dim i As Integer
   Dim IsChanged As Boolean
   Dim ctl As Control

   For i = 1 To 7
      Set ctl = Me.Controls("Muokkaus" & CStr(i))
      If ctl.Value <> ctl.Tag Then
        IsChanged = True: Exit For
      End If
   Next i

   Set ctl = Nothing

   If Not IsChanged Then
      Exit Sub
   End If

   Dim db As Database
   Set db = CurrentDb

   Dim rs As Recordset

   '*Jos päivitettäviä taluja on vain yksi niin...
   Set rs = db.OpenRecordset("TaulunNimi", dbOpenDynaset, dbOptimistic)

   rs.MoveFirst

   Do While Not rs.EOF
      If rs!Tilausnumero = Me.Muokkaus1.Tag Then
         rs.Edit
         rs!Tilausnumero = Me.Muokkaus1.Value
         rs!TilausPVM = Me.Muokkaus2.Value
         rs!Tuote = Me.Muokkaus1.Va3ue
         rs!Toimittaja = Me.Muokkaus4.Value
         rs!Määrä = Me.Muokkaus5.Value
         rs!Tilaaja = Me.Muokkaus6.Value
         rs!Lisätiedot = Me.Muokkaus7.Value
         rs.Update: Exit Do
      End If
      rs.MoveNext
   Loop

   rs.Close
   '*

   '** '*Jos päivitettäviä taluja on esim. kaksi niin...
   'Dim TaulunNimi As String
   'For i = 1 To 2 'Esim.
      'Select Case i
         'Case 1: TaulunNimi = "Taulun1Nimi"
         'Case 2: TaulunNimi = "Taulun2Nimi"
      'End Select
      'Set rs = db.OpenRecordset(TaulunNimi, dbOpenDynaset, dbOptimistic)
      'rs.MoveFirst
      'Do While Not rs.EOF
         'Select Case i
         'Case 1
               'If rs!Tilausnumero = Me.Muokkaus1.Tag Then
                  'rs.Edit
                  'rs!Tilausnumero = Me.Muokkaus1.Value
                  'rs!TilausPVM = Me.Muokkaus2.Value

                  'rs!Määrä = Me.Muokkaus5.Value
                  'rs!Tilaaja = Me.Muokkaus6.Value
                  'rs!Lisätiedot = Me.Muokkaus7.Value
                  'rs.Update: Exit Do
               'End If

         'Case 2
            'Do While Not rs.EOF
               'If rs!Tuote = Me.Muokkaus3.Tag Then
                  'rs.Edit
                  'rs!Tuote = Me.Muokkaus3.Value
                  'rs!Toimittaja = Me.Muokkaus4.Value
                  'rs.Update: Exit Do
               'End If
         'End Select
         'rs.MoveNext
      'Loop
      'rs.Close
   'Next i
   '**

   db.Close
   Set rs = Nothing: Set db = Nothing

   For i = 1 To 7
      Set ctl = Me.Controls("Muokkaus" & CStr(i))
      ctl.Tag = ctl.Value
   Next i

End Sub
'Form_Taulukko1 (alilomake)
Private Sub Tilausnumero_GotFocus()


   Form_Lomake1.Muokkaus1.Value _
   = Tilausnumero.Value
   Form_Lomake1.Muokkaus1.Tag _
   = Tilausnumero.Value

   Form_Lomake1.Muokkaus2.Value _
   = TilausPVM.Value
   Form_Lomake1.Muokkaus2.Tag _
   = TilausPVM.Value

   Form_Lomake1.Muokkaus3.Value _
   = Tuote.Value
   Form_Lomake1.Muokkaus3.Value _
   = TilausPVM.Value

   Form_Lomake1.Muokkaus4.Value _
   = Tuote.Value
   Form_Lomake1.Muokkaus4.Tag _
   = Tuote.Value

    Form_Lomake1.Muokkaus5.Value _
   = Tuote.Value
   Form_Lomake1.Muokkaus5.Tag _
   = Tuote.Value

   Form_Lomake1.Muokkaus6.Value _
   = Tuote.Value

   Form_Lomake1.Muokkaus6.Tag _
   = Tuote.Value

   Form_Lomake1.Muokkaus7.Value _
   = Tuote.Value
   Form_Lomake1.Muokkaus7.Tag _
   = Tuote.Value

End Sub

-Nea- :)

kisahalo [11.08.2010 09:12:29]

#

neau33: Haa, kiitos, pitää testata tuota (menee varmaan aikaa koska olen nyyppä VBA:ssa ja Accessissa). Tulen sitten takaisin ylistämään jos tuo ratkaisi ongelmani. :)

Edit: Yritän tuota ensin Accesissa (työnantaja suhtautuu vähän nihkeästi koko ohjelman tekoon VBA:lla (koska tuki lopetettu)). Pitääkö minun muuttaa jotenkin noiden muokkauskenttien ja/tai alilomakkeen sidoksia tietokantaan (joka muuten koostuu vain tauluista Tilaukset ja Tuote)? Tällä hetkellä alilomake hakee tietonsa Tilaukset-taulusta ja muokkausruudut ovat sitomattomia.

neau33 [11.08.2010 15:17:25]

#

Moi taas kisahalo!

1. Ei pidä muuttaa muokkauskenttien sidoksia!

2a. Jos on niin, että tilaukset tauluun siirretään (kopioidaan) tarvittavat tiedot Tuote-taulusta ja alilomakkeella oleva data on sidoksissa ainostaan Tilaukset-tauluun niin tapauksessa, että tuotetietoja muokataan on silmukan ensimmäisen kierroksen (esimerkin toinen vaihtoehto Case1 (2)) aikana päivitettävä kaikkien muokkauskenttien data Tilaukset-taulun vastaaviin kenttiin ja toisen kierroksen (case 2) aikana päivitetään Tuote-tauluun vain niiden muokkauskenttien tiedot, jotka liittyvä Tuote-taulun kenttiin.

2b. Jos taas on niin, että alilomakkeella oleva data tuodaan Kyselystä niin silloin esimerkin toinen malli ('**) on toimiva (alilomakkeen datan eli Kyselyn pitäisi päivittyä tällöin automaattisesti).

3b. Muussa tapauksessa on esimerkin ensimmäinen ('*) vaihtoehto toimiva.

-Nea- :)

Grez [11.08.2010 15:26:55]

#

kisahalo kirjoitti:

Yritän tuota ensin Accesissa (työnantaja suhtautuu vähän nihkeästi koko ohjelman tekoon VBA:lla (koska tuki lopetettu)).

Eikös se silloin ole juuri nimenomaan VBA:lla, jos teet sen Accessilla? Vai tarkoitatko että yrität tehdä kokonaan ilman "makroja".

Tuntuu myös uskomattomalta että MS olisi lopettanut tuen VBA:lle, kun se kuitenkin on vielä Office 2010:ssäkin.

derp [11.08.2010 17:02:06]

#

Moi neau33!

Nyt kyllä tuntuu vahvasti siltä että koodi ei ollut oma keksimä.

-Aku Ankka-

neau33 [11.08.2010 17:17:22]

#

No aivan sama mitä joku sorsanpoika jupisee...

kisahalo [23.08.2010 10:11:16]

#

Minulla oli ongelmia tuon koodin kanssa (lienee kokemattomuutta). Olin yhteydessä erääseen Accessin tuntijaan, joka neuvoi tekemään listaohjauksen suodatuksen avulla. Idea on se, että kun tietyn sarakkeen kohtaa klikkaa, macro ottaa suodatuksen käyttöön. Suodatus taas siirtää ohjausobjektin siihen tietueeseen, jossa klikattu kenttä on. Yksityiskohdat täällä.

Homma toimii minulla hienosti ensimmäisellä klikkauksella, mutta seuraavilla menetelmä ei enää toimi. Kysymyksessä täytyy olla jokin Accessin asetus tai bugi, koska täysin sama (kokeilin ko. tyypin omaa kokeilutietokantaa) menetelmä toimii hienosti toisaalla, kuten hänen tekemästä mallivideosta näkyy.

Jos otan ensimmäisen klikkauksen jälkeen suodatuksen pois päältä ja klikkaan jotain toista riviä, ohjelma käyttää edellisen kohdan suodatusta uudestaan. Osaisitteko auttaa tässä?

neau33 [24.08.2010 18:03:18]

#

Aivan sama mitä joku Access asiantuntija sanoo tai esittä jolain videolla...


Sivun alkuun

Vastaus

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

Tietoa sivustosta