前回の質問がかなり抽象的で意味がわかりずらかったと思いますので追加します。
自分なりにしらべた結果、チェックデジットの計算方法は次のとおりでした。
整数は6桁で一番最後の桁がチェックデジットになっています。
例えば、540838という番号なら最初の5の桁に6をかける(5×6=30)
次の桁は4に5をかける(4×5=20)次の桁は0に4をかける(0×4=0)
以下、8×3=24、3×2=6と計算し、出た答えを全部たした(30+20+0+24+6=80)80を最初に超える11の整倍数からひく(88-80=8)と最後の桁と一致すればその番号は正しく入力されていると判断できるしくみになっています。
この演算式をアクセスでデータ入力した際に、自動的に演算計算して、チェックデジットが一致していないときは、警告するようにしたいのですが、この算式をアクセスでどのように入力すればいいのかわかりません。また、そもそも、アクセスでこんな演算式を入れることができるのかもわかりません。
素人で申し訳ないのですが、わかるかたがいれば教えてください。

関連URL:http://oshiete1.goo.ne.jp/kotaeru.php3?qid=128693

A 回答 (2件)

VBAを使った解法の例です。


数値を入力するテキストボックスのプロパティを表示し、「イベント」の「更新前処理」の値を「イベントプロシージャ」に変更した後、その右に現れる「...」をクリックしてください。

んで、出てきた画面に以下の内容を貼り付けます。
(尚、最初の行と最後の行は既に入力されているはずですので、その間の部分だけコピペしてください)

'*****ココから
Private Sub テキスト0_BeforeUpdate(Cancel As Integer)
  Dim CheckDat As String
  Dim ErrMsg As String
  Dim CD As Long
  
  CheckDat = Nz(Me.テキスト0, "") '行A
  ErrMsg = ""
  If IsNumeric(CheckDat) = False Then
    ErrMsg = "数値じゃない"
  ElseIf Len(CheckDat) <> 6 Then
    ErrMsg = "6桁じゃない"
  Else
    CD = 0
    CD = CD + (Val(Mid$(CheckDat, 1, 1)) * 6)
    CD = CD + (Val(Mid$(CheckDat, 2, 1)) * 5)
    CD = CD + (Val(Mid$(CheckDat, 3, 1)) * 4)
    CD = CD + (Val(Mid$(CheckDat, 4, 1)) * 3)
    CD = CD + (Val(Mid$(CheckDat, 5, 1)) * 2)
    CD = 11 - (CD Mod 11)
    'If CD = 11 Then CD = 0 '行B
    If CD >= 10 Then CD = CD - 10 'CDが10もしくは11のときは、CDから10を引く(一桁にする)
    'CDの判定
    If Right$(CheckDat, 1) <> CStr(CD) Then
      ErrMsg = "チェックデジットが間違ってる"
    End If
  End If
  
  If ErrMsg <> "" Then
    MsgBox ErrMsg
    'Cancel = True
  End If
End Sub
'******ココまで



また、この例では、数値データが一つのテキストボックスに入力されていることを想定しています。
もし、テキストボックスが6コ用意されているとかでしたら、行Aの内容を

CheckDat = nz(Me.テキスト0,"") & nz(Me.テキスト1,"") & nz(Me.テキスト2,"") & …

ってな感じにしてください。


また、「80を最初に『超える』11の倍数」 とのことですので、計算結果が11の倍数(Ex:88)になったときは、99-88=11とし、1の位を取って最終的なCDは1になる、としています。
つまり、前5桁が「54283」のときは、CDは1になります。
もし、「88」のときのCDを0にしたい場合は、行Bの先頭のシングルクォーテーションを削除してください。

質問等ありましたら、補足してください。
    • good
    • 0

できます。



いくつか方法があるので、仮にテキストボックスを使うとして、BeforeUpdate イベントで、入力された整数値を文字列に変換して、桁数チェック、最初の桁(文字)を数値に変換して、6をかける・・・・・をやればできます。
けど逐一全部説明するのは、大変骨の折れることで、面倒なので、何か解説書を買うことをお勧めします。

具体的な入門書の名前は、別な人が回答してくれるでしょう。

>前回の質問がかなり抽象的で意味がわかりずらかったと思いますので追加します。

#前回の質問ってなに?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QACCESS2003のデータアクセスページの使い方について

イントラ内でACCESS2003のデータアクセスページを使いたい。

1.ACCESS2003のデータアクセスページを作成しました。
2.そのMDBファイルと、データアクセスページ(htmファイル)を、WINDOWS2000ServerのInetpub内のwwwrootフォルダの中へ入れました。
3.ここにはイントラ内のHPなどを置いています。(普通に見れています。)
4.クライアントから、データアクセスページのhtmファイルを見に行くと「データソースログオン」が立ち上がります。(パスワードを設定しています。)
5.パスワードを入れるとデータアクセスページ(htm)から、通常のアクセスのフォームのごとくデータ入力が出来る予定なのですが(泣)できません。(泣)

で、悩んでおります。

ACCESS2003のMDBファイルとデータアクセスページ(HTMファイル)をサーバーのwwwrootへ置いただけでは、データアクセスページを通してmdbファイルへの入出力は不可能なのでしょうか?

Aベストアンサー

MDBに接続されたAccessプロジェクトを開いている場合データアクセスページは自動的にそのデータベースに接続されてそのパスがデータアクセスページのConnectionString プロパティに設定されます。
ページを作成した後でデータベースを移動またはコピーした場合はConnectionString プロパティに設定されているパスを更新して新しい保管場所を設定する必要がありますがどうなっていますか?
そこを確認してみてください。

Q【急】Access 4桁の数字の頭に0をつけて5桁にしたい

4桁の数字が入っているフィールドで、頭に0をつけたいです。
一括で簡単にできる方法を、至急教えて下さい!

Aベストアンサー

sanbitです。
クエリでしたらできますか?更新クエリで案内します。
(1)該当テーブルで選択クエリを作成ください。
(2)このクエリをデザインモードで開く→クエリ画面で右クリックするとプルダウンメニューがでます。
→一番上のSQLビューをクリック→何やら表示しています。これを消して

UPDATE テーブル名 SET テーブル名.フィールド名 = "0"+[フィールド名]
WHERE Len([フィールド名])=4;

2行をコピーしてください、
テーブル名とフィールド名3箇所(同じ名前になります)を変更してください。
スペースドット 大小のカッコ など間違うと大変です。
(3)クエリは一旦閉じてダブルクリックで実行します。
クエリは画面上で右クリックで、表示モードが変えられます。
なお、念のため元のテーブルはコピーを取ってから実行ください。
データは更新してしまいます。間違っていたら元に戻せません

なお、前回のフォーム閉じてフォームをクリックすれば実行モードになります、ボタンをクリックすればイベントに書いた内容を実行してくれます。
フォームはデータを表示させたり、ボタンでいろんな処理をするのにしようします。

sanbitです。
クエリでしたらできますか?更新クエリで案内します。
(1)該当テーブルで選択クエリを作成ください。
(2)このクエリをデザインモードで開く→クエリ画面で右クリックするとプルダウンメニューがでます。
→一番上のSQLビューをクリック→何やら表示しています。これを消して

UPDATE テーブル名 SET テーブル名.フィールド名 = "0"+[フィールド名]
WHERE Len([フィールド名])=4;

2行をコピーしてください、
テーブル名とフィールド名3箇所(同じ名前になります)を変更してください。
ス...続きを読む

Qホームページ移転に伴う.htaccessの使い方ですがアップロードして

ホームページ移転に伴う.htaccessの使い方ですがアップロードして削除できなくなる事ないですか??また、さくらサーバーは.htaccess使えますか??

Aベストアンサー

.htaccessだけではなく、
ファイルはパーミッションによっては一旦削除できなくなると思いますよ・・・
使えないのにアップすると削除出来ないとか。

>さくらサーバーは.htaccess使えますか??
使えます。
.htaccessを使えない有料サーバってあるのでしょうか?・・・

QACCESSで10桁の中から中の3桁を抜き出す関数

ACCESSで7けたの数値7654321から765の部分3桁と43の部分の2桁、21の桁を分けて抜きとりたいのですが、どういう関数を使ったらよいかわかりません、LEFT関数を使ってみたりしたのですがどうも欲しいものが取り出せないので基礎的なことですが教えてください
よろしくおねがいします

Aベストアンサー

クエリのデザイングリッドの「フィールド」のセルに

a: [x] \ 10000
b: ([x] Mod 10000) \ 100
c: [x]-[a]*10000-[b]*100

と入力してください。ここで、x は 7654321 などが入っているフィールドの名前、a, b, c は計算結果が入るフィールドの名前です。

7654321 に対しては、a に 765、b に 43、c に 21 が得られます。

QAccessで作成したテーブルのOLEオブジェクトの使い方

Accessで作成したテーブルにデータ型(OLEオブジェクト型)で画像を取り込みできるようにしました。
取り込みした画像を開くためのフォームを作成して画像を開けるようにしました。
下記の内容です。

Private Sub Form_Open(Cancel As Integer)
Form.Caption = ProgName
End Sub

しかし「ビットマップ形式」ですと問題なく開くのですが、「JPG形式」ですと開けないのです。取り込みしたAccessテーブルのフィールドから直接だとひらけます。
Accessで作成したフォームから、「JPG形式」の画像を開くにはどうすればよろしいですか?
また、画像を1000件ほど取り込みすると大きいデータベースになってしまいます。Accessのデータベースのサイズは制限があるのかしら?
アドバイスいただけれは幸いです。

Aベストアンサー

Access のバージョンは?
んで Web で検索する努力はしましょうよ。
丸 1日ぐらい検索しっぱなしで悩まないと。

Google「access ole jpeg」で検索
http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=access+ole+jpeg&num=50

Access 2003 では以下のような制限があるようです。
■ Access 2003 で OLE オブジェクトとして JPEG および GIF 画像を取り扱う場合の注意事項
http://support.microsoft.com/kb/884484/ja

■ OLE オブジェクト型のフィールドに格納されているイメージが正しく表示されません
http://support.microsoft.com/kb/832508/ja

解決策としては JPEG を開ける OLE コンテナになるアプリケーションをインストールしておく。

Google「Access データベース サイズ 制限」で検索
http://www.google.com/search?hl=ja&num=50&q=Access+%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9+%E3%82%B5%E3%82%A4%E3%82%BA+%E5%88%B6%E9%99%90&lr=lang_ja

Access のバージョンは?
んで Web で検索する努力はしましょうよ。
丸 1日ぐらい検索しっぱなしで悩まないと。

Google「access ole jpeg」で検索
http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=access+ole+jpeg&num=50

Access 2003 では以下のような制限があるようです。
■ Access 2003 で OLE オブジェクトとして JPEG および GIF 画像を取り扱う場合の注意事項
http://support.microsoft.com/kb/884484/ja

■ OLE オブジェクト型のフィールドに格納されているイメージが正...続きを読む

QROUND関数と小数点以下桁上げ(桁下げ)ボタンについて

いつもお世話になっています。素朴な疑問ですが教えてください。

任意の桁数で切り上げや切り捨て、あるいは四捨五入を行なう関数としてROUNDUP関数やROUNDDOWN関数、そしてROUND関数というものが存在しますが、このうち四捨五入を行なうROUNDUP関数は、整数表示にしたい場合やそれ以下の小数第○位の表示にしたい場合に使う限りにおいては書式設定ツールバーの「小数点以下桁上げ(桁下げ)」ボタンを使えば事足りるのではないでしょうか? あるいは使い分けをしなければならないケースも存在するのでしょうか?

ご存知の方いらっしゃいましたらぜひ教えてください。宜しくお願いいたします <(__)>

Aベストアンサー

ここでも繰り返し質問がでていますが、関数と書式は全く違いま
す。書式は見た目を変えるだけで値を変えませんから、計算に使う
と想像と違う値が出て来たりするわけですよ。たとえば4.4を書式
で4と表示しておいて、3倍すると12になると思っても、実際には
13.2じゃないですか。

書式で小数点以下の桁数を指定するのは、2.5と3.0が縦に並んだと
きに3とだけ表示されて小数点の位置がずれるのがイヤだとか、そ
ういう用途に使うと考えた方がいいですね。

QAccess2000でFTPの使い方について。

Access2000のフォームから、実行のボタンをクリックするとFTPサーバに接続→ファイル取得→Accessテーブルに取込→FTPサーバのファイル削除→FTPサーバの接続切断という処理をしたいのですがどのようにしたらよいかわかりません。説明不足だとは思いますが、アドバイスを宜しくお願い致します。

Aベストアンサー

ちなみに先ほどのFTPサンプルは、BASP21をインストール後、サンプルのコードを新規モジュールに貼り付けて(たとえば以下をまるごと)実行すればAccessでもそのまま動きます。

sub file_download()

Dim ftp As Object, rc As Long, v As Variant, v2 As Variant
Dim ctr As Long

Set ftp = CreateObject("basp21.FTP")
ftp.OpenLog "c:\temp\log.txt"
rc = ftp.Connect("ftp.microsoft.com", "anonymous", "")
If rc = 0 Then
v = ftp.GetDir("bussys/winnt/winnt-public", 2) ' ディレクトリ一覧(詳細)
If IsArray(v) Then
For Each v2 In v
Debug.Print v2
Next
End If
v = ftp.GetDir("bussys/winnt/winnt-public") ' ディレクトリ一覧(ファイル名のみ)
If IsArray(v) Then
For Each v2 In v
Debug.Print v2
Next
End If
rc = ftp.GetFile("bussys/winnt/winnt-public/*", "c:\temp") 'ファイル受信

end sub

実行には20秒ほどかかります。
実行前にはCドライブにtempというフォルダを作っておいてください。

ちなみに先ほどのFTPサンプルは、BASP21をインストール後、サンプルのコードを新規モジュールに貼り付けて(たとえば以下をまるごと)実行すればAccessでもそのまま動きます。

sub file_download()

Dim ftp As Object, rc As Long, v As Variant, v2 As Variant
Dim ctr As Long

Set ftp = CreateObject("basp21.FTP")
ftp.OpenLog "c:\temp\log.txt"
rc = ftp.Connect("ftp.microsoft.com", "anonymous", "")
If rc = 0 Then
v = ftp.GetDir("bussys/winnt/winnt-public", 2) ' ディレクトリ一...続きを読む

Qテキスト形式(.txt)をエクセルで読み込むときに1桁目の「0」を読み込みたい

タブ区切りで作成されたテキストデータがあります。

これをエクセルで読み込むと、タブ区切りからセル区切りに自動的に変換されますが、
テキストに「0」から始まるデータがある場合、エクセルに変換されると数値として読み取ってしまうので、2桁目以降の0以外の数字を1桁目として認識してしまいます。

つまり、
「テキストデータを「文字列」のデータとしてエクセルで読み取る」
方法を探しています。

ご存知の方、教えてください。
よろしくお願いいたします。

Aベストアンサー

テキスト ファイル ウィザードの3/3のところで、
[列のデータ形式]を[文字列]にしてみてください。

QRuby on Rails 「attr_accessor」 の使い方に

Ruby on Rails 「attr_accessor」 の使い方について

こんにちは。

現在、Ruby on Railsで登録画面を作成しているのですが、attr_accessorで定義した項目に対して、validationのチェックを行うと、問題が起きてしまいました。

attr_accessorで定義した項目は、DB登録の対象ではないのですが、lengthのチェック等を行う必要があり、validates_length_of等を使って入力チェックを行っています。

問題になったのは、入力があったときだけチェックをかけたいのに、入力がなくてもチェックがかかってしまうという状態になってしまうことです。
「:if => 項目?」を書いてみると、「undefined method」のエラーがでてしまいます。

どなたか対応策の分かる方がおられましたらご教授いただけないでしょうか?

下記に実際の問題箇所のモデルクラスのソースを書いておきます。

 class User < ActiveRecord::Base

   attr_accessor :NEW_USER_PW ← 追加したアクセサ

   # 追加したアクセサに対するチェック
   validates_length_of :NEW_USER_PW, :minimum=>4, :message=>"は%d桁以上を設定してくださ            
    い。", :on => :update, :if => :NEW_USER_PW?

 end

上記のチェック内の「:if => :NEW_USER_PW?」で落ちてしまいます。
入力がないのにチェックに引っかかるとまずいので、入力がないときだけ上記チェックを行えれば良いのですが・・・。

どうぞ宜しくお願い致します。

Ruby on Rails 「attr_accessor」 の使い方について

こんにちは。

現在、Ruby on Railsで登録画面を作成しているのですが、attr_accessorで定義した項目に対して、validationのチェックを行うと、問題が起きてしまいました。

attr_accessorで定義した項目は、DB登録の対象ではないのですが、lengthのチェック等を行う必要があり、validates_length_of等を使って入力チェックを行っています。

問題になったのは、入力があったときだけチェックをかけたいのに、入力がなくてもチェックがかかってしまうという状...続きを読む

Aベストアンサー

attr_accessor :NEW_USER_PWを定義したからといって、
NEW_USER_PW?メソッドが定義されるわけではりません。
attr_accessorはゲッターとセッターメソッドを作るだけです。
それ以外の論理値を返すようなメソッドは自作しなければなりません。

NEW_USER_PW?メソッドを作成されていないのなら、「undefined method」が
出てしまうのは当然です。

質問にあるように、「入力があった場合のみ」とありますので、
NEW_USER_PW?メソッドを下記のように実装すればチェック可能です。

def NEW_USER_PW?
@NEW_USER_PW.size > 0
end

また、ifにはprocオブジェクトを渡すこともできますので、
:if => Proc.new{|u| u.NEW_USER_PW.size > 0}
と書いてもいいでしょう。


NEW_USER_PWというインスタンス変数はすべて大文字を使用されていますが、
見る人によっては定数と勘違いします。
変数であれば小文字表記を利用するほうが良いかもしれません。

attr_accessor :NEW_USER_PWを定義したからといって、
NEW_USER_PW?メソッドが定義されるわけではりません。
attr_accessorはゲッターとセッターメソッドを作るだけです。
それ以外の論理値を返すようなメソッドは自作しなければなりません。

NEW_USER_PW?メソッドを作成されていないのなら、「undefined method」が
出てしまうのは当然です。

質問にあるように、「入力があった場合のみ」とありますので、
NEW_USER_PW?メソッドを下記のように実装すればチェック可能です。

def NEW_USER_PW?
@NEW_USER_PW.s...続きを読む

Qユーザー定義で桁区切り&0の省略をしたい

桁区切り&0を省略したくてユーザー定義で「#,"",」としました。
10000を10,000→10,
5000を5,000→5,
ここまでは特に問題なかったのですが、データの中に2500という数字があり
2500→2,500→3,になってしまいました。(1000で割って繰上)
ここで表示の仕方を変えなければならないという事に気づいたので
10000→10,0
5000→5,0
2500→2,5
と表示したいのですが、この場合、どのようなユーザ定義を作成すればいいのでしょうか?
どなたかご存知の方教えてください。

Aベストアンサー

こんばんは。

書式をユーザー定義

「0,0[Ctrl+J]00」
にして、([Ctrl+J]->コントロールキーを押しながら、Jを押す)

配置[タブ]で、
□折り返して全体を表示

にチェックを入れればよいと思います。
ただし、セル高は、通常のままです。

ところで、ちょっと疑問を感じるのは、なぜ、こんな表記するのでしょうか?
もしかして、ヨーロッパ向けでしたら、コントロールパネルの地域のところで、入れ替えたほうがよいかもしれませんね。「, 」と「.」が逆ですから。


人気Q&Aランキング

おすすめ情報