Toon posts:

[VB6] bankrekening controle .. probleem met variabelen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hi


Ik ben voor stage bezig aan een progje waarin ik een (belgisch) bankrekening-nummer moet controleren ...

het formaat van een bankrekening is 000-000000-00 , waarbij de laatste 2 cijfers gelijk moet zijn aan de rest van de eerste 10 cijfer (3 en 7 ) delen door 97.

Maar nu is mijn vraag:
Gaat dit wel in VB6 ? En zo ja, wat doe ik fout ?

Ik krijg fout als ik een mod(ulus) van 2 currency's probeer te doen

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub controleerRekening_nummer()
    Dim curEerste10, curLaatste2, curRest As Currency
    
    curEerste10 = CCur(Mid(txtRekeningnummer.Text, 1, 3) + Mid(txtRekeningnummer.Text, 5, 7))
    curLaatste2 = CCur(Mid(txtRekeningnummer.Text, 13, 2))
    curRest = curEerste10 Mod 97
    
    If (curRest = curLaatste2) Then
        MsgBox ("goed rekeningnummer")
    Else
        MsgBox ("rekeningnummer was fout")
  End If
    
End Sub


Alvast bedankt

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 22:24

gorgi_19

Kruimeltjes zijn weer op :9

Ik krijg fout als ik een mod(ulus) van 2 currency's probeer te doen
En welke fout krijg je?

[ Voor 66% gewijzigd door gorgi_19 op 09-03-2004 10:53 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
En welke fout krijg je?
Runtime error 6
Overflow

op deze regel ==> curRest = curEerste10 Mod 97

Hij krijgt blijkbaar het resultaat van die mod niet in curRest ( currency )

Verwijderd

Als ik je code hier uitprobeer, werkt alles gewoon normaal, geen foutmeldingen.
maar waarom gebruik je eigenlijk currencies ? Waarom geen Longs ?
en misschien is je code wat eenvoudiger als je eerst de "-" tekens uit je rekeningnummer haalt met een replace.

[edit] Wat gebruik je als test-rekeningnummer ?

[ Voor 12% gewijzigd door Verwijderd op 09-03-2004 10:59 ]


Verwijderd

Topicstarter
Verwijderd schreef op 09 maart 2004 @ 10:58:
Als ik je code hier uitprobeer, werkt alles gewoon normaal, geen foutmeldingen.
maar waarom gebruik je eigenlijk currencies ? Waarom geen Longs ?
en misschien is je code wat eenvoudiger als je eerst de "-" tekens uit je rekeningnummer haalt met een replace.

[edit] Wat gebruik je als test-rekeningnummer ?
Ik werk nu met die Mid ( substring in java, waar ik het al eerder gedaan had), dat is het probleem niet ...

Als ik 001-1650792-25 als test rekening nummer gebruik dan werkt het .... ( maar dat komt omdat hij dan 1 650 792 overhoudt als ik die string(0011650792) ga omvormen naar een een getal ...

Als ik een rekening nummer gebruik beginnend met 735-.... dan krijgt ie de fout ...
dus bv 735-0002044-92 ( donaties zijn altijd welkom ;-) ) geeft fout

[ Voor 10% gewijzigd door Verwijderd op 09-03-2004 11:11 ]


  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Ik heb de code ook geprobeert, werkt naar behoren. Zou het alleen in een losse functie zetten zodat je routine niet afhankelijk is van de naam van je editbox.

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
Private Function ControleerNummer(ByVal RekeningNr As String) As Boolean
  Dim lngNummer   As Long
  Dim lngControle As Long
  Dim lngModulus  As Long
  
  lngNummer = Left$(Replace(RekeningNr, "-", ""), 10)
  lngControle = Right$(RekeningNr, 2)
  lngModulus = lngNummer Mod 97
  
  ControleerNummer = (lngModulus = lngControle)
End Function

Verwijderd

Topicstarter
Lorn schreef op 09 maart 2004 @ 11:10:
Ik heb de code ook geprobeert, werkt naar behoren. Zou het alleen in een losse functie zetten zodat je routine niet afhankelijk is van de naam van je editbox.

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
Private Function ControleerNummer(ByVal RekeningNr As String) As Boolean
  Dim lngNummer   As Long
  Dim lngControle As Long
  Dim lngModulus  As Long
  
  lngNummer = Left$(Replace(RekeningNr, "-", ""), 10)
  lngControle = Right$(RekeningNr, 2)
  lngModulus = lngNummer Mod 97
  
  ControleerNummer = (lngModulus = lngControle)
End Function
Je hebt gelijk wat betreft het gebruik van functies , maar als je 735-0002044-92 ( donaties zijn altijd welkom ;-) ) gebruikt geeft ie toch wel de overflow-fout denk ik ( bij mij in ieder geval )

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Ja klopt, maar je loopt volgens mij tegen een beperking aan van de mod functie. Als je namelijk lngNummer verandert in een Double dan kan je rekeningnummer er wel in. De aanroep van de Mod functie zal nu echter een overflow genereren... misschien zelf een Mod functie schrijven?

Verwijderd

Topicstarter
Lorn schreef op 09 maart 2004 @ 11:17:
Ja klopt, maar je loopt volgens mij tegen een beperking aan van de mod functie. Als je namelijk lngNummer verandert in een Double dan kan je rekeningnummer er wel in. De aanroep van de Mod functie zal nu echter een overflow genereren... misschien zelf een Mod functie schrijven?
Idd, zelf een functie schrijven is altijd een mogelijkheid geweest, maar liever eerst proberen met die mod, daarom dacht ik post het ff hier, misschien dat er mensen zijn die dit probleem ook gehad hebben ....

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Het zal vast charmanter kunnen als dit maar het werkt wel :)

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Function ControleerNummer(ByVal RekeningNr As String) As Boolean
  Dim dblNummer   As Double
  Dim lngControle As Long
  Dim lngModulus  As Long
  Dim dblTemp     As Double
  
  dblNummer = Left$(Replace(RekeningNr, "-", ""), 10)
  lngControle = Right$(Trim(RekeningNr), 2)
  dblTemp = dblNummer / 97
  'Zorg er voor dat van dblTemp alles na de komma (dan wel punt) wordt weggelaten
  lngModulus = dblNummer - (Mid$(dblTemp, 1, InStr(1, dblTemp, ",") - 1) * 97)
  
  ControleerNummer = (lngModulus = lngControle)
End Function

Verwijderd

hier ff een quick-and-dirty geschreven mod-functie die wel werkt....
Werkt zo te zien hetzelfde als de standaard VB Mod voor wat betreft.
Het zal hoogstwaarschijnlijk wel efficienter kunnen, maar voor een simpele bankrekeningcontrole is het goed genoeg lijkt me

code:
1
2
3
4
5
6
7
8
9
10
11
Public Function Mod2(ByRef waarde As Double, ByRef Deler As Double) As Long
  Dim i As Long
  waarde = Round(waarde, 0)
  Deler = Round(Deler, 0)
  For i = 10 To 0 Step -1
    Do While waarde >= ((10 ^ i) * Deler)
      waarde = waarde - ((10 ^ i) * Deler)
    Loop
  Next
  Mod2 = waarde
End Function

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 26-05 00:01

Janoz

Moderator Devschuur®

!litemod

Modulus op een double werkt niet goed. De significantie van een double zorgt ervoor dat je bij grote getallen niet meer weet wat er vlak voor de komma staat. En dat is nu precies wat je wel nodig hebt bij de modulus. De double oplossing werkt dus niet.

Waarom doe je toruwens zo moeilijk? Je hoeft niet te weten wat het resultaat van de deling is, en je hebt het rtesultaat van de modulus al. Waarom laat je er niet even je staartdeling kennis van de basisschool op los?

1 begin rekeningnummer (2 cijfers)
2 zolang getal <97 plak er cijfers achter
3 doe getal mod 97
4 als nog cijfers in rekeningnummer ga naar 2
5 als getal == aangegeven rest dan is het geldig.


Jammer dat programmeurs van tegenwoordig niet meer over een algoritme nadenken ;).

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Ik heb de oplossing geprobeerd en die klopt als een bus. Ik snap alleen niet waarom... wiskunde was niet mijn sterkste kant. Waarom werkt het?

[ Voor 192% gewijzigd door Lorn op 09-03-2004 11:58 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 26-05 00:01

Janoz

Moderator Devschuur®

!litemod

De oplossing die ik aangeef is de normale manier waarop je een staartdeling uitvoert. Dat is een manier waarop men (blijkbaar vroeger) deel-sommen deed zonder rekenmachine. Hierbij deel je telkens een klein onderdeel van het getal en houd je de rest bij. Uiteindelijk hou je de rest over. Aangezien je alleen de rest nodig hebt sla ik het resultaat niet op.


voorbeeldje van een staartdeling met rest:
code:
1
2
3
4
5
11 / 133 \ 12
     11
      23
      22
       1

[ Voor 15% gewijzigd door Janoz op 09-03-2004 12:12 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Hmm... die heb ik dus nooit zo geleerd. Ook al weet ik wat je aan het doen bent toch weet ik niet hoe ik je staartdeling moet lezen. Ik heb het op deze manier geleerd (tot 2 decimalen achter de komma):

code:
1
2
3
4
5
6
7
133   :   11 = 12,09
132            12
--- -
  100 
   99           0,09
  --- -
    1

  • 0528973
  • Registratie: Juni 2003
  • Laatst online: 15-05-2013
offtopic:
Goh,
wat grappig om te zien dat zowel de staartdeling van Janoz als de deling van Lorn, gebaseerd zijn op hetzelfde principe en dat ze alleen anders genoteerd ;)

In feite heb je gewoon hetzelfde geleerd, zoek de grootste gemene gehele deler in een getal en ga dan verder met de rest en zoek daar weer de grootste gemene gehele deler in, bla bla bla....

@Lorn, in feite gebruik je daar gewoon een staartdeling :)

Pascal


  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Goed, na nog wat gepuzzel en probeersels snap ik het denk ik :) Ik heb alleen nooit de link gelegd tussen een goede ouderwetse staartdeling en het berekenen van de modulus. Waarschijnlijk omdat mijn laatste staartdeling op de basisschool is geweest ik en toen nog nooit van een modulus had gehoord. Heb dus wat geleerd vandaag op Tweakers :)

@0528973: Ja, inderdaad grappig dat we dezelfde handeling op een andere manier en notatie hebben geleerd. Vraag me alleen af waarom ze van methode zijn geswitched.
Pagina: 1