Page 1 of 1

[Solved] Advice 0n converting this VB code

Posted: Monday 19th April 2021 8:14pm
by AndyGable
Hi All

I Hope someone can help me

I am trying to convert this code from Visual BASIC to Gambas

the code works out the check digit for a barcode number using Mod10CheckDigit (Based on https://www.freevbcode.com/ShowCode.asp?ID=1035)

Code: Select all

   Dim i As Integer = 0
    Dim TotalOdd As Integer = 0
    Dim TotalEven As Integer = 0
    Dim Total As Integer = 0

    Barcode = Trim(Barcode)
    'get odd numbers

    For i = 1 To Len(Barcode) Step 2
        TotalOdd = TotalOdd + CInt(Mid(Barcode, i, 1))
    Next

    TotalOdd = TotalOdd * 3

    'get even numbers
    i = 0
    For i = 2 To Len(Barcode) Step 2
        TotalEven = TotalEven + CInt(Mid(Barcode, i, 1))
    Next

    Total = TotalOdd + TotalEven

    Dim BarcodeLocal As Integer = 10 - IIf(Right(Total, 1) = 0, 10, Right(Total, 1))
    BarcodeNumberInHouse = Barcode & BarcodeLocal
but when the app runs I get on the following Line

Dim BarcodeLocal As Integer = 10 - IIf(Right(Total, 1) = 0, 10, Right(Total, 1))

Type Mismatch: wanted string, got integer instead in Global:274

I hope someone can advice me

Re: Advice 0n converting this VB code

Posted: Monday 19th April 2021 8:58pm
by PJBlack
as far as i can see at fast looking ... you compare a char (right(Total, 1)) with an integer as you been told b y the interpreter ;)

as you dim an integer you may should do something like -> val(right(total,1))

Re: Advice 0n converting this VB code

Posted: Monday 19th April 2021 9:12pm
by AndyGable
PJBlack wrote: Monday 19th April 2021 8:58pm as far as i can see at fast looking ... you compare a char (right(Total, 1)) with an integer as you been told b y the interpreter ;)

as you dim an integer you may should do something like -> val(right(total,1))
Hi PJ,

I tried that but I am still getting the same error. (Im struggling with this in Gambas hell I even struggled with this in VB and VB.net lol)

Re: Advice 0n converting this VB code

Posted: Monday 19th April 2021 9:24pm
by PJBlack
EDIT: changed to another version
' Gambas module file

Public Sub main()

    Print Test(4711)

End

Public Function test(sBarcode As String) As String

    Dim iTotalOdd As Integer = 0
    Dim iTotalEven As Integer = 0
    Dim sTotal As String
    Dim iBarcodeLocal As Integer
    Dim sBarcodeNumberInHouse As String

    For i As Integer = 1 To Len(Trim(sBarcode)) Step 2
        iTotalOdd += Val(String.Mid(sBarcode, i, 1))
        iTotalEven += Val(String.Mid(sBarcode, i + 1, 1))
    Next

    sTotal = Str((iTotalOdd * 3) + iTotalEven)

    iBarcodeLocal = 10 - IIf(Val(String.Right(sTotal, 1)) = 0, 10, Val(String.Right(sTotal, 1)))

    sBarcodeNumberInHouse = sBarcode & Str(iBarcodeLocal)

   Return sBarcodeNumberInHouse

End

Re: Advice 0n converting this VB code

Posted: Monday 19th April 2021 11:53pm
by BruceSteers
The function just checks the last digit is zero so there are other ways.
Like using % that gives the remainder of a division
eg.
Dim BarcodeLocal As Integer = 10 - IIf(Total % 10 = 0, 10, Total % 10)

Re: Advice 0n converting this VB code

Posted: Tuesday 20th April 2021 2:04am
by PJBlack
reduced to max ...
'' Modulo10 Prüfziffernberchnung für u.a. EAN13 Barcodes
Public Function CheckDigit(sBarcode As String) As String

    Dim iTotalOdd, iTotalEven, iTotal As Integer

    For i As Integer = 1 To Len(Trim(sBarcode)) Step 2
        iTotalOdd += Val(String.Mid(sBarcode, i, 1))
        iTotalEven += Val(String.Mid(sBarcode, i + 1, 1))
    Next

    iTotal = ((iTotalOdd * 3) + iTotalEven) % 10

    Return sBarcode & Str(10 - IIf(iTotal = 0, 10, iTotal))

End

Re: Advice 0n converting this VB code

Posted: Tuesday 20th April 2021 9:01am
by cogier
Which type of barcode are you intending to use? If it is 128B then I have put the necessary code on the Farm called Own_Barcode.

EDIT

I have looked further into this and if you are trying to create codes for EAN barcodes your code needs to calculate the odd and even numbers from right to left see here. The following code seems to work for EAN barcodes used on books.
Public Sub Form_Open()

  Print Calc(978047008293) ''5
  Print Calc(978156592400) ''0
  Print Calc(978059600025) ''7

End

Public Sub Calc(sBarcode As String) As String

  Dim iLoop, iTotal, iCalc As Integer

  For iLoop = Len(sBarcode) - 1 To 1 Step -2
    iTotal += Val(sBarcode[iLoop]) * 3
    iTotal += Val(sBarcode[iLoop - 1])
  Next

  If Right(Str(iTotal)) <> "0" Then iCalc = Round((iTotal / 10) + 0.5) * 10 Else iCalc = Round(iTotal / 10) * 10

  Return sBarcode & Str(iCalc - iTotal)

End

Re: Advice 0n converting this VB code

Posted: Tuesday 20th April 2021 7:40pm
by AndyGable
cogier wrote: Tuesday 20th April 2021 9:01am Which type of barcode are you intending to use? If it is 128B then I have put the necessary code on the Farm called Own_Barcode.

EDIT

I have looked further into this and if you are trying to create codes for EAN barcodes your code needs to calculate the odd and even numbers from right to left see here. The following code seems to work for EAN barcodes used on books.
Public Sub Form_Open()

  Print Calc(978047008293) ''5
  Print Calc(978156592400) ''0
  Print Calc(978059600025) ''7

End

Public Sub Calc(sBarcode As String) As String

  Dim iLoop, iTotal, iCalc As Integer

  For iLoop = Len(sBarcode) - 1 To 1 Step -2
    iTotal += Val(sBarcode[iLoop]) * 3
    iTotal += Val(sBarcode[iLoop - 1])
  Next

  If Right(Str(iTotal)) <> "0" Then iCalc = Round((iTotal / 10) + 0.5) * 10 Else iCalc = Round(iTotal / 10) * 10

  Return sBarcode & Str(iCalc - iTotal)

End

Thank-you cogier that works perfectly with both EAN8 and EAN13 barcode numbers