Avatar billede blolsen Juniormester
15. april 2012 - 19:19 Der er 8 kommentarer og
1 løsning

returner værdi i accesfelt til venstre for seperatortegn

Hej

Jeg sidder og mangler et udtryk i en access forespørgsel, hvormed man kan returnere alt det , der står i et felt til venstre for seperatortegnet semikolon. Dvs. hvordan får jeg udtrykket til at returnere "4450" og "op4450" i nedenstående tekststrenge?

4450; Afvent oprettelse RR 27/3

OP4450; afventer
Avatar billede mugs Novice
15. april 2012 - 19:40 #1
Er der altid tale om det samme antal cifrer til venstre for semikolon?
Avatar billede blolsen Juniormester
15. april 2012 - 20:22 #2
Nej det kan variere fra 4 til 8 cifre. Der vil også være tekststrenge,hvori der ikke er angivet et semikolon og disse skal ikke med. 4450 og op4450 er kundenumre, som jeg skal have trukket ud af feltet.
Avatar billede Slettet bruger
16. april 2012 - 11:50 #3
At have 'felter i felter' modsiger hensigten med at delegere manipulationsmulighederne til en sql database engine - det kan være hensigtmæssigt at oprette et nyt felt til det der evt. er foran semikolonet - af såvel effektivitets som design forståelsesmæssige grunde.

Function subFld(fld, Optional place = 0, Optional fldSep = ";")
    'subFld = Null
    If InStr(1, fld, fldSep) Then subFld = Split(fld, fldSep)(place)
End Function

Ved 'ikke med' som resultat hvor der  intet semikolon er, står returneringsvalget mellem missing, null eller den tomme streng - tilføj 'as string' til funktionsdeklarationen om ønsket!
Missing er den tomme streng i streng kontekst og 0 i aritmetisk kontekst.
Null kan være et godt valg til felter der kun skal indgå i joins når de har værdi - man kan anskue null muligheden som et sammensat felt af tilstedeværelsesindikation og indhold - faktisk en modsigelse af 'hver ting sit felt' - men effektivt i praksis.
Avatar billede blolsen Juniormester
16. april 2012 - 13:07 #4
takker for svaret:-) - er dog ikke helt mester i programmeringssproget, så hvordan vil ovenstående se ud i Access'udtryksgenerator?

Har prøvet med en formel, som jeg fandt i et andet svar her på sidet, i.e.

str = "125=2=1"        ' strengen du vil "opløse"
pos = inStr(str, "=")  ' positionen på lighedstegnet
res = left(str, pos-1)  ' tæl i str fra venstre indtil positionen - en karakte

den giver dog en fejl, hvis ikke der er et semikolon i tekststrengen og jeg har ikke kunne gennemskue, hvordan jeg får access til at returnere et tomt felt i stedet.
Avatar billede Slettet bruger
16. april 2012 - 18:25 #5
Du skal oprette funktionen subFld i et standdard modul.(copy/paste linierne fra #3) Det er sidste faneblad i, det der vist hedder database vinduet - der hvor tabeller er første fane, forespørgsler andet, formularer  tredje osv. Det har ingen betydning hvilket navn modulet gives - men det er en god skik at kalde det noget retvisende så jeg foreslår 'konvertering'

Lad os sige at  feltnavnet er fo, hvor indholdet i en post er '4450; Afvent oprettelse RR 27/3' og at '4450' skal optræde i et nyt felt kaldet f1. Der skrives så direkte i et nyt felt i forspørgspørgsel designvisning:
f1: subFld(f0)
Avatar billede blolsen Juniormester
16. april 2012 - 19:21 #6
Er det noget i retning af nedenstående - jeg kunne ikke fremfinde en beskrivelse af funktionen subfld i min access 2003 -så har prøvet mig lidt frem - men den virker ikke helt:-(

konvertering: subFld([fakturaer]![Behandler];(left([fakturaer]![Behandler];(InStr([fakturaer]![Behandler] ;";")-1))
Avatar billede Slettet bruger
16. april 2012 - 23:25 #7
At jeg skrev en definition på subFld i #3, betyder netop at den skal defineres - at du ikke kan finde noget i access 2003 om den, betyder at jeg har ikke uheldigvis har ramt navnet på noget i forvejen eksisterende.

Det er vba programmering - jeg aner ikke hvor meget du ved men her et link - undskyld hvis det er for banalt

http://fisher.osu.edu/~muhanna_1/837/MSAccess/tutorials/vb_intr.pdf

Jeg forstår ikke hvor du skriver udtrykket til sidst i #6 - det er nok et felt i forespørgselsdesign, men det er faktisk nødvendigt at bruge alle disse ord for at blive forstået.
Kørende videre ud fra den antagelse:
Feltet skal hedde noget der navngiver det fra den virkelige verden som databasen administrerer - f.eks kundenummer - 'kontering' var mit forslag til navnet på det kodemodul hvori subFld blev defineret. Du skal ikke angive de optionelle parametre, de har som udgangspunkt den værdi du har brug for. Da du forsøger at give dem nogle misforståede parametre, vil jeg dog forklare hvad de betyder:

fldSep er det seperator tegn, der er anvendt for opdele feltet i subfelter - ";" i dit tilfælde.

place er indrømmet en lidt for generel abstraktion i denne kontekst - men det er subfeltets placering i listen af subfelter - startende med første som nummer 0.
split("4450; Afvent oprettelse RR 27/3")(0) har værdien: 4450
split("4450; Afvent oprettelse RR 27/3")(1) har værdien:  Afvent oprettelse RR 27/3

At (sub)feltseperatoren og (sub)felt placering i listen af (sub)felter er angivet som parametre har følgende programdesign fordele:
*gør funktionen generel - kan anvendes med alle seperator tegn og til at hive alle subfelter ud med.
*er en del af funktionens navneinfo om dens virkemåde
*ungår hardcodning af konstant
*sparer programmeringslinier - vba er røvsygt at skrive i!

--
Men ellers er meget godt at du eksperimenter lidt - Du er velkommen til at spørge videre.
Avatar billede blolsen Juniormester
18. april 2012 - 09:12 #8
Hej brugerekspert,

jeg er ny i forhold til vba, men føler at jeg er tæt på, omend jeg skal bruge lidt tid på at eksperimentere:-) Så jeg takker for hjælpen og hvis du skriver et svar tilbage, overføre jeg pointene:-)
Avatar billede Slettet bruger
18. april 2012 - 11:09 #9
Lige et par starttip om vba-editoren

* brug 'option explicit' som anden linie i alle module - kommer automatisk når det er chekked in tools->options->require variable declaration

* tilføj comment block/uncomment block til edit menuen. Forklaring: Det er bekvemt at kunne udkommentere hele blokke af kodeliner, og fjerne/ændre denne igen. Denne office konfigurationsmulighed ligger i vis ->værktøjslinier->tilpas->træk fra fane kommandoer.

* brug <ctrl><space> efter at have skrevet de første par bogstaver, når der skal refereres til noget eksisterende - så kommer der en løbende indsnævrende rulleliste, der kan '<tab>' afsluttes når man har skrevet nok - er også et alternativ til indledende 'me.' i klassemoduler.

God lyst til at ekperimentere.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester