Microsoft Access 掲示板

views
4 フォロー
6,283 件中 5,601 から 5,640 までを表示しています。
2
kitty 2020/01/23 (木) 16:09:56 e4054@a3086

スナフキン様
ご連絡ありがとうございます。

ご指摘の件、実際のフィールド名を変えて質問していたため誤記です。
RS![名前] = Me![名前] となります。

このコードの前に、
 RS![check] = Me![check] ←チェックボックスがあるんですが、じつはここが問題だったようです。
フォームを開いた時に、チェックボックスがfalseになっていませんでした。
フォームロード時にチェックボックスを、
Me.check.Value = Falseにすることで解決できました。

ありがとうございました。

1
スナフキン 2020/01/23 (木) 13:34:51 796a1@06760

meibo_Tのデザインはどうなってますか?

RS.Find "名前 LIKE '" & Me![検索用名前] & "'"

RS![氏名] = Me![氏名]

で名前なのですか?
氏名なのですか?

後はどんなフォームを作成されているのでしょうか?

2
hiroton 2020/01/23 (木) 09:00:44 4ac42@f966d

ログって「一括出力」するようなものでしたっけ?

一つのファイルに対して複数人が書き込みが可能なのか?

どのような場合においても不可能であり、可能です

・「ログデータ(ファイル)」はアクセス可能な場所か
・「ログデータ(ファイル)」が存在するか
・「ログデータ(ファイル)」が上書き可能な状態で開けるか
・「ログデータ(ファイル)」がロックできるか

等、根本的な出力場所の環境や同時にアクセスする可能性、その場合の処理を適切に組むことによって「1つのファイルに複数人が同時に書き込める」ような仕組みは作れるでしょう

ログ出力先がデータベースであればこの辺の考え方は標準機能なのでデータベースを扱う技術だけで実現できると思います
それこそ構築中のACCESS自身に出力するだけでいいのであれば追加クエリ1つ実行するだけです

ログ出力に何が必要か(タイミング、内容、データ形式)とログをどのように閲覧したいかを考えてみるといいと思います

1

「Webシステム(Java)の場合はログ出力用のモジュール」というのがどのようなもので、どのようなログを出力するのか分からないので具体的に回答が難しいです。
テキストファイルですか。
Accessのテーブルとか、他のデータベースなら複数人の書き込みは可能だと思います。

6
kitty 2020/01/21 (火) 16:14:42 e4054@a3086

hatena様
ご連絡ありがとうございます。

アクセスのアンインストールやってみます。
それでもダメな場合の、Microsoft DAO 3.6 Object Liblaryの参照設定 ですが、
これは旧バージョンで使っていましたが、2010ではこれも「DLL読み込み時のエラーです」とエラー表示されます。

ご連絡待っている間、2010でDAO⇒ADOに変更しておりました。
そんなに複雑なプログラムではないのでADOに作り替えたほうが楽な気がしてきました。
昨日ご教授いただいた、AC2007以降の帳票フォームで画像表示も通常設定でできましたし。

とりあえずADOで進めてみたいと思います。
また何かありましたらよろしくお願いします。

5

「DLL読み込み時のエラーです」とエラーがでます。

Access(Office)をインストールするとき、Microsoft office 16.0 Access Database・・・ も同時にインストールされるはずなんですが、失敗しているのかもしれません。
Access(Office)をいったんアンインストールして、もう一度インストールしてみたら解決するかもしれません。

それでダメなら、Microsoft DAO 3.6 Object Liblary を参照設定してみてください。
DAOの古いバージョンですが、機能に差はないので問題なく使えるはずです。

4
kitty 2020/01/21 (火) 08:19:17 e4054@a3086

hatena様
ご丁寧にありがとうございます。

ご連絡を待っている間、2010形式で作り替えてみたところ、
2000で作っていたDAOが機能しませんでした。
ネットで調べたところ、Win10 64ビットのためかDAOの参照設定が無効になっていたため
Microsoft office 16.0 Access Database・・・を参照設定するようにと記載がありましたのでチェックを入れたところ、「DLL読み込み時のエラーです」とエラーがでます。

これはどうしたらよろしいでしょうか?
今後のために教えていただきたくお願い致します。

3

詳細セクションにイメージコントロールを配置して、VBAでイメージコントロールのPictureプロパティに画像のパスを設定します。レコード毎に変更したいので、フォーマット時のイベントプロシージャに記述します。

下記のような感じのコードになります。(フィールド名などは適当ですので適宜変更してください。)

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
    Dim ImgPath As String
    Select Case Me.資格コード
    Case 1
        ImgPath = "C:\test\image\pic1.bmp"
    Case 2
        ImgPath = "C:\test\image\pic2.bmp"
    Case 3
        ImgPath = "C:\test\image\pic3.bmp"
    End Select
    Me.イメージコントロール.Picture = ImgPath
End Sub
2
kitty 2020/01/20 (月) 13:44:11 e4054@a3086

hatena様
お返事ありがとうございます。
アクセスのバージョンは2000です。

レポート印刷のイメージは画像のとおりです。
(資格3種類、1名×2種類の場合)

バージョン替えて作り替えるよりこのまま進めたいのですが
何か良い方法がありましたらアドバイスいただけましたら幸いです。

画像1

1
hatena 2020/01/20 (月) 12:02:07 修正

Accessのバージョンは何でしょうか。
AC2007以降なら、イメージコントロールのコントロールソースプロパティに画像パスを設定することで簡単に表示させることができます。

下記の「画像ファイル名のみ格納してイメージコントロールで表示する方法」の項目を参照ください。
帳票フォームでの説明になってますが、レポートでもまったく同じ方法で使用できます。

AC2007以降の帳票フォームで画像表示
AC2003以前は画像の取り扱いはなかなか大変でした。OLEオブジェクト型に画像データを格納すれば、帳票フォームでも簡単に表示できて便利なんですが、Jpegなどの圧縮ファイルでも展開された状態で格納されるので、データベースファイルが肥大化したり、OLEサーバーに対応した画像処理ソフトが必要だったり、といろいろ問題点も抱えています。 そこで、ファイル名をテーブルに格納して、VBAでイメージコントロールにファイルパス...
fc2

6

とりあえず週単位の場合の集計を作成する方向でいましょう。
それができたら、月単位に応用するのは簡単ですね。

週単位は7日の間に、という意味です

すべての日付に対して、直近7日間での合計ということでしょうか。

例えば下記のような感じでしょうか。

氏名勤務日勤務時間(演算値)直近7日間計
AAA1月1日22
AAA1月2日35
AAA1月3日49
AAA1月4日110
AAA1月5日212
AAA1月6日315
AAA1月7日419
AAA1月8日522
AAA1月9日221
AAA1月10日623

表示させるとして、どこに、どのタイミングで表示さようと考えてますか。
入力フォームで 勤務開始時間 勤務終了時間 を入力したときに、規定時間をオーバーしていたらテキストボックスにそれを表示させる。
あるいは、入力完了後、レポートに一覧を表示させてそのときに規定時間オーバーを表示させるとか。

やろうとしていることを具体的かつ詳細に説明してもらえませんか。

5

まだ作成していませんが単純に
勤務id(主キー) 氏名 勤務日 勤務開始時間 勤務終了時間
適当です

週単位は7日の間に、という意味です

4
スナフキン 2020/01/17 (金) 11:57:23 c4b84@06760

週単位というのが...
今年初めの場合、12/29(日)~1/4(土)を週単位とみなすのですか?
それとも、1/1(水)~~1/4(土)を週単位とみなすのですか?

2
スナフキン 2020/01/17 (金) 11:44:02 c4b84@06760

こんにちは!
https://tsware.jp/tips/tips_522.htm
この形で保存して、
BASP21で送信するのがいいかと思います

2
TOKINAITO 2020/01/16 (木) 09:39:26 bb5c2@5f550

hatena様このたびは有り難うございました。
お礼が遅れたことお詫び申し上げます。

3

具体的な回答には、下記の情報が必要です。
現状のテーブル構成(テーブル名、フィールド名、主キー設定)、サンプルデータ

1

SendObjectメソッドで送ることができます。

SendObject メソッド (Access) | Microsoft Docs

ただし Access2003 で使えたかどうかは記憶にないです。なにしろ17年前にリリースされたものなので。
セキュリティの面からも最新バージョンに置き換えるべきかと。

2
ねん 2020/01/15 (水) 12:13:59 75588@4b1f1

ありがとうございます

最初に質問させてもらった集計などはどのようにしたらよいですか?
また、後から必要になったのですが
10時間超えは週に2回まで、といったような計算もできますか?

23

>> 1のテーブル構成では、出庫詳細 と 入庫詳細 のフィールド名が、共に「 数量 」なのに
>> 5のSQL文では、出庫詳細 と 入庫詳細 のフィールド名が「 入庫数量 」及び「 出庫数量
また、製品テーブルの 製品型番 というフィールドは 投稿文に掲載されておらず、実際の有無が不明。

こういった情報の欠落や矛盾は、ご自身で修正いただくとして
ご希望の結果は 以下のような SQL で表現できるでしょう。

PARAMETERS [Forms]![フォーム1]![表示月] DATETIME ;
SELECT Format$( Nz( [Forms]![フォーム1]![表示月], Date() ), 'yyyy\年m\月' ) As 年月
     , x.製品ID
     , x.製品型番
     , x.製品名
     , Sum(
           IIf( y.入出庫日 
                  < DateSerial( Year( CDate( Nz( [Forms]![フォーム1]![表示月], Date() ) ) )
                              , Month( CDate( Nz( [Forms]![フォーム1]![表示月], Date() ) ) )
                              , 1 )
              , y.入出庫数 * y.入出庫区分
              , 0
           )
       ) As 前月在庫
     , Sum(
           IIf( y.入出庫日 
                    >= DateSerial( Year( CDate( Nz( [Forms]![フォーム1]![表示月], Date() ) ) )
                                 , Month( CDate( Nz( [Forms]![フォーム1]![表示月], Date() ) ) )
                                 , 1 )
                    And
                y.入出庫区分 > 0
              , y.入出庫数
              , 0
           )
       ) As 入庫
     , Sum(
           IIf( y.入出庫日 
                    >= DateSerial( Year( CDate( Nz( [Forms]![フォーム1]![表示月], Date() ) ) )
                                 , Month( CDate( Nz( [Forms]![フォーム1]![表示月], Date() ) ) )
                                 , 1 )
                    And
                y.入出庫区分 < 0
              , y.入出庫数
              , 0
           )
       ) As 出庫
     , Sum( y.入出庫数 * y.入出庫区分 ) As 当月末在庫
FROM 製品 x
INNER JOIN
(
    SELECT 入庫詳細.製品ID
         , 入庫.入庫日        As 入出庫日
         , 入庫詳細.入庫数量  As 入出庫数
         , 1                  As 入出庫区分
    FROM 入庫
    INNER JOIN 入庫詳細
            ON 入庫.入庫ID = 入庫詳細.入庫ID
    WHERE 入庫.入庫日 
              <= DateSerial( Year( CDate( Nz( [Forms]![フォーム1]![表示月], Date() ) ) )
                           , Month( CDate( Nz( [Forms]![フォーム1]![表示月], Date() ) ) ) + 1
                           , 0 )
    UNION ALL 
    
    SELECT 出庫詳細.製品ID
         , 出庫.出庫日
         , 出庫詳細.出庫数量
         , -1
    FROM 出庫
    INNER JOIN 出庫詳細
            ON 出庫.出庫ID = 出庫詳細.出庫ID
    WHERE 出庫.出庫日
              <= DateSerial( Year( CDate( Nz( [Forms]![フォーム1]![表示月], Date() ) ) )
                           , Month( CDate( Nz( [Forms]![フォーム1]![表示月], Date() ) ) ) + 1
                           , 0 )
) y
ON x.製品ID = y.製品ID
GROUP BY x.製品ID
       , x.製品型番
       , x.製品名
ORDER BY x.製品ID ;

 
中間クエリを作らず、SQLを一筆書きで記述してますので
内容について少し解説しておきます。ポイントは3つ。

【 1 】
FROM句のサブクエリになっているユニオンクエリでは
製品・入荷先・出荷先 各テーブルの列は不要ですから、内部結合を必要最小限に留め、
抽出条件は、最初に評価されるクエリ( 一番内側 )に設定することで 処理を高速化できます。

【 2 】
SELECT句では IIF関数を使って条件分岐させることで
当月在庫と前月在庫を一度に計算します。
( 入庫・出庫に関しても同様 )
こうすると、クロス集計クエリを作る必要もなく、構造を単純化できます。

【 3 】
指定月のパラメータは
フォームのコントロールによる 日付の入力 を想定していますけど
入力をスキップすると、自動的に現在の月が設定されます。

1

入力するたびに変化するもの(計算値)なで、通常は必要な時に計算します。
クエリなら集計クエリ、フォームやレポートならSum関数、DSum関数などを使います。

22

クロス集計クエリを使ったクエリを基にするとそうなるようです
クロス集計クエリ(Q入出庫明細のクロス集計クエリ)にクエリ列見出しを設定しておくとレポートウィザードでもフィールド名が表示されるようになります

21
フック船長 2020/01/09 (木) 18:14:06 f3309@31d50 >> 20

明けましておめでとうございます。

上記のクエリを基にレポートをウィザードで作成しようとしますとクエリのフィールド名が表示しません。どのように行えばレポートを作成できるのでしょうか?

12

mayu様
できました。
本当に感謝申し上げます。
本当にありがとうございました。

11
naonao 2020/01/09 (木) 11:19:19 10f03@ea3fc

mayu様

できました。
本当に感謝申し上げます。
本当にありがとうございました。

10

この用にすると動くだろうと安直に思ってましたが、構文エラーになります。

SQL文中で使用する空白は
全角スペースを混在させず、全て半角スペースで統一して下さい。

また、WHERE句の条件を3つにした場合は
地域毎に抽出されたデータの行数 が 3 になっているかを
チェックする必要がありますから
HAVING句の絞り込み条件を Count(1) = 3 に変更しましょう。

SELECT * FROM テーブル1
WHERE 地域 IN
(
    SELECT 地域 FROM テーブル1
    WHERE ( ID = 1 And 収入 >= 100 )
       OR ( ID = 2 And 収入 >= 60 )
       OR ( ID = 3 And 収入 >= 20 )
    GROUP BY 地域
    HAVING Count(1) = 3
);
9
naonao 2020/01/08 (水) 20:11:09 e0b05@0d7bf

無礼を承知でもう一度質問します。

SELECT * FROM テーブル1
WHERE 地域 IN
(
    SELECT 地域 FROM テーブル1
    WHERE ( ID = 1 And 収入 >= 100 )
       OR ( ID = 2 And 収入 >= 60 )
    GROUP BY 地域
    HAVING Count(1) = 2
);

このSQL文に再度条件を加える場合です。

SELECT * FROM テーブル1
WHERE 地域 IN
(
    SELECT 地域 FROM テーブル1
    WHERE ( ID = 1 And 収入 >= 100 )
       OR ( ID = 2 And 収入 >= 60 )
     OR ( ID = 3 And 収入 >= 20 )
    GROUP BY 地域
    HAVING Count(1) = 2
);

この用にすると動くだろうと安直に思ってましたが、構文エラーになります。

単純に条件を重ねても動かないのはわかりました。

もう一度、ご教示お願いします。

地域⇒文字型
ID、収入⇒数値型
主キーは、別にあります。18桁の文字列です

よろしくお願いしあます。

8
naonao 2020/01/08 (水) 18:27:52 e0b05@0d7bf

ありがとうございました。できました。

7

これは、サブクエリでは、できないのでしょうか?

出来ます。

ですが、、、提示いただいた表が
履歴を管理しているテーブルのデータだとしたら
{ 地域 + ID } で行がユニーク( 固有の値 )にならない
という可能性すらありますから

次回からは、情報を小出しにせず
主キーや インデックス、データ型 についての情報も含め、
要件を丁寧に説明なさることをおすすめします。

■ { 地域 + ID } で行がユニークになる場合

SELECT * FROM テーブル1
WHERE 地域 IN
(
    SELECT 地域 FROM テーブル1
    WHERE ( ID = 1 And 収入 >= 100 )
       OR ( ID = 2 And 収入 >= 60 )
    GROUP BY 地域
    HAVING Count(1) = 2
);

■ { 地域 + ID } で行がユニークにならない場合

SELECT t.* FROM テーブル1 t
INNER JOIN
(
    SELECT 地域
    FROM 
    ( 
        SELECT DISTINCT 地域, ID
        FROM テーブル1
        WHERE ( ID = 1 And 収入 >= 100 )
           OR ( ID = 2 And 収入 >= 60 )
    ) tmp
    GROUP BY 地域
    HAVING Count(1) = 2
) q
ON t.地域 = q.地域 ;
14
のり 2020/01/08 (水) 17:45:22 292b8@151a6

hirotonさま
なるほど! 
人間の視覚で物事を判断していました。
わかりやすく説明していただき ありがとうございました。

6
naonao 2020/01/08 (水) 17:01:39 e0b05@0d7bf

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

地域⇒グループ

ID(社員ID) 1(社員番号)

収入⇒収入(そのまま)

社員ID 1 (社歴が一番長い人) の収入が、100万円以上 かつ 社員ID 2(社歴が二番目に長い人)の収入が、60万円以上の地域を抽出したいのです。

大阪 1 120
大阪 2 80
大阪 3 20

そうすると、上のようになるはずなのです。
これは、サブクエリでは、できないのでしょうか?

5
名前なし 2020/01/08 (水) 16:44:15 4451d@e046e

通常、抽出は単一のレコードに対してそれが持つ各フィールドの値を条件にするものですよね
IDが1かつIDが2なんてレコードは存在しないので質問の内容を実現するのはめちゃめちゃ面倒です
ACCESSならDLOOKUPで[地域]が両方とも見つかる(NULLが1つもない)で出せば簡単に組めますが速度的な問題が起きそうな気もします

面倒なことをしようとしてるので、なぜそれをしたいかがあれば適切な答えも出ると思います

4
naonao 2020/01/08 (水) 16:11:08 e0b05@0d7bf

回答ありがとうございます。
IDが1で収入が100以上、かつ、IDが2で、収入が60以上と書きたいのです。
このSQL文ですと、全データが表示されます。
本当にお手数ですけど、ご教示おねがいします。

3

IDの2の収入が、60以上のときですが、下記にすると、何も表示されません。

In (select 地域 from テーブル1 where (ID=1 and 収入>=100) and (ID=2 and 収入>=60))

間の and を or に変更してください。

In (select 地域 from テーブル1 where (ID=1 and 収入>=100) or (ID=2 and 収入>=60))
2
naonao 2020/01/08 (水) 12:07:39 e0b05@0d7bf

ありがとうございます。できました。
また、利用方法がわからず、別のところに書き込んでしまいました。申し訳ありません。

このSQL文に条件を追加したいのですが、
IDの2の収入が、60以上のときですが、下記にすると、何も表示されません。

In (select 地域 from テーブル1 where (ID=1 and 収入>=100) and (ID=2 and 収入>=60))

クエリのグリットに
In (select 地域 from テーブル1 where (ID=1 and 収入>=100))

In (select 地域 from テーブル1 where  (ID=2 and 収入>=60))
一行加えると全部表示されます。

大阪 1 120
大阪 2 80
大阪 3 20

このような結果を抽出するにはどのように記載するのでしょうか?

お手数ですが、重ねて、ご教示をお願いします。

1
hatena 2020/01/07 (火) 20:33:59 修正

in(select 地域 from テーブル1 where 収入>=100)

この条件で、IDの1が、100以上を追加したいのです。

下記のようなことでしょうか。

In (select 地域 from テーブル1 where ID=1 and 収入>=100)
13
hiroton 2020/01/07 (火) 07:12:46 5456d@f966d

わかりやすいと思うのでExcelを例に出しますが、Excelで表を作ろうと思うと1行目は項目にしたりしますよね?
そうすると1番目のデータは2行目となります。
表にタイトルを入れようと思うとさらに1行目ずらして1番目のデータは3行目となったりもします。

質問のフォームは帳票を横に表示するという特殊なことをしているので、設計上たまたま「元順+2がフォームの("txt" & i)に対応している」ということでしょう

2
朱色 2020/01/06 (月) 18:16:44 db0eb@be71c

なるほど、元から存在してるものに対し、使用することで名前を定義し、それに対してCloseしちゃってるのですね。
閉じずに放置することにします。
ありがとうございました。

12
のり 2020/01/06 (月) 09:46:17 292b8@151a6

hatenaさま 
    Me.畦取①.SetFocus
    Me.畦取①.Form.Controls("txt" & (Me.元順+2)).SetFocus
で出来ました。
テキストボックスの「使用可能」が「はい」でできるとは気が付きませんでした。

 Me.元順+2 で 畦取①.Form.Controls ”TXT” とイコールになるのが 疑問が残りましたが、とにかく思うように動いてくれます。

hatenaさま、hirotonさま 本当にありがとうございました。

11
hatena 2020/01/04 (土) 19:11:03 修正

遅くなりました。ようやく時間がとれたのでファイルを見てみました。

hirotonさんの最初の回答でほぼあっているのですが、
サブフォーム「畦取①」のすべてのテキストボックスの「使用可能」が「いいえ」になっているので、フォーカス移動できないためうまくいかないのだと思われます。
まずは「使用可能」を「はい」に変更してください。
そのうえで、サブフォームのソースが変更されるタイミングで、下記のコードを実行するようにしてみてください。

メインフォームの「元順」の位置のテキストボックスへ移動。

    Me.畦取①.SetFocus
    Me.畦取①.Form.Controls("txt" & Me.元順).SetFocus

フィールドの最終列へ移動ならhirotonさんのコードで。

10
のり 2019/12/29 (日) 11:39:28 439fb@5d7bf

hatenaさま

ありがとうございます。
できるだけ簡略化したファイルを送らせていただきました。
ご無理を言いますが よろしくお願いいたします。