Gegevens splitsen in Access

Status
Niet open voor verdere reacties.

marka

Gebruiker
Lid geworden
14 jul 2009
Berichten
333
Ik heb al gezocht in de zoekfunctie, maar kan geen oplossing voor dit specifieke probleem vinden.

Ik heb nummerieke waarden waar alleen de eerste 4 karakters gebruikt van moeten worden.

Hoe kan ik dit in een formule afvangen?
 
Dat kan bijvoorbeeld met de volgende functie:

Code:
Function First4Numbers(getal As Long) As Integer
    
    First4Numbers = CInt(Left(CStr(getal), 4))

End Function


rebmog
 
En hoe moet ik een functie in een sql statement verwerken. Access gaat me redelijk goed af, maar dit heb ik nog nooit gedaan.

Ik zou een tabel bij willen werken. Ik maak een nieuw veld aan waar de verkorte nummers in moeten worden bijgewerkt. De getallen staan overigens al tekst, omdat er weleens toevoegingen als a, b etc. zijn. Werkt de formule dan ook?
 
In een query kun je dit deel rechtstreeks gebruiken:

CInt(Left(CStr([Veld]); 4))
Mcihel
 
Ik heb er nu pas naar gekeken, maar hij werkt niet.

Query ziet er nu als volgt uit:

Code:
INSERT INTO Orders ( [Artikelcode verkort] )
SELECT Orders.Artikelcode
FROM Orders
WHERE (((Orders.Artikelcode)=CInt(Left(CStr([Artikelcode]),4))));
 
Gezien je vorige SQL statement, wil je een UPDATE query uitvoeren.
En natuurlijk deze zin: "Ik zou een tabel bij willen werken". :)
INSERT INTO is een nieuwe regel toevoegen in de tabel.

Dit wordt dan:

Code:
UPDATE [Orders] SET [Artikelcode verkort] = CInt(Left(CStr([Artikelcode]),4));

Is dit wat je zoekt?
 
Hij werkt niet helemaal. Alles staat als tekst en ik heb nog enkele waarden die korter zijn dan 4 karakters, ik denk dat het hier fout gaat?
 
De lengte aanduiding in de query maakt niet uit, je krijgt bij een kortere string ook alleen maar de aanwezige tekens terug. Het probleem met de tekst zou hiermee opgelost moeten zijn:

Code:
UPDATE [Orders] SET [Artikelcode verkort] = " & "'" &  CInt(Left(CStr([Artikelcode]),4)) & "'"

Michel
 
Ik heb de situatie even nagebootst, en deze code werkt gewoon prima, zowel in een numeriek veld als in een tekstveld:

Code:
UPDATE [Orders] SET [Artikelcode verkort] = CInt(Left([Artikelcode],4));

Heb je misschien soms lege velden er tussen zitten?

Michel
 
Nee er staat bij dat er een fout ontstaat door het type waarde.
 
Volgens mij zoek je dit:

Code:
UPDATE Orders SET Orders.[Artikelcode verkort] = Val([Artikelcode]);
 
Je zou kunnen beginnen met de basis van de Update:

Code:
UPDATE [Orders] SET [Artikelcode verkort] = Left([Artikelcode],4);

Hiermee pak je niks meer en niks minder dan de eerste 4 karakters; ik kan mij niet voorstellen dat dit niet werkt.
Tenzij er bepaalde restricties staan op het veld waar het in moet komen.
Eventueel kun je nog filteren op Not Null, om te voorkomen dat je lege waarden mee neemt.

Michel
 
Dit soort gegevens worden nu niet bijgewerkt naar aanleiding van de 1e code die ik heb geprobeerd.

570MP
 
Dan kan het kloppen dat CInt en Val niet gaan werken, want je hebt hier een combinatie van tekst en getal. In dit geval moet het doelveld uiteraard ook een tekstveld zijn, anders gaat het al op voorhand niet lukken.

Als je het cijferdeel uit de code wilt hebben, en je hebt een ongelijk aantal tekens dat je uit de string wilt trekken, zoals in je voorbeeld 3 cijfers, en misschien in een ander veld 4 cijfers, dan zul je daar toch een functie voor moeten maken.
Deze functie moet dan teken voor teken door de zoekstring loopen, en tekens toevoegen aan de variabele tot hij een niet-getal tegenkomt.

Deze functie doet dat:

Code:
Function EersteNummers(Waarde As String)
Dim tmp As Integer, i As Integer

For i = 1 To 4
    If IsNumeric(Mid(Waarde, i, 1)) Then
        tmp = tmp & Mid(Waarde, i, 1)
    Else
        Exit For
    End If
Next i
EersteNummers = tmp

End Function

Michel
 
Ik heb voor mezelf een patroon erin ontdekt. Als het de reeks enkel uit numerieke waarden bestaat moet hij de eerste 4 cijfers pakken. Bestaat hij uit numeriek + tekst dan wil ik de gehele reeks.
 
Dan kun je de query als volgt aanpassen:

UPDATE [Orders] SET [Artikelcode verkort] = IIf(IsNumeric([Artikelcode]);Left([Artikelcode];4);[Artikelcode])

Michel
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan