Access VBA質問箱 IV

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

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


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

【12440】Re:更新クエリの実行タイミングについて
回答  すぬ  - 13/12/6(金) 12:32 -

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

hatena さん、回答ありがとうございます。

>DoCmd.OpenQuery で更新クエリを実行するとトランザクション処理は行われないので、複数ユーザーがほぼ同時に実行したときに、問題がでそうに思えます。
>
>DAOかADOでトランザクション処理を追加して実行するようにしたほうがいいかもしれません。
>

すみません、トランザクション処理について理解できていないです。
どのような処理なんでしょうか?


>あと、登録フォームを開くとき、ダイアログモードあるいは、「作業ウィンドウの固定「を「はい」で、開いてますか。

作業ウィンドウの固定の設定は何も変更していないので「いいえ」のままになっています。
「はい」にすることで何が期待できるんでしょうか?
・ツリー全体表示

【12439】Re:更新クエリの実行タイミングについて
回答  hatena  - 13/12/5(木) 19:00 -

引用なし
パスワード
   前回の回答は、本テーブルに直接連結した場合のコードです。


>処理の流れは、
>
>・情報参照フォームで編集したいPartsを選択、表示する
>・情報参照フォームの「編集」ボタンを押す
>  このときPartsHensyuがON
>  情報参照フォームで選択していたPartsのレコードを、追加クエリでテンポラリテーブルに追加
>  「編集」ボタンを押した人(コンピュータ名)と時間を、選択したPartsレコードのフィールドに書く
>・登録フォームを開き、情報を編集する(テンポラリテーブル)
>・「登録」ボタンを押すと、更新クエリでテンポラリテーブルの情報を本物のレコードに反映し、フォームを閉じる
>・「キャンセル」ボタンを押すと、何もせずフォームを閉じる
>  フォームを閉じる時に、
>   テンポラリテーブルのレコードを削除
>   PartsHensyu=ONのとき、更新クエリでフラグをOFFにする
>
>
>という処理になっていまして、

テンポラリテーブルを利用しているのですね。
この部分を読み飛ばしてました。

ということで、処理の流れを見る限りは問題はなさそうです。

DoCmd.OpenQuery で更新クエリを実行するとトランザクション処理は行われないので、複数ユーザーがほぼ同時に実行したときに、問題がでそうに思えます。

DAOかADOでトランザクション処理を追加して実行するようにしたほうがいいかもしれません。

あと、登録フォームを開くとき、ダイアログモードあるいは、「作業ウィンドウの固定「を「はい」で、開いてますか。
・ツリー全体表示

【12438】Re:更新クエリの実行タイミングについて
回答  すぬ  - 13/12/5(木) 16:00 -

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

hatenaさん、回答ありがとうございます。

指摘いただいた点についてですが、

処理の流れは、

・情報参照フォームで編集したいPartsを選択、表示する
・情報参照フォームの「編集」ボタンを押す
  このときPartsHensyuがON
  情報参照フォームで選択していたPartsのレコードを、追加クエリでテンポラリテーブルに追加
  「編集」ボタンを押した人(コンピュータ名)と時間を、選択したPartsレコードのフィールドに書く
・登録フォームを開き、情報を編集する(テンポラリテーブル)
・「登録」ボタンを押すと、更新クエリでテンポラリテーブルの情報を本物のレコードに反映し、フォームを閉じる
・「キャンセル」ボタンを押すと、何もせずフォームを閉じる
  フォームを閉じる時に、
   テンポラリテーブルのレコードを削除
   PartsHensyu=ONのとき、更新クエリでフラグをOFFにする


という処理になっていまして、
フォーム上でFlagをOFFにすることが出来ないなと思い、更新クエリを使っています。
更新者、日時はご意見をいただいたとおり、私も処理に組み込んでいます。

ですので、何かあればそれを見て処置していますが、以前より頻発しているため、何が原因なのか、どう解決すればいいのか模索中でして・・・。

このような処理ですが、気になる点などありますか?
もしあればヒントをいただけると助かります。
・ツリー全体表示

【12437】Re:更新クエリの実行タイミングについて
回答  hatena  - 13/12/5(木) 15:13 -

引用なし
パスワード
   更新クエリを使ってますが、レコードソースにあるフィールドなら、フォーム上で更新した方がトラブルが少ないように思います。

Private Sub Form_Unload(Cancel As Integer)

On Error GoTo Err_LABEL

  If PartsHensyu = True And Me!チェック4 = True Then   
    Me!チェック4 = False
  End If

Exit_LABEL:
Exit Sub

上記で改善しないなら、処理全体を見直した方がいいと思います。

>このとき、他のユーザーがこのデータを編集できないようにそのレコードにフラグを立て(チェックON)、ガードするようにしています。
>
>編集フォームを閉じる時(Form_Unload)、更新クエリでフラグを下げる(チェックOFF)するようにVBAコードを書いたのですが、うまくいく時、いかない時があります。

> 複数人でデータベースをアクセスしているとNGなんでしょうか?
>
> 変数PartsHensyuはPublicで定義しています。
> Public PartsHensyu As Boolean

このフラグをいつ、どのように On にしてますか。

編集時に、フラグフィールドへの書き込みはどのようしてますか。

このあたりの整合がきちんととれているのでしょうか。


蛇足ですが、
私がするなら、更新フラグフィールドには、更新中のユーザー名あるいはPC名を書きこむようします。
そうすれば、更新ロックが長時間解除されない場合、更新中のユーザーに確認することができますので。
ついでに、更新開始時刻なども書きこんでおくといいかも。
・ツリー全体表示

【12436】Re:更新クエリの実行タイミングについて
回答  すぬ  - 13/12/5(木) 10:04 -

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

かるびのさん、回答ありがとうございます。

ご指摘いただいた箇所を確認しました。

> 更新クエリのSQL文を開示してみてください。

→こんなSQLになっています。

UPDATE T_Parts SET T_Parts.チェック4 = Off
WHERE (((T_Parts.PartsNo)=[forms]![F_Parts登録]![PartsNo]));


> また、更新クエリがうまくいかなかったときの、
>If PartsHensyu = True Thenというコードを実行する直前のPartsHenshu変数の値を確認してみてください。

→自分で試すとうまくいきます。うまくいかないときの原因がわからないため検証できずにいます・・・。
複数人でデータベースをアクセスしているとNGなんでしょうか?

変数PartsHensyuはPublicで定義しています。
Public PartsHensyu As Boolean
・ツリー全体表示

【12435】Re:更新クエリの実行タイミングについて
回答  かるびの  - 13/12/5(木) 2:39 -

引用なし
パスワード
    与えられた情報だけからすると、
更新クエリのWHERE句で必要なレコードが抽出されていないのかなとか、
Form_Unloadプロシージャにおいて、変数PartsHenshuには
きちんと値が格納されているのだろうか
(VBA実行中に、エラーでコードの実行が止まると、
変数が初期化されてしまい、その後は当該変数には何も格納されていない
という状態になることがあります。)
などという感想を持ちました。

 更新クエリのSQL文を開示してみてください。
 また、更新クエリがうまくいかなかったときの、
If PartsHensyu = True Thenというコードを実行する直前のPartsHenshu変数の値を
確認してみてください。
・ツリー全体表示

【12434】Re:出来た乱数の並び替え
回答  hatena  - 13/12/4(水) 22:53 -

引用なし
パスワード
   >もし、100個のデータがあった場合に、
>変数を配列化したりArray(1, 2, 3, 4, 5)を
>簡略化できる方法はありますか?

具体的に、どのようにしたいのか、結果をどのように利用したいのか不明なのですが、とりあえず下記のコードをご参考に。

Sub Test()
  Dim MyArray() As Long '動的配列を宣言
  Dim i As Integer
  
  i = 100
  ReDim MyArray(i) '動的配列のサイズを設定(100件)
  
  For i = 0 To UBound(MyArray) '1〜100 の値を設定
    MyArray(i) = i + 1
  Next
  
  AryShuffle MyArray '配列をシャッフル
  
  For i = 0 To UBound(MyArray) '結果をイミディエイトに出力
    Debug.Print MyArray(i)
  Next
End Sub
・ツリー全体表示

【12433】Re:出来た乱数の並び替え
お礼  トシ  - 13/12/4(水) 17:22 -

引用なし
パスワード
   ▼hatena さん:
>>変数を5つ用意して
>>int a, int b, int c, int d, int e
>>
>>a〜eまでに1〜5までの値をランダムに入れます。
>>ただし、a〜eで数字がダブル事がしないようにしたいです。
>
>下記で紹介しているAryShuffle関数を使えばどうでしょうか。
>
>配列をランダムに並べ替える関数 - hatena chips
>hatenachips.blog34.fc2.com/blog-entry-121.html
>
>
>使用例
>Sub Test()
>  Dim v As Variant
>  Dim a As Integer, b As Integer, c As Integer
>  Dim d As Integer, e As Integer
>  
>  v = Array(1, 2, 3, 4, 5)
>  AryShuffle v
>  
>  a = v(0)
>  b = v(1)
>  c = v(2)
>  d = v(3)
>  e = v(4)
>  
>  Debug.Print a; b; c; d; e
>End Sub

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

もし、教えていただけるのであれば、
参考までに次の事もご教授して頂けるとうれしいです。

もし、100個のデータがあった場合に、
変数を配列化したりArray(1, 2, 3, 4, 5)を
簡略化できる方法はありますか?
・ツリー全体表示

【12432】更新クエリの実行タイミングについて
質問  すぬ  - 13/12/4(水) 14:15 -

引用なし
パスワード
   こんにちは。
質問です。

部品管理をするデータベースを作成し、職場内で使っています。

参照フォームで編集したいデータを選び、「編集」ボタンを押したら編集フォームが開くようにしています。

このとき、他のユーザーがこのデータを編集できないようにそのレコードにフラグを立て(チェックON)、ガードするようにしています。

編集フォームを閉じる時(Form_Unload)、更新クエリでフラグを下げる(チェックOFF)するようにVBAコードを書いたのですが、うまくいく時、いかない時があります。

この原因がわからなくて解決に至らず、困っています。

知ってみえる方がいましたら教えてください。
よろしくお願いします。


参考までに、作ったVBAコードを載せます。


Private Sub Form_Unload(Cancel As Integer)

On Error GoTo Err_LABEL

  DoCmd.SetWarnings False
  
  If PartsHensyu = True Then             'フラグがONの時
    DoCmd.OpenQuery "Q_更新_T_Parts(Off4)"    
  End If

Exit_LABEL:
Exit Sub

Err_LABEL:
MsgBox ("予期せぬエラーが発生しました!(エラーNo." & Err.Number & ")" & vbCr & vbCr & "登録を終了します。")
Resume Exit_LABEL

End Sub
・ツリー全体表示

【12431】Re:出来た乱数の並び替え
回答  hatena  - 13/12/1(日) 17:38 -

引用なし
パスワード
   >変数を5つ用意して
>int a, int b, int c, int d, int e
>
>a〜eまでに1〜5までの値をランダムに入れます。
>ただし、a〜eで数字がダブル事がしないようにしたいです。

下記で紹介しているAryShuffle関数を使えばどうでしょうか。

配列をランダムに並べ替える関数 - hatena chips
hatenachips.blog34.fc2.com/blog-entry-121.html


使用例
Sub Test()
  Dim v As Variant
  Dim a As Integer, b As Integer, c As Integer
  Dim d As Integer, e As Integer
  
  v = Array(1, 2, 3, 4, 5)
  AryShuffle v
  
  a = v(0)
  b = v(1)
  c = v(2)
  d = v(3)
  e = v(4)
  
  Debug.Print a; b; c; d; e
End Sub
・ツリー全体表示

【12430】出来た乱数の並び替え
質問  トシ  - 13/12/1(日) 14:19 -

引用なし
パスワード
   変数を5つ用意して
int a, int b, int c, int d, int e

a〜eまでに1〜5までの値をランダムに入れます。
ただし、a〜eで数字がダブル事がしないようにしたいです。

1〜5までの数字をランダムに生成するのは
Rnd関数を作成すればよいことは分かります。


ただ、同じ数字が入らないようにするには、
どの様にプログラムを書けばよいのか分かりません。
どなたか教えて頂けないでしょうか?
・ツリー全体表示

【12429】Re:Recordsetでフィールドを変数で指定し...
お礼  タカ  - 13/11/18(月) 23:19 -

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

▼かるびの さん:
> フィールドの取得の仕方ですが、
>フィールド名が「Jusho」であるフィールドを取得する場合は、
>   rs!Jusho
>   rs.Fields(2)
>   rs.Fields("Jusho")
>のいずれかの方法によります。
>
>
>   Dim strFld As String
>   strFld = "Jusho"
>である場合にstrFld変数を使って「Jusho」フィールドを取得するには、
>上記の3番目の方法を使ってください。
>   rs.Fields(strFld)
・ツリー全体表示

【12428】フォームで変更した並び順をレポートに反...
質問  こうのとり  - 13/11/18(月) 17:27 -

引用なし
パスワード
    お手数ですが、ご教授いただけませんでしょうか。
使用しているのはAccess2010です。

 2000名以上の名簿データを管理しています。表形式のフォームで
入力、フィルター、並べ替え(昇順・降順)を行い、
抽出や並べ替えを行った状態のまま、ボタンを押すと開くように
設定したレポート(封筒宛名等)で印刷したいと考えています。

 下記の命令ですとフィルターはそのままレポートに
反映されるのですが、並び順は反映されません。
どのように修正すればいいのでしょうか。

Private Sub 【印刷ボタン】_Click()
Me.Requery
If Me.FilterOn Then
DoCmd.OpenReport "【印刷:はがき宛名】", acPreview, , Me.Filter
Else
DoCmd.OpenReport "【印刷:はがき宛名】", acPreview
End If
End Sub
・ツリー全体表示

【12427】Re:Recordsetでフィールドを変数で指定し...
回答  かるびの  - 13/11/18(月) 2:05 -

引用なし
パスワード
    フィールドの取得の仕方ですが、
フィールド名が「Jusho」であるフィールドを取得する場合は、
   rs!Jusho
   rs.Fields(2)
   rs.Fields("Jusho")
のいずれかの方法によります。


   Dim strFld As String
   strFld = "Jusho"
である場合にstrFld変数を使って「Jusho」フィールドを取得するには、
上記の3番目の方法を使ってください。
   rs.Fields(strFld)
・ツリー全体表示

【12426】Recordsetでフィールドを変数で指定した...
質問  タカ  - 13/11/17(日) 21:57 -

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

Dim FieldA as string

SQL1 = "SELECT * FROM TableA"
IntSel1 = SelDB(rs1, SQL1) ※SQL文はクラスモジュールで実行しています。
 
strhikakuName = Nz(rs1!FieldA)

のようにフィールドを変数にしたいのですがどのようにすればよろしいでしょうか? 
・ツリー全体表示

【12425】Re:10進数を36進数に変更するには
回答  hatena  - 13/10/23(水) 23:27 -

引用なし
パスワード
   ▼IKAI さん:
>こんばんは、ご紹介したURLにいくつかのコードがありますので、
>
>どちらを選択したほうがよろしいでしょうか?

(10進数→n進数への変換) の枠内の関数を標準モジュールにコピーして、

X = deccn(36, 123)

とすれば、X には、3F が入ります。
・ツリー全体表示

【12424】Re:10進数を36進数に変更するには
質問  IKAI  - 13/10/23(水) 21:23 -

引用なし
パスワード
   hatena さん

こんばんは、ご紹介したURLにいくつかのコードがありますので、

どちらを選択したほうがよろしいでしょうか?
・ツリー全体表示

【12423】Re:10進数を36進数に変更するには
回答  hatena  - 13/10/22(火) 23:23 -

引用なし
パスワード
   下記のリンク先に関数が紹介されてます。

n進数→m進数への変換
www5d.biglobe.ne.jp/~tomoya03/shtml/algorithm/Convert.htm
・ツリー全体表示

【12422】10進数を36進数に変更するには
質問  IKAI  - 13/10/22(火) 22:54 -

引用なし
パスワード
   こんばんは。。

 10進数を36進数に変更するには、どうやればできますか?ご指導をお願いします。

Aテーブルの構成

 コード    値 ←すべて正数
 ABCD001   123
 ABCD002   321

 コード    値   36進数
 ABCD001   123   3F
 ABCD002   321   8X
 
・ツリー全体表示

【12421】Re:フィールド存在の判断条件を設けるには
お礼  IKAI  - 13/10/22(火) 18:03 -

引用なし
パスワード
   hatena さん

 正確に動いています!大変ありがとうございました。
・ツリー全体表示

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