プロが教えるわが家の防犯対策術!

Accessの初心者です。
本当に超がつく初心者ですので、解説もしてくださるととても嬉しいです。
宜しくお願いします。



請求書番号連番を取得するフォーム(テーブルも)があります。
請求書番号は特殊な為、現時点ではじか打ちで作成しています。
それとは別に、顧客ごとに請求データを入力するフォーム(テーブルも)があります。
その二つは、請求書番号でひもづけています。



<請求書番号連番取得フォーム/帳票>
・請求書番号
・請求日
・顧客ID

<請求データの入力フォーム_A社/単票> ※これがB社、C社と複数存在します。
・顧客ID
・請求書番号
・商品CD


<請求書番号連番取得フォーム/帳票>上にボタンをつくり、そのボタンを押すと、
同じ顧客IDを持つ<請求データの入力フォーム/単票>が開けたらな・・・と思っているのですが、
わかりますでしょうか・・・・。

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



<請求書番号連番取得フォーム/帳票>
_________________________________________________________________
請求書番号|請求日 |顧客ID| 
_________________________________________________________________
09BB87ZZ1|2009/04/01|0001 |■(ボタン)
--------------------------------------------
09BS87AA2|2009/04/10|0003 |■(ボタン)
--------------------------------------------

↑この1行目の■(ボタン)を押すと、顧客ID「0001」の請求書番号「09BB87ZZ1」の単票フォームが開き、
(請求書番号欄に「09BB87ZZ1」が入っている。)
2行目の■(ボタン)を押すと、顧客ID「0003」のフォームを開く・・・というような動きです。


説明が下手で申しわけありません。
お願いします。

A 回答 (4件)

#2、#3です。



私も変に解釈しているかもしれないので
(#2、#3ミックスした方がよいかも)

フォームが複数あって、顧客IDがそれにぶら下がる、というのを以下で考えました。

運送会社が複数あって、その時の発送伝票を入力する。
顧客IDにより使う運送会社が違う。

運送会社A社 顧客ID 0001 / 0003 / 0005 など
運送会社B社 顧客ID 0002 など
運送会社C社 顧客ID 0004 / 0006 など
その他    顧客ID 0007 など

テーブル例
運送会社テーブル
運送会社ID, フォーム名, 運送会社名, ・・・

顧客テーブル
顧客ID, 運送会社ID, 顧客名, 住所, ・・・

という構成になっていたとして、

運送会社テーブル内容例
1, "フォームA", "XXXX運送"
2, "フォームB", "YYYY運送"
3, "フォームC", "ZZZZ運送"
4, "フォームD", "一般・・・"

顧客テーブル内容例
"0001", 1, "XXXX 一郎", "東京都・・・"
"0002", 2, "XXXX 二郎", "北海道・・・"
"0003", 1, "XXXX 三郎", "千葉県・・・"
"0004", 3, "XXXX 四郎", "大阪府・・・"
"0005", 1, "XXXX 五郎", "埼玉県・・・"
"0006", 3, "XXXX 六郎", "兵庫県・・・"
"0007", 4, "XXXX 七郎", "沖縄県・・・"

起動される側のフォームA / フォームB / フォームC / フォームD のレコードソースには、そのフォームを使用する顧客ID全てに対して表示できるように指定しておきます。
例えばフォームAの場合は、
SELECT 顧客ID FROM 顧客テーブル WHERE 運送会社ID=1;
で、フォームAを使用する顧客IDが抽出されます。
それを、請求データテーブルの顧客IDと結合させると、フォームAで扱う全データが得られます。

ただ単にフォームAを表示しただけでは、全てが表示されるので、フォームを起動する時点で絞込み指定します。
その指定部分が sWhere 部分になります。

>  sWhere = "顧客ID='" & Me.顧客ID & "' AND 請求書番号='" & Me.請求書番号 & "'"

顧客IDと請求書番号で絞込みを指定しますが、既に登録されていた場合はそのものが表示されます。
ここで問題としたのが、請求書番号が登録されていなかった場合、何も表示されません。
この時には、顧客IDと請求書番号を表示した新規レコードに移動してほしいと思ったので、顧客IDと請求書番号を ,(カンマ)区切りの文字列とし、呼ばれた側に教えてあげる方法として OpenArgs 部分を使用しました。

>  sArg = "'" & Me.顧客ID & "','" & Me.請求書番号 & "'"

(起動時に指定した sWhere は、呼ばれた側で Me.Filter の文字列として得ることができますが、そこから必要な部分を抜き出すのが面倒だったので)

呼ばれた側では、Me.OpenArgs で得られた文字列から、顧客IDと請求書番号を分離します。

>  vTmp = Split(Me.OpenArgs, ",")

vTmp(0) で顧客ID / vTmp(1) で請求書番号

でこれを、顧客ID/請求書番号のテキストボックスの既定値に設定し、新規レコードへ移動かけています。
既定値の設定は、値の代入ではないのでレコードは編集状態にはなりません。

sWhere / sArg の扱いは、#2の方がよいと思います。


>   If (Me.Recordset.RecordCount = 0) Then

の部分は表示対象のレコードが何件あるか、この時点でわかるので判別に利用。


また、運送会社テーブル構成で、フォーム名を持たない場合には、
顧客テーブルより、対象の顧客IDの運送会社IDを拾ってきて

  Select Case DLookup("運送会社ID","顧客テーブル","顧客ID='" & Me.顧客ID & "'")
    Case 1
        sForm = "フォームA"
    Case 2
        sForm = "フォームB"
    Case 3
        sForm = "フォームC"
    Case Else
        sForm = "フォームD"
  End Select

のようにすればよいと思います。


※ 呼ばれた側の処理は各フォームで必要になります。

※ 実際のものと違ったものでの説明になってしまいましたが、わかりましたでしょうか

※ 運送会社テーブル/顧客テーブルの構成は単なる説明上での例です。
 実際にはもう少しテーブルを追加したり、例外など考慮されると思います。
    • good
    • 0

#2です。



意味合いが違ってましたね。

「顧客ID」に対応した「フォーム名」情報がテーブルで作られているとします。
もしくは、「顧客ID」と A社、B社、C社 などが紐付けされ、その社ごとに「フォーム名」情報が得られるとすると

ボタンがクリックされた時の処理例)

Private Sub ボタン_Click()
  Dim sForm As String
  Dim sWhere As String
  Dim sArg As String

  sWhere = "請求書番号='" & Me.請求書番号 & "'"
  sArg = "'" & Me.請求書番号 & "'"
  sForm = DLookup("フォーム名","テーブル名/クエリ名","顧客ID='" & Me.顧客ID & "'")
  DoCmd.OpenForm sForm, , , sWhere, , , sArg
End Sub


呼ばれた各「請求データの入力フォーム」での処理

Private Sub Form_Open(Cancel As Integer)
  If (Me.Recordset.RecordCount = 0) Then
    Me.請求書番号.DefaultValue = Me.OpenArgs
    DoCmd.GoToRecord , , acNewRec
'☆    Me.ラベル1.Caption = "新規"
'☆  Else
'☆    Me.ラベル1.Caption = "既存"
  End If
End Sub


※「顧客ID」に対応した「フォーム名」情報ではなく、「会社名」なり「会社ID」が得られるのであれば以下のような感じかと
(会社IDが得られるとした場合)

Private Sub ボタン_Click()
  Dim sForm As String
  Dim sWhere As String
  Dim sArg As String

  sWhere = "請求書番号='" & Me.請求書番号 & "'"
  sArg = "'" & Me.請求書番号 & "'"
  Select Case DLookup("会社ID","テーブル名","顧客ID='" & Me.顧客ID & "'")
    Case 1
        sForm = "請求データの入力フォームA"
    Case 2
        sForm = "請求データの入力フォームB"
    Case 3
        sForm = "請求データの入力フォームC"
    Case Else
        sForm = "請求データの入力フォームETC"
  End Select
  DoCmd.OpenForm sForm, , , sWhere, , , sArg
End Sub

この回答への補足

30246kikuさん、度々申し訳ありません。

どうも、「DoCmd.OpenForm sForm, , , sWhere, , , sArg」でひっかかって実行できませんでした。。。
仕組みがどうもわからなく、前記の呼ばれた各「請求データの入力フォーム」での処理~という意味すらわかりません・・。
これはどういう意味なのでしょうか?


単純に、あるコントロール(この場合、顧客ID)が「aaa」の場合にボタンを押すと、「フォームaaa」を開く、
bbbの場合はフォームbbbを開く・・・というようなことをしたいのですが・・・・。

補足日時:2009/05/11 14:01
    • good
    • 0
この回答へのお礼

30246kikuさん、ありがとうございます!

お恥ずかしいながら、本当に初心者で、ご回答頂いたことを理解するのにも精一杯な状況です・・・。
おそらく、Select Caseの方になるのかな?と思いますが、
解読しながら、当てはめてみます。
ありがとうございます!
また、疑問や補足等ありましたら、どうか宜しくお願い致します。

お礼日時:2009/05/11 13:28

「請求データの入力フォーム」では、全社のデータを扱えられる様になっているとします。


「請求データの入力フォーム」を表示させる時に、顧客ID/請求書番号 で絞込みします。
下記 sWhere 部分で生成&指定

絞込み後、レコード件数が0件だった場合、新規レコードに移動します。
その時、OpenArgs 経由で得られる、顧客ID/請求書番号 を既定値として表示します。
よって、請求書番号連番取得フォームでボタンをクリックする際、既にデータがあるかどうか気にせずに処理できます。


ボタンがクリックされた時の処理例)

Private Sub ボタン_Click()
  Dim sWhere As String
  Dim sArg As String

  sWhere = "顧客ID='" & Me.顧客ID & "' AND 請求書番号='" & Me.請求書番号 & "'"
  sArg = "'" & Me.顧客ID & "','" & Me.請求書番号 & "'"
  DoCmd.OpenForm "請求データの入力フォーム", , , sWhere, , , sArg
End Sub


呼ばれた側「請求データの入力フォーム」での処理

Private Sub Form_Open(Cancel As Integer)
  Dim vTmp As Variant

  vTmp = Split(Me.OpenArgs, ",")
  If (Me.Recordset.RecordCount = 0) Then
    Me.顧客ID.DefaultValue = vTmp(0)
    Me.請求書番号.DefaultValue = vTmp(1)
    DoCmd.GoToRecord , , acNewRec
'☆    Me.ラベル1.Caption = "新規"
'☆  Else
'☆    Me.ラベル1.Caption = "既存"
  End If
End Sub


※ '☆コメントは、新規/既存が対象なのか、ラベル表示する時の例
(「ラベル1」名のラベルを作成し、コメントを外した時有効)

※ 連結されていること、フィールド名とテキストボックス名が同じことが前提の例です。

※ 新規の場合、顧客ID/請求書番号は既定値として表示しているだけなので、他の項目を編集しないと登録されません。
    • good
    • 0

現在自宅のため、記憶の範囲でお答えします。


フォームのボタン作成ウィザードでボタンを作成します。
フォームの操作→フォームを開く を選択。
特定のフォームを開く。を選択。
それで、開くフォームのリンクIDが選択できるはずです。
Access2003を使っているので、2000でこの機能が無ければゴメンナサイ。
    • good
    • 0
この回答へのお礼

inspire11さん、ありがとうございます。

2000でもおっしゃっている機能はありましたが、私が思っているのと同じ動きはしてくれませんでした・・・。
特定のCDは引き継げるのですが、そのCDから独立して存在するフォームをそれぞれ開くことは出来ませんでした。
私の設定がいけないのでしょうか・・・?

お礼日時:2009/05/11 13:23

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

このQ&Aを見た人はこんなQ&Aも見ています