Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VBA: Accessissä prompti raporttia suljettaessa jollei jotain kenttää ole täytetty

Sivun loppuun

Stefa [07.06.2010 16:00:59]

#

Ongelmana on accessin raportit jotka voi nyt tallentaa ilman sisältöä, joka johtaa luonnollisesti tyhjien raporttien syntymiseen. Ideana olisi tehdä "raportin tekijä"- ja "raportin päivämäärä"-kentät pakollisiksi täyttää. Tämä vielä onnistui, mutta nyt ohjelma sulkee raportin tallentamatta ja kysymättä mitään jollei tietoja ole. Eli jos raportissa ei ole pakollisiksi määrättyjä tietoja, niin se suljetaan tallentamatta ja kyselemättä. Ikävä ominaisuus. Miten saisin tarkistettua onko vaaditut kentät täytetty ja tehtyä promptin jos tietoja puuttuu? Luonnollisesti VB ei ole oikein hyvin hanskassa.

Tai miten saisin raportin päivämääräksi automaattisesti luontipäivämäärän? Näin riittäisi yksi pakollinen kenttä ja oma nimi on helpompi muistaa kirjoittaa kun päivämäärä.

neau33 [08.06.2010 09:48:06]

#

Moikka Stefa!

Raportissa päivämäärä tulee automaattisesti sivun alatunnisteeseen jos luot raportin ohjatun toiminnon avulla. Jos ei tule niin siiry rakennetilaan, lisää sivun alatunniste-osioon Muokkausruutu, klikka sen päällä hiiren oikealla, valitse ominaisuudet, valitse Kaikki-välilehti ja kirjoita Ohjausobjektin lähde-ruutuun: =Now()
Lisää manuaalisesti sivun alatunniste-osioon Label (Selite), nimeä ominaisuuksissa nimellä Label1 ja kirjoita Otsikoksi vaikka Raportin tekijä:...
Klikkaa rakennetilassa hiiren oikealla raportti-ikkunan vasemmassa ylälaidassa olevaa mustaa pikku ruutua, valitse Muodosta tapahtuma..., jos esiin aukeaa Valitse muodostin-ikkuna niin valitse Koodin muodostin ja klikkaa OK-nappia, Copy/Pasteta alla oleva koodi kaiken VBA-editorin koodi-ikkunassa näkyvän päälle ja tallenna projekti.

Private NoData As Boolean

Private Sub Report_Open(Cancel As Integer)
   NoData = False
End Sub

Private Sub Report_NoData(Cancel As Integer)
   NoData = True
   MsgBox "Ei raportoitavia tietueita", vbExclamation, Me.name
   Cancel = True
End Sub

Private Sub Report_Close()
   If Not NoData Then
      Dim merkkijono As String
Luuppi:
      merkkijono = "Raportin tekijä: " + _
      InputBox("Kirjoita nimesi", Me.name)
      If RTrim(merkkijono) = "Raportin tekijä:" Then
         merkkijono = "": GoTo Luuppi
      End If
      Me.Label1.Caption = merkkijono
      'Tulosta ActiveReport
   End If
End Sub

Sub Tulosta(ByVal rpt As Report)
   'Tänne mahdolliset tulostusrutiinit
End Sub

Stefa [08.06.2010 13:04:25]

#

Kiitokset vastauksesta. Ihan tuo ei kuitenkaan auennut, sain kyllä tuon päivämäärän tehtyä juoksevana, mutta ongelmia meinasi teettää saada tuo päivämäärä pysymään raportin luomishetkessä eikä muuttumaan jatkuvasti. Ohessa koodi napille jolla uusi raportti luodaan. Eli kun uusi raportti luodaan, niin perustiedot haetaan, noh, perustiedoista ja täydennetään valmiiksi. Tähän sain myös tuon ajan lisättyä ohessa näkyvällä tavalla. Tuo koodin pätkä löytyi netin syövereistä. Ensimmäiseen versioon lisäsin laitosinfopohjaan päivämääräkentän (=Date()) jonka tiedon hain samalla idealla kun esim. Yhtiön ja Laitoksenkin, mutta tämä toteutus on vähän nätimpi.

Private Sub uusihuolto_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
On Error GoTo Err_uusihuolto_Click

    DoCmd.GoToRecord , , acLast
    DoCmd.GoToRecord , , acNewRec

Forms!Laitosinfo!Raporttipohja!Nimi = Forms!Laitosinfo!Nimi
Forms!Laitosinfo!Raporttipohja!Yhtiö = Forms!Laitosinfo!Yhtiö
Forms!Laitosinfo!Raporttipohja!Laitos = Forms!Laitosinfo!Laitos
Forms!Laitosinfo!Raporttipohja!Kone = Forms!Laitosinfo!Kone
Me.Aika = Date

Exit_uusihuolto_Click:
    Exit Sub

Err_uusihuolto_Click:
    MsgBox Err.Description
    Resume Exit_uusihuolto_Click

End Sub

Tarkastelun, että huollolla on tekijä sain tehtyä raportin sulkemisnappiin. Päivämäärän pakollisuuden määräsin raporttipohjan taulukon rakenteesta. Tuossa vaan on ongelmana vielä, että jos automaattisesti täydennetyn päivämäärän käsin poistaa, niin raporttia ei saa poistettua jollei ensin täytä päivämäärää. Vähän hölmöä, mutta ei haitanne pahasti. En halua päivämäärää lukita, koska sen muuttaminen voi olla joskus tarpeen. Yritin tehdä sulkemisnappiin tarkastelua myös päivämäärälle if-rakenteella, mutta noita ei taida voida ketjuttaa tyyliin if-if-else... Tähän voisin ottaa vinkkejä vastaan.

EDIT: Doh, if ehto OR ehto...

Private Sub sulje_Click()

If IsNull(Tekijät) Then
MsgBox "Kirjoita raportille tekijä tai poista tyhjä raportti voidaksesi poistua.", vbInformation, "Huollon tekijä puuttuu."
Else
DoCmd.Close acForm, "laitosinfo"
DoCmd.OpenForm ("käyttöliittymä")
End If
End Sub

Mistä muuten johtuu, että osa napeista toimii näin "Private Sub sulje_Click()", mutta toiset haluavat "Private Sub uusihuolto_MouseDown"? Alunperin myös "uusihuolto" oli "click", mutta lopetti toimintansa jossain vaiheessa koodin puukotusta ja alkoi toimia kun muutin "mousedown". En käsitä.

Stefa [09.06.2010 13:49:37]

#

Hitusen noita päivämäärän ja tekijän tutkimisia vielä katsellut. Noin OR:lla homma pelaa, mutta virheilmoitus luonnollisesti aina sama. Joten tein tuon uudestaan idealla:

If IsNull(Tekijät) Then
MsgBox "Kirjoita raportille tekijä tai poista tyhjä raportti voidaksesi poistua.", vbInformation, "Huollon tekijä puuttuu."
ElseIf IsNull(Aika) Then
MsgBox "Kirjoita raporttiin päivämäärä tai poista tyhjä raportti voidaksesi poistua.", vbInformation, "Huollon päivämäärä puuttuu."
Else
DoCmd.Close acForm, "sahainfo"
DoCmd.OpenForm ("käyttöliittymä")

Homma toimii muuten, mutta jos poistaa päivämäärän, mutta on tekijä ja painaa sulje, niin herjaa puuttuvasta päivämäärästä. Sitten kun lisää päivän ja poistaa tekijän ja painaa sulje, niin lomake sulkeutuu. Eli nappi muistaa, että tekijä oli. Miten tuon voisi korjata?

neau33 [10.06.2010 14:18:32]

#

MOI Stefa!

auttaisikohan oheinen esimerkki..?

If nimi = "" Or pvm = "" Then
  'tee jotain
else: 'tee jotain muuta
End if

Stefa [21.06.2010 17:18:16]

#

Jeps, tuo oli juuri se mun Or-ratkaisu, mutta tuossa tosiaan se, että virheilmoitus on aina sama on kumpi tahansa kenttä täyttämättä, joten lisäsin tuon ElseIffin Or:n sijaan.

Toinenkin probleema on vielä ilmennyt, tuota mun keksimää tosin ei vielä käyttäjät ole löytäneet. Eli kun luo uuden raportin ja sulkee ohjelman ruksista, niin raportti jää sinne. Sitten jos siihen selaa itsensä, niin ei pääse pois kuin poistamalla raportin tai sulkemalla taas ruksista. Käyttäjinä kun on vanhojakin mekaanikkoja, niin pitäisi saada väärinkäytökset estettyä. Eli saanko mitenkään ohjelman sulkemisen estettyä muusta kuin sitä varten tehdystä napista? Tai piilotetua sen yläkulman ruksin. Kaikki valikot ja muut on salasanan takana, mutta koko ohjelman saa vielä suljettua.

neau33 [22.06.2010 18:25:33]

#

Moikka taas Stefa!

Oheinen systeemi ei varmaankaan suoraan tee ketään onnelliseksi, mutta...
elikä systeemissä on taulu "KAYTTAJA", jossa on kentät: knimi (teksti) & nro(laskuri&perusavain), joka sisälttää vain yhden tietueen, jonka knimi-kenttää päivitetään inputboxin palautearvolla. Tietokannan varsinaisesta DATA-taulusta tehdään rakennetilassa kysely: KYSELY1, johon tuodaan DATA-taulusta raporttiin tarvittavat kentät + käyttäjätaulun knimi-kenttä. Raporttipohja tehdään sitten luodusta kyselystä ja kyselyn knimi-kentän arvon sisältävä muokkausruutu siirretään selitteineen raportin sivun alatunniste -osioon...tämän jälkeen voidaan sitten halutessa piilotella kaikki ne taulut, kyselyt ja raportit, joiden ei tarvitse näkyä...

'formin: RaporttiFormi -koodinpätkät...
Option Compare Database
Private fldStr As String

Private Sub Form_Load()

   On Error Resume Next
      DoCmd.OpenReport "RaporttiPohja", _
      acViewPreview, , , acHidden, "OpenArgs"
   If Err Then
      Err.Clear: On Error GoTo 0
   End If

   'Jos KYSELY1 ja sitäkautta RaporttiPohja
   'sisältää raportoitavaa dataan niin...,
   If Reports("RaporttiPohja").HasData Then
      'alustetaan recordset-objekti...
      Dim rs As Recordset
      'ja määritellään recrdset-objekti
      'osoittamaan KAYTTAJA tauluun...
      Set rs = CurrentDb.OpenRecordset( _
      "KAYTTAJA", dbOpenDynaset, dbOptimistic)
      rs.MoveFirst
      rs.Edit
      'asetetaan kentän(0) arvoksi
      'inputboxin paluttama arvo...
      rs.Fields(0).Value = _
      InputBox("Raportoija?", "Uusi Raportti")
      rs.Update
      fldStr = rs.Fields(0).Value
      rs.Close: Set rs = Nothing
   End If

   DoCmd.Close acReport, "RaporttiPohja"

End Sub

Private Sub Form_Unload(Cancel As Integer)

   'Jos knimi-kentän arvo oli/tuli
   'erisuureksi kuin tyhjä merkkijono niin...
   If fldStr <> "" Then
      'alustellaan muutama muuttuja,
      Dim destDb, srcRep, destRep
      destDb = CurrentDb.name
      srcRep = "RaporttiPohja"
      destRep = "UusiRaportti"
      On Error Resume Next
      'avataan raporttipohja...,
      DoCmd.OpenReport srcRep, _
      acViewPreview, , , , "OpenArgs"
      If Err <> 0 Then
         Err.Clear
         On Error GoTo 0
      End If
      'estetään turhat varoitukset...
      DoCmd.SetWarnings False
      'kopioidaan pohja nimellä: UusiRaportti...,
      DoCmd.CopyObject destDb, _
      destRep, acReport, srcRep
      DoCmd.SetWarnings True
      'suljetaan pohja...,
      DoCmd.Close acReport, srcRep
      ja avataan kopio...
      DoCmd.OpenReport destRep, _
      acViewPreview, , , , "OpenArgs"
   Else
      'Jos ei raportoida niin suljetaan
      'tietokanta tallentelematta mitään...
      Application.Quit acQuitSaveNone
   End If

End Sub

Wiwwe [22.06.2010 23:04:19]

#

Saattaa olla että muistan nyt ihan omiani, mutta eikös sen ruksin saa pois rakennenäkymässä lomakkeen ominaisuuksista.

neau33 [23.06.2010 13:36:55]

#

Moikka taas!

Jos lomakkeen 'X'-napin toiminnan esto tekee onnelliseksi niin kyllä sen saa estettyä lomakkeen ominaisuuksissa. Jos saman efektin aikaansaaminen koodista käsin kiinnostaa niin tsekkaa tämä


Sivun alkuun

Vastaus

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

Tietoa sivustosta