Ongewilde wetenschappelijke notatie in string variabele

Status
Niet open voor verdere reacties.

HHunnekens

Gebruiker
Lid geworden
16 apr 2013
Berichten
63
Goedemiddag,

Ben bezig met het maken van een functie om het controlegetal voor een SSCC code te maken. Zo'n SSCC code is een 18 cijferige EAN code, waarvan het 18e cijfer een controlegetal is ( afgeleid van de eerste 17 cijfers ).

Hiertoe is het nodig om - via een string - als input van de nieuwe functie te verkrijgen de eerste 17 cijfers, waarna de te schrijven functie dus het controlegetal kan gaan berekenen.

Onverwachte moeilijkheid hierbij is een door mij ongewenste wetenschappelijke notatie.

Voorbeeld ervan :

?CheckDigitSSCC(08717853270050955)

waarbij 08717853270050955 als string variabele naar de functie - CheckDigitSSCC( strEAN17 as String ) - wordt doorgegeven.

Als ik vervolgens een debug.print uitvoer op de variabele strEAN17 ( binnen de functie code ), dan verkrijg ik het volgende op het scherm :

8,71785327005096E+15

Dit terwijl ik NODIG heb :

08717853270050955

M'n concrete vraag hieromtrent :

"Hoe kan ik voorkomen dat die ongewilde "transformatie" naar een wetenschappelijke notatie plaatsvindt ?

Bij voorbaat hartelijk dank voor de hulp !

Mvg,

HH
 
Zonder de functie? Geen idee. Begin eerst eens met de functie erbij te zetten. En loop eens in de Stapmodus door je code, dan zie je waar hij de verkeerde uitkomst genereert.
 
In reactie op ...

Hoi,

Dank voor je bericht.

Let wel, het gaat NIET om de functie zelve die ik aan het maken gaat, t.a.v. mijn specifieke vraagstelling.

"De truc" in m'n functie is om de waarde van de input-stringvariabele ( die 17 karakters, alle cijfers ) één voor één te doorlopen en er een berekening op los te laten. Dit "doorlopen" gaat goed t.e.m. positie 15, echter op positie 16 verschijnt een 'e', zijnde een onderdeel van die in m'n vraag getoonde wetenschappelijke notatie. Dit terwijl er "simpelweg" het zestiende cijfers uit de reeks van 17 zou moeten verschijnen.

Dus, de vraag is echt specifiek naar het voorkomen van die "wetenschappelijke notatie-vertaling" van die input-string voor m'n functie.

Hoop dat die e.e.a. verduidelijkt.

Bvd, mvg,

HH
 
Overigens, dit is - ter info - "de functie in opbouw" ...

Option Compare Database
Option Explicit

Public Function ControlegetalSSCC(strEAN17 As String)

Dim db As Database
Set db = CurrentDb
Dim strCheckdigit As String
Dim strChecksum As String
Dim strCheckdiv1 As String
Dim strCheckdiv2 As String

Dim int1 As String
Dim int2 As String
Dim int3 As String
Dim int4 As String
Dim int5 As String
Dim int6 As String
Dim int7 As String
Dim int8 As String
Dim int9 As String
Dim int10 As String
Dim int11 As String
Dim int12 As String
Dim int13 As String
Dim int14 As String
Dim int15 As String
Dim int16 As String
Dim int17 As String

'strEAN17 = strEAN17

int1 = Mid(strEAN17, 1, 1)
int2 = Mid(strEAN17, 2, 1)
int3 = Mid(strEAN17, 3, 1)
int4 = Mid(strEAN17, 4, 1)
int5 = Mid(strEAN17, 5, 1)
int6 = Mid(strEAN17, 6, 1)
int7 = Mid(strEAN17, 7, 1)
int8 = Mid(strEAN17, 8, 1)
int9 = Mid(strEAN17, 9, 1)
int10 = Mid(strEAN17, 10, 1)
int11 = Mid(strEAN17, 11, 1)
int12 = Mid(strEAN17, 12, 1)
int13 = Mid(strEAN17, 13, 1)
int14 = Mid(strEAN17, 14, 1)
int15 = Mid(strEAN17, 15, 1)
'onderstaande gaat fout wegens wetenschappelijke notatie
int16 = Mid(strEAN17, 16, 1)
'onderstaande gaat fout wegens wetenschappelijke notatie
int17 = Mid(strEAN17, 17, 1)

Stop

Debug.Print strEAN17
Debug.Print int17


strChecksum = int1 + (3 * int2) + int3 + (3 * int4) + int5 + (3 * int6) + int7 + (3 * int8) + int9 + _
(3 * int10) + int11 + (3 * int12) + int13 + (3 * int14) + int15 + (3 * int16) + int17

strCheckdiv1 = strChecksum / 10
'strCheckdiv2 = Round(strCheckdiv1, 0)
strCheckdiv2 = Round((strCheckdiv1 + 0.49), 0)
'strCheckdigit = Round(Abs((strCheckdiv2 - strCheckdiv1) * 10), 0)
strCheckdigit = Abs(Round((strCheckdiv2 - strCheckdiv1) * 10, 0))


Debug.Print strChecksum, strCheckdiv1, strCheckdiv2, strCheckdigit

ControlegetalSSCC = strCheckdigit


End Function



Mvg,

HH
 
Ik zou de variabelen int1 t/m int17 in ieder geval numeriek maken, want je haalt cijfers uit de init string. En cijfers zijn numeriek, geen tekst. Bovendien wil je met die cijfers rekenen. Zelf zou ik ook met één matrixvariabele werken, want dat maakt de hele procedure ook veel kleiner. Al zou dit ook moeten werken. Mits dus een getal in een numerieke variabele zit.
 
In reactie op ...

Goedenavond,

Yep, er wordt idd mee gerekend. Dit is (toch) wel mogelijk op de gekozen manier. Dit ondanks dat e.e.a. inderdaad als string is benoemd ... feitelijk al op voorhand om een wetenschappelijke notatie te ontwijken.

Dit Array-achtige-constructie had ik al gepland in te voeren, als e.e.a. daadwerkelijk werkt.

Vooralsnog denk ik dat ik dan maar "noodgedwongen" de (kennelijk te) lange string ga opsplitsen in 2 delen, teneinde dit probleem met de wetenschappelijke notatie te omzeilen ... had graag "iets eleganters" als oplossing gekend.

Toch bedankt !

Mvg,

HH
 
Zoals ik al zei: het moet gewoon werken. Maar ik moet het zelf nog even uitproberen. Gebruik in ieder geval het juiste variabeletype. Een string kan echt wel meer dan 16 tekens aan, dus daar zit het probleem niet.
 
en nog een tip: maak je code op met de CODE knop; dat maakt hem een stuk leesbaarder. Liefst uiteraard met terugwerkende kracht...
 
Ik heb de code vrij simpel werkend gekregen, op deze manier:
Code:
Public Function ControleSSCC(strEAN17 As String) As String
Dim iCheckdigit As Double
Dim iChecksum As Double
Dim iCheckdiv1 As Double
Dim iCheckdiv2 As Double
Dim i As Integer
Dim iEAN(17) As Integer

    For i = 1 To 17
        iEAN(i) = Mid(strEAN17, i, 1)
    Next i

    iChecksum = iEAN(1) + (3 * iEAN(2)) + iEAN(3) + (3 * iEAN(4)) + iEAN(5) + (3 * iEAN(6)) + iEAN(7) + (3 * iEAN(8)) + iEAN(9) + _
    (3 * iEAN(10)) + iEAN(11) + (3 * iEAN(12)) + iEAN(13) + (3 * iEAN(14)) + iEAN(15) + (3 * iEAN(16)) + iEAN(17)

    iCheckdiv1 = iChecksum / 10
    iCheckdiv2 = Round((iCheckdiv1 + 0.49), 0)
    iCheckdigit = Abs(Round((iCheckdiv2 - iCheckdiv1) * 10, 0))

    ControleSSCC = iCheckdigit

End Function
 
>>CheckDigitSSCC(08717853270050955)

Het door TS gesignaleerde probleem ligt vooral aan het feit dat er geen 'string' wordt gebruikt in de aanroep van de functie.
De foutieve declaraties van de variabelen, maken het alleen maar erger.
Het zou moeten zijn ControlegetalSSCC("08717853270050955") , met dan wel de juiste functie ControlegetalSSCC (of is CheckDigitSSCC)
 
Mooi opgelost !

Hoi,

Hartelijk dank voor de hulp ! Dit werkt beter dan m'n "work around".

Mvg,

HH
 
Helaas TOCH nog niet opgelost ( blijkt bij testen )

Option Compare Database
Option Explicit

Public Function ControleSSCC(strEAN17 As String) As String
Dim iCheckdigit As Double
Dim iChecksum As Double
Dim iCheckdiv1 As Double
Dim iCheckdiv2 As Double
Dim i As Integer
Dim iEAN(17) As Integer

Stop

Debug.Print strEAN17


For i = 1 To 17
iEAN(i) = Mid(strEAN17, i, 1)
Next i

iChecksum = iEAN(1) + (3 * iEAN(2)) + iEAN(3) + (3 * iEAN(4)) + iEAN(5) + (3 * iEAN(6)) + iEAN(7) + (3 * iEAN(8)) + iEAN(9) + _
(3 * iEAN(10)) + iEAN(11) + (3 * iEAN(12)) + iEAN(13) + (3 * iEAN(14)) + iEAN(15) + (3 * iEAN(16)) + iEAN(17)

iCheckdiv1 = iChecksum / 10
iCheckdiv2 = Round((iCheckdiv1 + 0.49), 0)
iCheckdigit = Abs(Round((iCheckdiv2 - iCheckdiv1) * 10, 0))

ControleSSCC = iCheckdigit

End Function


-----------

Bij testen blijkt het volgende :

?ControleSSCC(08717853270050954)
8,71785327005095E+15

-----------------------------------------

Goedemorgen,

Helaas, te vroeg gejuicht. E.e.a. blijkt toch nog niet te werken :

Heb in de code een "Stop" ingebouwd om te kunnen de-buggen :

- Bij het printen van strEAN17 blijkt TOCH weer die wetenschappelijke notatie te verschijnen ;-
- bij het voor de tweede keer die lus doorlopen komt een foutmelding dat de typen niet overeen komen ( betreft dan die komma ).

Hopelijk ziet iemand nog een beter alternatief ?

Bvd, mvg,

Hans
 
Excusi ! Werkt wel !!!

Hoi,

Lag aan mijzelf ! Werkt inderdaad wel goed zo.

Andemaal met dank en vriendelijke groet,

Hans
 
Nogmaals het verzoek om code op te maken met de CODE knop. Je ziet toch ook graag leesbare code? Vergelijk mijn voorbeeldje met die van jou, en probeer dan eens met droge ogen te beweren dat die van jou er beter uit ziet. ;)
 
Uiteindelijk juiste code voor berekenen check digit voor SSCC paleltnummers ...

... voor mocht iemand het ooit nodig hebben :
Mvg,
Hans Hunnekens
Code:
Option Compare Database
Option Explicit

Public Function ControleSSCC(strEAN17 As String) As String

    'Het SSCC volgnummer van een pallet dient 17 cijfers lang te zijn, zonder de check digit.
    'Let op dat de binnenkomende strEAN17 is geplaatst tussen dubbele quotes !! Zonder komt 't óók
    'binnen als string ( bij testen VarType ) máár dan in een wetenschappelijke notatie !!! ( vreemd ?!?!? )
    
    Dim variabeletype As Integer
    variabeletype = VarType(strEAN17)
       
    
    If Len(strEAN17) = 17 Then
        Dim iCheckdigit As Double
        Dim iChecksum As Double
        Dim iCheckdiv1 As Double
        Dim iCheckdiv2 As Double
        Dim i As Integer
        Dim iEAN(17) As Integer
        
            'de characters één voor één inlezen, nodig voor berekening check digit
            For i = 1 To 17
                iEAN(i) = Mid(strEAN17, i, 1)
            Next i
        
            iChecksum = (3 * iEAN(1)) + iEAN(2) + (3 * iEAN(3)) + iEAN(4) + (3 * iEAN(5)) + _
            iEAN(6) + (3 * iEAN(7)) + iEAN(8) + (3 * iEAN(9)) + iEAN(10) + (3 * iEAN(11)) + _
            iEAN(12) + (3 * iEAN(13)) + iEAN(14) + (3 * iEAN(15)) + iEAN(16) + (3 * iEAN(17))
            
            iCheckdiv1 = iChecksum / 10
            iCheckdiv2 = Round((iCheckdiv1 + 0.49), 0)
            iCheckdigit = Abs(Round((iCheckdiv2 - iCheckdiv1) * 10, 0))
        
            'benoemen checkdigit t.b.v. teruggave aan gebruiker
            ControleSSCC = iCheckdigit
                        
            
    End If

End Function
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan