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」のフォームを開く・・・というような動きです。
説明が下手で申しわけありません。
お願いします。
No.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
のようにすればよいと思います。
※ 呼ばれた側の処理は各フォームで必要になります。
※ 実際のものと違ったものでの説明になってしまいましたが、わかりましたでしょうか
※ 運送会社テーブル/顧客テーブルの構成は単なる説明上での例です。
実際にはもう少しテーブルを追加したり、例外など考慮されると思います。
No.3ベストアンサー
- 回答日時:
#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を開く・・・というようなことをしたいのですが・・・・。
30246kikuさん、ありがとうございます!
お恥ずかしいながら、本当に初心者で、ご回答頂いたことを理解するのにも精一杯な状況です・・・。
おそらく、Select Caseの方になるのかな?と思いますが、
解読しながら、当てはめてみます。
ありがとうございます!
また、疑問や補足等ありましたら、どうか宜しくお願い致します。
No.2
- 回答日時:
「請求データの入力フォーム」では、全社のデータを扱えられる様になっているとします。
「請求データの入力フォーム」を表示させる時に、顧客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/請求書番号は既定値として表示しているだけなので、他の項目を編集しないと登録されません。
No.1
- 回答日時:
現在自宅のため、記憶の範囲でお答えします。
フォームのボタン作成ウィザードでボタンを作成します。
フォームの操作→フォームを開く を選択。
特定のフォームを開く。を選択。
それで、開くフォームのリンクIDが選択できるはずです。
Access2003を使っているので、2000でこの機能が無ければゴメンナサイ。
inspire11さん、ありがとうございます。
2000でもおっしゃっている機能はありましたが、私が思っているのと同じ動きはしてくれませんでした・・・。
特定のCDは引き継げるのですが、そのCDから独立して存在するフォームをそれぞれ開くことは出来ませんでした。
私の設定がいけないのでしょうか・・・?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) access レポート 請求書について 2 2022/07/04 22:52
- その他(データベース) accessでのフォームの連携について 2 2022/06/14 00:45
- Visual Basic(VBA) VBAでPDFのアクティブページ番号取得 1 2023/05/25 12:41
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- 消費税 インボイスの事業者登録番号を仕入れ先から求められました? 3 2023/03/19 21:48
- その他(動画サービス) あるエッチ動画サービスのボタンを押し間違ったばかりに、なぜか会員登録完了という画面が出てしまいました 6 2023/05/07 21:56
- Access(アクセス) Access IF文でテーブルに存在しない場合の処理について 2 2022/10/10 18:09
- Visual Basic(VBA) 複数ページあるPDFファイル内の文字列等の情報をキーにPDFをグループ分け分割したい。 2 2022/06/25 09:51
- Visual Basic(VBA) VBA 請求書自動作成 3 2022/04/24 01:58
- 個人事業主・自営業・フリーランス インボイス制度は、クライアントごとに請求書を分ける事はできますか? 6 2023/04/03 14:22
このQ&Aを見た人はこんなQ&Aも見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
テキストボックスにクエリ結果を表示させたい
その他(データベース)
-
ACCESS 入力フォームでテーブルへデータを複数追加する
Access(アクセス)
-
帳票フォームのなかにリストを表示させたい
Access(アクセス)
-
-
4
Accessでレコードを別テーブルへコピーするには
Access(アクセス)
-
5
レコードを保存するコード アクセスvba
その他(Microsoft Office)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Access VBAでクエリーのレコー...
-
Access フォームのデータがテー...
-
データベースの1要素に複数デー...
-
Access 既に開いているフォー...
-
テーブル1 2 3 の結合
-
Excel 2019 のピボットテーブル...
-
エクセルVBAで5行目からオート...
-
「直需」の意味を教えてください
-
Access テキスト型に対する指定...
-
BLOB型のPDF出力の方法
-
ACCESSのクエリで集計で、先頭...
-
作番ってどういう意味でしょうか?
-
エクセルグラフの凡例スペース
-
アクセス メモ型 255文字...
-
Oracle 2つのDate型の値の差を...
-
accessで重複を防ぎたい
-
Accessのリンクテーブルのパス...
-
Accessでテーブル名やクエリ名...
-
Accessレコードの追加や変更が...
-
3つの表を1つに縦に連結する
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access VBAでクエリーのレコー...
-
Access IF文でテーブルに存在し...
-
データベースの1要素に複数デー...
-
ワードでの単純作業の効率化に...
-
Access フォームのデータがテー...
-
ACCESS で マクロの中でフィ...
-
Accessデータベースで行と列を...
-
ワードで保存するファイル名の...
-
別のDBからテーブルをコピーす...
-
ADOでレコードを閉じるタイミン...
-
Accessで名寄せグループの関係...
-
シングルクォーテーションとダ...
-
Access 縦(行)のデータを横(列)...
-
Access クエリ このレコードセ...
-
顧客IDを入力すると顧客名や住...
-
(ACCESS)連番取得について
-
Access2000 単票フォーム上の...
-
Access 既に開いているフォー...
-
文字化け、記号の含まれるフィ...
-
Access2013VBA 複数のテーブル...
おすすめ情報