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ä.
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
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ä.
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?
MOI Stefa!
auttaisikohan oheinen esimerkki..?
If nimi = "" Or pvm = "" Then 'tee jotain else: 'tee jotain muuta End if
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.
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
Saattaa olla että muistan nyt ihan omiani, mutta eikös sen ruksin saa pois rakennenäkymässä lomakkeen ominaisuuksista.
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ä
Aihe on jo aika vanha, joten et voi enää vastata siihen.