Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


190 / 500 ページ ←次へ | 前へ→

【9470】Re:SQLの記述
回答  たん  - 07/5/29(火) 16:48 -

引用なし
パスワード
   >番号  商品名  在庫数
>01  A完成品  50
>011 A工程1   5

が少なくとも、同じ01として処理させたいなら、
そういう形にクエリ上で加工しておかなければ、

クロス集計クエリ(前述のクエリとは別)で

番号が5種類になるのは当然。
・ツリー全体表示

【9469】SQLの記述
質問  hiro  - 07/5/29(火) 15:58 -

引用なし
パスワード
   いつも参考にさせていただいてます。
環境は WinXP Access2000です。

下記のテーブルの

番号  商品名  在庫数
01  A完成品  50
011 A工程1   5
012 A工程2  25
02  B完成品  10
022 B工程2   5

SQLの実行結果が

番号  商品名  在庫数 工程1 工程2
01  A完成品  50  5   25
02  B完成品  10       5

となるように記述するにはどうすればよいのでしょうか?

クロス集計クエリで作成してみたのですが実行結果が

番号  商品名  在庫数 工程1 工程2
01  A完成品  50
011 A工程1       5
012 A工程2          25
02  B完成品  10
022 B工程2           5

となります。
ご存知の方おられましたら教えていただけますでしょうか。
よろしくお願いします。
・ツリー全体表示

【9468】Re:指定した日から今日までの日数をカウン...
回答  小僧  - 07/5/29(火) 15:39 -

引用なし
パスワード
   ▼まり さん:
こんにちは。


>ソースを教えていただきたいです!!!

掲示板の上にある「こちら」をクリックして表示される
サイトの基本方針をご確認されてみてください。
(特に「してはいけない質問について」の項あたりを…)

日付の差を求める関数として DateDiff 関数がありますが、
今回の場合は

・x年xヶ月x日という表示でなく、単純にx日という表記で良い
・時間まで求める必要がある

という事で、単純にtxt退職日からtxt本日を引き、
整数部が日にち、Format関数を小数部に使い時間を求める方法でも良さそうです。

あとは仕様の問題として
・片方に何も入っていなかった場合どうするのか
・時間が入力されていなかった場合どうするのか

などを決める必要が出てきそうですね。


例えば
txt本日 2007/03/31 15:33
txt退職日 2007/03/31

の場合、txt退職日まで にはマイナスの値が入ることになります。

・昨年度いっぱいでの退職者の日付を入力する場合、
 ユーザさんの入力を 2007/04/01 としてもらう様にする

・時間が入っていない場合は警告を出して、時間まで入力させる

・時間が入っていない場合は勝手にプログラムで 23:59:59 を足す

など、考えられそうですね。
・ツリー全体表示

【9467】Re: 閉じる時最適化はしない方が
お礼  吉村  - 07/5/28(月) 18:11 -

引用なし
パスワード
   たんさん、こんにちは。
ご指摘ありがとうございました。

「最適化」を解除しました。


▼たん さん:
>>「ツール」→「オプション」→「全般」→「閉じる時に最適化する(C)」
>
>については、開発中のプログラムではやらない方が良いでしょう。
>開発中というのは、さまざまな理由で、mdbが破損する可能性があります。
>
>上記を設定していると、破損したmdbのままで最適化しようとする場合が
>あるので、mdb自体を定期的にバックアップを取っていないと、
>
>mdb破損の際に、どうしようもなくなります。
>
>最適化が必要であれば、定期的に手動で行なうべきです。
・ツリー全体表示

【9466】Re: 閉じる時最適化はしない方が
発言  たん  - 07/5/28(月) 11:53 -

引用なし
パスワード
   >「ツール」→「オプション」→「全般」→「閉じる時に最適化する(C)」

については、開発中のプログラムではやらない方が良いでしょう。
開発中というのは、さまざまな理由で、mdbが破損する可能性があります。

上記を設定していると、破損したmdbのままで最適化しようとする場合が
あるので、mdb自体を定期的にバックアップを取っていないと、

mdb破損の際に、どうしようもなくなります。

最適化が必要であれば、定期的に手動で行なうべきです。
・ツリー全体表示

【9465】Re:RunMacro""が実行できません...
お礼  吉村  - 07/5/26(土) 20:51 -

引用なし
パスワード
   hatena さんへ
>
>データベースにおけるレコード削除は、実際にデータを消去
>するわけでなく、削除マークを付けていくだけです。
>ですので、それほど時間がかかるわけではありません。
>
>大量のレコードを削除してもMDBファイルサイズは減らないことから
>分かると思います。
>そのため定期的に、最適化をして削除して無駄になった領域を
>実際に削除するという処理が必要になります。

こんな設定をしてみました。
「ツール」→「オプション」→「全般」→「閉じる時に最適化する(C)」
を「チェック」しました。
COBOLの領域でいう「索引ファイルの再構築」と同様かな・・
と認識させてもらいました。
※すみません。
 ここはAccess広場ですので他言語に言及するのは禁止ですね。

私、54歳になります。
今年3月からこの業界、この仕事を担当になりました。
COBOLと簡単なSQLはひと月くらいで何とかマスターできましたが、
AccessとAccessVbaは私にとってかなり手強い存在です。

今後も幼稚な投稿(質問)をさせていただく事になりますが、
よろしくお願い致します。

クロさん,そしてhatenaさん ありがとうございました。
とても勉強になりました。
・ツリー全体表示

【9464】Re:RunMacro""が実行できません...
回答  hatena  - 07/5/26(土) 19:48 -

引用なし
パスワード
   >Deleteは1レコードづつ削除していくというイメージ
>が私の中にありまして、テーブルを一気に初期化する
>コマンドがあればそれを使いたいという事なんですが。

データベースにおけるレコード削除は、実際にデータを消去
するわけでなく、削除マークを付けていくだけです。
ですので、それほど時間がかかるわけではありません。

大量のレコードを削除してもMDBファイルサイズは減らないことから
分かると思います。
そのため定期的に、最適化をして削除して無駄になった領域を
実際に削除するという処理が必要になります。
・ツリー全体表示

【9463】Re:RunMacro""が実行できません...
質問  吉村  - 07/5/26(土) 19:27 -

引用なし
パスワード
   ありがとうございます。
出来ました。

  MsgBox " 抽出処理を終了しました。 "
  CurrentDb.Execute "qutacifimport_delete"
  DoCmd.TransferText acImportDelim, "select_import", "tacifimport", "c:\sinsystem_mdb\data\select_import.txt"
  MsgBox " データベースを作成しました。 "


>
>>【質問4】
>>
>> テーブルの初期化にDeleteを使っていますが、本当は「ModifyTable」のようなものを使いたいのですが、
>> 関数?,コマンド?が分かりません。
>
>具体的には何がしたいのでしょうか。

Deleteは1レコードづつ削除していくというイメージ
が私の中にありまして、テーブルを一気に初期化する
コマンドがあればそれを使いたいという事なんですが。
・ツリー全体表示

【9462】Re:RunMacro""が実行できません...
回答  hatena  - 07/5/26(土) 17:28 -

引用なし
パスワード
   >>CurrentDB.Excute "削除クエリ名"
> を参考にして
> CurrentDb.Excute "qutacifimport_delete"としました。
> 結果は、
>「コンパイルエラー:メソッドまたはデータメンバが見つかりません。」
> となります。(クエリ名は確認しました)
> VBEditorの画面へ遷移して、CurrentDb.Excuteの「.Excute」の文字列
> が反転している状態になります。

ごめんなさい。タイプミスです(汗)
CurrentDb.Execute が正しいです。

>【質問2】
> CurrentDb.Excuteの代わりに
> DoCmd.RunSQL "Delete * From tacifimport"を試みて、成功はしましたが、

RunSQL もやはり非同期ですので、Executeを使った方がいいです。

>【質問3】
>>Docmd.TransferText acLinkDelim, "インポート定義","テーブル名","ファイル名"
>>
>>というようにVBAで記述した方が安全でしょう。
>
>  DoCmd.TransferText acLinkDelim, "select_import", "tacifimport", "c:\sinsystem_mdb\data\select_import.txt"
> は成功しましたが、"tacifimport"のテーブルテキストリンク"tacifimport1"
> が作成されてしまいます。
> 本当は"tacifimport"へ上書きしたいのですが。
> 「作成されてしまいます・・」というよりは、私が未熟でそういう仕組みになっているのですが。

ごめんなさい。これも私のミスです(滝汗)
インポートは、第一引数が acImportDelim でした。

>【質問4】
>
> テーブルの初期化にDeleteを使っていますが、本当は「ModifyTable」のようなものを使いたいのですが、
> 関数?,コマンド?が分かりません。

具体的には何がしたいのでしょうか。
・ツリー全体表示

【9461】Re:RunMacro""が実行できません...
質問  吉村  - 07/5/26(土) 15:38 -

引用なし
パスワード
   hatena さん、こんにちは。

解説とご指摘ありがとうございます。
早速、ご指摘の箇所を修正しましたが、どうもうまくいきません。

4点、質問をさせてください。

私は、
OS:Microsoft WindowsXP Home Edition
バージョン:5.1.2600 Service Pack2
Office 2003:Access2003
を使用しています。

ご指摘の箇所ですが、
>
>>  DoCmd.RunMacro "tacifimport_delete"
>>'  テーブルの初期化
>>
>>  DoCmd.RunMacro "cif_import"
>>'  テーブルの作成(インポートです)
>
>RunMacro(マクロ)でクエリを実行する場合非同期ですので、
>実行終了を待たずに、次のコードが実行されます。
>ですので、テーブルの初期化が終わる前に、
>次のインポートが実行される可能性があります。
>
>ここは、
>
>CurrentDB.Excute "削除クエリ名"
を参考にして
CurrentDb.Excute "qutacifimport_delete"としました。
結果は、
「コンパイルエラー:メソッドまたはデータメンバが見つかりません。」
となります。(クエリ名は確認しました)
VBEditorの画面へ遷移して、CurrentDb.Excuteの「.Excute」の文字列
が反転している状態になります。
尚、クエリの単独実行は正常に動きました。

試しに、
CurrentDb.Excute "Delete * From tacifimport"としましたが、
結果は同じでした。

【質問1】
Accessの環境定義みたいなもに問題があるのでしょうか?
例えば、ODBCソースみたいのものですが?
(ODBCの意味も分からずに質問して申し訳ありません。)

【質問2】
CurrentDb.Excuteの代わりに
DoCmd.RunSQL "Delete * From tacifimport"を試みて、成功はしましたが、
どうしても、「CurrentDb.Excute」を克服したいと思っています。
ご指摘をお願いします。

【質問3】
>Docmd.TransferText acLinkDelim, "インポート定義","テーブル名","ファイル名"
>
>というようにVBAで記述した方が安全でしょう。

  DoCmd.TransferText acLinkDelim, "select_import", "tacifimport", "c:\sinsystem_mdb\data\select_import.txt"
は成功しましたが、"tacifimport"のテーブルテキストリンク"tacifimport1"
が作成されてしまいます。
本当は"tacifimport"へ上書きしたいのですが。
「作成されてしまいます・・」というよりは、私が未熟でそういう仕組みになっているのですが。

【質問4】

テーブルの初期化にDeleteを使っていますが、本当は「ModifyTable」のようなものを使いたいのですが、
関数?,コマンド?が分かりません。

>

以上ですが、なにとぞよろしくお願いします。
・ツリー全体表示

【9460】Re:RunMacro""が実行できません...
発言  hatena  - 07/5/26(土) 7:50 -

引用なし
パスワード
   解決したということですが、
念のために、

>   Private Const PROCESS_STATUS     As Long = &H400  'プロセスの状態を取得する
>   Private Const PROCESS_ACTIVE     As Long = &H103  'プロセスは実行中
>   * As Long = &H400,As Long = &H103 の記述はまだ理解できていません。

これは定数の定義で、その数値にコメント部分の意味を割り当てた
ということです。あとで使うときに、&H400 と指定するより、
PROCESS_STATUS と指定した方がコードが読みやすいですよね。

例えば、

>  ProcessHandle = OpenProcess(PROCESS_STATUS, False, ProcessID)
>'  プロセスハンドル情報の取得

ProcessHandle = OpenProcess(&H400, False, ProcessID)

とするより意味を理解しやすいですよね。

>  Do
>    GetExitCodeProcess ProcessHandle, ExitCode
>'    プロセス状態の取得
>
>    DoEvents
>  Loop While ExitCode = PROCESS_ACTIVE
>'  プロセスが終了するまでループさせる(或いは、待っているのでしょうか)

状態が PROCESS_ACTIVE(プロセスは実行中)の間はループさせるということですね。


>  DoCmd.RunMacro "tacifimport_delete"
>'  テーブルの初期化
>
>  DoCmd.RunMacro "cif_import"
>'  テーブルの作成(インポートです)

RunMacro(マクロ)でクエリを実行する場合非同期ですので、
実行終了を待たずに、次のコードが実行されます。
ですので、テーブルの初期化が終わる前に、
次のインポートが実行される可能性があります。

ここは、

CurrentDB.Excute "削除クエリ名"

Docmd.TransferText acLinkDelim, "インポート定義","テーブル名","ファイル名"

というようにVBAで記述した方が安全でしょう。
・ツリー全体表示

【9459】テキストボックス内の文字数の限定
質問  ぁや  - 07/5/25(金) 16:14 -

引用なし
パスワード
   Access初心者で今計算機を作っています。
答えのかえってくるテキストボックスの文字数を最大12文字までにしたいのですが、どうやったらよいのでしょうか?
・ツリー全体表示

【9458】Re:RunMacro""が実行できません...
お礼  吉村  - 07/5/25(金) 12:54 -

引用なし
パスワード
   クロさん こんにちは。 ありがとうございました。

やっと解決しましたが、まだまだ詳細部分については理解できていません。
特に、As Long = &H400,As Long = &H103 の記述はチンプンカンプンです。


以下のURLを参考にさせて頂きました。

http://miyabi.la.coocan.jp/technic/index.php?ID=1&Category=1&Topic=10
http://homepage1.nifty.com/rucio/main/tyukyu/tyukyu4.htm

1. フォームモジュールレベルで文字列データの比較条件を定義しました。
  ・Option Compare {Binary | Text | Database}
   ここではAccess内でのみ使用しますので以下のように記述しました。
   Option Compare Database

  ・Option Explicit
   ここで、定数を記述しました。
   Private Const PROCESS_STATUS     As Long = &H400  'プロセスの状態を取得する
   Private Const PROCESS_ACTIVE     As Long = &H103  'プロセスは実行中
   * As Long = &H400,As Long = &H103 の記述はまだ理解できていません。

   ここでは、WinAPI宣言(APIのハンドル) を記述しました。
   Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
   * プロセスハンドルの情報を取得する。
   Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
   * プロセスの状態を取得する。
   Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
   * プロセス終了時にプロセスハンドルを閉じる。

※General定義は以上です。 整理すると以下のようになりました。

   Option Compare Database
   Option Explicit
     Private Const PROCESS_STATUS     As Long = &H400
     Private Const PROCESS_ACTIVE     As Long = &H103
     Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
     Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
     Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long


2.  次は、Private Subの記述です。

Private Sub export_Click()

'  変数宣言
  Dim ProcessID                  As Long
  Dim ProcessHandle                As Long
  Dim ExitCode                  As Long

  Call SaveRec
'  テーブルの更新

  DoCmd.RunMacro "cif_export"
'  テキストファイルの作成

  MsgBox " 抽出条件を作成しました。 "

'  Call Shell("C:\sinsystem_mdb\object\fs8e290a.exe")
'  このCall文を以下のように変更しました。

  ProcessID = Shell("C:\sinsystem_mdb\object\fs8e290a.exe")

  ProcessHandle = OpenProcess(PROCESS_STATUS, False, ProcessID)
'  プロセスハンドル情報の取得

  Do
    GetExitCodeProcess ProcessHandle, ExitCode
'    プロセス状態の取得

    DoEvents
  Loop While ExitCode = PROCESS_ACTIVE
'  プロセスが終了するまでループさせる(或いは、待っているのでしょうか)

  Call CloseHandle(ProcessHandle)
'  プロセスハンドルを閉じる

  MsgBox " 抽出処理を終了しました。 "

  DoCmd.RunMacro "tacifimport_delete"
'  テーブルの初期化

  DoCmd.RunMacro "cif_import"
'  テーブルの作成(インポートです)

  MsgBox " データベースを作成しました。 "

End Sub


※Private Sub定義は以上です。 整理すると以下のようになりました。

Private Sub export_Click()

'  変数宣言
  Dim ProcessID                  As Long
  Dim ProcessHandle                As Long
  Dim ExitCode                  As Long

  Call SaveRec

  DoCmd.RunMacro "cif_export"

  MsgBox " 抽出条件を作成しました。 "

  ProcessID = Shell("C:\sinsystem_mdb\object\fs8e290a.exe")

  ProcessHandle = OpenProcess(PROCESS_STATUS, False, ProcessID)

  Do
    GetExitCodeProcess ProcessHandle, ExitCode

    DoEvents
  Loop While ExitCode = PROCESS_ACTIVE

  Call CloseHandle(ProcessHandle)

  MsgBox " 抽出処理を終了しました。 "

  DoCmd.RunMacro "tacifimport_delete"

  DoCmd.RunMacro "cif_import"

  MsgBox " データベースを作成しました。 "

End Sub

以上です、ありがとうございました。
・ツリー全体表示

【9457】Re:RunMacro""が実行できません...
発言  吉村  - 07/5/25(金) 10:16 -

引用なし
パスワード
   解決次第、結果を報告します。
API・
未知の領域なので、理解しながら進捗しています。


▼クロ さん:
>>まだ、解決していません。
>
>あっ、なるほど「礼」となってたから終わったものかと...スミマセン。
・ツリー全体表示

【9456】Re:RunMacro""が実行できません...
発言  クロ  - 07/5/25(金) 10:07 -

引用なし
パスワード
   >まだ、解決していません。

あっ、なるほど「礼」となってたから終わったものかと...スミマセン。
・ツリー全体表示

【9455】Re:RunMacro""が実行できません...
発言  吉村  - 07/5/25(金) 9:48 -

引用なし
パスワード
   クロ さん おはようございます。
まだ、解決していません。
紹介していただいたURLを参考にただいま挑戦中です。


▼クロ さん:
>えっと...終わりってことですか?
>
>でしたら、最終的にどのように解決したかを書いていただければ
>後々同様の疑問を持った方の参考になるので…是非ヨロシク!
・ツリー全体表示

【9454】Re:RunMacro""が実行できません...
発言  クロ  - 07/5/25(金) 8:34 -

引用なし
パスワード
   えっと...終わりってことですか?

でしたら、最終的にどのように解決したかを書いていただければ
後々同様の疑問を持った方の参考になるので…是非ヨロシク!
・ツリー全体表示

【9453】Re:RunMacro""が実行できません...
お礼  吉村  - 07/5/24(木) 19:19 -

引用なし
パスワード
   ありがとうございます。

COBOL側は基幹システムのため、その資源を
活用する制約があります。
・ツリー全体表示

【9452】Re:レポートのスナップショット保存につい...
お礼  くま  - 07/5/24(木) 18:02 -

引用なし
パスワード
   ▼Gin_II さん こんにちは。

色々な方法がありますね。とても参考になります。
これも違うPGMで使わせていただこうと思います。
ありがとうございました。
・ツリー全体表示

【9451】Re:レポートのスナップショット保存につい...
お礼  くま  - 07/5/24(木) 18:00 -

引用なし
パスワード
   ▼クロ さん こんにちは。

OutputToメソッドと組み合わせてより使いやすいものができました。
本当にありがとうございました。
・ツリー全体表示

190 / 500 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
1084622
(SS)C-BOARD v3.8 is Free