Stukje uit string in kolom1 vissen en kolom2 mee vullen

Status
Niet open voor verdere reacties.

Visara

Gebruiker
Lid geworden
10 mrt 2019
Berichten
225
Goedemiddag lieve helpers,

Wie kan en wil me laten zien hoe ik het volgende kan doen?
Het leek me een overzichtelijke vraag die ik zelf zou kunnen oplossen door te googlen en proberen, maar het lukt me niet :(

Via een INSERT QUERY worden kolommen gevuld in een andere tabel gevuld, tabel "1001_1116_Udea".
Ziet er zo uit, wat hier staat werkt.
Code:
INSERT INTO 1001_1116_Udea ( eancode, omschrijving, bestelnummer, sve, consumentenprijs )
SELECT product.eancode, product.omschrijving, product.bestelnummer, product.sve, Replace([product]![consumentenprijs],".",",") AS Expr3
FROM product
WHERE (((product.status)="Actief") AND ((product.leveranciernummer) Like "1001" Or (product.leveranciernummer) Like "1116"));

Ik wil graag de kolom "omdoos" vullen met iets uit de string in veld "omschrijving".

Code:
INSERT INTO 1001_1116_Udea ( eancode, omschrijving, bestelnummer, sve, consumentenprijs, [COLOR="#008000"][B][SIZE=5]omdoos[/SIZE][/B][/COLOR] )
SELECT product.eancode, product.omschrijving, product.bestelnummer, product.sve, Replace([product]![consumentenprijs],".",",") AS Expr3, [COLOR="#008000"][B][SIZE=5]??????[/SIZE][/B][/COLOR]
FROM product
WHERE (((product.status)="Actief") AND ((product.leveranciernummer) Like "1001" Or (product.leveranciernummer) Like "1116"));

?????? in woorden:
Neem de string van "omschrijving". Bekijk die string van rechts naar links. Als je als eerste ) tegenkomt, gevolgd door één of twee cijfer-tekens, gevolgd door ( , vul dan die cijfer-tekens in in kolom "omdoos". Dus:
appels (12) ---> 12
Dus alleen de cijfer-tekens 0123456789. Als er ook maar iets anders dan iets van deze tien tekens tussen de () staat, plaats dan niks. (2,5) ---> niks/Null

?????? in voorbeeld:
VraagVisaraVissenUitString.jpg

Ik heb dingen geprobeerd met RIGHT(, LEN(, ^ maar lukt me niet.

Mvg, Visara
 

Bijlagen

Laatst bewerkt:
Dit kan je eigenlijk alleen handig oplossen met een functie, anders wordt het een flink lastige query.
 
Had ik ook naar gezocht, maar lukt me niet.
Ik dacht dat het 't makkelijkst zou zijn via SQL.

Bent u er in thuis hoe dat met een functie zou moeten? Of is dat dan iets voor een ander forum-gedeelte?
 
Ik dacht dat het 't makkelijkst zou zijn via SQL.
Waarom dacht je dat? SQL is een redelijk beperkte taal (in Access) waarin je bijvoorbeeld geen expressie hebt om te controleren of een string een getal is, of een tekst. En dat heb je sowieso nodig om strings als "12", "(2.5kg)" en "(2,5)" uit elkaar te houden.
PHP:
Expr1: IIf(InStrRev([omschrijving];"(")=0;"";IIf(Mid([omschrijving];InStrRev([omschrijving];"(")+1;InStrRev([omschrijving];")")-InStrRev([omschrijving];"(")-1)/2
=Mid([omschrijving];InStrRev([omschrijving];"(")+1;InStrRev([omschrijving];")")-InStrRev([omschrijving];"(")-1)\2;
Mid([omschrijving];InStrRev([omschrijving];"(")+1;InStrRev([omschrijving];")")-InStrRev([omschrijving];"(")-1);""))
Hiermee kun je een hooop afvangen, maar hier zit, zoals je kunt zien, nog steeds de chocola ("(2)chocolade") in het resultaat, simpel omdat je met InstrRev zoekt naar een "(" en een ")". En die zitten er dus gewoon in, met ook nog eens een bruikbaar getal.

Kortom: bijna niet te doen in jouw voorbeeld. Met een functie kan het dus een stuk makkelijker, met name omdat je dus veel meer functies kunt gebruiken (IsNumeric(#) bijvoorbeeld). Ik maak er wel een voor je :).
 
En hier is de functie die je in een willekeurige module (heb je die niet: maak een nieuwe) kan zetten.
Code:
Function funOmdoos(Waarde As String) As Variant
Dim sT As String
    If InStr(1, Waarde, ")") > 0 And Not InStr(1, Waarde, "(") = 1 Then
        sT = Mid(Waarde, InStrRev(Waarde, "(") + 1, InStrRev(Waarde, ")") - InStrRev(Waarde, "(") - 1)
        If IsNumeric(sT) Then
            If sT / 2 = sT \ 2 Then funOmdoos = sT
        Else
            sT = vbNullString
        End If
    Else
        funOmdoos = vbNullString
    End If
End Function

Je gebruikt 'm dan zo in je query: Omdozen: funOmdoos([omschrijving])
 
Split is ook een leuke optie om dit probleem aan te vliegen. De uitkomst van @OctaFish komt overeen met jouw letterlijke vraag. Mijn uitkomst geeft het resultaat wat je in het plaatje ongeveer hebt aangegeven. (jammer dat het plaatje niet overeenkomt met de inhoud van jouw tabellen.)

Code:
Function VenA(Waarde As String) As Long
  x = Split(Waarde, "(")
  If UBound(x) Then
   y = Replace(x(UBound(x)), ")", "")
    If IsNumeric(y) Then
      If y / 2 = y \ 2 Then VenA = y
    End If
  End If
End Function
 
Eerst nog even Wie is de Mol kijken met mijn partner, voordat ik verder kon sleutelen aan de database :)
Waarom dacht je dat? SQL is een redelijk beperkte taal (in Access)
Ik dacht dat omdat ik eens ergens las dat SQL heel geschikt is voor het manipuleren van kolommen en records. Nu ik dit typ realiseer ik me dat dit niet hetzelfde is als de ínhoud van een veld manipuleren.
Ik heb in excel (en een beetje in Access query) wel eens dingen gedaan met Len() en Right(). Ik verwachte dat ik iets kon doen als:
If Right("omschrijving", 1)=")" AND Right("omschrijving",2)=")"+'[iets dat de groep getal-tekens omschrijft] + "(" .. etc


Hartstikke bedankt voor uw hulp :)
Ik ben er echter nog niet.
Heb in de SQL dit stukje gezet
Code:
funOmdoos([omschrijving]) AS Omdozen
en ik heb in een nieuwe module uw functie gezet.

Ik krijg foutmelding
'Run-time error '3085'
Undefined function in Expression

Dan denk ik aan 2 opties om het op te lossen:
Optie 1: door de syntax herkend het systeem al dat ik een functie in heb willen voeren, maar hij heeft geen contact met de Module waar die functie is uitgewerkt. Heb de functie ook maar in het mapje voor codes van het Formulier gezet, maar dat hielp niet.
Optie 2: Ik moet in Tools-References iets aanvinken zodat Access weet wat hij aan moet met InStr & InStrRev & IsNumeric
Ik kan dat niet vinden wat ik aan moet vinken bij References, zodat deze termen bekend worden in de database. Kunt u mij verder helpen?
 
Laatst bewerkt:
@VenA Terwijl ik mijn reactie aan OctoFish schreef heeft u ook gereageerd.
Uw code geeft geen foutmelding.
Er komen bij uw code nullen in de tabel te staan ipv Niks/Null, maar daar kan ik wel omheen werken. Komt goed.

Hartelijk dank beiden!
Fijne avond
 
Was ook een bewuste keuze.:d Waarom een getal uit een tekst halen en het vervolgens weer als tekst opslaan?
 
Laatst bewerkt:
Was ook een bewuste keuze.:d Waarom een getal uit een tekst halen en het vervolgens weer als tekst opslaan?
Als je de praktijk van deze situatie bekijkt, dan is 'nul' niet het correcte getal op deze plek. Er moet 'niets' staan. (blanco / niet van toepassing)
"Geen geld" hebben is inderdaad een saldo "nul", maar die analogie is hier niet van toepassing. Hoe dan ook, lekker laten zo :) Werk, lijkt me, pima.

Maar...
Het is toch niet opgelost.
@VenA: Uw code slaat appels (5) op als 0.
De oneven getallen gaan mis, denk ik?
 
Laatst bewerkt:
Ik krijg foutmelding
'Run-time error '3085'
Geen van de twee opties die je aandraagt zijn noodzakelijk voor een juiste werking. Ik zal morgen de db posten met de werkende oplossing. En SQL is an sich prima om records te manipuleren. Alleen kan je er niet alles mee. En dan is een functie vaak makkelijker en sneller. Als ik moest kiezen tussen een ingewikkelde query formule die niet gegarandeerd het juiste resultaat oplevert, of een simpele functie die dat wél doet, is de keuze denk ik niet zo moeilijk :).
 
@VenA bedankt voor uw aangepaste code in de bijlage. Inderdaad, uw functie slaat niks op. Ik drukte me niet handig uit.
Ik gebruikte de functie in een Append Query (SQL INSERT INTO), de resultaten van de functie worden op die manier opgeslagen.

In uw bijlage is de functie VenA iets aangepast en geeft de functie bij "voorbeeldproduct (5)" wel "5". Dank voor de aanpassing.
De functie VenA uit de bijlage komt het meest in de buurt van het gewenste resultaat:
VraagVisaraVissenUitString2.jpg

Ik zie in de echte omschrijvinglijsten vooralsnog nergens iets als (2.5) of (7,6) staan aan het einde van de string, dus ik lijk er mee weg te komen als de functie ook "werkt" bij 2.5 of 7,6.
Maar het is natuurlijk mooier en veiliger om dit af te dekken.
Er staat in de functie "IsNumeric". Kan daar iets aan worden toegevoegd dat zegt "IsHeelGetal" of "String tussen de haakjes aan het einde, bestaat alleen uit de cijfertekens 0123456789"? (dus geen komma of punt)

Benieuwd waarom ik deze wens heb?
Lees dan verder. Geen interesse? Negeer de rest :)
Het is voor het maken van een bestelling in mijn bestelapplicatie. Uit onvrede over de matige functionaliteiten van de bestaande bestelapplicaties ben ik in mijn vrije tijd voor mij en mijn collega's wat aan het maken. Het werkt al en werkt prettiger dan de proffesionele programma's, maar er zijn nog verbeteringen mogelijk. Vandaar mijn vraag.
Als je een bestelnummer invoert in een bestelapplicatie, dan krijg je een doos/krat van een product, bijvoorbeeld 12 pakken sap samen verpakt. Dit is 1 besteleenheid.
Bij kort houdbare producten is de inhoud van een krat ook bijvoorbeeld 12 of 24. Dat is vanwege de korte houdbaarheid niet altijd handig om te ontvangen, vooral kleine afnemers willen kleinere porties kunnen bestellen.
De groothandels zetten daarom de officiële besteleenheid op "1", je kan het dus per stuk bestellen. Echter, als je een volledig krat besteld geven ze efficiëntie-korting. Er is in de vastgenagelde structuren geen plaats om deze kratgrootte in te vullen. De leveranciers hebben daarom onderling de afspraak gemaakt dat ze in dit geval aan het einde van de omschrijving dit aantal tussen haakjes te zetten. Dit zullen dus altijd hele getallen zijn.
Soms staat er in omschrijvingen iets als (6 stuks), of (per 2), of (6pack). Dit heeft niets te maken met de kratinhoud waar ik over sprak.
Vandaar mijn formulering: Als de string EINDIGT op HAAKJES met daartussen ALLEEN cijfertekens, dan wil ik graag die cijfertekens in een aparte kolom hebben staan.
Ik zorg ervoor dat als iemand een bestelnummer invoert met besteleenheid "1" & efficiëntiekorting bij afname van "12", dat bij het invoeren van "1x" dan het getal "12" wordt ingevuld. De gebruiker besteld dus als default hele kratten, maar kan het aantal altijd nog handmatig aanpassen.

Mvg, ik hoop dat jullie lekker slapen op dit inmiddels al late uur :)
 
Laatst bewerkt:
Code:
Function VenA(Waarde As String) As Long
  x = Split(Waarde, "(")
  If UBound(x) Then
   y = Replace(x(UBound(x)), ")", "")
    If IsNumeric(y) Then
      If UBound(Split(Replace(y, ",", "."), ".")) = 0 Then VenA = y
    End If
  End If
End Function
 
Er waren gevallen waarin de bovengenoemde code van VenA toch niet werkt. ( "(85+)" geeft bijvoorbeeld "85" ipv "0")

Voor wie benieuwd is naar een oplossing die precies doet wat de bedoeling is, dit lijkt helemaal te werken:

Code:
Function funcOmdoos(Waarde As String) As Long
  Dim y As String
  x = Split(Waarde, "(")
  If UBound(x) Then
   y = x(UBound(x))
   If ")" = Right(y, 1) Then
    y = Left(y, Len(y) - 1)
      If "" = [COLOR="#FF0000"][B]wegGetallen[/B][/COLOR](y) Then
        funcOmdoos = y
      End If
    End If
  End If
End Function

Code:
Function [COLOR="#FF0000"][B]wegGetallen[/B][/COLOR](Waarde As String) As String
  y = Waarde
  For I = 0 To 9
    y = Replace(y, I, "")
  Next I
  wegGetallen = y
End Function

Met vriendelijke groet,
Visara
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan