アプリ版:「スタンプのみでお礼する」機能のリリースについて

前回の質問させていただいたものですが、今だに完成できて
いないので、もう一度書き込みさせていただきます。
kurodai2様にご丁寧に返答いただいたのですが、
いかんせん小さい脳みそで。。質問も閉じてしまいましたので今一度。

ツアーNo.、ツアータイトル、ツアー情報、入力者氏名

があります。

現在、フォームを開く際に小さなフォームが出てきて、
「入力者の氏名」を入力します。格納する不可視の
テキストBOX「非入力者」があり、「入力者氏名」は
そこを見に行き、新しいレコードを開くたびに自動で氏名が
反映されます。のはずです。説明難しいですが。。

フォームで「ツアーNo.」を入力し、更新したら、「ツアータイトル」
と「ツアー情報」が自動で出てきます。これは前もって
ツアー情報テーブルで登録しています。


そこで、毎回同じ「ツアーNo.」、「ツアータイトル」、「ツアー情報」
の場合、入力の際ミスが出ますので、入力者氏名と同じ方法で
格納して反映しようと思っています。

まぁkurodai2様の教えなんですけど^^;
メモリーに格納ってのは難しかったのでこちらの方法でいこうと
思います。

自分なりにいじってみたんですけど、

Dim Textname As TextBox
Dim strmsg As String
Dim varname As Variant

Set Textname = Me.入力者表示
strmsg = "入力者氏名を入力して下さい"
varname = InputBox(strmsg)

'入力なき時は、フォームオープンをキャンセルします。
If varname = "" Then
Cancel = True

End If

Textname = varname

Set Textname = Me.ツアーNo
strmsg = "ツアーNoを入力して下さい"
varname = InputBox(strmsg)

'入力なき時は、フォームオープンをキャンセルします。
If varname = "" Then
Cancel = True

End If

Textname = varname

では、ツアーNo.に値は入れれませんとエラーがでます。
非連結のテキストボックス「非ツアーNo.」を作り、それを指定したら
入りました。

非連結のテキストボックス「非ツアーNo.」にツアーNo.を入れ、
保存ボタン押したら「非ツアーNo.」から「ツアーNo.」へ値を
反映させるようにしたのですが、ボタンを押した時点では反映
されているのに、レコードが切り替わったらブランクに
なってしまいます。たぶんそういう設定にしているのでしょうけど、
どこをいじっていいのか。。
しかもツアーNo.へ値を反映させても値のみが反映され、
「ツアータイトル」と「ツアー情報」が空白のままになって
しまいます。
もうなにがなんだか。。

知識と文章力のなさで、暗号を解くみたいになりましたが、、、。
ご理解いただける方、宜しくお願いいたします。

A 回答 (7件)

いろいろとやり方はありますが、


保存ボタンクリックのソースが出てますので
その中だけで、現在の値を保存、新レコードにして画面上の部品に
退避した値をセットするように書いてみました。

Private Sub 新規データ保存_Click()

Dim 保存ツアーNo As Integer
Dim 保存ツアータイトル As String
Dim 保存ツアー情報 As String

保存ツアーNo = Me!ツアーNo
保存ツアータイトル = Me!ツアータイトル
保存ツアー情報 = Me!ツアー情報

Me.入力者書込み.Value = Me.入力者表示.Value
Dim strmsg As String
strmsg = "データの保存が完了しました。"

CkPoint = False 'CKPointをFalseに変更します。
MsgBox strmsg, vbInformation


DoCmd.GoToRecord , , acNewRec
Me!ツアーNo = 保存ツアーNo
Me!ツアータイトル = 保存ツアータイトル
Me!ツアー情報 = 保存ツアー情報
DoCmd.GoToControl "自宅電話番号"

End Sub

登録と同時に、新規レコード上に該当項目がセットされます
(無条件に、入力状態になります それが不味ければ、保存用の変数をフォームモジュールの
上部へもって行き、 Private Sub Form_BeforeInsert(Cancel As Integer)
内で、部品上にセットする。
このときは、どれかの項目を入力した瞬間に、セットされる。

しかしながら、この処理があります

Private Sub ツアーNo_AfterUpdate()

If Me![招待者ID] = 0 Then
Me![招待者ID] = Nz(DMax("招待者ID", "旅行招待者管理テーブル")) + 1
End If

招待者IDの扱いがわかりませんが、自動でセットすると、この部分は処理しないと思います。
意味合いが見えませんが、適時必要な箇所へ同等の処理を記載する必要があるかもしれません。

この回答への補足

回答ありがとうございます!

これはこのままコピペでいけるんですかね?
保存ツアーNo = Me!ツアーNoの場所で型が一致しませんって出ました。
ツアーNoって名前はあってるんですけど。。

補足日時:2007/07/20 14:04
    • good
    • 0

もともと


>If Me![招待者ID] = 0 Then
>Me![招待者ID] = Nz(DMax("招待者ID", "旅行招待者管理テーブル")) + 1
>End If
は、ツアーNOを入力した時に、処理されているのです。
今回、自動でセットした関係でこの処理を通らないのが問題だったのですが・・
もしかしたら、別なところで同様の処理があるのかもしれないですね。

>あっても問題ないなら残しておいたほうがいいのでしょうか。
ツアーNoを入力し直した時には、処理されます。
現在ある処理ですので 置いておいた方が無難ですね。

私には、システムそのものが見えませんので、正確な判断は付きませんので 最終的には 色々テストされ 登録されるデータでご判断ください。
    • good
    • 0
この回答へのお礼

了解しました!

なんか、ほんまにありがとうございます。
わからないなりにもできた時の感動はすごいですね。

またいろいろと質問させていただくことがあるかと思いますが、その節は宜しくお願いいたします。

ありがとうございました!

お礼日時:2007/07/20 18:20

空白で、エラーにかからないようにしても問題ないとは思います。


なぜならば、現に空白でも ボタンが押せてその処理を通るわけですから
たぶん、テーブルの必須項目かなにかで、登録できないのではないかと考えます。
もともとそうだったので、追加した部分で発生するエラーは、
対応した書き方でも、よいと思います。

それよりも、本来ツアーNOを入力をした時の

If Me![招待者ID] = 0 Then
Me![招待者ID] = Nz(DMax("招待者ID", "旅行招待者管理テーブル")) + 1
End If

この処理ですね・・

ツアーNOを入れたときに、招待者IDが0であれば、旅行招待者管理テーブルの招待者ID+1の値を
採番して画面上にセットしていますね。

以降、招待者IDを触ることが無いのであれば、同じく
Private Sub 新規データ保存_Click()
の最初に持って行ってもよいでしょうが・・
(クリックするまで、招待者IDは自動採番されないので0のままですが)

全体がわからないので、こうあるべきと言う判断は付きませんが
何れにしても、この3行を無視するわけにはいかないと思いますので
対応は必要ですね。

この回答への補足

なんなんでしょうか。。。

一応招待者IDはオートナンバーで連番になっているんです。
今回の改造をした後も普通に連番でいけているのですが。

実はこれいらないとかいうオチでしょうか。。。

補足日時:2007/07/20 17:21
    • good
    • 0
この回答へのお礼

f Me![招待者ID] = 0 Then
Me![招待者ID] = Nz(DMax("招待者ID", "旅行招待者管理テーブル")) + 1
End If

ためしにこれを削除してやってみたのですが、とくに問題がなさそうなんです。。団体IDはちゃんと連番になりますし。

あっても問題ないなら残しておいたほうがいいのでしょうか。

お礼日時:2007/07/20 17:29

>一番最初にタイトルが空白の状態で保存ボタンを押すとNullが不正だとでます。

これの対処の仕方をお願いいたします!

ツアーIDを入力すると、タイトル・情報が参照表示される。
(でたらめなツアーIDを入力すると”該当データがありません。確認してください”)
とメッセージが、表示されるようになっていたので
必ず正しいツアーIDを入力するものと思いましたが?
また、本来最初に入力しようとしたのも その意味では無かったのでしょうか?

よくわかりませんが、タイトル・情報が空白の場合もあるとして

保存ツアータイトル = iif(isnull(Me!ツアータイトル),"",Me!ツアータイトル)
保存ツアー情報 = iif(isnull(Me!ツアー情報),"",Me!ツアー情報)

もしかして、一番最初に このボタンを押して入力状態ですかね・・
    • good
    • 0
この回答へのお礼

いや、おっしゃるとおりです^^;
よくわからんこと言いました。。

フォームを開いた最初の画面では、タイトルと情報はブランクとなっています。普通ならちゃんとしたNo.を入力して保存するのですが、バイトが大勢で入力をするので、誤ってエラー出してコードの画面を見せたくないって思ったのです。

でもブランクの状態で保存ができたら本末転倒ですね^^;すみません。

ほんとにわけわからない文章にお付き合いいただきありがとうございました。貴重なお時間感謝いたします!

お礼日時:2007/07/20 15:12

>保存ツアーNo = Me!ツアーNoの場所で型が一致しませんって出ました。



ツアーNoのコントロールソースに対応する項目は テーブルでは
どのデータ型になっていますか?
NOなので、短絡的に数値と判断したのですが、もしテキスト型であれば
Dim 保存ツアーNo As Integer

Dim 保存ツアーNo As String
にしてください。
他の型であれば、それにあった型で宣言してください。

この回答への補足

クリアしました!

つ、次は
保存ツアータイトル = Me!ツアータイトル
でNullの使い方が不正ですとなります。

ほんまにすみません。。

Private Sub ツアーNo_AfterUpdate()

If Me![招待者ID] = 0 Then
Me![招待者ID] = Nz(DMax("招待者ID", "旅行招待者管理テーブル")) + 1
End If

DoCmd.SetWarnings False '警告メッセージをオフにします。
DoCmd.OpenQuery "ツアー情報抽出テーブル削除クエリ" ' 削除クエリーを実行します。

' 追加クエリーを実行します。
DoCmd.OpenQuery "ツアー情報抽出テーブル作成クエリ"
DoCmd.SetWarnings True '警告メッセージをオンに戻します。

Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim stCri As String
Set cn = CurrentProject.Connection
rs.Open "ツアー情報抽出テーブル", cn, adOpenDynamic, adLockOptimistic
'文字列型データ検索
stCri = "[ツアーNo]='" & ツアーNo & "'"
rs.Find stCri
'該当するレコードが無い場合は、メッセージボックスを表示し、抜け出す
If rs.EOF Then
MsgBox ("該当データがありません。確認してください!!")
Else
Me!団体名 = rs!団体名
Me!ツアータイトル = rs!ツアータイトル

End If
rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing

End Sub


これと何か関係があるのでしょうか?

補足日時:2007/07/20 14:29
    • good
    • 0
この回答へのお礼

うそです!!!!

できました!”1!!

一番最初にタイトルが空白の状態で保存ボタンを押すとNullが不正だとでます。これの対処の仕方をお願いいたします!

お礼日時:2007/07/20 14:43

kurodai2です。


前回のは、難しかったですか・・

>非連結のテキストボックス「非ツアーNo.」にツアーNo.を入れ、
>保存ボタン押したら「非ツアーNo.」から「ツアーNo.」へ値を
>反映させるようにしたのですが、ボタンを押した時点では反映
>されているのに、レコードが切り替わったらブランクに
>なってしまいます。たぶんそういう設定にしているのでしょうけど、
>どこをいじっていいのか。。

この切り替わったら・・と言うのは 新しいデータの入力になったら
と言うことですか?

そうであれば、当然そうなります。
なぜならば、保存のときにツアーNOを入れていますので
新しいデータになった時には、空の状態ですね。
新しいデータの入力状態になったときに、ツアーNOが入っている
ようにするには、保存ボタンを押したときではなく(このイベント時に
ほかにどのような操作をしているのかも不明ですね)
Private Sub Form_BeforeInsert(Cancel As Integer)
のタイミングですね。

>しかもツアーNo.へ値を反映させても値のみが反映され、
>「ツアータイトル」と「ツアー情報」が空白のままになって
>しまいます。
そもそも、ツアーNOを入力すると言うことから考えると
「ツアータイトル」「ツアー情報」の情報がマスタ化されてるのでしょう。
そうなると、画面上の「ツアータイトル」と「ツアー情報」は表示
されているだけで、入力項目でも、データとして格納される項目でもないと
思うのですが・・

ツアーNOの入力間違いがあると言うことであれば、コンボボックスではない
と考えます。
そうなると、ツアーNOを入力したときに、ツアーマスターを
参照して、「ツアータイトル」「ツアー情報」を取得している場所が
あるのではないですか?

新規データ入力になった時にツアーNOをセットするようにすれば
その処理を通るのか? 
通らないのであれば、セットした時にその処理をしてやるようにすれば
よいと思いますが

ただ・・コードだけ入力して、名称を参照表示させているとしても
間違っていれば、表示されないか 他の名称が表示されるので
基本的には入力時に即 気がつくと思うのですが・・

入力対象のテーブルの構成と、画面の部品の種類
(テキストボックスなのかコンボなのか)を含め、
もう少し情報を出されたほうがわかりやすいですね。

この回答への補足

先日は本当にありがとうございました!
しつこく質問しまくって申し訳ありません。

とりあえず今現在はコンボボックスでなく、
テキストボックスになります。返答が遅れてしまいました。

前もってツアーNo.とツアータイトルとツアー情報を、
ツアー内容テーブルに入力しておきます。
フォームのテキストボックスにツアーNo.を入れたら、タイトルと
情報がでるようにしています。そのフォームで入力した全てのものが
入るテーブルに、その三つも入るようなっています


>新しいデータの入力状態になったときに、ツアーNOが入っている
ようにするには、保存ボタンを押したときではなく(このイベント時に
ほかにどのような操作をしているのかも不明ですね)
Private Sub Form_BeforeInsert(Cancel As Integer)
のタイミングですね。

クリック時に

Private Sub 新規データ保存_Click()

Me.入力者書込み.Value = Me.入力者表示.Value
Dim strmsg As String
strmsg = "データの保存が完了しました。"

CkPoint = False 'CKPointをFalseに変更します。
MsgBox strmsg, vbInformation


DoCmd.GoToRecord , , acNewRec
DoCmd.GoToControl "自宅電話番号"

End Sub

となっています。


タイミングが違うのですね^^;了解しました。


画面の部品ですが、ツアーNo.、タイトル、情報の上記の三つと
ツアーID、これは規定値にして新しいレコードになった際も
最後に入力したデータが反映されます。
あとは普通に個人情報です。氏名、電話番号、住所(郵便番号支援使用)です。


今現在のツアーNo.に入っているコードは以下です。

Private Sub ツアーNo_AfterUpdate()

If Me![招待者ID] = 0 Then
Me![招待者ID] = Nz(DMax("招待者ID", "旅行招待者管理テーブル")) + 1
End If

DoCmd.SetWarnings False '警告メッセージをオフにします。
DoCmd.OpenQuery "ツアー情報抽出テーブル削除クエリ" ' 削除クエリーを実行します。

' 追加クエリーを実行します。
DoCmd.OpenQuery "ツアー情報抽出テーブル作成クエリ"
DoCmd.SetWarnings True '警告メッセージをオンに戻します。

Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim stCri As String
Set cn = CurrentProject.Connection
rs.Open "ツアー情報抽出テーブル", cn, adOpenDynamic, adLockOptimistic
'文字列型データ検索
stCri = "[ツアーNo]='" & ツアーNo & "'"
rs.Find stCri
'該当するレコードが無い場合は、メッセージボックスを表示し、抜け出す
If rs.EOF Then
MsgBox ("該当データがありません。確認してください!!")
Else
Me!ツアー情報 = rs!ツアー情報
Me!ツアータイトル = rs!ツアータイトル

End If
rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing

End Sub

補足日時:2007/07/20 10:05
    • good
    • 0

QNo.3143864 から見ていますが、どうも方向が違うように思えてなりません。



>基本同じコードを使用し、一回一回コードを入力していました。
>やはり人間の手によるものですから間違いがあり、
>違うコードを入力してしまうと行方不明になってしまうのです。

この対策は重要ですが、「そのために入力回数をへらす」のではなく「誤ったコードは入力できない」ようにするべきです。その上で入力者の負担軽減を考えるのが良いでしょう。

それではどうするか?
選択対象が多くない場合はコンボボックスが便利です。
Armadillo5さんが使用しているテーブルやフィールドの名前が判らないので一応
ツアーマスター(Table)
ツアーNo、ツアータイトル、ツアー情報(Field)

ツアー記録(Table)
ツアーNo、入力者ID(Field)

と仮定します。フォームのレコードソースは
SELECT ツアー記録.入力者ID, ツアー記録.ツアーNo
FROM ツアー記録;

コンボボックスを貼り付け
1.テーブルまたはクエリーの値
2.ツアーマスター
3.ツアーNo
4.次のフィールドに保存する→ツアーNo
これで登録されているツアーNoしか選択できなくなります。同様にコンボボックスを作り3.のところだけを「ツアータイトル」に替えると、ツアーNoとツアータイトルが連動して変わります。ツアー情報も同様です。
最終の選択を次に反映させたければ

Private Sub Form_AfterUpdate()
stok_cd = Forms![フォーム1]![ツアーNo]
End Sub

Private Sub Form_BeforeInsert(Cancel As Integer)
Forms![フォーム1]![コンボ1] = stok_cd
End Sub

みたいなことでできるでしょう。

この回答への補足

なんとかできそうな気がしてきました。

ツアーNo.とツアータイトル、ツアー情報のテーブルが一つあり、
メインのテーブルにはそれらも入りますが、個人情報、つまり氏名、電話番号、住所など、ほかのデータも入ってきます。そうなるとフォームのレコードソースはどうなるのでしょうか??
今現在は全部のデータが集まるメインのテーブルの名前だけがレコードソースに入っているのですが。。。

あと、前にも教えていただいたのですが、stok_cdというのはこのまま使えばいいのですよね?CDを何かに置き換える必要はありませんよね?

補足日時:2007/07/20 09:52
    • good
    • 0
この回答へのお礼

↑の補足の補足になりますが、、。

ツアーNo.
ツアータイトル
ツアー情報
氏名
電話番号
住所

など、メインのテーブル(ツアー参加者テーブル)があり、
フォームで入力したものはタイトルも情報も含め
すべてこの中に入ります。
ツアーNo.で反映されるように、もう一つの(ツアーマスター)
のテーブルにツアーNo.とツアータイトルとツアー情報が先に
登録してあります。

以下にもありますが、フォームのレコードソースは
「ツアー参加者テーブル」となっています。

お礼日時:2007/07/20 10:32

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

関連するカテゴリからQ&Aを探す