FC2ブログ

スポンサーサイト 


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--/--/--

Category: スポンサー広告

TB: --  /  CM: --

top △

クロス集計表示上で入力 後編 


前記事の後編になります。

前回ではフォーム「F1」「F2」で、クロス集計を表示した状態で入力してみました。

kEnt147_F1

ただ、このフォームでは「品名」が最大でも5つまでの例となってました。
・「品番」数が5を越して・・・・とか
・「品番」全部じゃなく、必要なものだけ表示できて入力できればいいや・・・

等々であれば、メイン/サブの構成の方が楽は楽でしょ・・・・???

という事で、フォーム「F3M / F3S」の構成に・・・・

kEnt147_F3M
kEnt147_F3M_1 kEnt147_F3M_2 kEnt147_F3M_3 kEnt147_F3M_D

サンプルファイルは、前記事からダウンロードできます。
 
メインフォーム「F3M」の作成

kEnt147_F3M_D

フォームをデザインから作っていきます。

・基本的なところをまず変更しておきます。(非連結のフォームとなります)
 ポップアップ「はい」、既定のビュー「単票フォーム」、レコードセレクタ/移動ボタン「いいえ」

・コントロールを配置していきます
詳細部に
a) 受付日入力用テキストボックス「txtDate」(書式:日付(S))
b) 表示品名選択用コンボボックス「cbx1」~「cbx5」
 コンボボックスの基本的な設定は、
 ・列数:2
 ・列幅:0cm;2.501cm
 ・値集合タイプ:テーブル/クエリ
 ・値集合ソース:SELECT 品番, 品名 FROM T品名 ORDER BY 品名;
 ・連結列:1
 ・入力チェック:はい
c) サブフォームコントロール「FSUB1」~「FSUB5」

処理の順としては、以下の様な感じです。

起動されたら
コンボボックス/サブフォームコントロールの初期化、およびイベントの処理を割付けます。
  For i = 1 To 5
    With Me("cbx" & i)
      .Value = Null
      .RowSource = SQLBASE1
      .AfterUpdate = "=CombChange(" & i & ")"
      .OnGotFocus = "=CombDrop()"
    End With
    With Me("FSUB" & i)
      .Visible = False
      .SourceObject = ""
    End With
  Next

コンボボックスに割り付けた関数は、(ここでは説明だけで、記述した内容は後述)
・フォーカスが得られたら DropDown 表示する様に・・・・
・値が変更されたら・・・・以下の処理を
 Null に変更されたら、サブフォームコントロールをクリア
 Null じゃなかったら・・・・
  選択された品番と日付を Tag に設定してから、サブフォームを設定
  複数あるサブフォームコントロールに表示したいサブフォームは1つなので、
  あなたは品番 xx について処理しなさい・・・・ これを Tag 経由で伝えます。
  サブフォームに組み込む時 DoCmd.OpenForm の様に OpenArgs で情報を伝える・・・・
  これが出来ないので・・・・
  今回渡す情報としてカンマ区切りで 品番,日付 の2つ。
  で、サブフォームを組み込みできたら、サブフォームで表示しようとしている高さに
  サブフォームコントロールの高さを合わせます。
  元々のフォーム「F3M」の高さは大きく取っていないので、フォームの高さも合わせて変更設定します。
  フォーム自体の高さは一度設定すれば用はすみますが、コンボボックスの値が変更された毎回に・・・
  (毎回設定し直ししても、速いので・・・・)
・値が変更されたことにより、他のコンボボックスで表示するリストを作り直します。

受付日が変更されたら、上記コンボボックスの処理を走らせます。

言葉での説明はこんなもので、VBAで記述したのは以下
Const SQLBASE1 As String = "SELECT * FROM T品名 ORDER BY 品名;"
Const SQLBASE2 As String = "SELECT * FROM T品名 WHERE 品番 Not In ({%1}) ORDER BY 品名;"


Private Function NotInId(iNum As Long) As String
  Dim i As Long
  Dim sS As String

  sS = ""
  For i = 1 To 5
    If (i <> iNum) Then
      If (Not IsNull(Me("cbx" & i))) Then sS = sS & "," & Me("cbx" & i)
    End If
  Next
  If (Len(sS) > 0) Then sS = Mid(sS, 2)
  NotInId = sS
End Function

Private Sub CombSet()
  Dim i As Long
  Dim sS As String

  For i = 1 To 5
    sS = NotInId(i)
    If (Len(sS) > 0) Then
      Me("cbx" & i).RowSource = Replace(SQLBASE2, "{%1}", sS)
    Else
      Me("cbx" & i).RowSource = SQLBASE1
    End If
  Next
End Sub

Private Function CombChange(iNum As Long)
  Dim i As Long

  If (IsNull(Me("cbx" & iNum))) Then
    With Me("FSUB" & iNum)
      .Visible = False
      .SourceObject = ""
    End With
  Else
    With Me("FSUB" & iNum)
      Me.Tag = Me("cbx" & iNum) & "," & Me.txtDate
      .SourceObject = "F3S"
      i = .Form.Section(acDetail).Height * DCount("*", "T営業") + 50
      Me.InsideHeight = .Top + i + 200
      .Height = i
      .Visible = True
    End With
  End If
  Call CombSet
End Function

Private Function CombDrop()
  Me.ActiveControl.Dropdown
End Function

Private Sub Form_Load()
  Dim i As Long

  For i = 1 To 5
    With Me("cbx" & i)
      .Value = Null
      .RowSource = SQLBASE1
      .AfterUpdate = "=CombChange(" & i & ")"
      .OnGotFocus = "=CombDrop()"
    End With
    With Me("FSUB" & i)
      .Visible = False
      .SourceObject = ""
    End With
  Next
  With Me.txtDate
    .Value = Date
    .ValidationRule = "Is Not Null"
    .ValidationText = "必ず入力してください"
  End With
End Sub

Private Sub txtDate_AfterUpdate()
  Dim i As Long

  For i = 1 To 5
    If (Not IsNull(Me("cbx" & i))) Then Call CombChange(i)
  Next
End Sub

Private Sub txtDate_DblClick(Cancel As Integer)
  DoCmd.OpenForm "F_DATE"
  Cancel = True
End Sub

 
 
サブフォーム「F3S」の作成

フォームをデザインから作っていきます。

・基本的なところをまず変更しておきます。(連結のフォームとなります)
 既定のビュー「帳票フォーム」、移動ボタン「いいえ」
 レコードソース:注意事項は後述
  SELECT Q1.受付時間, Q2.an, Q2.受付日, Q2.品番, Q2.数量 FROM
  T営業 AS Q1 LEFT JOIN
  (SELECT * FROM T受付 WHERE 受付日 Is Null) AS Q2
  ON Q1.受付時間=Q2.受付時間;

・コントロールを配置します

a) 受付時間用テキストボックス「txt0」(使用可能「いいえ」/編集ロック「はい」)
b) 数量用テキストボックス「txt1」(書式:数値)

処理の順としては、以下の様な感じです。

起動されたら、
過去記事でも紹介しましたが、サブフォームとして組み込まれていなかったら起動しないように・・・
組み込まれていたら、親フォームの Tag に自分が処理する 品番、日付が設定されているので、
それを元にレコードソースを正式なものに書き換え設定します。
テキストボックス「txt0」「txt1」のコントロールソースは設定していなかったので、ここで・・・

フォームの更新前処理で、
「txt1」(数量)部分を空白にされてしまうと、そのまま空白(Null)で登録されてしまうので、
数値を消す=削除 と解釈し、レコードセレクタ側から削除してもらうように・・・
また、「T受付」に登録する時に足りない「受付日」「品番」を、親から受け取った内容で設定・・・
Private Sub Form_BeforeUpdate(Cancel As Integer)
  If (IsNull(Me.数量)) Then
    MsgBox "削除はレコードセレクタをクリックして、Delキーで", vbCritical
    Cancel = True
    Exit Sub
  End If
  Me.受付日 = dt
  Me.品番 = iNo
End Sub

※ ここでですが、当初レコードソースは空で、Form_Open 時に正式なものを設定するから・・・
としていたのですが、
  Me.受付日 = dt
  Me.品番 = iNo
部分で見つからないよ・・・・のエラーに・・・・
フォームをデザインで保存した時点で解決されていないとダメなようで・・・・
なので、デザイン時のレコードソースは抽出するフィールドがあって、データ件数=0となるように・・・・

で、データをレコードセレクタで削除する時ですが、(過去記事でもやってましたが)
そのまま削除してしまうと、全受付時間を表示するために使っていた「T営業」の内容も消えてしまいます。
「T受付」側のレコードだけ削除されれば良いので、削除対象の「an」(オートナンバ)を覚えておいて、
一旦削除はキャンセル・・・・と Access さんを騙す感じで、削除後確認で「T受付」のみに削除を・・・・

言葉で説明すつとこんな感じで、記述した VBA は以下
Const SQLBASE As String = "SELECT Q1.受付時間, Q2.an, Q2.受付日, Q2.品番, Q2.数量 FROM " _
            & "T営業 AS Q1 LEFT JOIN " _
            & "(SELECT * FROM T受付 WHERE 受付日=#{%1}# AND 品番={%2}) AS Q2 " _
            & "ON Q1.受付時間=Q2.受付時間;"

Dim sDelAn As String
Dim iNo As Long
Dim dt As Date


Private Sub Form_Delete(Cancel As Integer)
  If (Not IsNull(Me.an)) Then
    sDelAn = sDelAn & "," & Me.an
  End If
End Sub

Private Sub Form_BeforeDelConfirm(Cancel As Integer, Response As Integer)
  Cancel = True
End Sub

Private Sub Form_AfterDelConfirm(Status As Integer)
  Dim sSql As String

  If (Len(sDelAn) > 0) Then
    sSql = "DELETE * FROM T受付 WHERE an IN (" & Mid(sDelAn, 2) & ");"
    CurrentProject.Connection.Execute sSql
    Me.Requery
  End If
  sDelAn = ""
End Sub


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

  On Error Resume Next
  If (Me.Parent.Name = "") Then Cancel = True
  If (Not Cancel) Then
    v = Split(Me.Parent.Tag, ",")
    iNo = v(0)
    dt = v(1)
    Me.RecordSource = Replace(Replace(SQLBASE, "{%1}", dt), "{%2}", iNo)
    Me.txt0.ControlSource = "受付時間"
    Me.txt1.ControlSource = "数量"
    sDelAn = ""
  End If
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)
  If (IsNull(Me.数量)) Then
    MsgBox "削除はレコードセレクタをクリックして、Delキーで", vbCritical
    Cancel = True
    Exit Sub
  End If
  Me.受付日 = dt
  Me.品番 = iNo
End Sub

 

ま、こんな感じでしょうか・・・・
関連記事

2013/02/10

Category: サンプルかな

TB: --  /  CM: 5

top △

この記事に対するコメント

ご質問ノ

はじめまして!!!
練乳と言います。
教えてgooより飛んできました^^

アクセスについて、ものすごく親切なご回答だったため、ご教授願いたいと思い、コメント(ご質問)させて頂きますm(_ _)m


アクセス2010を使っています。

病院食を取り扱う関係で、下記のような内容となっております。
まずはテーブル・・・

ID   提供日    提供時    品目     食種
1   2013/3/4   朝     味噌汁    並食
2   2013/3/4   朝     味噌汁    R並食
3   2013/3/4   朝     味噌汁    減塩H
4   2013/3/4   朝     味噌汁    減塩I
5   2013/3/4   朝     味噌汁    透析S



10  2013/3/4   朝     味噌汁    糖尿20
11  2013/3/4   朝    もろみ和え   並食
11  2013/3/4   朝    もろみ和え   透析S
11  2013/3/4   朝    もろみ和え   ミキサー食




・・・このようなかんじで並んでおります。
提供日時は配膳する日、提供時間は、朝・昼・夕のどれか、
品目は料理名、食種は専門調理法です。

毎日、3食分のデータを入力しなければならないので、
早く入力する方法を考えたところ、
フォームの食種を入力するコントロールをコンボボックス、もしくは
チェックボックスにすれば、かなり作業が早くなると思いました。

しかし、コンボやチェックを複数選択にした場合、
テーブルへの反映が困難であることに気づきました;;
ちなみに、テーブルの複数の値の許可を「はい」にすると、
今度はこのレコードを利用したクエリ等への反映が×となってきます・・・

説明が不足であると思います。必要なことは何でもご提供しますので、何卒お力をお貸し頂きたく、宜しくお願い申し上げます。

P.S. ここへのコメントでよかったのでしょうか・・・??

練乳 #- | URL | 2013/03/05 17:25 * edit *

Re:

コメントに気づくのが遅れました。
(コメントを頂いたのが、何年かぶりだったもので・・・)

どの記事でもコメントは OK です。
記事に関係なさそうなので、状況に特化した内容が欲しいのかと思います。

そのためには、最低、再現用のテーブルを解釈しながら作成して・・・が必要になります。
(回答する時には良くやってますが)
今回は、フォームのイメージ・操作のイメージも必要だと思います。
これらについては、差し支えない範囲でサンプルファイルがあった方がアドバイスは速くなると思います。

現在、部分的に使いたい機能の原型は、記事内容作成中ですが・・・・次の記事(149)になります。
(サンプルファイルは10日以上前に出来上がってましたが)
(実は、次の次のサンプルファイルも出来上がっていて・・・・・文章は後で後で・・・の弊害?)

まず、解釈できていない箇所は

・「品目」「食種」は、文字だけ?
 例えば、フィールド「品目ID」「品目名」の別テーブルがある・・・とかないとか

・「品目」「食種」は、単に掛け合わせるだけで良い?
 例えば「食種」として以下を表示していて

 並食
 R並食
 減塩H
 減塩I
 透析S
 糖尿20
 透析S
 ミキサー食
 ・・・・
 ・・・

 チェックボックスで選択して
 その後、「品目」で選んだ、「味噌汁」「もろみ合え」・・・と、単に掛け合わせ生成して OK?
 それとも、「品目」を選んだら選択する「食種」は変わる?

・「食種」で表示するものは、患者さん(?)の有無で変化する?
 他テーブルを解釈する必要がある?

・「登録」に特化して良い?


現在の私のイメージでは、フォームに必要な部品を考えて見ると、

テキストボックス:提供日
コンボボックス:提供時(朝、昼、夕 の値リスト)
リストボックス or サブフォーム:品目
サブフォーム:食種
コマンドボタン:登録
★サブフォーム:登録結果を一覧で確認できるもの

メインは非連結単票
★サブフォームは、該当テーブルの帳票表示で、リンク親/子フィールドに 提供日;提供時
品目、食種のサブフォームは、次の記事のを流用変更

次の記事は、頑張って文章を書こうと思っていますが・・・・近日公開ってことで

ただ、上記構成が、考えられていた操作/画面イメージになっているかとか・・・わかりません。

原型となるサンプルファイルが欲しいのですが、ファイルを添付できる掲示板を
hatena さんが用意されてますので、そちらを使う・・・っていう方法があります。
他の方からの回答もあるかもしれません。
実現する方法は1つではないので、いろいろな方法を知ることが出来るかもしれません。
また、作成したサンプルを渡すことが出来ます。
(私のは 2000 / 2003 / 2007 ですので、それで確認できるものに・・・)
※ データはサンプル用のデータにしてください

hatena の Microsoft Access 掲示板
http://hatena-access.progoo.com/bbs/

ただ、既に質問を投稿されているようですのでマルチポストになります。
回答が付いてなければ、質問を削除後、上記を利用する・・・・でも

操作イメージ・画面イメージ関係なく、それらしい方法だけで良ければ、
ここで続けても良いですし・・・

※ どこででも同じですが、すぐの回答は期待しないでください。

kiku #1a/xiM.Q | URL | 2013/03/06 09:12 * edit *

ご回答有難うございました。

http://rennewkai.r-estate-site.com/wordpress/?page_id=129

ご回答有難うございました。
自分のブログに固定ページを作成しましたので、そこに写真等記載して説明させて頂きました。。
(ブラウザゲームに関するブログですが、そこは気にしないで下さい^^)

このアクセスデータはご提供しても問題無いテストデータですので、いつでもお渡し可能です。現在3Mbくらいですが・・・

http://okwave.jp/qa/q7977920.html
上記に投稿してしまいましたが、もしkikuさんが居なかったら・・・と思って心配になり投稿してしまった次第です・・・

ご指示があればhatenaさんのところにデータを添付致します。

ちなみにですが、サブフォームについては詳しく理解していない部分がありますので、勉強してみます^^

以上、宜しくお願い申し上げます。

練乳 #- | URL | 2013/03/06 11:52 * edit *

Re:

コメントがあったとは、知らずに・・・・

次に予定していた記事を、急遽作成しました。
記事後半に、変更点等まとめておきました。
やりたいイメージがわからないまま記述していますので、そちらの環境に合うものか??
良い悪いの判断してみてください。

悪かったら、改めて 情報を参照したいと思います。

コメントで頂いた文章で解釈した内容は、予定していた記事を流用できそう・・・・・
で、記事後半は、回答っぽくなってしまいました。

なお、質問に回答が付いてしまいましたね。
こことのマルチポストの扱いになると思うので、回答者さんには失礼のないようにしてください。
また、提案(回答?)は、次の記事をベースに記述しているので、私は投稿しません。
(私は、ここのアドレスを記述できないので・・・・書くと削除されちゃうので)

ラッキーとでも表現できるタイミングでしたね・・・・

記事を予定していなかったら、どうした方が良かったのか・・・・
私も考えてみますが、練乳さんも考えてみてください・・・・・


ちなみに、この次に用意しているサンプルファイルは、
帳票フォームのレコード内で、3つのコンボボックスが連動しながら・・・・
他のコンボボックスの設定を確認しながら絞り込み表示する・・・・っていうものですかね。

コントロールを重ねる・・・・これを、二段、三段・・・・
コンボボックスにコンボボックスを重ね、
また、あるところでは、さらにテキストボックスを重ねる・・・・

結構画面がちらつくので、記事にするか・・・・迷っているところではありますが・・・・


※ 私で良かったのでしょうか?
プロフィールにも書いてましたが・・・(ある方から【致命的な回答だ】と言われた事があります)
「ぶつぶつ」も参照ください。

kiku #asbnF9Ew | URL | 2013/03/06 21:24 * edit *

ご回答有難うございます!!

急がせてしまって申し訳ございません。

サンプルを触らせて頂きました^^

すごいですね~~~

正直、ご回答内容とサンプルに触れた瞬間、『ハードル高っノノノ』って思ってしまいました・・・;;

私は、全くの素人ですので、簡単にできるのかと思ってましたが、ここまで難しいとは・・・

物凄く解読に時間が掛かりそうですので、とりあえず感謝の意をこめてご返事致しました。

頑張って理解していきます!!!

でわでわ。。。

練乳 #- | URL | 2013/03/07 16:10 * edit *

top △

コメントの投稿

Secret

top △


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。