2011-08-10 3 views
0

私はデータベース、3つ以上のテーブルと3つ以上の列を持つそれらの1つを持っています。私は等のID列、名列、日付列を持っている。この表で データベースVb.Netの1つのテーブルで支払の各領収書に一意の番号を与える方法

私は印刷のために1つのレコードを選択し、人に支払い(請求書)の一つ以上の領収書を与えたいです。

しかし、私は一意であるために領収書の番号が好きです。私のテーブルのすべての人とすべての支払いのために。

開始番号の形式は、00000000または00.000.000またはA 000000になります。次の番号+1など

さらに詳しい説明を求めます。

を参照してくださいフォーム例:

form example http://imageshack.us/photo/my-images/89/prinreceipt.png/

+0

これは実際にはあまり明確ではありません。各人に1(または0)から戻ってくるユニークな番号が必要ですか、それとも何人かの人にかかわらず領収書ごとに連続的に増分するユニークな番号ですか?あなたはDB内でユニークなインデックスを使用することができ、それがあなたがしようとしている場合は、ラージ数を取得し、それをインクリメントする関数を持っているが、私はあなたが求めているものであることを確信していません。 –

+0

あなたはどのデータベースを使用していますか? –

答えて

3

あなたはMS SQL-Serverを使用している場合は、私はに新しいレコードとCLR(スカラー値関数)を挿入するために、データベース内のストアドプロシージャを使用します次の請求番号を取得します。このようにして、番号が一意であることを確認できます。

SPは、次のようになります。次の番号がMAX(BillNumber)+1なり

CREATE PROCEDURE [dbo].[InsertBill] 
    @idBill int OUTPUT, 
    @CreationDate datetime OUTPUT, 
    @Name varchar(50) OUTPUT, 
    @BillNumber char(10) OUTPUT 
with execute as Owner 
AS 
INSERT INTO tBill(CreationDate, Name, BillNumber) 
VALUES (GetDate(), @Name, dbo.GetNextBillNumber()) 
;SELECT @idBill=idBill,@CreationDate=CreationDate, @Name=Name, @BillNumber=BillNumber 
FROM tBill WHERE (@idBill = SCOPE_IDENTITY()) 

、フォーマットは、10文字(A + 9桁)、次の紙幣番号を生成するためのCLRである:

CREATE FUNCTION [dbo].[GetNextBillNumber]() 
RETURNS CHAR(10) 
AS 
BEGIN 
    DECLARE @BillNumber CHAR(10); 
    DECLARE @nextBillNumber int; 
    SET @nextBillNumber = CONVERT(int,SUBSTRING((SELECT MAX(BillNumber) FROM tBill),2,9)) + 1; 
    SET @BillNumber = 'A' + RIGHT('000000000'+ CONVERT(VARCHAR,@nextBillNumber),9) 
    return @BillNumber 
END 

注:100%テストされたわけではありませんが、私が意味するものを理解する必要があります。

編集:また、一意性を保証するにはadd a unique constraintにする必要があります。同じBill-Numberを持つ2つのレコードを挿入するのは技術的に不可能です。この例では、テーブルのprimary-keyはビル番号自体ではなく、Is Identity(自動インクリメント、here with SSMS)のint-columnであると推定しています。

Hereは、ADO.NETからストアドプロシージャを呼び出す方法に関する情報です。

+1

+1 - 同意 - データの整合性を徹底し、固有の識別子を生成するためにデータベースを使用する必要があります –

関連する問題