AccessとVBは具体的にはどう違うんですか?(Accessではできるけど、VBではできないものなど)教えてください。お願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

こんにちは。

maruru01です。
VBというのは、プログラミング言語です。VBで作ったアプリケーションをVBアプリケーションとか、VBプログラムとか言います。VBは、メモ帳やデータベース、ゲームなど様々なものが作れます。一方、Accessはデータベースアプリケーションです。
と、書いてきましたが、多分donardさんはAccessVBAとVBの違いについて質問しているのでしょう。
AccessVBAとVBは基本的に同じ言語です。VBをAccessを操作したり、カスタマイズするために機能を特化したのがVBAです。これは他のWindowsOfficeアプリ(Excel、Wordなど)のVBAも同じです。したがって、AccessVBAには、Accessを操作するための特殊な機能が備わっています。もちろんVBでもAccessを操作出来ますが、他のアプリケーションを使用せず、Accessのみで完結する場合は、AccessVBAで作る方が作り易いです。
あと、両方使っていると、VBで使えた関数や機能がVBAでは使えないといらいらすることもありますけどね。特に、コントロールの種類や機能が結構違いますね。
このように多少は違うので、VBをおぼえたからと言ってVBAを使えるというわけではない(逆も同じ)ですが、先に述べたように基本的には同じですから、片方を知っているともう片方は覚えやすいですね。
どちらを使うにしても、がんばって下さい。
では。
    • good
    • 0

>AccessVBAとVBの違い


ならば・・・

EXE実行形式を作成できるかどうか が一番違う点だと思います。
AccessVBAは、原則としてAccessを持っている人をエンドユーザであるとしていますので、EXE実行形式を作ることは、あんまり考慮されていません。VBは、Windowsアプリケーションソフトを作るためのコンパイラ言語ですから、EXEをつくる事を第1に考えられています。

>AccessVBAではできるけど、VBではできないもの
 細かい点は、たくさんありますよ。
たとえば、カレントデータベース(mdb)の扱い方は、Access内部のVBAからアクセスするほうが、はるかにシンプルにできますし、フォームやレポートもデータベース向け(に使いやすい)ですね。

このあとは、わかるかどうか donard さんのレベル次第ですが・・・
VBのコントロールの一つに、VBAのエンジンがあります。
つまり、がんばればいつかは、VBでAccessのようなものをつくることも可能です。Accessでは、VB(のようなもの)を作る事はできません。
    • good
    • 0

この質問は少し変ではありませんか?


もともとまるっきり違うものを比較しようとしているようです。
たとえばWordとExcelはどう違うのかというのとあまり変わらないみたいです。

たぶん、AccessVBAとVBの違いということだと思いますが、
いかがでしょうか?

この回答への補足

AccessVBAとVBの違い

補足日時:2001/10/18 11:20
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しの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プログラミンング作業の具体的な流れをお教え下さい よろしく御願いします

プログラミングに関しては全く無知です。どうぞよろしくお教え下さい。

(1)「一個140円の商品を客がn個購入し代金を一万円札で支払った時、おつりはイクラになるか」を求めるプログラミンを考えることとします。

これは、どういう形のプログラムで実際に表現されますか。教えて下さい。改行も実際通りお教え願えれば幸いです。

(2)・・・・この(2)のほうに、より強い興味を感じているのですが、

上記のプログラムは紙の上の存在、頭の中の存在ですが、実際にWindowsで実行しようとする時、具体的にはどういう作業の段階を踏みますか。・・・・この具体的な段階がいちばん知りたい部分です。

(1)で作成したプログラムは、何に書いて(ワードパッドですか、メモ帳ですか)、名前をつけたら、どこに保存するのでしょうか。ドライブCなのでしょうか。またプログラムを書いて保存するとき、ファイルの拡張子は一定ですか。

そして、保存したプログラムを実際に使うには、どういう手順になりますか。「すべてのプログラム」の中に表示されますか。どこを選択クリックしたら、「n」の入力を待つプロンプトが出て来ますか。

                     ○

 以上、まったくのシロウトの質問で大変失礼だったかも知れませんが、どうぞよろしくお教え下さい。お忙しいところ申しわあけありませんが、よろしく御願い申し上げます。

 この方面に詳しい方にとっては、つまらない質問と思われるかも知れませんが、どうしても知りたいので質問を書かせていただきました。御了承下さい。

プログラミングに関しては全く無知です。どうぞよろしくお教え下さい。

(1)「一個140円の商品を客がn個購入し代金を一万円札で支払った時、おつりはイクラになるか」を求めるプログラミンを考えることとします。

これは、どういう形のプログラムで実際に表現されますか。教えて下さい。改行も実際通りお教え願えれば幸いです。

(2)・・・・この(2)のほうに、より強い興味を感じているのですが、

上記のプログラムは紙の上の存在、頭の中の存在ですが、実際にWindowsで実行しようとする時、具体...続きを読む

Aベストアンサー

ちょっと長くなっちゃったんで続きを。

先にも書きましたが、C言語だろうとPythonだろうと、「書かれた通りに実行はします」が書かなかった部分については実行しません。
つまり質問者さんの(1)の質問に関して言うと、

> (1)「一個140円の商品を客がn個購入し代金を一万円札で支払った時、おつりはイクラになるか」を求めるプログラミング

と言うのは入出力に関しては「何も設定してなかった」って事ですね。
従って、この部分は

> 「n」の入力を待つプロンプトが出て来

るようには設定されていないので、当然「n」の入力を待つプロンプト、なんざ出てこないんです。
ここもプログラムしたい、ってのならその通りにプログラムを設計して書かないと絶対出てきません。
(実はC言語だと、この辺明快には解説されてない例が多い、って言うか構造的にどうしても「main関数」を設定して「入出力を切り離せない」カタチで書く事が多いんで、初心者的には物凄く曖昧になる部分です。結果printfを書きまくるハメになります。)
Python(2.7)だと「n」の入力を待つプロンプト含み、って事で改造するのなら、定型的にはfoo.pyを次のように改造します。

def foo(n, money = 10000, price = 140): # ここは前と同じ
 return money - price * n

if __name__ == '__main__': # ここを追加する
 print foo(input("「n」の入力を待つプロンプト> ")) # input関数を引数として関数fooに渡し、printで表示する

そうすると、

1. DOS窓を起動する
2. python foo.pyとコマンドを打つ

# こんなカンジ
➜ ~ python foo.py
「n」の入力を待つプロンプト>

3. 好きなnを入力する

# こんなカンジ
➜ ~ python foo.py
「n」の入力を待つプロンプト> 10
8600
➜ ~

とだいぶ簡略化されました。

んで、上に追加した入出力関連の部分をGUIのコードに置き換えれば単純には「クリックして起動して・・・」と言うようなGUIプログラムを作成出来ます。
まあ残念ながら、僕自身は今、Linux使ってるんで、ちょっとWindows向けに「ほら、こう書けば・・・」ってすぐにはお見せ出来ないんですが(笑)、要するにこの辺の「入出力関連」をうまい具合にGUI作成ツールを使って置き換えれば端末(DOS窓)経由じゃなくても起動出来るプログラムは理論的には書ける、って事ですね。
で、Microsoft提供のVisual C++/C#あるいはVisualBasicだとそのへん、Windowsで動かす際には問題がないGUIツール込みで提供されてるので、便利と言えば便利な環境になってるわけです。

ちょっと長くなっちゃったんで続きを。

先にも書きましたが、C言語だろうとPythonだろうと、「書かれた通りに実行はします」が書かなかった部分については実行しません。
つまり質問者さんの(1)の質問に関して言うと、

> (1)「一個140円の商品を客がn個購入し代金を一万円札で支払った時、おつりはイクラになるか」を求めるプログラミング

と言うのは入出力に関しては「何も設定してなかった」って事ですね。
従って、この部分は

> 「n」の入力を待つプロンプトが出て来

るようには設定されていないので...続きを読む

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

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

Aベストアンサー

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

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

QVBSでAccess2000のバージョン確認

VBScriptsでAccess2000のインストール状態を調べようとしています。

実行した環境は、以下です。
 環境(1)
  WinXP
  ACCESS2000
  ACCESS2010Runtime

作成したコードは以下です。

------------------------
Dim objAcc
Dim AccVer

On Error Resume Next
Set objAcc = CreateObject("Access.Application")

If Err.Number = 0 Then
AccVer =objAcc.Version

Select Case AccVer

Case 9
WScript.Echo "ご利用のPCにはAccess2000がインストールされています。"

Case 14
WScript.Echo "ご利用のPCにはAccess2010がインストールされています。"

End Select

Else
WScript.Echo "Access はインストールされていません"
End If
-----------------------------

実行をすると、"Access はインストールされていません"とメッセージが出て、
ACCESS2000のインストールを認識していません。

CreateObject("Access.Application")をCreateObject("Access.Application.9")
に変更しても同じ結果でした。

他の環境でも確認しましたが、以下の結果でした。

 環境(2)
  WinXP
  ACCESS2010
   ⇒"ご利用のPCにはAccess2010がインストールされています。"

 環境(3)
  WinXP
  ACCESS2010Rintime
   ⇒"Access はインストールされていません。"

ただ、実際に確認が必要になるのは、環境(1)の状態でのAccess2000のインストール有無です。

上記の現象について情報をお持ちの方、または他に良い方法をご存知の方がおりましたら
ご連絡を頂ければと思います。

VBScriptsでAccess2000のインストール状態を調べようとしています。

実行した環境は、以下です。
 環境(1)
  WinXP
  ACCESS2000
  ACCESS2010Runtime

作成したコードは以下です。

------------------------
Dim objAcc
Dim AccVer

On Error Resume Next
Set objAcc = CreateObject("Access.Application")

If Err.Number = 0 Then
AccVer =objAcc.Version

Select Case AccVer

Case 9
WScript.Echo "ご利用のPCにはAccess2000がインストールされています。"

Case 14
WScript.Echo "ご利...続きを読む

Aベストアンサー

RunTime 関連は?ですけどCドライブ中のMSACCESS.EXEのバージョンなら

Dim oSH
Dim oFS
Dim oFLD
Dim oF
Dim j
Dim sMsg
Dim infoIndex 'XP の場合は39?
Dim strComputer
Dim objWMIService
Dim colFiles
Dim FCol
Dim sSql

sSql = "SELECT * FROM CIM_DataFile " _
& " WHERE Drive = 'C:'" _
& " AND FileName = 'MSACCESS'" _
& " AND Extension = 'EXE'"

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colFiles = objWMIService.ExecQuery(sSql)

Set oSH = CreateObject("Shell.Application")
Set oFS = CreateObject("Scripting.FileSystemObject")
infoIndex = 39

For Each FCol In colFiles
Set oF = oFS.GetFile(FCol.Name)
Set oFLD = oSH.Namespace(oF.ParentFolder.Path)
j = j + 1

sMsg = sMsg & j & "," & FCol.Filename _
& "," & FCol.Name _
& "," & oFLD.GetDetailsOf(oFLD.Items, infoIndex) _
& "," & oFLD.GetDetailsOf(oFLD.ParseName(oF.Name), infoIndex) _
& Chr(13) & Chr(10)

Set oF = Nothing
Set oFLD = Nothing
Next

MsgBox sMsg

のVBSで出来るかと思います。Cドライブのファイルを総なめしてるので遅いです。
製品バージョン番号の辺りはそちらの状況に合わせて加工してください。
ここの掲示板はTabインデントが利かないので見辛いでしょうが勘弁。
なお、ExcelかAccessのVBEにて
Sub TEST()
ここに上記コードを張り付けて色々やって見てください。
End Sub

RunTime 関連は?ですけどCドライブ中のMSACCESS.EXEのバージョンなら

Dim oSH
Dim oFS
Dim oFLD
Dim oF
Dim j
Dim sMsg
Dim infoIndex 'XP の場合は39?
Dim strComputer
Dim objWMIService
Dim colFiles
Dim FCol
Dim sSql

sSql = "SELECT * FROM CIM_DataFile " _
& " WHERE Drive = 'C:'" _
& " AND FileName = 'MSACCESS'" _
& " AND Extension = 'EXE'"

strComputer = "."
Set objWMIService = GetObje...続きを読む

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 オブジェクト型のフィールドに格納されているイメージが正...続きを読む

Qvb→access コーディングエラーについて

<環境>access2007

vbコーディングした以下のコードをaccessに移行しているのですが、宣言で"Excel.~"となっているところでコンパイルエラーとなります。
(エラー:ユーザー定義型は定義されていません。)
なので、全てObject型に変えたのですが、
(1)objBook.Names.Countで件数が取れないし、
(2)For Each objName In objBook.Namesで名前も取れません。

accessで動くようにどう直せばいいのでしょうか?
よろしくお願いします。

<vbコード>
Dim XLAPP As Excel.Application→Objectに変更
Dim objBook As Excel.Workbook→Objectに変更
Dim objName As Excel.Name →Objectに変更
Dim objTable As Excel.Range→Objectに変更
Dim objRange As Excel.Range→Objectに変更
Dim objColumn As Excel.Range→Objectに変更
Dim objRow As Excel.Range→Objectに変更
Dim i As Integer
Dim lngCountSheet As Long

Set XLAPP = CreateObject("Excel.Application")
Set objBook = XLAPP.Workbooks.Open(FileName)

objBook.Application.DisplayAlerts = False
lngCountSheet = objBook.Names.Count (1)←ここ

For Each objName In objBook.Names(2)←ここ
Set objTable = objName.RefersToRange
With objTable
For i = 1 To .Columns.Count
Set objColumn = .Columns(i)
objColumn.HorizontalAlignment = XlHAlign.xlHAlignLeft
Set objColumn = Nothing
Next i
'先頭行の書式設定をします
Set objRow = .Rows(1)
objRow.Interior.Color = RGB(192, 192, 192)
' .Range("A2").Activate
'' ActiveWindow.FreezePanes = True
' XLAPP.ActiveWindow.FreezePanes = True
End With
Next
XLAPP.Quit

<環境>access2007

vbコーディングした以下のコードをaccessに移行しているのですが、宣言で"Excel.~"となっているところでコンパイルエラーとなります。
(エラー:ユーザー定義型は定義されていません。)
なので、全てObject型に変えたのですが、
(1)objBook.Names.Countで件数が取れないし、
(2)For Each objName In objBook.Namesで名前も取れません。

accessで動くようにどう直せばいいのでしょうか?
よろしくお願いします。

<vbコード>
Dim XLAPP As Excel.Application→Objectに変更...続きを読む

Aベストアンサー

> objBook.Names
ヘルプには、
『指定されたブックのすべての名前 (すべてのワークシートの名前を含む) を表す Names コレクションを返します。値の取得のみ可能です。Names コレクション オブジェクトを使用します』
とあります。
さらに使用例も載っています。
objBook.Names は名前の定義で作成した名前のコレクションです。
ブックの名前のことではありません。
http://officetanaka.net/excel/vba/file/file04.htm
具体的な添削回答はいたしません。

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) ' ディレクトリ一...続きを読む

QVBSでセキュリティ「中」のAccessをメッセージなしに開きたい

AccessのテーブルにCSVのデータをインポートするVBSを作っていますが、そのVBSを実行するパソコンののAccessのセキュリティが「中」となっているため、実行時に「開くかどうか」を聞いてきます。
セキュリティレベルを「低」に変更できないため、VBSか、Accessファイルに修正をしなければいけないのですが、どうすればよいか、よくわかりません。
ちなみに、VBSのコーディングは以下のようになっています。

'アクセスオブジェクトセット
Set objAccess = CreateObject("Access.Application")
'データベースオープン
objAccess.OpenCurrentDatabase(strMdbName)
'データベースセット
Set objDB = objAccess.CurrentDb

'インポート実行
objAccess.DoCmd.TransferText ,defFile,strTableName,strInFile,False

'データベースクローズ
objAccess.CloseCurrentDatabase
s = s & "CloseCurrentDatabase" & vbCrLf

objRS.Close
objDB.Close

Set objRS = Nothing
Set objDB = Nothing
Set objAccess = Nothing

どうか、助けてください。お願いします。

AccessのテーブルにCSVのデータをインポートするVBSを作っていますが、そのVBSを実行するパソコンののAccessのセキュリティが「中」となっているため、実行時に「開くかどうか」を聞いてきます。
セキュリティレベルを「低」に変更できないため、VBSか、Accessファイルに修正をしなければいけないのですが、どうすればよいか、よくわかりません。
ちなみに、VBSのコーディングは以下のようになっています。

'アクセスオブジェクトセット
Set objAccess = CreateObject("Access.Application")
'データベース...続きを読む

Aベストアンサー

ご希望の事が可能なら、マクロウィルスがあってもノーチェックで実行出来てしまいますので、セキュリティレベルを手動で変更するか、毎回メッセージダイアログをクリックするしかありません。

以前にエクセルのマクロウィルスのソースを見ましたが、レジストリ操作でセキュリティレベルを変更していました。

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オブジェクト指向(具体的にはどんなクラスで作ります?)

 オブジェクト指向、クラスの便利さは大体わかりました。
(赤外線やマイクロ波の専門的な説明はわかったけど、リモコンや電子レンジに具体的に見てみないと、ぴんときていない状態だと、思います。)
それに、一人で作っていることもあり、また構造化プログラミングで今まで作ってきたので、具体的にどういうクラスに分け、どういうことを将来予想し、作るのかがわかりません。

仮に、シンプルな日記から作る場合、どういったクラスを作り、どういうことを予想し、作りますか?
特に、継承や他に使いまわせるようにとか、ソフトを作り、何を想定するのかを知りたいです。

Aベストアンサー

あんまり参考にならないかもしれませんが。

1人で自由にコーディングしているのであれば、まずどんどんソースを書いていって「何か似たようなコード書くことになるな」「同じコード書くことになるな」という段階で、クラス化します(まぁ最低限、最初の段階でReadクラスとWriteクラスと分けますが)。

仕事で客先からの要求がある場合は、あらかじめコーディング前に、「似たようなコード書くことになるな」「同じコード書くことになるな」を想定して、クラス化します。

余裕があれば、「この要件は、後々同じようなことを言ってくるだろうな」というのも、クラス化しておきます。が、「一歩先を見越す」程度でそれ以上はしません(限られた納期ですし、アテが外れる場合もありますから)。

それと、保守しやすい・見やすい(結果としてバグが出にくくなる)という点もクラス・メソッド設計では重視します(今、他人が作ったソースの保守・改修で泣きを見ているので)。

うーん、あまりレベルは高くないかもしれませんが(涙)、今の私の現状です。


人気Q&Aランキング

おすすめ情報