Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


172 / 500 ページ ←次へ | 前へ→

【9834】Re:フィールドに入力した値を判定したい
回答  hatena  - 07/9/11(火) 0:26 -

引用なし
パスワード
   >フィールドに[長さ]と[判定]をつくり、フォームで[長さ]のプロパティー、更新後処理、イベントプロシジャーに[判定]=IIF(Abs([長さ]-10.5)<=0.5,"OK","NG"))としましたがうまく出来ませんでした。入力した長さが規格内ならOK、規格外ならNGと[判定]に表示したいのですが。判定基準は10.5±0.1です。


もう一度いいますと、

演算で求められる値は、フィールドに格納せずに、必用なときにその都度
計算するというのが、データベース設計の原則です。

よって[判定]フィールドは必用有りません。
フォームに表示したいのなら、テキストボックスのコントロールソースに
式を設定します。

> 判定基準は10.5±0.1です。

[長さ] が 10.4以上、10.6以下なら OK ということですね。
なら、コントロールソースの式は、

=IIf(Abs([長さ]-10.5)<=0.5,"OK","NG")

です。
・ツリー全体表示

【9833】Re:数値型データの抽出です
回答  hatena  - 07/9/10(月) 23:38 -

引用なし
パスワード
   >テーブルで確認したのですが、事業者NOのフィールドは
>長整数型で間違いなかったです。

フィールドは数値型でも、抽出条件式は文字列ですよね。
それと、Nullかどうかを確認するには、IsNull関数を使います。

Private Sub テキスト34_AfterUpdate()

Dim Fil As String

If Not IsNull(テキスト34) Then
  Fil = "[事業者NO]=" & テキスト34
End If

Me.Filter = Fil
Me.FilterOn = True

End Sub
・ツリー全体表示

【9832】Re:数値型データの抽出です
質問  ゆっぴぃ  - 07/9/10(月) 23:33 -

引用なし
パスワード
   hatena さん 初めまして。


>数値型の場合は何も付加する必用はありません。
>
>stFil = "[フィールド名]=" & コンボ31

そうですよね・・・たしかそうだとは思ったんですが
次のコードを動かすと☆のところで型が合わないとして
止まってしまうのです。


Private Sub テキスト34_AfterUpdate()

Dim Fil As Long

If テキスト34 <> Null Then
  Fil = "[事業者NO]=" & テキスト34  ☆
End If

Me.Filter = Fil
Me.FilterOn = True

End Sub


テーブルで確認したのですが、事業者NOのフィールドは
長整数型で間違いなかったです。
・・・いったいどこが(涙)

質問ばっかりですみません。
・ツリー全体表示

【9831】Re:フィールドに入力した値を判定したい
質問  kouzi  - 07/9/10(月) 18:07 -

引用なし
パスワード
   すいませんがもう一度お願い致します。
フィールドに[長さ]と[判定]をつくり、フォームで[長さ]のプロパティー、更新後処理、イベントプロシジャーに[判定]=IIF(Abs([長さ]-10.5)<=0.5,"OK","NG"))としましたがうまく出来ませんでした。入力した長さが規格内ならOK、規格外ならNGと[判定]に表示したいのですが。判定基準は10.5±0.1です。宜しくお願い致します。
・ツリー全体表示

【9830】Re:フォームからテーブルにデータを格納す...
回答  Nao  - 07/9/10(月) 16:49 -

引用なし
パスワード
   ららぽさん、こんにちは。

>具体的には,非連結テキストボックス(社員名,ID,パスワード,誕生日)などを入力した後,登録のボタンをクリックし,社員テーブルにデータを格納したいと考えています.

とのことですが、どうして「非連結」と考えたのでしょうか?
連結しておけば自動的にかかれますけど?
・ツリー全体表示

【9829】フォームからテーブルにデータを格納する...
質問  ららぽ  - 07/9/10(月) 13:43 -

引用なし
パスワード
   はじめまして,フォームからテーブルにデータを格納の仕方はどうすればいいのでしょうか?
具体的には,非連結テキストボックス(社員名,ID,パスワード,誕生日)などを入力した後,登録のボタンをクリックし,社員テーブルにデータを格納したいと考えています.
勉強不足ですみません,よろしければ教えてください.
・ツリー全体表示

【9828】Re:VBAの型指定について
発言  ひろ  - 07/9/10(月) 12:18 -

引用なし
パスワード
   ご回答ありがとう御座います。

返信遅くなりました事お詫び申し上げます。


又、解決しておりません

このテキストボックスは、非連結コントロールでです

又、基値は前画面がありそこからホームのロード処理時に
値を取得しています

取得値は「20070910」みないな型の値です

書式などは扱ってはいません。
・ツリー全体表示

【9827】Re:数値型データの抽出です
回答  hatena  - 07/9/10(月) 11:33 -

引用なし
パスワード
   > これと同じような形で、数値型のレコードを抽出できるように
> したいのですが☆のところはどのように記述すればよいのでしょうか?

数値型の場合は何も付加する必用はありません。

stFil = "[フィールド名]=" & コンボ31
・ツリー全体表示

【9826】Re:2テーブル共通のレコード検索について
発言  hatena  - 07/9/10(月) 10:23 -

引用なし
パスワード
   補足させてください。

>>CREATE UNIQUE INDEX index1 ON テーブルB (事業者NO, 営業所NO, 顧客NO, 入場証NO);
>
>も、いつでも使えるようにしておいたほうがよさそうですね!!

複数フィールドインデックスは、上記の方法でもできますが、
テーブルのデザインビューで、メニュー[表示]-[インデックス]
をクリックして、

インデックス名 フィールド名 並べ替え順序
------------------------------------------
index1     事業所NO   昇順
        営業所NO   昇順
        顧客NO    昇順
        入場証NO   昇順

インデックスプロパティ
主キー  いいえ
固有   はい
Null無視 いいえ

というように設定しても可能です。
・ツリー全体表示

【9825】数値型データの抽出です
質問  ゆっぴぃ  - 07/9/9(日) 23:37 -

引用なし
パスワード
   また来てしまいました。ゆっぴぃです。
以前のものとはまったく別の質問があるのですが・・・。


レコードの一覧が表示されているフォームがあって
その欄外に抽出語を入力するコンボボックス(コンボ31)があり
そのコンボの更新後処理に

Dim stFil as String
If コンボ31 <> "" Then
  If stFil <> "" Then
  stFil = stFil & " and" & "[顧客名]='" & コンボ31 & "'"
  Else
  stFil = "[受払種類]='" & コンボ31 & "'"  ☆
  End If
End If
Me.Filter = stFil
Me.FilterOn = True

という記述がしてあります。
この他にも検索語を入力するところがいくつかあり
それら複数の条件に一致するレコードを更新後に抽出できるように
なっているわけです。


これと同じような形で、数値型のレコードを抽出できるように
したいのですが☆のところはどのように記述すればよいのでしょうか?

↑は[受払種類]がテキスト型の場合の書き方なんですよね??
日付の場合には#を使うのでしょうが、ではたとえば[顧客NO]のように
数値型(テーブルで確認したらLongでした)の場合にはどうなるのかと・・・

↑をそのまま数値型のフィールドに使ったらデータ型エラーか
Me.Filter = stFilのところで『直前でキャンセルされました』といった
内容のエラーが表示されてうまくいきません。


単純にデータ型が原因なのかと勝手に想像してるんですけど・・・
どなたか教えてください!お願いします。
・ツリー全体表示

【9824】Re:2テーブル共通のレコード検索について
お礼  ゆっぴぃ  - 07/9/9(日) 14:16 -

引用なし
パスワード
   小僧 さんへ

できました!!
最終的には更新クエリで処理するようにしたのですが

>CREATE UNIQUE INDEX index1 ON テーブルB (事業者NO, 営業所NO, 顧客NO, 入場証NO);

も、いつでも使えるようにしておいたほうがよさそうですね!!

いろいろ教えていただいてありがとうございました!
・ツリー全体表示

【9823】Re:2テーブル共通のレコード検索について
回答  小僧  - 07/9/9(日) 7:02 -

引用なし
パスワード
   ▼ゆっぴぃ さん:
こんにちは。

>2.〜5.すべてが同じということは絶対にありません。


という事でしたら

CREATE UNIQUE INDEX index1 ON テーブルB (事業者NO, 営業所NO, 顧客NO, 入場証NO);

で4つのフィールドを合わせて一つの Unique なキーにして、


SELECT テーブルB.ID,
テーブルB.来場確認
FROM テーブルA
INNER JOIN テーブルB
ON (テーブルA.入場証NO = テーブルB.入場証NO) AND
(テーブルA.事業者NO = テーブルB.事業者NO) AND
(テーブルA.営業所NO = テーブルB.営業所NO) AND
(テーブルA.顧客NO = テーブルB.顧客NO);


で更新可能なクエリになりそうです。


また、レコードセットを開かなくても

UPDATE テーブルA
INNER JOIN テーブルB
ON (テーブルA.入場証NO = テーブルB.入場証NO) AND
(テーブルA.顧客NO = テーブルB.顧客NO) AND
(テーブルA.営業所NO = テーブルB.営業所NO) AND
(テーブルA.事業者NO = テーブルB.事業者NO)
SET テーブルB.来場確認 = "来場しました";


のような更新クエリで、1発更新も可能です。
更新クエリを使うのであればIndex を付けなくても良さそうですね。
・ツリー全体表示

【9822】Re:2テーブル共通のレコード検索について
質問  ゆっぴぃ  - 07/9/8(土) 22:56 -

引用なし
パスワード
   小僧 さん、ご丁寧にありがとうございます。
やっぱりインデックスはつけれないということなのかな。。。

それでは申し訳ないのですがお言葉に甘えさせていただきます。


テーブルA

フィールド名  データ型     インデックス
1.ID      オートナンバー  はい(重複なし)
2.事業者NO   数値型      はい(重複あり)
3.営業所NO   数値型      はい(重複あり)
4.顧客NO    数値型      はい(重複あり)
5.入場証NO   数値型      はい(重複あり)


テーブルB

フィールド名  データ型     インデックス
1.ID      オートナンバー  はい(重複なし)
2.事業者NO   数値型      はい(重複あり)
3.営業所NO   数値型      はい(重複あり)
4.顧客NO    数値型      はい(重複あり)
5.入場証NO   数値型      はい(重複あり)
6.来場確認   テキスト型


テーブルAおよびテーブルBの2.〜5.を比較し、すべての
データが一致した場合のみテーブルBの6.に『来場しました』の文字列を
入れたいと思います。
それぞれのテーブルの各フィールドには同じ数値が入ることもありますが、
2.〜5.すべてが同じということは絶対にありません。


ここに記入したことが小僧さんの言われる《テーブルの情報》になって
いるのかどうかわかりませんが、とりあえず書かせていただきます。
よろしくお願いします。
・ツリー全体表示

【9821】Re:2テーブル共通のレコード検索について
回答  小僧  - 07/9/8(土) 17:50 -

引用なし
パスワード
   ▼ゆっぴぃ さん:
こんにちは。

>>ID と 品名 の2フィールドで Uniqueである(他のレコードと絶対に被らない)事を
>>テーブルに明示的に書いてあげないと更新ができません。

>とのことですが、これはフィールドの中に同じ値があってはいけないということ
>なのでしょうか?

ID の中で重複、品名の中で重複は許されますが、
IDと品名を合わせると重複は許されない、という事ですね。

ID 品名
1 りんご
2 りんご
2 なし
2 なし    ← これはダメ


例として、

テーブルA
ID  品名  価格
1 りんご  100
2 みかん   50
3 なし   150


テーブルB
ID  品名  価格
1  りんご null
3  ぶどう null
1  りんご null


SELECT テーブルB.ID, テーブルB.価格
FROM テーブルA
LEFT JOIN テーブルB
ON (テーブルA.ID = テーブルB.ID) AND (テーブルA.品名 = テーブルB.品名)
WHERE テーブルB.ID Is Not Null;

ID 価格
1  null
1  null


このような状態になると、価格フィールドを更新したくても
テーブルBのどちらのレコードなのかという区別がつかないため、
一意制約が必要となります。
(前回の回答ではテーブルAにもIndexをつけましたが、
正確にはテーブルBのみIndexをつければ更新は可能です。)


>重なるデータがある場合にはインデックスは使えない・・・のかな??

結合しているフィールド(上記例の場合はID、品名)に
重複がある場合は Index を使う方法はできませんね。


データの中身は適当で良いので
ゆっぴぃさんの使っているテーブルの情報をご提示して頂くと
もうちょっとピンポイントな回答ができるかもしれません。
・ツリー全体表示

【9820】Re:2テーブル共通のレコード検索について
質問  ゆっぴぃ  - 07/9/8(土) 15:20 -

引用なし
パスワード
   またまた丁寧な回答ありがとうございます。

えっと・・・


>ID と 品名 の2フィールドで Uniqueである(他のレコードと絶対に被らない)事を
>テーブルに明示的に書いてあげないと更新ができません。

とのことですが、これはフィールドの中に同じ値があってはいけないということ
なのでしょうか?

実は教えていただいたものを基に作ったSQLは、実際にはフィールドが4つあって
個々のフィールド内で同じ値を持つものはたくさんあります。
けれど4つのフィールドすべてが同じというレコードはないのです。
重なるデータがある場合にはインデックスは使えない・・・のかな??

それにしても、SQLでインデックスって設定できるんですね。
テーブルでやる方法しか知りませんでした。
Accessは奥が深いなぁ〜。私もまだまだです^^
・ツリー全体表示

【9819】Re:2テーブル共通のレコード検索について
回答  小僧  - 07/9/8(土) 11:52 -

引用なし
パスワード
   ▼ゆっぴぃ さん:
こんにちは。

> そういえば、選択クエリは2つ以上のテーブルからフィールドを選択した場合
> 更新とかはできなかったような気がします。

そんな事はありませんよ^^

そのクエリで更新するとデータベースにとって不都合が
出てしまう可能性がある、という事で拒否されていますね。

今回の例では
ID と 品名 の2フィールドで Uniqueである(他のレコードと絶対に被らない)事を
テーブルに明示的に書いてあげないと更新ができません。

CREATE UNIQUE INDEX index1 ON テーブルA (ID, 品名);
CREATE UNIQUE INDEX index1 ON テーブルB (ID, 品名);

上記2つのSQLを実行してあげると、
ゆっぴぃさんのプログラムでも更新が可能になるかと思われます。


また、上記SQLの操作は

テーブルをデザインビューで開く ⇒ ツールバーの [表示] から
[インデックス] を開く事で手動で設定する事も可能ですね。
・ツリー全体表示

【9818】Re:2テーブル共通のレコード検索について
質問  ゆっぴぃ  - 07/9/8(土) 11:22 -

引用なし
パスワード
   小僧 さん・・・
やっぱりできませんでした。


SELECT テーブルA.ID, テーブルA.品名
FROM テーブルA
LEFT JOIN テーブルB
ON (テーブルA.品名 = テーブルB.品名) AND (テーブルA.ID = テーブルB.ID)
WHERE テーブルB.ID Is Not Null;

教えていただいたSQLはこれです。
実際にはテーブルBの価格を更新したいので

SELECT テーブルA.ID, テーブルA.品名, テーブルB.価格
FROM テーブルA
LEFT JOIN テーブルB
ON (テーブルA.品名 = テーブルB.品名) AND (テーブルA.ID = テーブルB.ID)
WHERE テーブルB.ID Is Not Null;

のようにSELECTの一番後ろに更新したいフィールドを追加しました。


そしてそのフィールドに【100】という数字を入れてみようと思ったので

Dim stSQL as string
Set rs = db.OpenRecordset(stSQL, dbOpenDynaset)
rs.MoveFirst
Do Until rs.EOF
  rs.Edit
  rs.価格 = 100
  rs.Update
Loop

と記述してみたのですが・・・
rs.Edit のところで
《実行時エラー3027
データベースまたはオブジェクトは読み取り専用なので、更新できません。》
と表示されます。

そういえば、選択クエリは2つ以上のテーブルからフィールドを選択した場合
更新とかはできなかったような気がします。


教えていただいたコードの後はどのように書けばよかったのでしょうか?
それともSQLの追加の方法が間違っていたのでしょうか。

質問ばかりで申し訳ないのですがぜひとも教えてください!
・ツリー全体表示

【9817】Re:2テーブル共通のレコード検索について
質問  ゆっぴぃ  - 07/9/7(金) 22:44 -

引用なし
パスワード
   小僧 さんへ

お返事ありがとうございます。
教えていただいた、まさにそれがやりたいことです♪
とはいえまだできたわけではないのでまた質問をさせていただくかもです。
そのときはまたお願いします。

ありがとうございました!!
・ツリー全体表示

【9816】Re:画像ファイルを参照して開きたい
回答  ちん  - 07/9/7(金) 19:56 -

引用なし
パスワード
   こんばんは、ちんといいます。

ファイル名の間にSpace文字があると認識しなくなると思われます。
""もしくは'で囲んで試してください。

Call Shell("""C:\Program Files\Common Files\Microsoft Shared\PhotoEd\PHO
TOED.EXE"" D:\フォルダ1\" & strFile & ".jpg", vbNormalFocus)

もしくは、'シングルコーテーション
Call Shell("'C:\Program Files\Common Files\Microsoft Shared\PhotoEd\PHO
TOED.EXE' D:\フォルダ1\" & strFile & ".jpg", vbNormalFocus)

参考までに・・・
・ツリー全体表示

【9815】Re:VBAの型指定について
回答  Gin_II  - 07/9/7(金) 18:15 -

引用なし
パスワード
   > フォーム【F】に【A】と言うテキストがあり

このテキストボックスは、連結コントロールでしょうか?
そうであれば、連結しているテーブルのフィールド型は、日付/時刻型以外に
なっていませんか?(テキスト型?)

だとした場合、

> また原因も教えていただければ幸いです

定型入力プロパティを設定する前に入力したものが、

>   1.20070907

設定後に入力したものが、

>   2.2007年09月07日

となっているとか。

そうであれば、対応策としては、更新クエリを使って「年月日」を
入れてやればいいですね。

UPDATE テーブル名
SET フィールド名 = Format(フィールド名,"@@@@年@@月@@日")
WHERE LEN(フィールド名) = 8

とか。
・ツリー全体表示

172 / 500 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
1083222
(SS)C-BOARD v3.8 is Free