1

次の4桁の数字を取得する良い方法を見つけました。 次の無料の一意の4桁の番号を見つける方法

しかし、私の場合、次に利用可能な4桁または5桁の番号を取得したいと思います。そして、これはユーザーの要求に応じて変わります。これらの番号はキーID列ではありませんが、ビジネス目的のタグ付け構造に不可欠です。

現在、テーブルアダプタークエリを使用しています。しかし、どのようにクエリを作成しますか。4桁になるまで、すべての値を繰り返しループすることができると思います。

しかし、私はもっと効率的なものを考えようとしています。

Function GetNextAvailableNumber(NumofDigits) as Long
'SQL Code Here ----
'Query Number Table

Return Long


End Function

これが私の現在のSQLです:

'This Queries my View
SELECT MIN([Number]) AS Expr1
FROM  LineNumbersNotUsed

'This is my View SQL 
SELECT Numbers.Number
FROM Numbers
WHERE (((Exists (Select * From LineList Where LineList.LineNum =  Numbers.Number))=False))
ORDER BY Numbers.Number;

番号は、0から99999までのすべての利用可能な番号のリストであり、基本的には使用可能な番号です。

LineListは、長くて関連する他のすべてのビジネス情報を保持する最後のマスターテーブルです。

うまくいけば、これは理にかなっています。

おやおや、君たちは新しい男にとても厳しいです。誤ってエンターキーを押したところ、質問が投稿され、すぐに-3票を獲得しました。

新しい男に休憩を与えてください!お願いします。

4

2 に答える 2

1

ご不明な点がございましたら、あらかじめお詫び申し上げます。あなたのデザインを使用して、このようなクエリは次の未使用の4桁の数字を返しませんか?

SELECT MIN([Number]) AS next_number
FROM  LineNumbersNotUsed
WHERE
        [Number] > 999
    AND [Number] < 10000;

このアプローチは、複数の同時ユーザーには適切ではありませんが、それが問題であることを示していません。

于 2012-05-04T19:15:12.683 に答える
1

リンクした質問は、必要なのは2つのフィールドを持つテーブルであることを説明しています。

Number     InUse
0000       No
0001       No
0002       Yes
0003       No
0005       Yes

番号が使用/解放されるたびに、テーブルを更新しInUseて「はい/いいえ」に設定する必要があります。

何かが足りないかもしれませんが、あなたの説明とあなたが示したSQLコードから、0から100000までのすべての数値を含む単一のフィールドを持つテーブルしかないようです。
その場合、私にはわかりません。そのテーブルの有用性。

私があなたであり、あなたの必要性を正しく理解している場合、あなたが望むのは次のようなものです。

  1. まず、上記のように、0から100000までのすべての実行番号と、その番号が使用されているかどうかを確認するためのフィールドを使用してテーブルを作成します。

  2. 次のようInUseに、テーブルにすでに含まれているすべての数値を使用してフィールドを初期化します。LineList

    UPDATE Numbers SET InUse = True
    WHERE  Numbers.Number IN (SELECT LineNum FROM LineList)
    
  3. ReserveNumber(NumOfDigits as Integer) As Long次の論理シーケンスに従って、4桁または5桁の空き番号を検索して予約する関数を記述します。

    • (4または5)に応じてNumOfDigits、クエリの1つの結果を 次のように取得しLowestNumberます。

      SELECT Min(Number) FROM Numbers WHERE Number < 10000 AND NOT InUse
      SELECT Min(Number) FROM Numbers WHERE Number >= 10000 AND NOT InUse
      
    • その特定の番号を予約して、二度と使用されないようにします。

      UPDATE Numbers SET InUse = True WHERE Number = @LowestNumber
      
    • 戻る LowestNumber

  4. いつでも

:上記のロジックは、2人のユーザーが同時に最小数を取得しようとしないことを前提としているため、少し単純です。ただし、これがいつか発生する可能性があるというリスクがあります。
このリスクを取り除くには、たとえば、テーブルにTakenBy列を追加Numbersして、現在のユーザー名に設定します。次に、番号を予約した後、もう一度読んでTakenBy、現在のクライアントによって実際に更新されていることを確認します。そうでない場合は、ゲインを試してください。
これを行う方法はたくさんあります。テーブルロックをいじることもできますが、解決策が何であれ、必ずテストしてください。

于 2012-05-07T05:23:10.653 に答える