Microsoft Access 掲示板

views
4 フォロー
6,283 件中 441 から 480 までを表示しています。
3

ならばデータ例もそうのように提示すべきですね。
全角数字のあとにアルファベットがくるのですか。
であるなら、前回の回答の最初のクエリでいいでしょう。

商品コード的なもので、数字+アルファベット という書式のものなら、
数字部分とアルファベット部分にわけて、それぞれ数値型、テキスト型フィールドにするという設計もあります。

というようなこともあるので、どのような書式になるのか、データ例もあげて、仕様を明確に提示してください。

2
驚天動地!前任者失踪丸 2024/04/20 (土) 08:33:03 23e8e@44ebd >> 1

同じフィールドにアルファベットが入る可能性があるので数値型に出来ません。

1
hatena 2024/04/20 (土) 05:03:41 修正

全角数字はVal関数では数値と判断されずに0になります。
StrConv関数で半角に変換してVal関数で数値化すればいいでしょう。

SELECT T_昇順実験.短いテキスト型, Val(StrConv([短いテキスト型],8)) AS 式1
FROM T_昇順実験
ORDER BY 2;

StrConv 関数 (Visual Basic for Applications) | Microsoft Learn


そもそも論ですが、数値順にならべたいフィールドを、テキスト型で全角数字にする意味が不明です。
素直に数値型のフィールドにしておけば無駄なことをせずにすみます。
StrConvやValで囲むことで無駄な処理が増えて、かつインデックスが無効になるので重くなります。

もし、表示上、全角にしたいのなら、フィールドのデータ型は数値型にしておいて、表示するときに全角に変換すればいいでしょう。

SELECT StrConv(T_昇順実験.数値型,4) AS 数値型
FROM T_昇順実験
ORDER BY T_昇順実験.数値型;
2
驚天動地!前任者失踪丸 2024/04/19 (金) 18:25:54 23e8e@44ebd >> 1

ありがとうございます!
思った通りに動かせるようになりました。

1

cmb_2の値集合ソースのクエリ(SQL)をcmb_1の値で絞り込んだものにします。

SELECT * FROM テーブル名 WHERE 種類=[cmb_1];

これだけだとcmb_1を変更してもリストが更新されないので、フォーカス取得時に再クエリします。

'cmb_2フォーカス取得時
Private Sub cmb_2_Enter()
    Me.cmb_2.Requery
End Sub
1

このフィールドで7ケタ以上の数値がはいると指数表示となってしまうのですが、どうにか指数表示させない方法がないでしょうか?

フィールドの書式設定を「固定」にすれば指数表示にはなりません。

フィールドサイズを倍精度浮動小数点型に変更しようとしてみたのですが、メモリ不足ですとエラーになり変更できませんでした。

倍精度浮動小数点型に変更するだけで、メモリ不足とは考えにくいですね。何か他に問題がありそうです。とりあえず下記の作業を上から順に不具合が解消するまで実行してみてください。

テーブルを新規に作成しなおす。
「最適化と修復」を実行する。
新規データベースファイルを作成して、そこに現状のデータベース内のオブジェクトをすべてインポートする。

ちなみに、小数点以下桁数が2桁までいいのなら、通貨型の方がいいですね。浮動小数点数は演算誤差が発生しますが、通貨型なら誤差が発生しません。
数値型でフィールドサイズを「十進型」にしてもいいですが、あまり一般的ではありません。

このテーブルをAccessからエクスポートして利用するのですが、指数表示でエクスポートされ、他のアプリケーションで使えなくなってしまい困っています。

テキスト形式でエクスポートしているのでしょうか。
テーブルからクエリを作成して、クエリでFormat関数で書式を設定すればいいでしょう。

小数点以下桁数が2桁なら、

フィールド名: Format([テーブル名]![フィールド名],"0.00")
1

何をしたいのか不明瞭です。

まずは、下記を提示してください。

テーブルのサンプルデータ

上記データのクエリでの希望の出力結果

現状のクエリのSQL

4
驚天動地!前任者失踪丸 2024/04/11 (木) 14:20:37 23e8e@44ebd >> 3

あ、フィルターです。失礼致しました。

>=IIf([Forms]![F_納品書出力依頼]![txb_納期検索1]="","000000",[Forms]![F_納品書出力依頼]![txb_納期検索1]) And <=IIf([Forms]![F_納品書出力依頼]![txb_納期検索2]="","999999",[Forms]![F_納品書出力依頼]![txb_納期検索2])

提示頂いた抽出条件を参考に、こちらで想定通りにフィルターされるようになりました!
ありがとうございます。

3

レポートのレコードソースをフォームの非連結テキストボックスに入力した抽出条件(納期)によってソートしたいです。

ソートは並び替えという意味ですが、ご希望のことは抽出(フィルター)ということですよね。

短いテキスト型です。

抽出条件を下記のように設定すればいいでしょう。

>=IIf(Nz([Forms]![F_納品書出力依頼]![txb_納期検索1],"")="","000000",[Forms]![F_納品書出力依頼]![txb_納期検索1]) AND IIf(Nz([Forms]![F_納品書出力依頼]![txb_納期検索2],"")="","999999",[Forms]![F_納品書出力依頼]![txb_納期検索2])
2
驚天動地!前任者失踪丸 2024/04/11 (木) 12:50:37 23e8e@44ebd >> 1

短いテキスト型です。

1

納期(フィールド)のデータ型はなんですか?

4
やどかり 2024/04/10 (水) 20:35:02 ac752@85bbd

有難うございます。
単票フォームを作りたかったので、教えて頂いたサイトを参考に作成してみます。

3
驚天動地!前任者失踪丸 2024/04/10 (水) 18:24:55 23e8e@44ebd >> 2

いつも回答ありがとうございます。
Hatenaさんのサンプルと同じく左から右への印刷方向です。

提示して頂いた方法で希望通りのレイアウトになりました!
毎度ながら、テーブル構成・クエリ・フォーム・レポート、どんな質問に対しても精通していらっしゃって感服です、、、ありがとうございました。

2

サンプルを作成して確認してみたら、「左から右へ」に設定してあるときに、質問の症状が発生しました。

ご希望のことは、最後のグループフッターの後に、全体の集計を表示させたいということでしょうか。

レポートフッターでは無理のようですので、全体を一つのグループとするグループフッターを作成してそこに全体の集計を表示させるようにすればどうでしょう。

具体的な手順は、「グループ化と並べ替え」でグループを追加して、フィールドの選択で一番下の「式」をクリックします。
式ビルダーが開きますので、そこで =1 と固定値の式を設定します。これを一番上に移動して、「グループフッター付き」にします。そこに、レポートフッターにあった集計テキストボックスを移動させればいいでしょう。

1

ページ設定のレイアウトで列数を2に設定しているということですね。

「印刷方向」の設定は、
「左から右へ」か「上から下へ」かどちらになってますか。

また、現状のデータでは、1列に何行表示されていて、実際のレコード数は何件ですか。

3
hatena 2024/04/10 (水) 17:15:22 修正

訪問データを入力するフォームを作成する必要がありますが、
その場合、単票フォームでもいいですか。それとも帳票フォームがご希望ですか。

帳票フォームは少し難しいので、下記のサイトで単票フォームの場合の作成法を研究して、まずは単票フォームを作成してみてください。

ACCESS コンボボックスの絞り込みをする方法 - たすけてACCESS

それができてから、帳票フォームに取り組むのがいいと思います。

2
驚天動地!前任者失踪丸 2024/04/10 (水) 16:34:21 23e8e@44ebd >> 1

回答ありがとうございます、自己解決できました。
T_出力の各フィールドのNullをNzで""にしたらクエリを実行しても警告がでなくなりました。

2
やどかり 2024/04/10 (水) 16:02:16 ac752@85bbd

回答ありがとうございます。
テーブルのルックアップでは無理なんですね。
ルックアップ設定は以下になります。

顧客テーブルの企業ID
値集合ソース
    SELECT [T_企業マスタ].[企業ID], [T_企業マスタ].[企業名] FROM T_企業マスタ ORDER BY [企業名];
連結列
    1
列数
    2
列幅
    0cm;2.54cm

訪問テーブルの企業ID
値集合ソース
    SELECT [T_企業マスタ].[企業ID], [T_企業マスタ].[企業名] FROM T_企業マスタ ORDER BY [企業名];
連結列
    1
列数
    2
列幅
    0cm;4.604cm

1

テーブルのルックアップ機能では無理ですね。

テーブルからフォームを作成して、
VBAでコンボボックスのリストのデータを制御することになります。

どちらにしても、Accessでは入力作業は、テーブルでするものではなく、フォームでするのが基本です。
フォームならいろいろな制御ができるので、安全かつ高機能なUIを構築できます。

まずは、現状のテーブルのルックアップの下記の設定を教えてもらえますか。

値集合ソース
連結列
列数
列幅

12

「ウィザード」機能は、初心者にとっては、質問に答えていくだけで、それなりの結果を得られるので、便利なんですが、設定の意味を理解しなくてもできるので、スキルアップの障害になりかねないですね。
また、今回のように想定外のことが起こったり、一部修正しようとしたときに、何をしたらよいかわからないということになります。

ある程度スキルがあるのなら、とりあえず「ウィザード」でひな形をさっと作成して、あとはお好みで修正しながら仕上げるという使い方ができますけどね。

11
hiroton 2024/04/10 (水) 10:29:59 0799a@f966d >> 8

そんな機能あるんですねぇ。そして、運用を考えたら今回の問題が起こるような使い難い機能だと・・・

10

クエリの設定がお書きいただいた様に「日でグループ化: Format$…」となっていました。

最終的は表示場所の設定でOKなんですね。それぞれ指定をしていました。とても勉強になりました。
詳しく説明いただきありがとうございました。

1
hiroton 2024/04/10 (水) 10:16:28 0799a@f966d

ぱっと見ですが、

「T_住所1分割」の「住所1前半」「住所1後半」フィールドの値要求プロパティと空文字の許可プロパティはどうなっていますか?
これに対して、

IIf(InStr([住所1]," ")=0,[住所1],Left([住所1],InStr([住所1]," ")-1)) AS 住所1前半
IIf(InStr([住所1]," ")=0,"",Mid([住所1],InStr([住所1]," ")+1)) AS 住所1後半

これらの計算結果はどのような結果が取られますか?

各プロパティの設定によって、そのフィールドに「Nullは使えない」「空文字("")は使えない」のような制限がかかります。それらのフィールドに使えない値を入れようとすると問題の警告が表示されます

9
hiroton 2024/04/10 (水) 09:48:29 0799a@f966d

書式は最終的な表示の仕方を決めるものです。最終的な表示場所(今回の場合はレポート)で設定すれば十分です
ただ、同じデータをフォームで表示したい・レポートで表示したいなど複数用いることもあります。その場合、デフォルトの書式としてレコードソースの書式を用いるので、テーブルで書式を設定しておけば、基本的にその書式で表示する(後から変更もできる)という使い方もできます

既に指摘していますが、「書式をyyyy年mm月dd日として」いて、「『2024年3月1日』と表示されているのはおかしい」です。どこかで書式を使った何かが間違っています

画像から見える限りでは、一枚目の画像のクエリの最初のフィールド「入金日を日付でグルー」が怪しいです


ここまで記述してたら回答付いたので以下略

8

おそらくクエリをウィザードで作成したのですね。
そのときに、「日付をグループ化する単位を選択してください。」で「日」を選択したのでしょう。
そうすると、日付は下記のような演算フィールドになります。

開始日 を日でグループ化: Format$([Mtbl_所属歴].[開始日],'日付 (L)')

Format関数で標準の日付書式にしてますので、テーブルでの書式は無視されますね。
Format関数の返り値は文字列ですので、文字列としての並び順になりますのでそのような結果になります。

このフィールドの式を削除して、「開始日」にすれば日付順になるでしょう。


私としては、レポートの並び順は、レポートの方で「並べ替え」プロパティ、「グループ化と並べ替え」を設定してなければ、レコードソースの並び順になると認識してました。

優先度の高い順
「グループ化と並べ替え」
「並べ替え」プロパティ
レコードソースの並び順
(クエリの並び替え設定、テーブルのインデックス設定)

しかし、レポートの方で「並べ替え」なり、「グループ化と並べ替え」で並び順を指定した方が確実ですね。

7

新しくクエリを作り直してみたのですが、日付順に並びました。
色々と教えていただき、ありがとうございました。

6

画像1
画像1
テーブルのデザインです。 テーブルだと2024年03月01日となっています。

もともとはExcelデータをインポートしてテーブルにしていて、「入金日」を列に加えて
「日付」データを参照して入力をして使っています。
(「日付」を使いたいのですが、データ型を「日付/時刻型」にするとデータを消えてしまったので、
新たに列を作りました。)
書式の指定は必要ないのでしょうか。

5
hiroton 2024/04/10 (水) 09:12:19 0799a@f966d

「レポートでも」というよりは「レポートの指定のみ」が反映されます。レポート上で並び順を指定しなかった場合の並びは不定です

クエリ上での確認は、単にレポート上で並び順を指定した場合に、求めた並び順になるかどうかの確認です
画像を見る限りそうではないようですね

データが正しく日付型データで保存されているのであれば日付順に正しく並びます

データ型を「日付/時刻型」に設定し、書式をyyyy年mm月dd日としています。

型を指定しているだけで、正しいデータが保存されていないか、書式の設定の仕方が間違っています

特に「書式をyyyy年mm月dd日」と設定しているのにも関わらず「2024年3月1日」と表示されているのはおかしいですね。「mm」や「dd」としているので、0を詰めて2桁で表示(2024年03月01日)されていないとおかしいです
書式が適用できず、元のデータをそのまま表示しているのでしょう

大元のテーブルのフィールドは「日付/時刻型」になっていますか?また、そのフィールドの書式を変更する(書式なしにする)と、きちんと望んだ日付のデータが保存されていますか?

4

画像1
画像2

クエリでの指定とその結果になります。
レポートで並び替えたい場合は、レポートでも日付のところで昇順の指定をしないといけないという事でしょうか。

3
hiroton 2024/04/10 (水) 08:42:28 0799a@f966d

そのクエリを直接表示した場合は指定の並び順になっていますか?
また、レポートでの並びは、レポート上で並び順の指定が必要です

レポートの既定の並べ替え順序を定義する

2

ご回答ありがとうございます。
データ型を「日付/時刻型」に設定し、書式をyyyy年mm月dd日としています。
日付フィールドでの並び替えはクエリで「昇順」に設定していますが、1日から並びませんでした。
設定方法など間違っているでしょうか。 宜しくお願いいたします。

1

日付フィールドのデータ型は日付/時刻型になってますか。
日付フィールドで並び替えを設定していますか。

4
驚天動地!前任者失踪丸 2024/04/09 (火) 10:06:42 23e8e@44ebd >> 3

原因究明は地道にやるしかないのですね・・・

Recalc、Refresh等を追記したところ、正常に表示されるようになりました!
ありがとうございます。

3

これが何かしらCurrentRecordの値取得に影響を及ぼしている可能性はありますか?

私の作成したサンプルにそのコードを追加しても、問題なく動作します。

問題のフォームと同じテーブルをレコードソースとするシンプルなフォームを作成して、
質問のテキストボックスとコマンドボタンを配置して、症状がでるか確認してみてください。

そこから、問題のフォームと同じになるように一つずつプロパティ設定やコードを追加していって、その都度、動作確認して、症状が発生する直前に変更、追加したものが、原因ということになります。

面倒ですが、原因追及するにはそのぐらいしかないでしょう。

ちなみに、前回の回答で提案した方法は2つとも効果がありませんでしたか。

2
驚天動地!前任者失踪丸 2024/04/08 (月) 13:47:30 23e8e@44ebd >> 1

回答ありがとうございます。
私も簡素なサンプルを作成してみましたが、正常に値を表示できました。

フォームのレコード移動時イベントで、新規レコードなら次レコードボタン(+いくつかのテキストボックス 下記コードでは省略)を使用不可にするコードを書いています。


Private Sub Form_Current()

    If Me.NewRecord = True Then '新規レコードの場合はテキストボックスを操作不可にする

        [btn_次レコード].Enabled = False

    Else

        [btn_次レコード].Enabled = True

    End If

End Sub

これが何かしらCurrentRecordの値取得に影響を及ぼしている可能性はありますか?

1

当方でシンプルなサンプルを作成して確認してましたが、症状は確認できませんでした。
コマンドボタンで移動するごとに正しいレコード番号か表示されます。

コントロールの再計算のタイミングがずれている感じですね。
下記のように移動後に再計算させるとで改善されないですか。

    DoCmd.GoToRecord , , acNext
    Me.Recalc
    Me!txb_何件中何件目.Requery

あるいは、コントロールソースは空欄にしておいて、レコード移動時で代入するとか。

Private Sub Form_Current()
    If Me.NewRecord Then
        Me.txb_何件中何件目.Value = Me.CurrentRecord & "/" & Me.Recordset.RecordCount + 1
    Else
        Me.txb_何件中何件目.Value = Me.CurrentRecord & "/" & Me.Recordset.RecordCount
    End If
End Sub
2

画像の解像度が低いので詳細が読み取れないので推測ですが、ご希望のことは下記のようなことでしょうか。

画像の左は集計クエリで縦に並んでいる。
それをクロス集計クエリで画像の右のように横に展開するようにする。
年月フィールドが毎年変わるので、それをレポートにする場合、作り直しになるのを、なんとかしたい。

だとしたら、下記のリンク先が参考になると思います。フォームになってますが、レポートでもそのまま応用できます。

列名が変化するクロス集計クエリと連結するフォーム - hatena chips

1

毎月のデータは勤怠システムからCSV出力して、リンクテーブルと更新クエリ、クロス集計で左の画像まで出来たのですが、ここからレポートを作成する時に今あるデータでレポートのレイアウトを作成し、翌月には新しいフィールドが追加されるので、またレポートのレイアウトという感じになってしまいます。

このような大雑把な説明では、回答しづらいです。

まず、勤怠システムから出力されるCSVのフォーマットを説明してください。
数行のサンプルを提示してもらえるとなおいいです。氏名などの情報はマスキングしておいてください。

それをアクセスのテーブルに取り込むことになると思いますが、現状のテーブルのフィールド構成を提示してください。

「翌月には新しいフィールドが追加されるので、」とのことですが、データベースではこのような設計にはしないので、テーブル設計から変更する必要があると思われます。

やりたいこととしては、最初に右の表を作成しておき、条件が一致(月が一致したら)したその月の時間が入力されるというような処理がしたいです。

「その月の時間が入力される」とは具体的にどのようなことでしょうか。
条件はどこから取得するのかとか、どのようなデータをどこに入力するのかとか、あいまいすぎてイメージが湧きません。

まずは、CSVデータと、現状のテーブル設計の説明をお願いします。

1
驚天動地!前任者失踪丸 2024/04/05 (金) 11:48:26 23e8e@44ebd

すみません、自己解決できました。

Like "* *" And Not Like "*[A-Z]*"

ですね。

7
はづき 2024/04/04 (木) 20:21:04 7475b@267c5

SQLで大分改善はしました。が、ちょっと待ち時間がストレスに感じるくらいです。

hatenaさまにいただいた、DAOでループ処理する方法でゆきたいと思います。
コードを一見して動きは理解できました。

rs.MovePreviousで1レコード前に戻るというのもできるのですね。

考えつきもしませんでした、勉強になりました。