Access VBA質問箱 IV

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

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


163 / 2272 ツリー ←次へ | 前へ→

【12726】更新クエリについて ゆか 15/3/12(木) 16:42 質問[未読]
【12727】Re:更新クエリについて かるびの 15/3/12(木) 23:30 回答[未読]
【12731】ありがとうございます。 ゆか 15/3/16(月) 12:01 お礼[未読]
【12748】Re:更新クエリについて ゆか 15/3/21(土) 18:45 質問[未読]
【12749】クエリのCSV出力について ゆか 15/3/21(土) 21:45 質問[未読]
【12750】Re:別スレッドへ かるびの 15/3/21(土) 23:40 発言[未読]
【12751】畏まりました。 ゆか 15/3/23(月) 8:23 お礼[未読]

【12726】更新クエリについて
質問  ゆか  - 15/3/12(木) 16:42 -

引用なし
パスワード
   はじめまして。アクセスの本を読んでも、
PCが苦手な私には理解し兼ねたために、
皆様方のお知恵を拝借したく、この度質問させていただきます。
年度末で皆様ご多忙と存じますが、お答えいただければ幸いです。

下記3点のテーブルがあります。
I.入金・未入金
II.入金・未入金(取込)
III.請求

1、2のテーブルは下記のようなフィールドになっています。
(1)振替日 (yyyy/mm/dd)
(2)委託者番号
(3)委託者名
(4)契約者番号
(5)口座名義人名
(6)入金額
(7)未入金額
(8)金融機関コード
(9)金融機関名
(10)支店コード
(11)支店名
(12)預金種目
(13)口座番号
(14)不能理由

3のテーブルは下記のようなフィールドになっています。
(1)請求No
(2)請求年月
(3)振替日
(4)利用者ID
(5)請求額
(6)新規コード
(7)領収済(Yes/No型)
(8)備考

これらのテーブルに、下記のことを自動もしくは
操作項目を少なくし、ミスを減らしたいと考えています。

1.テーブルII.にcsvデータを取り込む
  ※CSVの内容は、テーブルI.II.と同じ項目です。
2.テーブルI.に1で取り込んだデータを追加する。
  ※請求年月日と利用者IDが重複するものは、上書き更新
3.テーブルI.の(4)契約者番号とテーブルIII.の(4)利用者IDが一致し、
 テーブルI.の(1)振替日とがテーブルIII.の(3)振替日一致するレコードを、
 テーブルI.の(14)不能理由が0になっている場合、
  テーブルIII.の(7)領収済にチェックにいれる。

このような一連の工程が短縮できるようにするには
どうしたらよいかを教えていただければ幸いです。
お手数をお掛けしますが、何卒よろしくお願いいたします。

【12727】Re:更新クエリについて
回答  かるびの  - 15/3/12(木) 23:30 -

引用なし
パスワード
    本題からはずれますが、気になった点をいくつか。

>下記3点のテーブルがあります。
>I.入金・未入金
>II.入金・未入金(取込)

 第1に、「入金・未入金(取込)」テーブルですが、
テーブル名に括弧や中黒などの記号を使うのは、やめた方がいいです。
 それら記号は、プログラム上特別な意味が与えられていることがあるため、
コンピュータにおいて、プログラム上特別な意味が与えられている記号であるのか、
テーブルの名前の一部なのかの区別をつけられなくなるおそれがあるからです。
 使っていい記号は、アンダーバー「_」だけです。

 第2に、「入金・未入金(取込)」テーブルですが、
一般的に言えば、テーブル構成が同じテーブルを複数持ってはいけません。
 エクセルなどでは、月ごとや年ごとにワークシートを分けたりしますが、
そのようにテーブルを分けてはいけません。
 テーブルは1個にまとめるべきです。

 ただ、CSVファイルからいきなり「入金・未入金」テーブルへインポートすると、
不都合が出る場合があります。
 CSVファイルからインポートした後、データを修正した上で、
「入金・未入金」テーブルへ追加したいという場合です。
 インポートされたものを格納するだけの専用のテーブルを設けておいた方が、
そういうデータの修正をやりやすいです。
 つまり、今回の場合は「入金・未入金」テーブルと「入金・未入金(取込)」テーブルの
2テーブル構成で良いと思います。

 第3に、テーブル構成の提示です。
 こういう掲示板でアクセスについての質問をする人の中には、テーブル構成を示さない人が
半分くらいいます。
 なので、テーブル構成を書いてくれたのは、とても良いです。
 ただ、惜しいのは、主キーがどのフィールドなのか書いて欲しかったです。
 また、各フィールドのデータ型も示して欲しかったです。
 さらに言うと、「入金・未入金」テーブルと「請求」テーブルは、どういう関係に立つのか、
つまり、一対一なのか、一対多なのか、多対多なのかも書いてもらえれば、
さらに良かったです。


 さて、本題です。
>これらのテーブルに、下記のことを自動もしくは
>操作項目を少なくし、ミスを減らしたいと考えています。
>
>1.テーブルII.にcsvデータを取り込む
>  ※CSVの内容は、テーブルI.II.と同じ項目です。
>2.テーブルI.に1で取り込んだデータを追加する。
>  ※請求年月日と利用者IDが重複するものは、上書き更新
>3.テーブルI.の(4)契約者番号とテーブルIII.の(4)利用者IDが一致し、
> テーブルI.の(1)振替日とがテーブルIII.の(3)振替日一致するレコードを、
> テーブルI.の(14)不能理由が0になっている場合、
>  テーブルIII.の(7)領収済にチェックにいれる。
>
>このような一連の工程が短縮できるようにするには
>どうしたらよいかを教えていただければ幸いです。

 最も自動化を進めるならば、
フォームにコマンドボタンを配置し、そのコマンドボタンをクリックすれば、
上記1から3までの処理を行ってしまうというような形が可能です。

 上記1から3までの処理を部分的に自動化したいというのなら、
それに応じて、様々な方法が考えられます。


 自動化する場合、基本的には、マクロを使うか、VBAを使うかします。
 なお、私は、マクロは殆どわかりませんので、マクロについては細かな回答はできません。

>1.テーブルII.にcsvデータを取り込む
 マクロなら、「テキスト変換」アクションを使います。
 VBAなら、TransferText メソッドを使います。
 いずれの場合も、予め「インポート定義」を設定しておいた方がいいでしょう。

 ただ、CSVファイルでの並び順をテーブルでも何が何でも維持したいというのであれば、
上記の方法ではなく、「Line Input #」ステートメントを使います。


>2.テーブルI.に1で取り込んだデータを追加する。 
>  ※請求年月日と利用者IDが重複するものは、上書き更新
 更新クエリを実行することになります。
 次のページが参考になると思います。
   hatena chips
   クエリで2つのテーブルを同期させる
   ht tp://hatenachips.blog34.fc2.com/blog-entry-153.html

 ただ、「入金・未入金」テーブルや「入金・未入金(取込)」テーブルには、
「請求年月日」フィールドも「利用者ID」フィールドもありませんから、
両テーブルで重複するレコードをどのように認識するか、もう少し考える必要があります。

 更新クエリの実行は、マクロであれば、「SQL の実行」アクションですが、
VBAであれば、「RunSQL」メソッドか、DAOを使っての「Execute」メソッドを使います。
「Execute」メソッドの方がお勧めです。


>3.テーブルI.の(4)契約者番号とテーブルIII.の(4)利用者IDが一致し、
> テーブルI.の(1)振替日とがテーブルIII.の(3)振替日一致するレコードを、
> テーブルI.の(14)不能理由が0になっている場合、
>  テーブルIII.の(7)領収済にチェックにいれる。
 これも、更新クエリを実行することになります。
 
>テーブルI.の(4)契約者番号とテーブルIII.の(4)利用者IDが一致し、
>テーブルI.の(1)振替日とがテーブルIII.の(3)振替日一致するレコードを、
 ここは、両テーブルの結合条件を使って実現することになります。

>テーブルI.の(14)不能理由が0になっている場合、
 ここは、そのような抽出条件を指定します。SQL文で言えば、WHERE句で実現します。

【12731】ありがとうございます。
お礼  ゆか  - 15/3/16(月) 12:01 -

引用なし
パスワード
   かるびの様

初心者で何もわからない私のために懇切丁寧にご指導とご回答をいただき、
ありがとうございます。お忙しい中、恐縮です。

早速教えていただいた様に、テーブル名を変更し、
フォームにコマンドを配置してやってみることにします。
コマンド自体がうまく作れるかは自信はありませんが、
一度熟考して挑戦してみます。

どうしてもわからなかった場合には再度質問させていただくかもしれませんが、
その際は何卒よろしくお願いいたします。

【12748】Re:更新クエリについて
質問  ゆか  - 15/3/21(土) 18:45 -

引用なし
パスワード
   先日は、親切丁寧に教えて下さりありがとうございました。
お蔭様で、うまく更新することが出来ました。
ありがとうございます。
そして、少しステップアップを試みました!
アクセス2010で、「複数のアイテム」で利用者のフォームを作成し、
複数の抽出が出来る様に試みました。
試みてはや4日、全くうまくいきません。
木葉さんのコメントもみているのですが、???が頭にうかんでばかりです。
もしよろしければ、何がいけないのか教えていただけませんでしょうか。
宜しくお願いいたします。

テーブル:利用者
利用者ID(主キー):テキスト型
請求コード:数値型
利用施設:テキスト型(テーブル:施設のルックアップ)
金融機関コード:数値型
支店コード:数値型
預金種目コード:数値型
口座番号:数値型
口座名義人:テキスト型
住所:テキスト型
連絡先:テキスト型
備考:メモ型
利用開始日:日付/時刻型
利用終了日:日付/時刻型
利用終了者:Yes/No型

テーブル:施設
施設ID(主キー):オートナンバー型
施設名:テキスト型

テーブル:請求
請求No(主キー):オートナンバー型
請求年月:数値型
振替日:テキスト型
請求額:通貨型
新規コード:数値型
領収済:数値型
備考:メモ型

リレーションシップ
利用者:利用者ID 請求:利用者ID(一対多)

フォーム:利用者一覧
ヘッダー部分に下記を追加
テキストボックス
txt_利用者ID
txt_t口座名義人
txt_利用者名
txt_利用施設 (当初はコンボボックスで選択可能にしたかったのですが、全くうまくいかなかたっためテキストになっています。)
txt_開始日
txt_終了日
txt_口座番号

チェックボックス:利用終了者

ボタン
名前:cmdFilter 標題:抽出
名前:cmfFilterOff 標題:抽出解除

上記のテキストボックスとチェックボックスで複数抽出するために
下記の構文を利用しました。    

Private Sub cmdFilter_Click()
  Dim strFilter As String, strExp As String, aryOpe As Variant


  If Not IsNull(Me.txt_利用者ID) Then
    strFilter = " AND " & BuildCriteria("利用者ID", _
      dbLong, Me.txt_利用者ID)
  End If
  
   If Not IsNull(Me.txt_口座番号) Then
    strFilter = " AND " & BuildCriteria("口座番号", _
      dbLong, Me.txt_口座番号)
  End If
  
 
  If Not IsNull(Me.txt_口座名義人) Then
    strFilter = strFilter & " AND 口座名義人 Like '*" & Me.txt_口座名義人 & "*'"
  End If
  
  If Not IsNull(Me.txt_利用者名) Then
     strFilter = strFilter & " AND 利用者名 Like '*" & Me.txt_利用者名 & "*'"
  End If
  
   If Not IsNull(Me.txt_利用施設) Then
     strFilter = strFilter & " AND 利用施設 Like '*" & Me.txt_利用施設 & "*'"
  End If
  
  If Not IsNull(Me.txt_開始日) Then
    strFilter = strFilter & " AND 開始日 >= #" & Nz(Me.txt_開始日) & "#"
  End If
  
  If Not IsNull(Me.txt_終了日) Then
    strFilter = strFilter & " AND 終了日 <= #" & Nz(Me.txt_終了日) & "#"
  End If
  
If Not IsNull(Me.利用終了者) Then
    Me.Filter = "利用終了者 = '" & True & "'"  
End If


  Me.Filter = Mid(strFilter, 8)
  If strFilter = "" Then
    Me.FilterOn = False
  Else
    Me.FilterOn = True
  End If
End Sub

Private Sub cmdFilterOff_Click()
  Me.Filter = ""
  Me.FilterOn = False
  Me.txt_利用者ID = Null
  Me.txt_口座名義人 = Null
  Me.txt_利用者名 = Null
  Me.txt_利用施設 = Null
  Me.txt_開始日 = Null
  Me.txt_終了日 = Null
  Me.txt_口座番号 = Null
  Me.利用終了者 = Null
End Sub


拙文な上に長文で申し訳ありませんが、
どうぞ宜しくお願いいたします。

【12749】クエリのCSV出力について
質問  ゆか  - 15/3/21(土) 21:45 -

引用なし
パスワード
   そして、もう一つずっと詰まっていることがあります。

送付用というクエリがあるのですが

SELECT DISTINCT 利用者.請求コード, 請求.請求年月, 利用者.金融機関コード, 利用者.支店コード, 利用者.預金種目コード, 利用者.口座番号, 利用者.口座名義人, 請求.請求額, 請求.新規コード, Format([利用者].[利用者ID],"00000000000000") AS 利用者
FROM 利用者 INNER JOIN 請求 ON 利用者.利用者ID = 請求.利用者ID
WHERE (((請求.領収済)<>0))
ORDER BY 請求.請求年月, Format([利用者].[利用者ID],"00000000000000");

できちんと表示されていたものが、何故か
クエリ式'Format([利用者].[利用者ID],"のコンパイルエラーが発生しました

発生後の式は

SELECT DISTINCT 利用者.請求コード, 請求.請求年月, 利用者.金融機関コード, 利用者.支店コード, 利用者.預金種目コード, 利用者.口座番号, 利用者.口座名義人, 請求.請求額, 請求.新規コード, Format([利用者].[利用者ID],"00000000000000") AS 利用者
FROM 利用者 INNER JOIN 請求 ON 利用者.利用者ID = 請求.利用者ID
WHERE (((請求.領収済)<>0))
ORDER BY 請求.請求年月, 請求.請求年月;

何がよろしくないのでしょうか。
初歩的な事ばかりお尋ねして申し訳ありませんが、
何卒よろしくお願いいたします。

【12750】Re:別スレッドへ
発言  かるびの  - 15/3/21(土) 23:40 -

引用なし
パスワード
    12748や12749は、当初の「更新クエリについて」とは別の話になってしまっているので、
別にスレッドを立てた方がいいと思います。

 そのときは、12748については、「利用者一覧」フォームに関し、
そのレコードソース、
txt_利用者ID、txt_t口座名義人、txt_利用者名、txt_利用施設、txt_開始日、txt_終了日
及びtxt_口座番号の各コントロールソース
の情報を追加してください。
 また、12748については、どううまくいかないのか、つまり、何らかのエラーが出るのか、
エラーはでないが、予期したとおりの抽出ができないのかなどについても追加してください。

【12751】畏まりました。
お礼  ゆか  - 15/3/23(月) 8:23 -

引用なし
パスワード
   かるびの様

ご多忙の中ありがとうございます。
そのようにさせていただきます。

163 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078190
(SS)C-BOARD v3.8 is Free