Microsoft Access 掲示板

views
4 フォロー
6,349 件中 6,281 から 6,320 までを表示しています。
3

主キーは
テーブル「団体台帳」は 団体ID テーブル「健診者台帳」は 健診者ID テーブル「検査データ台帳」は 検査データID に設定してあります。 

それでは、テーブル設計として間違ってますね。

その設計だと、
「健診者台帳」で健診者一人は、複数のカルテNoを持つことが可能、
「検査データ台帳」の検査データID一つにつき複数のカルテNoを持つことが可能、
ということで2つのテーブル関係が多対多の関係になってしまいます。
多対多の関係では結合することができません。(データが増幅されてしまう。)

テーブル同士を結合するときは、どちらかのフィールドが主キーであることが必須だと覚えておいてください。

実際上は、
検診者一人が複数のカルテNoを持つことはありますか。

2
igachan 2019/04/10 (水) 15:22:55 fdd2e@d14a6

前回の分を見ながら作成してみました。

2
igachan 2019/04/10 (水) 15:20:43 fdd2e@d14a6

主キーは
テーブル「団体台帳」は 団体ID テーブル「健診者台帳」は 健診者ID テーブル「検査データ台帳」は 検査データID に設定してあります。 

求めたいものは 団体Aは○月○日に△人受診しました。 がわかればいいのですが。

1

それぞれのテーブルの主キーはどのフィールドになってますか。

集計クエリで、団体名+採取日毎の検査人数を出したいということですか。

7

エラーの原因の特定のために下記の手順でコードを順に実行して試してみてください。

On Error の行はデバッグ中はコメントアウトします。
stFilter の条件式をシンプルなものから少しずつ足していく。
エラーが出た直前に足して条件式が原因と特定できる。
Debug.Print でイミディエイトウィンドにstFilterの内容を出力して
それが条件式として問題ないか確認する。
1.

        stFilter = "本部 In(" & Mid(stFilter, 2) & ")"
        Debug.Print stFilter
        'On Error Resume Next 
        DoCmd.OpenReport "販社連絡", acViewPreview, , stFilter
        'On Error GoTo 0

2.

        stFilter = "本部 In(" & Mid(stFilter, 2) & ") And ([申請日]=#" & [TXT申請] & "#)"
        Debug.Print stFilter
        'On Error Resume Next 
        DoCmd.OpenReport "販社連絡", acViewPreview, , stFilter
        'On Error GoTo 0

3.

        stFilter = "本部 In(" & Mid(stFilter, 2) & ") And ([不備]=true Or [申請日]=#" & [TXT申請] & "#)"
        Debug.Print stFilter
        'On Error Resume Next 
        DoCmd.OpenReport "販社連絡", acViewPreview, , stFilter
        'On Error GoTo 0
6
tokinaito 2019/04/10 (水) 10:24:09 bb5c2@2f12b

早々に有り難うございました。
申請日の記入がないものは不備ということでコントロールに
自動的に記入になるようにしています。
今後はこういう形に持って行こうと思ってます。
宜敷お願いします。
Dim stFilter As String
Dim stFilter2 As String
Dim stFilter3 As String
Dim varItm As Variant
Dim varItm2 As Variant
Dim varItm3 As Variant
    With Me.listSupplier
        For Each varItm In .ItemsSelected
            stFilter = stFilter & "," & .ItemData(varItm)
        Next
    End With

    If stFilter = "" Then
        MsgBox "本店を選択してください。"
    Else
        stFilter = "本部 In(" & Mid(stFilter, 2) & ") And ([申請日] Is Null Or [申請日]=#" & Me.TXT申請 & "#)"

        On Error Resume Next
        DoCmd.OpenReport "販社連絡", acViewPreview, , stFilter
         On Error GoTo 0

    End If
DoCmd.Close acForm, "F車庫証明台帳"

End Sub

5

確認ですが、「申請日の記入がない」と「不備のもの」というのはイコールですか。

4
tokinaito 2019/04/10 (水) 09:51:28 bb5c2@2f12b

hatena様有り難うございます。
ご指摘のようにしましたが、抽出条件でデータ型が一致しませんと出ます。
宜敷お願いします。
>>申請中: Not [申請日] Is Null
レポートのグループ化の機能で、このフィールドでグループ化すればいいでしょう。
以上のように対応はしています。

7
美月 2019/04/10 (水) 07:50:30 a63a9@7b5ca

失礼いたしました。
手順のミスでした。

アドバイスいただいた通りに動作いたしました。

3

電話などで軽く依頼があり
そのときに下請けに発注することがあります

一対多の入力フォームは、メインフォーム(一側データ)にサブフォーム(多側データ)を埋め込む形にします。

軽く依頼があった場合は、
メインフォームで新規レコードへ移動して、主キー(受注番号など)と仮受注日、顧客コードは確定させて、金額など未確定のものは未入力(Null)にしておきます。そして、サブフォームで下請けへの発注データを入力します。

というような設計になると思います。

今日、複数の下請けのデータを入力したとします
月末に受注データを入力します
受注データを入力するときに、自動的に対応する下請けの
データを関連付けることは可能なのでしょうか?

下請けのデータを入力するときに、関連付けするべき一側のデータを決めておかないと、
どれとどれが対応するかは後から判断できないですよね。

テーブル設計の一例
(そちらの詳しい業務内容が分からないので想像ですので参考程度に)

受注テーブル
 受注番号 主キー
 仮受注日
 受注先顧客コード
 受注内容
 本受注日
 金額

下請発注テーブル
 下請発注ID 主キー オートナンバー型
 受注番号 受注テーブルとリンクする外部キーフィールド
 下請顧客コード
 下請発注日
 下請内容
 金額

下請けデータを入力する前に、受注テーブルの受注番号、仮受注日、受注先顧客コードは確定しておく必要があると思います。

2

電話などで軽く依頼があり
そのときに下請けに発注することがあります

下請けには先に払う(入力)することがあり
あとから取引先から正式な受注データがくることがある、といった感じです

また、受注データは1案件扱いで10万だったとして、それは月末などに確定します
それの案件を自社と下請けで分担してやるので
先に下請けのデータだけを入力する場合がでてしまいます
1案件に対して複数の下請けが存在します

例えば
今日、複数の下請けのデータを入力したとします
月末に受注データを入力します
受注データを入力するときに、自動的に対応する下請けの
データを関連付けることは可能なのでしょうか?
その月かつその取引先からの業務のすべての下請け金額の小計を差し引いて粗利を表示するといったものです

文章だとわけわかりませんよねえ

3

伝票テーブル
 伝票ID 伝票名
  1   請求書
  2   請求書(控)

ということなら、下記でどうでしょうか。

    DoCmd.OpenReport "請求書", acViewPreview, , "請求書NO =" & Me!請求書NO & " AND 伝票ID=1"
    DoCmd.OutputTo acOutputReport, "請求書", acFormatPDF, "請求書.pdf", True
3

やりたいことはレポートに中からTXT申請日に記入のある申請日と 申請日の記入がない申請日を
選びたいのですが。

stFilter に下記のような条件文が格納されるように考えましょう。

本部 In(1,2) And ([申請日] Is Null Or [申請日]=#2019/04/01#)

上記の意味は、(本部が1か2) かつ (申請日が未入力 または 申請日が2019/04/01)
ということです。() 内が優先順位が高いということを利用します。

ということで、下記でどうでしょう。

stFilter = "本部 In(" & Mid(stFilter, 2) & ") And ([申請日] Is Null Or [申請日]=#" & Me.TXT申請 & "#)"
2
truegrow 2019/04/09 (火) 15:40:39 30b16@a036a

早速の返信ありがとうございます。説明不足で申し訳ありません。
伝票テーブル
 伝票ID 伝票名
  1   請求書
  2   請求書(控)
クエリで材料、数量・金額などの明細の後に上記テーブルを入れ、交互に出すようにしてあるので請求書の内容は全く同じでテキストボックス(コントロールソース 伝票名)だけ名前が変わるようになっております。

それようのフォームを作り
DoCmd.PrintOut acPages, Me!txt開始ページ, Me!txt終了ページ
を挿入するぐらいしかわかりません。

正は1ページ目にでるので1ページ目だけ指定とかできるのでしょうか

2
tokinaito 2019/04/09 (火) 14:33:08 bb5c2@2f12b

hatena様早速のお返事ありがとうございます。おっしゃるとおりにしましたが
申請日がないものについて表示されません。
上記の式のなかで
stFilter = "本部 In(" & Mid(stFilter, 2) & ")And ([申請日]=#" & [TXT申請] & "#) )"

stFilter = "本部 In(" & Mid(stFilter, 2) & ")And ([申請日]=#" & [TXT申請] & "#) )
OR 本部 In(" & Mid(stFilter, 2) & ")And ([申請日]=" & IS NULL([TXT申請]) & ") )"
なんて素人考えでやってますがうまくいきません。

やりたいことはレポートに中からTXT申請日に記入のある申請日と 申請日の記入がない申請日を
選びたいのですが。宜しくご教示のほどお願いします。

1

請求書を作成するにあたり、印刷すると正と控えが2枚出てくるようになっています。
 (※テーブルで請求書と請求書(控)をつくり請求書明細のクエリに組み込みレポートのテキストボックスで正と控がでます)

この仕組みがどうなっているか不明ですので、推測での回答になりますが、

OpenReportの引数で抽出条件で"(正)"のみ抽出するようにはできませんか。

レコードソースのフィールド名が不明なので、推測ですが、

    DoCmd.OpenReport "請求書", acViewPreview, , "請求書NO =" & Me!請求書NO & " AND 種別='(正)'"
    DoCmd.OutputTo acOutputReport, "請求書", acFormatPDF, "請求書.pdf", True
6

どのようなエラーがでますか。エラーメッセージを提示してください。

また、同じデータ、同じ追加先テーブルで、手動で保存済みインポート定義を使ってインポートできるかも確認してください。

5
美月 2019/04/08 (月) 21:15:18 5ec36@d6973

すみません、追記です。
strTblNameのテーブル定義は、必要な10のフィールドに絞っものを使っています。

4
美月 2019/04/08 (月) 21:08:32 5ec36@d6973

すみません、業務が立て込んでおり確認とご報告が遅くなってしまいました。

一度だけ手動でインポート定義を作成して保存しました。
インポート定義の名前:"CSVインポート"

この定義を使って下記のようにインポートできるのでしょうか?
strTblName:ここは固定のテーブル
strCSVFilePath:インポートするファイル名は変数で与えるため可変です

DoCmd.TransferText acImportDelim, "CSVインポート", strTblName, strCSVFilePath, True

何度かトライしましたが、エラーが出てうまくインポートできませんでした。

1

さてこれらについて申請中のレポートに、不備欄を設け申請中のもの未申請のもの(申請日がnull)
として販社連絡レポートに一緒に印刷したいのですがご教示お願いします。

ひとつのレポートに 申請中 のものと 未申請 のものを表示したいということでしょうか。
2つのレポートが同じレイアウトなら、
レコードソースのクエリに、下記の演算フィールドを設けて、

申請中: Not [申請日] Is Null

レポートのグループ化の機能で、このフィールドでグループ化すればいいでしょう。

6
けんたろー 2019/04/05 (金) 19:55:05 a63a9@7b5ca

どうもありがとうございます。

自分のやり方に自身がなかった、
あるいは、もしかしたら私の思いもつかないやり方があるのかも?と思って相談させていただきましたので、hatena様もそのようにされるというのをお聞きできて大変参考になりました。

5

なるほど、初めて入力する場合も考慮すると式は退避させておく必要はありますね。
ならば、自分がするとしてもそのような設計になると思います。

他に、計算列以外を1列ずつCopyFromRecordsetという方法も考えられますが、列数が多いと遅くなりそうです。

4
けんたろー 2019/04/05 (金) 18:15:09 a63a9@7b5ca

ありがとうございます。

最終行に追加する場合は、既存の関数列にデータが残っているので、それでもいいと思いますが、初期のデータ追加の場合も考慮すると、関数が、消えてしまうので、
統一的なロジックとして、そのように対応したつもりです。つまり、一番上の関数が消えてしまわないように、ワークに残しました。

2
はっち 2019/04/05 (金) 16:08:15 b6c0e@a6755 >> 1

hatena様

思い通りの仕組みになりました!
本当にありがとうございます。

1

下記のコードでどうでしょう。

Public Sub CloseAllForm()
    Dim i As Long
 
    For i = Forms.Count - 1 To 0 Step -1
        If Forms(i).Name <> "フォームA" And Forms(i).Name <> "フォームB" Then
            DoCmd.Close acForm, Forms(i).Name
        End If
    Next

End Sub

Forms(0から始まるインデックス) で開いているフォームを参照できます。
インデックスの最後から削除しているのは、前から削除すると削除したとき、インデックスが前にずれるので、
削除されずにのこるフォームが出てくるためです。

3

エクセルのカラム名と1行目に式があるかどうかをチェックしながらSQLが生成できたら、
それをレコードセットとして開いて、CopyFromRecordsetで貼り付ければいいですよね。
計算列はNullの演算フィールドにしておけばいいでしょう。

貼り付けた後、計算列はオートフィルで上から埋めるようにすればいいのでは。

ワークテーブルがなぜ必要なのでしょうか。

2
けんたろー 2019/04/05 (金) 10:32:46 a63a9@7b5ca

ご回答ありがとうございます。

一つ目のご質問ですが、最終行以下に追記します。また、テーブル定義はしていません。

二つ目のご質問ですが、後者のご認識の通りです。列数は一致しませんし、並び順も一致しません。

どうぞよろしくお願いします。

1

仕様に関していくつか曖昧な点があるので確認させてください。

1.Accessからある条件でデータ抽出してExcelにデータを転記する

Excelのシートには既にデータや計算式が入力されているようですが、
Accessのデータは、シートの最終行の後に追記するということでしょうか。

また、Excelのシートのデータ範囲にテーブル定義をしてますか。

2.AccessとExecelのカラム名は一致しているが、Excelには計算列(ユーザー任意)がランダムに存在する
  計算列を除外してAccessのデータだけ出力したい

AccessとExecelのカラム名の数も一致してますか。
それともExecelにはあるがAccessにはないカラム名が存在しますか。
例えば、「計算列(ユーザー任意)」はAccessには存在しないのでしょうか。

1

ちょっとよく分からないのですが、
実際の取引では、
受注してから、それを下請けに割り振るという形になると思います。

受注者からの入金、下請けへの支払いが前後することがあったとしても、

受注 → 下請け の順は変わらないと思いますが、どうなんでしょう。

受注があったら、その時点で「受注番号」とかの主キーになるものを入力します。

それを下請のテーブルの外部キーとするような設計にすればいいと思いますが。
金額が未定の場合は未入力にしておいて、後から入力しても問題ないと思います。

1

いろいろなやり方があると思いますが、
売上テーブルは分けない方がいいと思います。

なるべく最小の単位で1レコードとします。

日付   数量 委託先
4月4日  10  A社
4月4日  15  A社
4月4日  20  B社

といった感じです
これを集計して

4月4日  45

ということなら、集計結果の45はテーブルにはしません。

上記の3レコードが1グループだと分かるようなフィールドを追加します。

例えば、

売上先 日付   数量 委託先
あ   4月4日  10  A社
あ   4月4日  15  A社
あ   4月4日  20  B社

というような感じです。
そちらの業務内容が分かりませんので、あくまで一例です。
グループ化できる項目があるはずですのでそれをフィールドに追加します。

売上先 日付   数量 委託先
あ   4月4日  10  A社
あ   4月4日  15  A社
あ   4月4日  20  B社
い   4月4日  30

というように1売上1レコードなら1グループに1件だけにしておけばいいです。

これを、集計クエリで、売上先、日付 でグループ化すれば
売上先  4月4日  45
という結果を取得できます。

委託先への支払いもクエリで委託先でグループ化して希望の形になるようにすればいいでしょう。あるいは、レポートのグループ化の機能を使えば、合計と詳細を同時に表示させることも可能です。

テーブルは最小単位のデータを1レコードとする。
集計結果や演算結果はクエリで加工する。
あるいは、レポートを使って見やすいようにレイアウトする。
という方針にすればいいと思います。

3

一応、解説しておきます。
[入金額]-[出金額] とすると片方がNullだと、演算結果もNullになってしまいます。
その結果、DSumで集計すると 0 になります。

Nz([入金額],0)-Nz([出金額],0) とNullを0に変換することで、数値として演算できます。

2
初老の人 2019/03/31 (日) 15:38:47 c7366@58e94

早速のご指導ありがとうございます。
計算がされるようになりました。
Dsum関数とNz関数
理解してたつもりですが、
これを機会に、また少しづつ勉強したいと思います。
まずはお礼にて!

1
hatena 2019/03/31 (日) 14:59:40 修正

前年繰越のテキストボックスのコントロールソースの式を、

=DSum("Nz([入金額],0)-Nz([出金額],0)","T_出納","金融機関='" & [金融機関] & "' And 月日<#" & [年] & "/1/1#")

としたらどうでしょうか。

3

取り込む10のフィールドは決まっているのですよね。
ならば、一度だけ手動でインポート定義を作成して保存しておけば、後はそれを使って Docmd.TransferText すればいいでしょう。インポート定義では、インポートする/しないの選択、データ型の指定もできますので、日付/時刻型に設定しておけばいいでしょう。
日付/時刻型なら、書式設定で、yyyy/m/d でも、和暦表示でも、お好みの表示にすることができます。

2
美月 2019/03/30 (土) 12:22:03 a63a9@10d06

ありがとうございます。

おっしゃる通り、元になるファイルから必要ない列のみ残したものを、実際にインポートしてテーブル定義を作成しました。

元のファイルは列数が250以上ありまして、インポートの定義でインポートするしないを設定するのは大変かなと思ってしまいまた。実際に使う列は250のうち10程度です。

データも、一月4万件のデータを12ヶ月分洗い替えでインポートしなければならないため、事前に加工しようと考えました。

そのようにやっているのですが、日付データの形式が変わってしまいます。

1

前加工として、不要な列を削除して上書き保存してから取り込もうとしています。
※オートメーションにより、最終列目から1列目までループ処理をして、削除対象列かどうかを判断して列削除

テキストファイルに対してオートメーションってできました?ちょっとどのようにしているのか分かりません。

csvファイルの列構成が固定で、削除する列も固定なら、まずは手動でインポートして、そのときに、データ型を設定したり、インポートしない列を設定できますので、その設定をして、インポート定義として保存します。

その後、Docmd.TransferText の引数でインポート定義名を指定してインポートすればいいかと思います。

3

リフレッシュで回復できましたか。それはよかったです。

リフレッシュでは回復できない場合もありますので、定期的なバックアップは必須です。
コードの大きな改変する前にもバックアップは取っておくといいでしょう。

2
hhmmj553 2019/03/28 (木) 16:30:56 50384@9043e

エラーが起きる直前にDo Loop で無限ループを起こさせてしまいまして、強制中止させています。
たぶん、それが原因ではないかと思います。教えて頂いたリフレッシュを実行したところ、module2が破損しているメッセージがでたので、ああこれが原因かと思った次第です。参照設定は再設定する必要があり、奇妙な現象がすこし起きていますが、なんとかなると思います。ありがとうございました。

1

それまては正常に動作していたのが、突然エラーが出るようになったのでしょうか。

まずは、下記のページのリフレッシュを実行してみてください。

AccessのDBファイルを長期的に安定して使用するには - hatena chips

それでだめなら、正常動作していたときのバックアップを使用するようにしてください。
バックアップをとってないなら、下記の方法で復元できる場合があります。

Windows 10:以前のバージョンって?-使い方教えて!

7
美月 2019/03/27 (水) 12:46:14 a63a9@a32b3

hatena様

ありがとうございます。

前者です。Avg関数はnullを無視する仕様知りませんでした。勉強になりました。

これで解決です。どうもありがとうございました。