Access VBA質問箱 IV

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

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


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

【11745】Re:リレーション設定してある主テーブル
お礼  ひろ  - 10/7/29(木) 16:02 -

引用なし
パスワード
   ▼よろずや さん

 ありがとうございます。
 設定内容ですが、2つのテーブルは、コードで一対一で組んでまして
 参照整合性、フィールドの連鎖更新、レコードの連鎖削除全てにチェック
 入れてます。

 主テーブルは、毎日更新変更したいのですが、どうすれば良いのでしょうか?

 宜しくお願いします。
・ツリー全体表示

【11744】Re:レコードセットの追加と編集
質問  あおぎん  - 10/7/29(木) 15:51 -

引用なし
パスワード
   ▼雅 さん:
>雅です。
>
>rs1.AddNew - rs1.Updateをループの外に出しましょう。
>rs1.Edit - rs1.Updateは不要です。

こんにちは。
回答ありがとうございます。

ご提示の方法でやってみたところ、

年度 番号 月4 月5 月6 〜 月3
20   1   1     
20   1      1
20   1         1
20   1            1


というデータができあがります。
これをグループ化して集計すれば、希望のデータは取得できるのですが、データがないときは追加、データがある場合は編集として、1レコードに書込むことは可能なのでしょうか??
もし方法があれば今後のために教えていただけたらと思います。

どうかよろしくお願いします。
・ツリー全体表示

【11743】Re:リレーション設定してある主テーブル
回答  よろずや  - 10/7/28(水) 22:40 -

引用なし
パスワード
   >コードが入っているテーブルがあるのですが、
>そのテーブルは、もう一つのテーブルとリレーション組んでます。
>(↑ここは、詳しく書かなくてはいけないのかな?)
>
>で、リレーション設定してあるテーブルは、変更、削除って出来ないの
>でしょうか?(初心者ですいません)

リレーションの設定内容によっては、そういうこともあります。
・ツリー全体表示

【11742】Re:レコードセットの追加と編集
回答    - 10/7/28(水) 13:33 -

引用なし
パスワード
   雅です。

rs1.AddNew - rs1.Updateをループの外に出しましょう。
rs1.Edit - rs1.Updateは不要です。
・ツリー全体表示

【11741】リレーション設定してある主テーブル
質問  ひろ  - 10/7/28(水) 9:18 -

引用なし
パスワード
   いつもお世話になっております。
又教えて下さい。

コードが入っているテーブルがあるのですが、
そのテーブルは、もう一つのテーブルとリレーション組んでます。
(↑ここは、詳しく書かなくてはいけないのかな?)

で、リレーション設定してあるテーブルは、変更、削除って出来ないの
でしょうか?(初心者ですいません)
他にその2つのテーブルで、不一致クエリと重複クエリ作ってます。
 
・ツリー全体表示

【11740】レコードセットの追加と編集
質問  あおぎん  - 10/7/27(火) 17:01 -

引用なし
パスワード
   いつもお世話になります。
自力で調べたのですが、解決できなかったので、こちらに投稿します。
よろしくお願いします。


計算期間起:2008/4/1
計算期間至:2009/3/31
番号:1
年度:20

フォーム上のこのデータをもとに、ワークテーブルにデータを書込むようにしたいのですが・・・。

データを書き込むワークテーブルは 年度、番号、月4、月5、・・・、月3のフィールドで構成されています。
計算期間起の月の末日が計算期間至の1日後より前ならば月4に1を書込む。
1ずつ月を足していき、n月の末日が計算期間内であれば、フィールド『月n』に1を書き込む。n月が計算期間至の翌日の月と同月であれば終了。

上の条件だと次のようなデータができあがる予定です。
年度 番号 月4 月5 月6 〜 月3
20   1   1  1  1 〜  1 


で、次のようなコードを書いてみました。
データを追加するワークテーブル(rs1)にはもともとデータがないので、i=1のときはレコードを追加し、それ以外のときはレコードを編集するとしているのですが、i=2のときに、データがないとエラーになります。このコードではi=1のときにレコードは追加されてないのでしょうか??見た目は追加されたようになっているのですが。。

解決方法があればご教示ください。

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

 
  tuki_ki = Val(Format(Me!計算期間起, "m"))
  tuki_si = Val(Format(Me!計算期間至 + 1, "m"))
  nendo= Me!年度
  bangou = Me!番号

  For i = 1 To 12
  tuki = "月" & tuki_ki
 
  Dim myLooP As Long
  For myLooP = 0 To rs1.Fields.Count - 1
   If rs1(myLooP).Name = tuki Then
    If i = 1 Then
    rs1.AddNew
    rs1(myLooP) = 1
    rs1!年度 = nendo
    rs1!番号 = bangou
    rs1.Update
    Else
    rs1.Edit ←ここで、カレントレコードがないとエラーが出る。
    rs1(myLooP) = 1
    rs1.Update
    End If
   Exit For
   End If
  Next myLooP
 
 
  tuki_ki = tuki_ki + 1

  If tuki_ki > 12 Then
   tuki_ki = tuki_ki - 12
  End If

  If tuki_ki = tuki_si Then
   Exit For 
  End If
 Next i
・ツリー全体表示

【11739】Re:データのないフィールドの表示
発言  MIT48  - 10/7/17(土) 15:07 -

引用なし
パスワード
   ▼小僧 さん:

また時間が空いてしまってすみません・・・m(__)m


>>支店は全部ちゃんと表示されました。
>
>この段階ではまだ全支店を表示する処理をしていないので、
>今回たまたま元データに
>全支店のデータが存在していたのかもしれませんね。

集計前のデータ集計に問題があり、全データでていたみたいです


>クロス集計クエリの列見出しを固定するには
>「IN」句を使います。
>年月によって31日の処理やうるう年の処理がある為、
>こちらも可変にしてあげます。
>
>Sub MakeCrossQuery2()
>Dim strSQL As String
>Dim strIn As String
>Dim DB As DAO.Database
>Dim RS As DAO.Recordset
>Dim QD As DAO.QueryDef
>Dim MyDate As Date
>Dim i As Long
>  
>  MyDate = #6/21/2010#
>  'MyDate = CDate(Format(DMin("売上計上日", "売上テーブル"), "@@@@/@@/@@"))
>  Set DB = CurrentDb
>  
>  'クエリ Q_Cross の存在チェック
>  'なかった場合には作成
>  'あった場合には使いまわし
>  
>  strSQL = " SELECT * FROM MsysObjects WHERE NAME ='Q_Cross'"
>  
>  Set RS = DB.OpenRecordset(strSQL, dbOpenSnapshot)
>  If RS.EOF Then
>    Set QD = DB.CreateQueryDef("Q_Cross")
>  Else
>    Set QD = DB.QueryDefs("Q_Cross")
>  End If
>  RS.Close
>  
>  'クロス集計クエリの作成
>  
>  strSQL = ""
>  strSQL = strSQL & " TRANSFORM Count(売上テーブル.伝票番号) AS 伝票番号のカウント "
>  strSQL = strSQL & " SELECT 売上テーブル.支店コード "
>  strSQL = strSQL & " FROM 売上テーブル "
>  strSQL = strSQL & " GROUP BY 売上テーブル.支店コード "
>  strSQL = strSQL & " PIVOT Right([売上計上日],2) "
>
>    'In句の作成
>    '20日締めなので21日〜20日は固定
>      
>    Do Until Day(MyDate) = 20
>      strIn = strIn & ", '" & Day(MyDate) & "'"
>      MyDate = DateAdd("d", 1, MyDate)
>    Loop
>
>  strSQL = strSQL & "IN (" & Mid(strIn, 2) & ",20);"
>
>  QD.SQL = strSQL
>  QD.Close
>  
>  MsgBox "クロス集計クエリ作成終了"
>
>End Sub

これで走らせてみたところフィールドに2桁で表示される
10日〜31日はデータ表示されるのですが、1日〜9日は表示
されませんでした。

なので
strSQL = strSQL & " PIVOT Right([売上計上日],2) "

strSQL = strSQL & " PIVOT Val(Right([売上計上日],2))"
と変更してみたらうまくいきました。


>> また自分でもわからないなりにVBAを解読してみたのですが
>> どういった仕様になっているのか、よければ教えてください。
>
>解りづらい処理がありましたら
>どの箇所をご提示して頂ければ
>出来る限り回答させて頂きます。


ありがとうございます
さっそくなのですが
Do Until Day(MyDate) = 20
>      strIn = strIn & ", '" & Day(MyDate) & "'"
>      MyDate = DateAdd("d", 1, MyDate)
>    Loop
>
この部分が今回上記の問題にもなったと思うのですが・・・
真ん中の処理がどうなっているのかぜんぜんわからなかったです

3連休ですがよろしくお願いします。
・ツリー全体表示

【11738】Re:サブレポートを作るには
お礼  にしもり  - 10/7/14(水) 17:44 -

引用なし
パスワード
   ▼小僧 さん:
わたくしのアバウトな質問ではレスをいただけず、諦めていたので
小僧さんのご返答にまったく気が付きませんでした。
再トライしてみます。
有難うございました。
・ツリー全体表示

【11737】Re:クエリ構文がうまく動作しない
お礼  ろん  - 10/7/14(水) 17:42 -

引用なし
パスワード
   ▼超初心者 さん:
おお、動きました!
INNER JOINを使うのですね。
INNER JOINで調べたところ、WHEREでの書き方も分かりました。

ありがとうございます。
・ツリー全体表示

【11736】Re:クエリ構文がうまく動作しない
発言  超初心者  - 10/7/14(水) 16:26 -

引用なし
パスワード
   ▼ろん さん:

SELECT KOSE_MST.構成名称, KOSE_MST.数量*KAKAKU_MST.提供価格 AS 金額
FROM KOSE_MST INNER JOIN KAKAKU_MST ON KOSE_MST.商品コード = KAKAKU_MST.部材コード

こんな感じでいかがでしょう。
・ツリー全体表示

【11735】クエリ構文がうまく動作しない
質問  ろん  - 10/7/14(水) 14:25 -

引用なし
パスワード
   クエリがうまく動作しないので、恥ずかしながら2回目の質問をさせて頂きます。

まず、使用するのは以下のテーブル2つです。


・KOSE_MST
構成ID 構成名称 商品コード 数 ユーザID
4444  システムA  1A1A   2 1111111
5555  システムB  2B2B   3 2222222
6666  システムC  3C3C   4 3333333
7777  システムA  2B2B   5 4444444

・KAKAKU_MST
部材コード 適用開始日 適用終了日 提供価格
1A1A    2010/07/01 2010/08/30 \1000
2B2B    2010/07/01 2010/08/30 \2000
3C3C    2010/07/01 2010/08/30 \3000


この表からクエリを使い、次のものを取り出したいと思っています。

・構成名称(KOSE_MST)
・数(KOSE_MST)×提供価格(KAKAKU_MST)の合計⇒新フィールド名「金額」とする。

ただし、取り出す時の条件は「KOSE_MSTの商品コード=KAKAKU_MSTの部材コード」です。
そして自分の予想では以下のような結果になるはずでした。

構成名称  金額
システムA  \2000
システムB  \6000
システムA  \10000

ですが、実際はまったく違う内容になってしまいました。
記述したクエリ文は以下の通りです。


SELECT KOSE_MST.構成名称, KOSE_MST.数量*KAKAKU_MST.提供価格 AS 金額
FROM KOSE_MST, KAKAKU_MST
WHERE KAKAKU_MST.部材コード IN (SELECT KOSE_MST.商品コード FROM KOSE_MST)


どのように記述すればよいでしょうか?
最終的には、システム名ごとの数×数量の合計を出したいと思っています。

解決策を教えていただけるとありがたいです。
・ツリー全体表示

【11734】Re:データのないフィールドの表示
回答  小僧  - 10/7/14(水) 8:35 -

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

> ほかの仕事に追われなかなか手がつけられず返信できませんでした。
> 申し訳ありません・・・

いえいえ、MIT48 さんのペースで大丈夫ですよ^^


>支店は全部ちゃんと表示されました。

この段階ではまだ全支店を表示する処理をしていないので、
今回たまたま元データに
全支店のデータが存在していたのかもしれませんね。


>休日でデータのない日以外クロス集計で表示されるようにでてきました。
>この状態でよろしいでしょうか?

はい、問題ないです。
次にデータのない日を表示する処理を追加します。

クロス集計クエリの列見出しを固定するには
「IN」句を使います。
年月によって31日の処理やうるう年の処理がある為、
こちらも可変にしてあげます。

Sub MakeCrossQuery2()
Dim strSQL As String
Dim strIn As String
Dim DB As DAO.Database
Dim RS As DAO.Recordset
Dim QD As DAO.QueryDef
Dim MyDate As Date
Dim i As Long
  
  MyDate = #6/21/2010#
  'MyDate = CDate(Format(DMin("売上計上日", "売上テーブル"), "@@@@/@@/@@"))
  Set DB = CurrentDb
  
  'クエリ Q_Cross の存在チェック
  'なかった場合には作成
  'あった場合には使いまわし
  
  strSQL = " SELECT * FROM MsysObjects WHERE NAME ='Q_Cross'"
  
  Set RS = DB.OpenRecordset(strSQL, dbOpenSnapshot)
  If RS.EOF Then
    Set QD = DB.CreateQueryDef("Q_Cross")
  Else
    Set QD = DB.QueryDefs("Q_Cross")
  End If
  RS.Close
  
  'クロス集計クエリの作成
  
  strSQL = ""
  strSQL = strSQL & " TRANSFORM Count(売上テーブル.伝票番号) AS 伝票番号のカウント "
  strSQL = strSQL & " SELECT 売上テーブル.支店コード "
  strSQL = strSQL & " FROM 売上テーブル "
  strSQL = strSQL & " GROUP BY 売上テーブル.支店コード "
  strSQL = strSQL & " PIVOT Right([売上計上日],2) "

    'In句の作成
    '20日締めなので21日〜20日は固定
      
    Do Until Day(MyDate) = 20
      strIn = strIn & ", '" & Day(MyDate) & "'"
      MyDate = DateAdd("d", 1, MyDate)
    Loop

  strSQL = strSQL & "IN (" & Mid(strIn, 2) & ",20);"

  QD.SQL = strSQL
  QD.Close
  
  MsgBox "クロス集計クエリ作成終了"

End Sub

今回は2010年6月21日〜7月20日までの処理を想定して

> MyDate = #6/21/2010#

としておりますが、
ここの日付を変化させる事で31日が出現したり
2月の処理をプログラム上で操作する事ができます。

売上テーブルの最小の日付を
セットする様なコードでも良いかもしれませんね。

ここまで出来ましたら次は全支店を表示する処理です。


> また自分でもわからないなりにVBAを解読してみたのですが
> どういった仕様になっているのか、よければ教えてください。

解りづらい処理がありましたら
どの箇所をご提示して頂ければ
出来る限り回答させて頂きます。
・ツリー全体表示

【11733】Re:データのないフィールドの表示
発言  MIT48  - 10/7/13(火) 18:53 -

引用なし
パスワード
   ▼小僧 さん:

こんにちは。
ほかの仕事に追われなかなか手がつけられず返信できませんでした。
申し訳ありません・・・

時間があいてしまったのですが

> (20日締めなので21日〜20日)
>
>という事なので存在してはいけないという事で大丈夫でしょうか?

はい。記入ミスですので21日〜20日のフィールドでお願いします。


>
>Sub MakeCrossQuery()
>Dim strSQL As String
>Dim DB As DAO.Database
>Dim RS As DAO.Recordset
>Dim QD As DAO.QueryDef
>
>  Set DB = CurrentDb
>  
>  'クエリ Q_Cross の存在チェック
>  'なかった場合には作成
>  'あった場合には使いまわし
>  
>  strSQL = " SELECT * FROM MsysObjects WHERE NAME ='Q_Cross'"
>  
>  Set RS = DB.OpenRecordset(strSQL, dbOpenSnapshot)
>  If RS.EOF Then
>    Set QD = DB.CreateQueryDef("Q_Cross")
>  Else
>    Set QD = DB.QueryDefs("Q_Cross")
>  End If
>  RS.Close
>  
>  'クロス集計クエリの作成
>  
>  strSQL = ""
>  strSQL = strSQL & " TRANSFORM Count(売上テーブル.伝票番号) AS 伝票番号のカウント "
>  strSQL = strSQL & " SELECT 売上テーブル.支店コード "
>  strSQL = strSQL & " FROM 売上テーブル "
>  strSQL = strSQL & " GROUP BY 売上テーブル.支店コード "
>  strSQL = strSQL & " PIVOT Right([売上計上日],2);"
>
>  QD.SQL = strSQL
>  QD.Close
>  
>  MsgBox "クロス集計クエリ作成終了"
>
>End Sub
>
>
>上記をコピーし、標準モジュールに貼り付け実行させた後
>クエリ「Q_Cross」が出来る事を確認してみて下さい。
>
>
これで実行してみました。
支店は全部ちゃんと表示されました。
休日でデータのない日以外クロス集計で表示されるようにでてきました。
この状態でよろしいでしょうか?

また自分でもわからないなりにVBAを解読してみたのですが

どういった仕様になっているのか、よければ教えてください。
・ツリー全体表示

【11732】Re:アクセスデータの容量について
お礼  かい  - 10/7/13(火) 16:06 -

引用なし
パスワード
   ▼247b さん:

ありがとうございます
考えてても、仕方が無いので、無償であるということですので、
試してみたいと思います

アドバイスありがとうございました
・ツリー全体表示

【11731】Re:クエリの結果を配列に格納したい
お礼  ろん  - 10/7/13(火) 14:56 -

引用なし
パスワード
   ▼雅 さん:
返信ありがとうございます。

少し調べてみましたが、コレクションに追加できるのですね。
これは使えそうです。

的確な内容をありがとうございました!
・ツリー全体表示

【11730】Re:クエリの結果を配列に格納したい
回答    - 10/7/13(火) 14:53 -

引用なし
パスワード
   雅です。

DLookupよりはOpenRecordsetしたほうが手っ取り早いのではないでしょうか?
・ツリー全体表示

【11729】クエリの結果を配列に格納したい
質問  ろん  - 10/7/13(火) 14:46 -

引用なし
パスワード
   アクセス2007について質問させて頂きます。

タイトルの通り、クエリで抽出した結果を配列に格納したいと思っています。
抽出したデータは3〜5個でそれほど多くはありません(エクセルで例えると、一列だけ抽出された感じです)。
DLookupで複数の結果を取得して配列に入れるイメージです(もちろんDLookupでは無理と分かっています)。

何か良い方法はないでしょうか?
・ツリー全体表示

【11728】Re:LANでのWithEventsは無謀ですか
発言  247b  - 10/7/13(火) 14:41 -

引用なし
パスワード
   不足があったので追記です。

ローカルでのデータ存在チェック。新規か更新かを判断する。(画面の表示データや、内部で保持しているデータから。tempテーブルにフラグを立てるという方策も有り)
新規の場合
↓ 更新の場合
↓ ↓
↓ 元のデータの存在チェック→無かったら待機後再実行OR再実行をユーザーに指示して終了
↓ ↓
DELETE
↓ ↓
INSERT

念のためですが、厳密には排他制御ではありません。
非常にシビアな更新(多くのユーザーが同じデータに更新をかける可能性が高いような場合)
には、この方式ではデータを保証できない可能性があります。その場合、排他制御が必要です。
・ツリー全体表示

【11727】Re:LANでのWithEventsは無謀ですか
発言  247b  - 10/7/13(火) 14:10 -

引用なし
パスワード
   こんにちわ
>ドライブレターの割り当てを組み込んでみましたが
>割り当て先を触られることがありそうな気がして悩んでしまいました
>結局、
>起動時割当、終了時割当削除
>起動時既割当なら、割当済みでした 管理者に報告する メッセージ で終了
>みたいな感じにしました
>普通はどのような処理になるのでしょうか
>上記、まだ多摩では試していませんがコメント有ればよろしくお願いいたします

たしかに、上記のような配慮は必要ですね。以前、似たようなロジックをみたことがありますが、
そのときは、割当済みかどうかのチェックをせずに問答無用で起動時割当というロジックでした。
それでも動くんですが、ちょっと怖いので、割当済みのチェックが可能なら組み込んだ方が個人的には良いかと思います。その分、ロジックは複雑になりますが。


>TmpT_PJ_DTを元に更新処理を進めるのは不利な操作となるのでしょか
一旦、Tmpテーブルに保持してその後、本体へ更新をかけるという処理自体は、良く用いられる手段なので問題ないと思います。
問題になりうるとしたら、以前の投稿でもあったように、排他制御の方ですね。
そう言えば、今になって思い出したのですが、更新方法にも、2つの方法があります。と言っても、個人的にそう言ってるだけですが。
UPDATE方式:ponさんが現状行っている方式
DELETE&INSERT方式:UPDATEは使用せず、元のデータを一旦、削除し、改めてINSERTする。
 元のデータが無くてもDELETEは通るので、新規追加に関して考慮する必要がないメリットがあります。
 ただ、この方式では、ファントム・リードという問題が発生しうるため、実際には、
 元のデータの存在チェック→無かったら待機後再実行、または再実行をユーザーに指示して終了
 ↓
 有ったら、DELETE
 ↓
 INSERT
 という手順を取るべきです。プログラムは複雑になりますが、データ自体で排他がかけられるので、私の周囲では良く用いられていました。いまさら思い出してすみません。
・ツリー全体表示

【11726】Re:アクセスデータの容量について
発言  247b  - 10/7/13(火) 13:49 -

引用なし
パスワード
   こんにちわ
>SQLServerやOracleは超初心者な私でも、できるような、入りやすいものなのでしょうか?

どちらも触ってみた感覚では、SQLServerのほうが、敷居は低い(入りやすい)と思います。
ちらっと調べてみたところ、Express版という無償版が存在するので、試しにダウンロードしてみる、というの有りかと思いますよ。
T-SQLも使えるようですし、レポートツール(クリスタル・レポート)もついているようです。
T−SQLはSQLを元に作られた手続き型言語です。(非常に大雑把にいえば、VBAと同類ということ。SQL文みたいなのに、IF文とかもあります。が、データへのアクセスに関する記述が、取っ付きにくいと思います(経験談))
クリスタルレポートは、ちゃんと触ったことがないのでなんとも言えませんが、調べた限りではACCESSのレポートに近かったように記憶しています。間違っていたらすみません。
・ツリー全体表示

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