17. maj 2006 - 15:25
Der er
24 kommentarer og 1 løsning
Tjekke om variabel er tom
Jeg har en stump kode, som bruger nogle data jeg får ud fra Active Directory (AD). Disse bruges til at lave en afsenderperson på et brev. Jeg vil derfor godt lave et tjek, der sørger for at der ikke opstår tomme linier i mellem kontaktoplysningerne på afsenderen af brevet. Opbygningen er så følger: navn stilling telefon mobil email Hvis telefon og mobil er tomt for en person, så vil jeg få 2 tomme linier, dem vil jeg undgå. Jeg har denne kodestump, der ligger data fra AD over i nogle variabler. While (Not found) And (Not rs.EOF) If LCase(cbAfsender.Value) = LCase(rs.Fields("name")) Then found = True Me.afsName = rs.Fields("name") Me.afsTlf = rs.Fields("telephoneNumber") Me.afsMail = rs.Fields("mail") Me.afsTitle = rs.Fields("title") Me.afsMobile = rs.Fields("mobile") Me.afsDistName = rs.Fields("distinguishedName") End If rs.MoveNext Wend Senere når jeg opretter brevet, ved klik på OK, så har jeg følgende: 'afsender Dim strAfsender As String strAfsender = Me.afsName & vbCrLf & _ Me.afsTitle & vbCrLf & _ Me.afsMail & vbCrLf & _ Me.afsTlf & vbCrLf & _ Me.afsMobile If IsEmpty(Me.afsTlf) Then Debug.Print strAfsender End If Den fanger ikke på IsEmpty for afsTlf er åbenbart ikke tom, men hvordan sikre jeg mig så imod tomme linier.
Annonceindlæg tema
Offentlig digitalisering
Fra effektivisering til digital suverænitet. Hvordan skaber det offentlige en digital fremtid med AI, sikkerhed og kontrol i centrum?
Du kan prøve med: If Me.afsTlf = "" Then eller If ("" & Me.afsTlf) = "" Then
Den første har jeg også prøvet uden held, men jeg faldt over IsNull() og den virker, men nu skal jeg bare have tænkt mig om. For jeg har som du kan se både navn, stilling/titel, telefon, mobil og mail. Jeg skal reelt have tjekket for de 4 sidste på en smart måde, så tilfælge hvor kun én af dem er tom og tilfælde hvor flere er tomme.
Hvad skal der ske, hvis en linie er tom? Gælder denne regel for alle linier?
Du skal forstille dig en afsender på et brev. Hanseman Lugther Brandmand hanseman (@) lugther (.) dk 112 221 Der må så ikke forekomme tomme linier, hvis f.eks. mailen ikke er oprettet på personen, så det hele skal rykkes sammen. Men jeg sådan set selv løst den, men ikke særligt elegant, så der er point hvis du kender en pænere metode. Jeg kommer lige med det jeg har gjort
Jeg bygge sådan set bare på strengen, hvis variablen IKKE er tom. Dim strAfsender As String If Not IsNull(Me.afsName) Then strAfsender = Me.afsName End If If Not IsNull(Me.afsTitle) Then strAfsender = strAfsender & vbCrLf & Me.afsTitle End If If Not IsNull(Me.afsMail) Then strAfsender = strAfsender & vbCrLf & Me.afsMail End If If Not IsNull(Me.afsTlf) Then strAfsender = strAfsender & vbCrLf & Me.afsTlf End If If Not IsNull(Me.afsMobile) Then strAfsender = strAfsender & vbCrLf & Me.afsMobile End If
Hvad med: dim navn, titel, mail, tlf, mobil, afsender navn = "" If Not IsNull(Me.afsName) Then navn = navn & vbCrlF titel = "" If Not IsNull(Me.afsTitle) Then titel = titel & vbCrlF mail = "" If Not IsNull(Me.afsMail) Then mail = mail & vbCrlF tlf = "" If Not IsNull(Me.afsTlf) Then tlf = tlf & vbCrlF mobil = "" If Not IsNull(Me.afsMobile) Then mobil = mobil & vbCrlF strAfsender = navn & titel & mail & tlf & mobil
dim navn, titel, mail, tlf, mobil, afsender As String navn = "" If Not IsNull(Me.afsName) Then navn = navn & vbCrlF titel = "" If Not IsNull(Me.afsTitle) Then titel = titel & vbCrlF mail = "" If Not IsNull(Me.afsMail) Then mail = mail & vbCrlF tlf = "" If Not IsNull(Me.afsTlf) Then tlf = tlf & vbCrlF mobil = "" If Not IsNull(Me.afsMobile) Then mobil = mobil & vbCrlF strAfsender = navn & titel & mail & tlf & mobil
Doh! :-) Retter lige koden..
dim navn, titel, mail, tlf, mobil, afsender As String navn = "" If Not IsNull(Me.afsName) Then navn = navn & Me.afsName & vbCrlF titel = "" If Not IsNull(Me.afsTitle) Then titel = titel & Me.afsTitle & vbCrlF mail = "" If Not IsNull(Me.afsMail) Then mail = mail & Me.afsMail & vbCrlF tlf = "" If Not IsNull(Me.afsTlf) Then tlf = tlf & Me.afsTlf & vbCrlF mobil = "" If Not IsNull(Me.afsMobile) Then mobil = mobil & Me.afsMobile & vbCrlF strAfsender = navn & titel & mail & tlf & mobil
Man kunne vel også bare nøjes med: dim navn, titel, mail, tlf, mobil, afsender As String navn = "" If Not IsNull(Me.afsName) Then navn = Me.afsName & vbCrlF titel = "" If Not IsNull(Me.afsTitle) Then titel = Me.afsTitle & vbCrlF mail = "" If Not IsNull(Me.afsMail) Then mail = Me.afsMail & vbCrlF tlf = "" If Not IsNull(Me.afsTlf) Then tlf = Me.afsTlf & vbCrlF mobil = "" If Not IsNull(Me.afsMobile) Then mobil = Me.afsMobile & vbCrlF strAfsender = navn & titel & mail & tlf & mobil
Det er jo sådan set næsten det samme som jeg gør nu, kan man ikke gør noget rekursivt?
Hmmm.. det kan næsten ikke betale sig, når du kun har 5 værdier. Koden til det rekursive, fylder garanteret mere end koden i 17/05-2006 16:04:44.
Okay, smide et svar, så er pointene dine.
Jeg prøver lige at lave et eksempel.. - Svar
option explicit ' --------------------- simulering af database ---------------- dim sim_navn, sim_titel, sim_mail, sim_tlf, sim_mobil sim_navn = "Hanseman Lugther" sim_titel = null ' titel er sat til NULL sim_mail = "hanseman (@) lugther (.) dk" sim_tlf = "112" sim_mobil = "221" ' ---------------------------------------------------------- ' -------- her starter koden: -- dim arr(4) arr(0) = sim_navn arr(1) = sim_titel arr(2) = sim_mail arr(3) = sim_tlf arr(4) = sim_mobil dim navn, titel, mail, tlf, mobil, afsender dim i for i = 0 to ubound(arr) If Not IsNull(arr(i)) then afsender = afsender & arr(i) & vbCrLf next ' Egentligt skal du fjerne det sidste mellemrum: afsender = left(afsender, len(afsender) - 2) ' --- her slutter koden --- msgbox afsender
Hmmm.. 17/05-2006 16:04:44 = 12 linier 17/05-2006 16:31:38 = 11 linier (man kan smide "i" op sammen med de andre variabler, for at spare 1 linie) :-)
Ja hold da op en forskel... ;-)
Da jeg ikke lige har Visual Basic, har jeg bare lavet en VBS fil.. og der er jo nogen begrænsninger.. Du burde kunne erstatte dim arr(4) arr(0) = sim_navn arr(1) = sim_titel arr(2) = sim_mail arr(3) = sim_tlf arr(4) = sim_mobil med Dim arr() As String = {sim_navn, sim_titel, sim_mail, sim_tlf, sim_mobil } Så sparer du yderliger 5 linier.. :-)
Prøv det her (så er du nede på 6 linier): option explicit ' denne tæller ikke med som linie ' --------------------- simulering af database ---------------- dim sim_navn, sim_titel, sim_mail, sim_tlf, sim_mobil sim_navn = "Hanseman Lugther" sim_titel = null ' titel er sat til NULL sim_mail = "hanseman (@) lugther (.) dk" sim_tlf = "112" sim_mobil = "221" ' ---------------------------------------------------------- ' -------- her starter koden: -- Dim arr() As String = { sim_navn, sim_titel, sim_mail, sim_tlf, sim_mobil } dim navn, titel, mail, tlf, mobil, afsender, i for i = 0 to ubound(arr) If Not IsNull(arr(i)) then afsender = afsender & arr(i) & vbCrLf next ' Egentligt skal du fjerne det sidste mellemrum: afsender = left(afsender, len(afsender) - 2) ' --- her slutter koden --- msgbox afsender ' denne tæller ikke med som en linie, da det bare er en test
Hvis den ikke accepterer Dim arr() As String = { sim_navn, sim_titel, sim_mail, sim_tlf, sim_mobil } kan du prøve med: option explicit ' denne tæller ikke med som linie ' --------------------- simulering af database ---------------- dim sim_navn, sim_titel, sim_mail, sim_tlf, sim_mobil sim_navn = "Hanseman Lugther" sim_titel = null ' titel er sat til NULL sim_mail = "hanseman (@) lugther (.) dk" sim_tlf = "112" sim_mobil = "221" ' ---------------------------------------------------------- ' -------- her starter koden: -- dim navn, titel, mail, tlf, mobil, afsender, i, arr arr = Array(sim_navn, sim_titel, sim_mail, sim_tlf, sim_mobil) for i = 0 to ubound(arr) If Not IsNull(arr(i)) then afsender = afsender & arr(i) & vbCrLf next ' Egentligt skal du fjerne det sidste mellemrum: afsender = left(afsender, len(afsender) - 2) ' --- her slutter koden --- msgbox afsender ' denne tæller ikke med som en linie, da det bare er en test 6 linier :-) :-)
Denne kode er hurtigere: "gammel kode" for i = 0 to ubound(arr) If Not IsNull(arr(i)) then afsender = afsender & arr(i) & vbCrLf next afsender = left(afsender, len(afsender) - 2) "Hurtigere kode:" for i = 0 to ubound(arr)-1 If Not IsNull(arr(i)) then afsender = afsender & arr(i) & vbCrLf next afsender = afsender & arr(ubound(arr))) Så slipper du for først at skrive noget til variablen for dernæst at slette det. Og det fylder lige mange linier, nu det åbenbart er succeskriteriet :o)
Hehe.. Gad vide om den kan reduceres mere..? :-) PS: Du har en slut-parentes for meget i denne linie: afsender = afsender & arr(ubound(arr)))
Hehe.. så slemt er det heller ikke.. :-)
Kurser inden for grundlæggende programmering