Eerste letter vanaf rechts uit serienummer halen

  • Onderwerp starter Onderwerp starter jhdw
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

jhdw

Gebruiker
Lid geworden
15 dec 2012
Berichten
166
Goedenavond,

Ik ben op zoek naar een methode om een letter uit een serienummer te halen.
2 voorbeelden van verschillende serienummers.
1) A123B456C987654 – uit dit serienummer wil ik graag de eerste letter vanaf rechts halen: in dit geval dus de C.

2) Van een ander merk is de opbouw anders, bijv.: AB1N1020BS987654 – uit dit serienummer wil ik gaag de tweede letter vanaf rechts halen: dus de B.

Heeft iemand de codes om dit voor elkaar te krijgen?

Bij voorbaat dank.
Gr. Jan
 
Dat is een min of meer kansloze onderneming, als ik je codevoorbeeldjes bekijk. Want als je een functie wilt gebruiken om iets ergens uit te halen, dan moet er een constante zijn, zoals: eerste letter van rechts, of tweede letter van links. Bij jou ziet die factor er niet in. Dus ofwel twee functies gebruiken (maar hoe bepaal je dan welke van de twee je moet hebben?) ofwel iets anders verzinnen...
 
Goedenavond Octafish,

Bedankt voor de reactie.
Ik kan wel eerst het merk bepalen en dan een functie aan het serienummer koppelen. Het eerste krijg ik wel voor elkaar maar de te maken functies, dat is het probleem. Als voor de functies een oplossing zou zijn, dan ben ik al heel een eind.

Gr. Jan
 
Ik snap je antwoord niet helemaal. Wat heb je er aan als je eerst het merk weet?
 
Als ik het merk weet, dan weet ik welk type serienummer het is: voorbeeld 1 of 2.
Ik dacht als er 2 verschillende functies gemaakt moeten worden, dat ik dan afhankelijk van het merk de juiste functie kies.
 
En hebben die altijd dezelfde layout?
 
Dan kan het; maak 2 functies in een module. Eén die een parameter doorloopt van rechts naar links met een lusje. Die lus gebruikt de functie MID om steeds één karakter uit de string te halen. Het eerste teken dat niet numeriek is, is een letter. Dat is dan de uitkomst van je functie.
De tweede functie doet iets vergelijkbaars, maar moet de lus een keer extra doorlopen. Ik zou de lus dus eerst een Boolean variabele op True laten zetten en die variabele meechecken. In je voorbeeldje (AB1N1020BS987654) kom je eerst een S tegen. De variabele bCheck is nog False, dus die zet je op True. De lus kijkt naar én tekst, én bCheck=True, dus hij gaat gewoon door met de volgende letter. En daar lees je dan de letter uit, en stop je de functie.
In een query check je met een IIF de merknaam, en op basis daarvan roep je ofwel Functie 1 aan, ofwel Functie 2.
 
Als je het niet erg vindt dan denk ik dat ik wel begrijp wat de bedoeling is maar ik zou niet weten hoe er aan te beginnen.
De query maken met de IIF constructie gaat wel lukken, maar de 2 functies bouwen gaat mijn verstand te boven.
Als je tijd hebt, zou je die voor mij willen maken?

Alvast heel erg bedankt.

Gr. Jan
 
Ik heb 2 werkwijzes:
1. Als ik functies/queries tot zelfs databases heb die een vraag kunnen helpen beantwoorden, dan gooi ik ze met alle liefde in de groep
2. Als regel 1 niet opgaat, dan doe ik niks zonder voorbeeldje, ik ben geen tikgeit :)

Jouw vraag valt in categorie 2...
 
Goedemorgen,

Ik heb even een nieuwe dB gemaakt met een paar dummy gegevens. In de dB heb ik 2 tabellen opgenomen: in tbl_serienummer staan een aantal serienummers van verschillende merken. In de andere tabel staan per merk een letter met een bijbehorend bouwjaar. Wat ik uiteindelijk wil bereiken is dat ik voor de merken MerkA en MerkB uit het serienummer het bouwjaar kan halen. Bij de andere merken in dit voorbeeld kan dat niet.
Ik heb 2 queries gemaakt waarmee het zou moeten kunnen als de 2 functies gemaakt zijn en dat laatste is nu juist mijn probleem.

Alvast bedankt voor de genomen moeite.

Gr. Jan
 

Bijlagen

Ik kan nu niet veel doen met je bestand, maar ik zal er vanavond naar kijken!
 
Het werd iets later :). Maar goed, ik heb er nu één functie van gemaakt, die ook gelijk wat flexibeler is. Je kunt nu namelijk op meerdere posities zoeken m.b.v. een extra parameter. Je geeft in de functie namelijk mee welke letter je wilt hebben: de 1e, 2e, 3e etc.
Dit is de functie:

Code:
Function Letter_SN(Nummer As String, Positie As Integer) As String
Dim l As String
Dim i As Integer, j As Integer, x As Integer

    j = Len(Nummer)
    For x = 0 To Positie
        x = x + 1
        If x > Positie Then
            Exit For
        Else
            For i = j To 1 Step -1
                l = Mid(Nummer, i, 1)
                If Asc(UCase(l)) >= 65 And Asc(UCase(l)) <= 90 Then
                    x = x + 1
                    If x > Positie Then
                        j = i
                        Exit For
                    Else
                        j = i
                    End If
                End If
            Next i
        End If
        x = x + 1
    Next x
    
    l = Mid(Nummer, j, 1)
    Letter_SN = l
End Function

Zal best korter kunnen maar dat is van later zorg :). En zo gebruik je hem in de query:
Code:
Letter: IIf([Merk]="MerkA";Letter_SN([Serienummer];1);IIf([Merk]="MerkB";Letter_SN([Serienummer];2);""))
 
Goedenavond,

Je hoort mij niet klagen dat het iets later is geworden. Hoe laat het zou zijn geworden als ik het zelf had moeten uitvinden, zou ik niet durven te zeggen. Ik zou er maar niet op vasten.
Ik heb het even getest in de test dB en het werkt precies zoals ik graag wil hebben. Het is zo gewoon dat het altijd weer zo snel opgelost kan worden,:thumb: ik neem mijn petje er voor af (een hoed heb ik ook trouwens ook niet).
Heel hartelijk bedankt voor de oplossing en wie weet tot snel.

Mvg Jan
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan