フォームにデータ一覧を決まった数ずつ表示させ、『次の10件』『前の10件』ボタンで、表示を切り替えたいのですが、構文をどう繋げてよいか理解できません。
今やっている事は、データにOutoNoを振り、まずフォームオープン時、SQL文ではじめの10件を抽出しています。その時、表示中データのOutoNoが一番小さいものにフラグを立てて変数にし、それを元に次の(又は『前の』)10件を抽出、と考えているのでが、、。
NEXT~FOR文を使うのかなと思うのですが、それをどう絡ませていけばよいのか分かりません。
データの最後が10で割った数にならないので、それもどうやって処理するか。
どうかご教授願います。
No.5ベストアンサー
- 回答日時:
ソース見ました。
・毎回[Q_有給]を作りなおす
という構造ですね?
・Q_有給は固定
・Q_有給からデータを10件ずつ抽出する
という流れにした方が、良いと思います。
以下のSQL文で、クエリを作成してください。
※注意!!≪全角スペースを利用しておりますので、半角に置換してください≫
クエリ[Q_有給]
------------------------------------------------------------
SELECT
M_社員.ナンバー
,T_日数.コード
,M_社員.氏名
,M_社員.入社日
,T_日数.有給付与日
,T_日数.有給日数
FROM
M_社員
INNER JOIN
T_日数
ON M_社員.コード = T_日数.コード
WHERE
IIF((M_社員.退社日) > Date(),Null,(M_社員.退社日)) IS NULL
------------------------------------------------------------
[M_社員].[ナンバー]
がオートナンバーフィールドですよね。
オートナンバーのフィールドが
・1-10
・11-20
・21-30
と、連続しているとは限りません。
[M_社員].[退社日]の状態により、不連続なデータになります。
入力キャンセルを行った場合だけでも、不連続データが発生します。
回避するためには、表示エリアデータの起点を見つけ、その前方/後方の表示対象データのキーを取得する必要があります。
フォームの中に、以下のソースを埋め込んでください。
VBAソース
------------------------------------------------------------
Option Compare Database
Option Explicit
'定数
Private Const DEF_SQL_MAIN As String = "SELECT * FROM Q_有給" & vbCrLf 'メインのSQL文
Private Const DEF_AUTO_NO As String = "[ナンバー]" 'クエリのメインキー
Private Const DEF_SQL_ORDER As String = "ORDER BY " & DEF_AUTO_NO & vbCrLf 'SQLのOrderBy句
Private Const DEF_MOVE_VECT As Integer = 10 '表示量
'列挙:移動種別
Private Enum ENM_MOVE
MV_開始
MV_戻る
MV_進む
End Enum
'構造体:表示領域
Private Type typ表示領域
lng開始 As Long
lng終了 As Long
End Type
'表示領域記憶変数
Private m表示状態 As typ表示領域
'イベント/ボタン/進む
Private Sub cmd進む_Click()
Call Sub画面リフレッシュ(MV_進む)
End Sub
'イベント/ボタン/戻る
Private Sub cmd戻る_Click()
Call Sub画面リフレッシュ(MV_戻る)
End Sub
'イベント/フォーム/開く時
Private Sub Form_Open(Cancel As Integer)
Call Sub画面リフレッシュ(MV_開始)
End Sub
'画面のレコードソースとボタン状態の切替を行う
Private Sub Sub画面リフレッシュ( _
ByVal p_移動方向 As ENM_MOVE _
, Optional ByVal p_lng移動量 As Integer = DEF_MOVE_VECT _
)
'データ操作用
Dim strSQL As String
Dim daoDB As DAO.Database
Dim daoRec As DAO.Recordset
'オートナンバー対策
Dim lng基準 As Long
Dim lng開始番号 As Long
Dim lng終了番号 As Long
'ボタン制御用フラグ
Dim bln戻る As Boolean
Dim bln進む As Boolean
'基本的にボタンは使用不可とする
bln戻る = False
bln進む = False
'基準点を得る
Select Case p_移動方向
Case MV_開始
lng基準 = 0
Case MV_戻る
lng基準 = m表示状態.lng開始
Case MV_進む
lng基準 = m表示状態.lng終了
End Select
'基準点をベースにSQLを発行
strSQL = ""
strSQL = strSQL & DEF_SQL_MAIN
strSQL = strSQL & "WHERE " & DEF_AUTO_NO & IIf((p_移動方向 = MV_戻る), "<=", ">=") & lng基準 & vbCrLf
strSQL = strSQL & DEF_SQL_ORDER
Set daoRec = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
'取得できない
If daoRec.EOF Then
lng開始番号 = 0
lng終了番号 = 0
'終了処理へ
GoTo PGMEND
End If
'取得できた
Select Case p_移動方向
Case MV_開始, MV_進む
'先頭
daoRec.MoveFirst
If (p_移動方向 = MV_開始) Then
'開始ポイントの記憶
lng開始番号 = daoRec(DEF_AUTO_NO)
Else
'戻るボタン使用可能
bln戻る = True
'一個移動
daoRec.MoveNext
'移動し過ぎの回避
If daoRec.EOF Then
daoRec.MovePrevious
End If
'開始ポイントの記憶
lng開始番号 = daoRec(DEF_AUTO_NO)
End If
'移動:表示エリア + 1
daoRec.Move p_lng移動量
'データの存在チェックを行い、進むボタンの使用可能状態を決める
bln進む = Not daoRec.EOF
'移動:表示エリアの最後
daoRec.MovePrevious
'終了ポイントの記憶
lng終了番号 = daoRec(DEF_AUTO_NO)
Case MV_戻る
'最後
daoRec.MoveLast
'進むボタン使用可能
bln進む = True
'一個移動
daoRec.MovePrevious
'移動し過ぎの回避
If daoRec.BOF Then
daoRec.MoveNext
End If
'終了ポイントの記憶
lng終了番号 = daoRec(DEF_AUTO_NO)
'移動:表示エリア - 1
daoRec.Move -p_lng移動量
'データの存在チェックを行い、戻るボタンの使用可能状態を決める
bln戻る = Not daoRec.BOF
'移動:表示エリアの先頭
daoRec.MoveNext
'開始ポイントの記憶
lng開始番号 = daoRec(DEF_AUTO_NO)
End Select
'終了処理
PGMEND:
'データセット開放
daoRec.Close
Set daoRec = Nothing
'表示領域エリアを記憶
m表示状態.lng開始 = lng開始番号
m表示状態.lng終了 = lng終了番号
'画面の入力フィールドにフォーカスを当てる
Me.コード.SetFocus
'ボタン状態の制御
Me.cmd戻る.Enabled = bln戻る
Me.cmd進む.Enabled = bln進む
'SQLを作成
strSQL = ""
strSQL = strSQL & DEF_SQL_MAIN
strSQL = strSQL & "WHERE " & DEF_AUTO_NO & " BETWEEN " & lng開始番号 & " AND " & lng終了番号 & vbCrLf
strSQL = strSQL & DEF_SQL_ORDER
'SQLを設定
Me.RecordSource = strSQL
End Sub
できました!
別の回答で教えて頂いたように、コードを見るって勉強になりますね。
とても丁寧な解説に感謝しています。
ありがとうございました。
No.4
- 回答日時:
指定件数単位に抽出するクエリを作成し、それを基に一覧形式のフォームを作成
出来上がったフォームをメインフォームへサブフォームとして埋め込み画面
は完了
後は、『次の10件』『前の10件』のイベントでSQL文を編集しサブフォームの基となっているクエリを変更し、画面をリフレッシュすればOK
※データ表示を一覧形式のフォームを利用すると仮定した場合
Event:NextBotton
Dim l_OutoNo = l_OutoNo + 10
SSQL = "SELECT * FROM データテーブル WHERE Between OutoNo & CStr(l_OutoNo) & " And " & CStr(l_OutoNo + 9)
SubForm_Query.SQL = SSQL
Me.MainForm.SubForm.Form.F_Sub.Refresh
No.3
- 回答日時:
SQL文の発行は、DAO?ADO?
DAOなら
「Set レコードセット=CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)」
として、EOF/BOFのチェック
さらに
「レコードセット.Move 移動量」
で指定のレコード位置にカーソルを移動できます。
存在するレコード以下、あるいは以上の位置にカーソルを移動しようとすると、EOF/BOFになります。
>SQL文ではじめの10件を抽出しています
現在どのような処理が行われているのか、コードが見たいです。
それにより、極力改造を必要としない方法が見つかるかもしれません。
大変失礼しました。
まずフォームオープン時、
Dim qdf As QueryDef
Dim strsql As String
strsql = ""
strsql = strsql & "SELECT T_日数.コード, M_社員.氏名, M_社員.入社日, T_日数.有給付与日, T_日数.有給日数, "
strsql = strsql & "FROM M_社員 INNER JOIN T_日数 ON M_社員.コード = T_日数.コード "
strsql = strsql & "WHERE (((M_社員.退社日)>Date() Or (M_社員.退社日) Is Null and (M_社員.ナンバー)<=10 ));"
Set qdf = CurrentDb.QueryDefs("Q_有給")
qdf.SQL = strsql
qdf.Close
Me.RecordSource = "Q_有給"
です。
そして各『前ページ』『次ページ』を各コードに書かず、モジュール側で10を変数にして扱うのはどうしたら、、、と困っていたのです。
DAOも他で使っている箇所があるんですが、色々参考書を読んでみてるんですけど、いまいち明確な使い方(データを見せるだけの処理であるとか、架空のものとか)がただの抽出とどう違うのかが難しくて。
私事ですが.netも覚える事になっていて、その辺りもまた詳しく質問をさせてもらおうと思っています。ありがとうございました。
No.2
- 回答日時:
#1ですが、ざっと書いてみました。
データは配列に格納できているものとします。
「フォームに表示」の形態がわからないので、仮にテキストボックスとしました。
Private DataNum as Long '全部のデータ数
Private DataBuff() as String 'データを格納した配列
Private cnt As Long
'「進む」ボタンクリック
Private Sub cmdnext_Click()
Dim i As Integer
txtData.Text = ""
For i = 0 To 9
If 10 * cnt + i > DataNum Then Exit Sub
txtData.Text = txtData.Text & vbCrLf & DataBuff(10 * cnt + i)
Next
cnt = cnt + 1
End Sub
'「戻る」ボタンクリック
Private Sub cmdpre_Click()
Dim i As Integer
txtData.Text = ""
cnt = cnt - 1
If cnt < 0 Then cnt = 0
For i = 0 To 9
txtData.Text = txtData.Text & vbCrLf & DataBuff(10 * cnt + i)
Next
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
ロボットの住む世界で流行ってる罰ゲームとは?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
アクセスのフォームで10件づつ表示する。
その他(データベース)
-
SQL文で パラメータが少なすぎます エラー
Access(アクセス)
-
Accessのフォーム上にレコード数とレコード番号の表示
その他(データベース)
-
-
4
新規レコード行を非表示にしたい
Access(アクセス)
-
5
フォームを開くときに、コンボボックスの値を選択(アクセスVBA)
Visual Basic(VBA)
-
6
アクセスでテキストボックスの値が空白だったら
Access(アクセス)
-
7
「RunSQL」と「Execute」の違い
Access(アクセス)
-
8
レコードを保存するコード アクセスvba
その他(Microsoft Office)
-
9
Accessを開きなおすとテキストボックスの値がエラー#Name?になる
その他(データベース)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「Nullの使い方が不正です」の...
-
VBAでアクセスDBからデータの取...
-
VB2010で、選択した系列を最前...
-
VB6.0 テキストボックス マル...
-
【C#】textBoxの指定行のデータ...
-
Excel VBAでグラフの可変データ...
-
ExcelVBAで戻り値を返すには
-
ウェブページから手軽にスクレ...
-
アクセスでウェブ上のデータを...
-
部品表
-
リスト内のアイテム並び替えに...
-
【VB.NET】Excelの最終行までの...
-
Excel VBAでフォルダ内の全テキ...
-
Excel VBA で日付を4ケタの数値...
-
Excel VBAでグループ毎に集計す...
-
エクセルのCSV読み込みについて
-
MSFlexGrid 行選択状態
-
XMLでデータとして画像を指定す...
-
COBOL数値転記の仕様
-
VBA 変数名に変数を使用したい。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでアクセスDBからデータの取...
-
【C#】textBoxの指定行のデータ...
-
「Nullの使い方が不正です」の...
-
C# DataTableに最後に追加した...
-
XMLでデータとして画像を指定す...
-
VBAコンボボックスの内容が反映...
-
Excel VBAでフォルダ内の全テキ...
-
COBOL数値転記の仕様
-
エクセルのセル最終行取得
-
ListViewで表示されたデータの...
-
MSFlexGrid 行選択状態
-
【VB.NET】Excelの最終行までの...
-
アクセスでウェブ上のデータを...
-
【ExcelVBA】値を変更しながら...
-
クリスタルレポートでレコード...
-
ADODBでの行番号の取得、もしく...
-
Excel VBAでグループ毎に集計す...
-
VB webデータの取得
-
VB2010で、選択した系列を最前...
-
エクセルのCSV読み込みについて
おすすめ情報