2016-09-19 3 views
0

最近、私はドイツで発行された社会保険番号を確認するためのコードを書いています。
私は3つの出力を持っています:姓、dobと指定された社会保険番号。 3桁目と8桁目の間には、日付月と出生の最後の2年間が含まれます。 ただし、場合によっては偽陰性を返します。誰もが改善を提案することはできますか?私はVBAや一般的なコーディングにはとても新しいので、何か改善があるかどうかは自由にチェックし、提案してください。
私は自分のコードを投稿します。本当のポジティブな例と偽のネガティブな例を投稿します。VBAに関する私の機能は、いくつかの偽陰性を出力します

Akyol 1993年10月31日13311093A017__
Voormann 1995年11月22日53221195V018__
ケーラー1997年10月15日14151097K056__
Xheladini 1991年10月22日65221091X509__

ため

__Steinbach 1991年1月12日12011291S533

偽陰性結果

Visual Basicでの関数

Public Function firstDigitsSocIn(surname As String, dob As Date, socialSecurityNumber As String) As String 
     'defining variables (add gender after surname when data is available) 

     Dim dayOfMonth As Integer 
     Dim monthSoc As Integer 
     Dim yearSoc As Integer 
     Dim firstCharSurname As String 
     Dim customMadeNumber As String 
     'Dim genderCode As Integer   enable when having genders in data set 
     'Dim genderCheck As Boolean 
     Dim resultFirst7Chars As Boolean 
     Dim resultInclGenderCheck As Boolean 
     Dim resultFinal As Boolean 
     'setting up variables with correct values 

     dayOfMonth = Day(dob) 
     monthSoc = Month(dob) 
     yearSoc = Right(Year(dob), 2) 
     firstCharSurname = Left(surname, 1) 
     'genderCode = Left(Right(socialSecurityNumber, 3), 2) 


     'if gender = "M" am 

     'custommadenumber is composed using the credentials of the user 
     customMadeNumber = dayOfMonth & monthSoc & yearSoc & firstCharSurname 

     resultFirst7Chars = StrComp(Mid(socialSecurityNumber, 3, 7), customMadeNumber, vbBinaryCompare) 

     'If gender = "M" And genderCode < 50 Then 
     'genderCheck = True 
     'ElseIf gender = "F" And genderCode > 50 Then 
     'genderCheck = True 
     'Else 
     'genderCheck = False 
     'End If 

     'resultInclGenderCheck = resultFirst7Chars And genderCheck 

     'resultFinal = resultInclGenderCheck And True 'put Pruefziffer check here as well 

     firstDigitsSocIn = resultFirst7Chars 

End Function 
+1

'='の代わりに 'StrComp'を使う理由はありますか? (私はあなたが 'True' /' False'値だけを望んでいると思います)。すべての例について関数が真を返すようにしたいと思います。(StrComp(Str1、Str2、vbTextCompare)= 0) ' – arcadeprecinct

+0

@arcadeprecinct、正確な一致を確認するために' StrComp 'を使用したかったのですが、構造体に従うのを忘れていました。 –

答えて

4

あなたには2つの重大な問題があると思います。

  1. カスタム番号は、文字列の代わりにIntegerで作成します。つまり、10未満の数値は0を失うことになります。

  2. StrCompは、実際に文字列が等しいかどうかを確認する場合に使用します。これはあまり悪くないでしょうが、結果はBooleanとなります(resultFirst7Charsはブール値なので)。 StrCompは、文字列が等しい場合は0を返し、それ以外の場合は-1または+1を返します。しかし、0、-1、1をブール値として扱うと、FalseTrue、およびTrueが得られます。

Prakashはすでに2番目の問題の解決策を示しています。もう一つは、ちょうど

resultFirst7Chars = (socialSecurityNumber = customMadeNumber) 

編集を使用することです:プラカシュはここに彼の答えを削除したので、彼が提案するものである:

resultFirst7Chars = (StrComp(Mid(socialSecurityNumber, 3, 7), customMadeNumber, vbBinaryCompare) = 0) 

すなわちStrCompが0か返されるかどうかをチェックします。最初の問題については


、あなたは先行ゼロを取得するためにdayOfMonth = Format(Day(dob), "00")を使用することができます(文字列としてdayOfMonthと他人を宣言したり、それらを再び失うことになる!)

Dim dayOfMonth As String 
'... 
Dim yearSoc As String 

dayOfMonth = Format(Day(dob), "00") 
'... 
yearSoc = Right(CStr(Year(dob))) 'CStr wouldn't be necessary but this way it's more obvious what is happening. 

最後に、あなたの関数は、おそらく返す必要があります文字列ではなくブール値。

+0

問題を解決しました。 –

関連する問題