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.
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).
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.
paha sanoa. en osaa auttaa, ellet sitten tee C#/VB/Visual C++ + Access yhdistelmällä. Ei ole ikinä ollut tarvetta tehdä formeja accessilla suoraan
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.
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?
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
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
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- :)
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.
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- :)
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.
Moi neau33!
Nyt kyllä tuntuu vahvasti siltä että koodi ei ollut oma keksimä.
-Aku Ankka-
No aivan sama mitä joku sorsanpoika jupisee...
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ä?
Aivan sama mitä joku Access asiantuntija sanoo tai esittä jolain videolla...
Aihe on jo aika vanha, joten et voi enää vastata siihen.