Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 8.1 Pro : Access 2016)
伝票番号格納テーブル
投稿日時: 19/08/09 16:28:56
投稿者: めぐちゃん

入力フォームで、入力を開始すると自動で伝票番号が採番されるようにしています。
今までは、社内の複数PCで処理していたのですが、外出先からアクセスできるようにするため、リンクテーブルにしようとしています。
伝票番号格納デーブルをリンクテーブルにすると以下のエラーが出ます。
実行時エラー3252
現在のプロバイダーはIndex機能に必要なインターフェイスをサポートしてません。
 
 
伝票番号格納テーブル
伝票コード/伝票名/伝票番号/下限/上限
10/納品伝票/10000123/10000001/59999999
60/仮納品伝票/60000456/60000001/69999999
70/仮返品伝票/70000789/70000001/79999999
80/値引伝票/80000223/80000001/89999999
90/返品伝票/90000123/90000001/90000000
 
 
下記のモジュールで
Public Function getNewDenpyoNumber(strDenpyoCode)
 
Dim cnn1 As New ADODB.Connection
Dim rst1 As New ADODB.Recordset
 
cnn1.Open CurrentProject.Connection
rst1.Open "伝票番号格納テーブル", cnn1, adOpenDynamic, adLockOptimistic, adCmdTableDirect
rst1.Index = "PrimaryKey"
 
rst1.Seek strDenpyoCode
If rst1.EOF Then
    getNewDenpyoNumber = Null
Else
    rst1![伝票番号] = rst1![伝票番号] + 1
    If rst1![伝票番号] > rst1![上限] Then
        rst1![伝票番号] = rst1![下限]
    End If
    getNewDenpyoNumber = rst1![伝票番号]
    rst1.Update
End If
 
rst1.Close
cnn1.Close
End Function
 
フォームのイベントで下記のようにしています
Private Sub Form_BeforeInsert(Cancel As Integer)
If DCount("*", "受注") = 0 Then
伝票番号 = 10000001
Else
Me![伝票番号] = getNewDenpyoNumber("10")
End If
End Sub
 
納品伝票は、伝票コード10で呼び出しています。
 
リンクテーブルでも、エラーが出ずに伝票番号を取得するにはどうしたらいいか、悩んでいます。
どなたか、ご教授いただけませんでしょうか。
宜しくお願いします。
 

回答
投稿日時: 19/08/09 18:07:04
投稿者: sk

引用:
今までは、社内の複数PCで処理していたのですが、
外出先からアクセスできるようにするため、
リンクテーブルにしようとしています。

バックエンドを SQL Server データベースなどに
アップサイジングした、という意味でしょうか。
 
引用:
伝票番号格納デーブルをリンクテーブルにすると以下のエラーが出ます。
実行時エラー3252
現在のプロバイダーはIndex機能に必要なインターフェイスをサポートしてません。

引用:
cnn1.Open CurrentProject.Connection
rst1.Open "伝票番号格納テーブル", cnn1, adOpenDynamic, adLockOptimistic, adCmdTableDirect
rst1.Index = "PrimaryKey"
  
rst1.Seek strDenpyoCode

・Seek メソッドはクライアントカーソルではサポートされない。
 
・リンクテーブルはテーブルタイプのレコードセットとして
 開くことができない。
 
引用:
納品伝票は、伝票コード10で呼び出しています。

引用:
Me![伝票番号] = getNewDenpyoNumber("10")

[伝票コード]のデータ型はテキスト型なのでしょうか。
 
引用:
リンクテーブルでも、エラーが出ずに伝票番号を取得するにはどうしたらいいか

1 件のレコードのみを更新するのであれば、
例えば次のように書き換えてみてもよいでしょう。
 
([伝票コード]のデータ型がテキスト型である場合)
------------------------------------------------------------------------
Public Function getNewDenpyoNumber(strDenpyoCode)
  
Dim cnn1 As ADODB.Connection
Dim rst1 As ADODB.Recordset
Dim strSQL As String
  
Set cnn1 = CurrentProject.Connection
 
strSQL = "SELECT * FROM [伝票番号格納テーブル]" & _
         " WHERE [伝票コード] = '" & strDenpyoCode & "'"
 
Set rst1 = New ADODB.Recordset
 
rst1.Open strSQL, cnn1, adOpenDynamic, adLockOptimistic, adCmdText
If rst1.EOF Then
    getNewDenpyoNumber = Null
Else
    rst1![伝票番号] = rst1![伝票番号] + 1
    If rst1![伝票番号] > rst1![上限] Then
        rst1![伝票番号] = rst1![下限]
    End If
    getNewDenpyoNumber = rst1![伝票番号]
    rst1.Update
End If
  
rst1.Close
Set rst1 = Nothing
cnn1.Close
Set cnn1 = Nothing
 
End Function
------------------------------------------------------------------------

投稿日時: 19/08/16 10:40:37
投稿者: めぐちゃん

ありがとうございます
お盆休みだったので、返信が遅くなりました。
 
すんなり、解決しました。
ADOでseekが使えないのは、調べてわかったのですが、何をどのようにすればいいのかわかりませんでした。
 
教えて頂いた通りで、問題なく伝票番号の取得ができるようになりました。
 
ありがとうございます。