Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VBA: Tekstitiedostosta osa Access/Excel tietokantaan

Knappe [31.10.2003 03:07:20]

#

Olen käyttänyt alla olevaa koodia tekstitiedoston lukemiseen. Tieodosto luetaan rivi kerrallaan, jonka jälkeen kyseinen rivi näytetään MsgBoxissa. (Tämä vain siksi, että olen voinut seurata koodin toimivuutta.) Tekstitiedoston data on kolmessa sarakkeessa, välilyönneillä jaettuna. Koodin alapuolella on esimerkki tekstitiedostosta. Jotta tämä ei olisi liian yksinkertaista, on tekstitiedostossa 28 vastaavaa yhdistelmää kuin tässä esimerkissä (COMBINATION 1). Yhdistelmien ekalla rivillä on otsikko: COMBINATION 1 (2, 3, jne...) Yhdistelmien välissä on aina yksi tyhjä rivi.

Tarvitsen tietokantaani 29 saraketta. Ensimmäiseen tulee tekstitiedoston toinen sarake ja loppuihin 28:aan tulee jokaisen yhdistelmän kolmas sarake. Yhdistelmien toinen sarake on kaikissa yhdistelmissä sama, siksi riittää, että se on tietokannassa vain kerran. Jotta tämä olisi vieläkin vaikeampaa, on yhdistelmissä kaikkia muita rivejä kuin ensimmäistä ja viimeistä tuplasti. Tarvitsen siis jokaista riviä vain kerran. Kaikissa yhdistelmissä on siis yhtä monta riviä, mutta rivien lukumäärä vaihtelee tapauskohtaisesti.

Tuliko tämä nyt tarpeeksi epäselvästi? Voinko saada joitakin yksinkertaisia vinkkejä esim. miten käytän Split-käskyä, luon sarakkeet tietokantaan, jätän ekan sarakkeen huomioimatta, miten toinen sarake huomioidaan vain kertaalleen ja miten saan yhdistelmien otsikot sarakkeiden nimiksi? Tässähän näitä ongelmia on riittävästi... Olisi mukavaa jos joku voisi vastata edes yhteen kysymykseen ja vaikka kommentoida tuota koodia ja miten sitä muokkaamaan.

Olen kyllä tutkiskellut esimerkkejä ja ohjeita mutta en esimerkiksi tiedä miten käyttäisin split-käskyä juuri tässä tapauksessa. En siis hyödy kovinkaan paljon viittauksista vanhoihin kysymyksiin ja vastauksiin. Kiitos etukäteen ja tässä alla nämä esimerkit:

Dim iReadFile As Integer
    Dim sLine As String

    iReadFile = FreeFile
    Open App.Path & "\Sas\M.log" For Input As #iReadFile

    While Not EOF(iReadFile)
        Line Input #iReadFile, sLine

        MsgBox "This was recieved by the file: " & sLine, vbOKOnly

    Wend

    Close #iReadFile

Alla esimerkki tekstitiedostosta:

COMBINATION 1
 1           0.00  -7.5000E-01
 2         230.00   2.6579E+05
 2         230.00   2.6580E+05
 3         460.00   5.6492E+05
 3         460.00   5.6492E+05
 4         690.00   8.9737E+05
 4         690.00   8.9737E+05
 5         920.00   1.2631E+06
 5         920.00   1.2631E+06
 6        1150.00   1.6622E+06
 6        1150.00   1.6622E+06
 7        1380.00   2.0947E+06
 7        1380.00   2.0947E+06
 8        1610.00   2.5604E+06
 8        1610.00   2.5604E+06
 9        1840.00   3.0595E+06
 9        1840.00   3.0595E+06
 10       2070.00   3.5919E+06
 10       2070.00   3.5919E+06
 11       2300.00   4.1577E+06
 11       2300.00   4.1577E+06
 12       2470.00   3.6600E+06
 12       2470.00   3.6600E+06
 13       2640.00   3.1805E+06
 13       2640.00   3.1805E+06
 14       2810.00   2.7192E+06
 14       2810.00   2.7192E+06
 15       2980.00   2.2761E+06
 15       2980.00   2.2761E+06
 16       3150.00   1.8512E+06
 16       3150.00   1.8512E+06
 17       3320.00   1.4446E+06
 17       3320.00   1.4446E+06
 18       3490.00   1.0561E+06
 18       3490.00   1.0561E+06
 19       3660.00   6.8588E+05
 19       3660.00   6.8588E+05
 20       3830.00   3.3384E+05
 20       3830.00   3.3383E+05
 21       4000.00   7.5000E-01

Knappe [31.10.2003 03:13:28]

#

Anteeksi että pääsi unohtumaan, kyseessä on siis VB 6.0. Tuosta esimerkistä ei näköjään erota välilyöntejä kovinkaan selvästi. Eka sarake on siis 1 - 21, toka 0.00 - 4000.00 ja kolmas -7.5000E-06 - 7.5000E-01. Tuo data pitäisi siis muuttaa tekstistä numeroiksi.

eakem [23.11.2003 12:17:36]

#

Moi,
Joko sait koodin väännettyä vai vieläkö tämä case odottaa ratkaisua?

Knappe [03.12.2003 22:15:40]

#

Olen kyllä saanut apua pulmaan ja tällä hetkellä ohjelma tekee tietokantaan 28 taulukkoa, joissa kaikissa on kaksi saraketta. Ekassa sarakkeessa on yllä olevan esimerkin toinen sarake ja toisessa sarakkeessa on esimerkin kolmas saraka. Lisäksi koodi poistaa rivit, jotka on kaksi kertaa.

Tämä on siis ihan ok, mutta nyt minun pitäisi löytää se taulukko, joka sisältää maksimiarvon ja se taulukko, joka sisältää minimiarvon. Jokaisen taulukon eka sarake on samanlainen ja min. ja max. arvot siis löytyvät taulukoiden toisesta sarakkeesta. Pitäisi siis selvittää taulukot, joista löytyy ääriarvot.

Vinkkejä?

Tarvitsen kuvaajaa varten ne kaksi tau

eakem [06.12.2003 16:00:50]

#

Tässä on yksi tapa toteuttaa homma. Oletan, että käytät access -kantaa. Seuravaan esimerkkiin tarvitset formille seuraavat kontrollit:
command1
4 textboxia (Txt_min_tbl_name,Txt_max_tbl_name,
Txt_min_tbl_value,Txt_max_tbl_value)

esimerkin tietokannan nimi on testi.mdb ja kantaan on tehty kolme taulua, jotka on nimetty taulu1, taulu2,taulu3.
Kussakin taulussa on sarake kentta1, jonka minimi ja
maksimiarvoja tarkastellaan.

ohjelma lukee taulut läpi ja tallettaa min ja max arvot tekstikenttiin, ja näyttää vastaavat taulujen nimet.

Tein formille myös labelit, että tulos olisi helposti luettavissa, tyyliin:

----------- taulu arvo
minimi----- |txtbox| |txtbox|
maksimi---- |txtbox| |txtbox|

Private Sub Command1_Click()

Dim ADO_conn As New ADODB.Connection
Dim db_rset As New ADODB.Recordset
Dim table_name As String
Dim sql_string As String

'määritellään yhteys access- kantaan
ADO_conn.ConnectionString = "PROVIDER=Microsoft.Jet.OLEDB.3.51;Data Source=" & App.Path & "\testi.mdb;"
'avataan yhteys
ADO_conn.Open

'luetaan silmukassa taulujen minimi- ja maksimiarvot
For x = 1 To 3 Step 1
'muokataan luettavan taulun nimi
table_name = "taulu" & x
'määritellään suoritettava sql-lause
sql_string = "select min(kentta1) as minimi, max(kentta1) as maksimi from " & table_name
'suoritetaan sql-lause
db_rset.Open sql_string, ADO_conn, adOpenDynamic, adLockOptimistic
db_rset.MoveLast 'tämä ei ole välttämätön

'alustetaan tekstikentät eka taulun kyselyn tuloksilla
'edellyttää, että tekstikenttien text property on alussa tyhjä.
If Txt_min_tbl_name.Text = "" Then
  Txt_min_tbl_name.Text = table_name
  Txt_max_tbl_name.Text = table_name
  Txt_min_tbl_value.Text = db_rset.Fields(0)
  Txt_max_tbl_value.Text = db_rset.Fields(1)
End If

'vertaillaan kyselyn palauttamia arvoja. Jos min tai max muuttuu,
'otetaan arvot talteen tekstikenttiin.
If db_rset.Fields(0) < Txt_min_tbl_value.Text Then
      Txt_min_tbl_value.Text = db_rset.Fields(0)
      Txt_min_tbl_name.Text = table_name
End If

If db_rset.Fields(1) > Val(Txt_max_tbl_value.Text) Then
      Txt_max_tbl_value.Text = db_rset.Fields(1)
      Txt_max_tbl_name.Text = table_name
End If
'suljetaan recordset. Muuten tulee virhe.
db_rset.Close
Next x

'lopuksi suljetaan yhteys.
ADO_conn.Close

End Sub

Toivottavasti voit tästä soveltaa jotakin omaan juttuusi.
Tämänkaltainen toteutus voi olla aika tehoton, jos tauluja on paljon, ja niissä on paljon tietueita. Minimin ja maksimin haussa on kahlattava kaikki taulut läpi.

Voisiko tehdä niin, että ylläpidät erillistä taulua, josta seuraat minimin ja maksimin muutosta? Kannattaa miettiä siinä tapauksessa, että tulee suorituskykyongelmia.

Vastaus

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

Tietoa sivustosta