2011-07-11 16 views
1

私のテーブル...販売時点管理のロジックは?販売が終了したときに

create table sale 
(
idsale int primary key identity, 
idclient int, 
user1 varchar(50), 
fecha datetime 
) 

create table listofsale 
(
idsale int, 
idproduct int, 
amount int, 
priceunit float, 
subtotal 
) 

私は

table sale 

listofsale の情報を挿入しようと思って参照するすべての を挿入するつもりですし、私はやりますinsertを使うことはできますが、どのようにして同じリストを取得できますか? 私が持っていた別のアイデアは私のidsaleがvarchar (10) だったと私はC#で文字と数字のランダムを行うと、私はそれをテキストボックスに を持っているつもりですので、私は同じ時間で、それを保存することができ、

か、私はそれを何の形で行うことができますか? これを行うための最善の方法は何ですか?

は - ... 私はいつも 、販売を「挿入」とIDを取得させるためのボタンを持っていたとのことを行った後、あなたがリストを追加することができます{ を追加しましたが、私はそれが正しいフォームではありません知っています.. いつかあなたは(あなたが追加なし製品をいけない場合、およびアプリケーションを閉じて再度開く)リストなしでの販売を持って }

答えて

1

問題の内容を理解するのに苦労しています。読んで、それは必ずしもセールスIDを生成することに問題があるわけではなく、むしろ、セッション/コンピュータ/インスタンス/等の間でクライアントの販売リストを維持することにあります。

仮定: 1)特定のクライアントのみが「idclient」あなたの列はその販売リストが属する誰にクライアントのIDであることを1つの販売時リスト、および 2)を持つことができること。

解決策: 販売を探す代わりに、問題のクライアントのテーブル販売でidclientを探します。それが何も戻って来なければ、その顧客のために新しい販売を作成し、販売で戻って来たら、その販売IDを使用してください。あなたがその商品を必要とするときはいつでもこれをしてください。

改善されたソリューション: 上記のソリューションでは、クライアントごとに1つの販売、したがって販売リストを持つことができます。

テーブル販売に「isSaleCompleted」ブール型列を追加してください。売却が完了して完了した場合にのみ、それをtrueに設定します。 次に、上記と同じクライアント販売の検索で、isSaleCompletedがfalseであることも確認します。

ので、クライアントの販売検索ストアドプロシージャは、そのようになります。

CREATE Procedure ClientSaleSearch 
(
    @clientid int 
) 
SELECT saleid 
From Sale 
WHERE [email protected] AND isSaleCompleted = '0' 
1

あなたが販売INTO INSERTを行うと.... SQL @@ ID変数には、最後に生成されたIDのの値販売。 この値を使用して、idsalelistofsalesテーブルに挿入できます。

あなたはより多くの情報が必要な場合は、ここでhttp://msdn.microsoft.com/en-us/library/ms187342.aspx

+0

私は知っています!あなたが2台のコンピュータから同じ時間にそれをやるとどうなりますか? @Sasha – angel

+0

2人の異なるクライアントに挿入すると、@@ IDENTITYにはそれぞれのクライアントごとに1つの挿入があるため、それぞれに異なる値が設定されます。 @@ IDENTITYにはSQLセッションスコープがあります。 SQLセッション間で共有されないことを意味します。 – Sasha

+0

あなたは2つの異なる値を持っていますが、私が(テーブルから最大値(idsale)を選択して)テーブルlistofsaleに追加すると、何が起こりますか?そして、それは最後のものを取得しようとしています!そして、computer1とcomputer2最後の数字でidsaleでlistofsaleに追加しようとしていますが、これは問題になるでしょう! – angel

4

あなたはいくつかのオプションがあり、それを見つけることができます。 (ここでは詳細:http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

  1. 使用SCOPE_IDENTITY()現在のセッションで作成された最後のID値を返しますし、同様に現在のスコープに限定されています。 @@ IDENTITYに関する問題を回避します。

  2. は、OUTPUT句(http://msdn.microsoft.com/en-us/library/ms177564.aspx)の代わりにあなたの鍵としてのIntを使用しての

  3. を経由して、あなたに挿入されたIDを与えるUNIQUEIDENTIFIER(GUID)を使用するINSERT文を持っています。 利点:idクライアント側を作成してサーバーに送信できます。 ダウンサイド:それはあなたのインデックスの地獄を引き起こします。

それは、最大私にだったと私は、私は上記のオプション#2を使用すると思い、私は戻ってきたID値の100%一定になりたかった場合。

1

は、私はそれが検索してデータを取得遅くなるので、あなたがvarchar型として(idsaleのように)主キーをすべきとは思いません。 idsaleをオートナンバーにして、販売テーブルにデータを挿入した後、最後に挿入されたID値のIDを取得し、それをlistofsaleに挿入するために使用します。

販売(TradeMeters)の私のポイントに取り組んで私はこのようなテーブルを設計した:あなたは量とpriceunitから小計を計算することができますので、

SaleItems 
{ 
    transaction_id int, 
    product_id int, 
    quantity float, 
    unit_price float, 
    discount float 
} 

ノート小計が必要とされていません。

Subtotal = priceunit x amount 
関連する問題