Difference between revisions of "Sales.SalesOrderDetail (table)"
| Line 12: | Line 12: | ||
| + | === Columns === | ||
{| border="1" cellpadding="5" cellspacing="0" style="border-collapse:collapse" | {| border="1" cellpadding="5" cellspacing="0" style="border-collapse:collapse" | ||
|- style="background:silver" | |- style="background:silver" | ||
| Line 18: | Line 19: | ||
| '''Nullable | | '''Nullable | ||
| '''Default | | '''Default | ||
| − | | '''Description | + | | '''Description |
|- valign="top" | |- valign="top" | ||
| Line 25: | Line 26: | ||
| not null | | not null | ||
| | | | ||
| − | | Primary key. Foreign key to SalesOrderHeader.SalesOrderID. | + | | Primary key. Foreign key to SalesOrderHeader.SalesOrderID. |
|- valign="top" | |- valign="top" | ||
| SalesOrderDetailID | | SalesOrderDetailID | ||
| Line 31: | Line 32: | ||
| not null | | not null | ||
| | | | ||
| − | | Primary key. One incremental unique number per product sold. | + | | Primary key. One incremental unique number per product sold. |
|- valign="top" | |- valign="top" | ||
| CarrierTrackingNumber | | CarrierTrackingNumber | ||
| Line 37: | Line 38: | ||
| null | | null | ||
| | | | ||
| − | | Shipment tracking number supplied by the shipper. | + | | Shipment tracking number supplied by the shipper. |
|- valign="top" | |- valign="top" | ||
| OrderQty | | OrderQty | ||
| Line 43: | Line 44: | ||
| not null | | not null | ||
| | | | ||
| − | | Quantity ordered per product. | + | | Quantity ordered per product. |
|- valign="top" | |- valign="top" | ||
| ProductID | | ProductID | ||
| Line 49: | Line 50: | ||
| not null | | not null | ||
| | | | ||
| − | | Product sold to customer. Foreign key to Product.ProductID. | + | | Product sold to customer. Foreign key to Product.ProductID. |
|- valign="top" | |- valign="top" | ||
| SpecialOfferID | | SpecialOfferID | ||
| Line 55: | Line 56: | ||
| not null | | not null | ||
| | | | ||
| − | | Promotional code. Foreign key to SpecialOffer.SpecialOfferID. | + | | Promotional code. Foreign key to SpecialOffer.SpecialOfferID. |
|- valign="top" | |- valign="top" | ||
| UnitPrice | | UnitPrice | ||
| Line 61: | Line 62: | ||
| not null | | not null | ||
| | | | ||
| − | | Selling price of a single product. | + | | Selling price of a single product. |
|- valign="top" | |- valign="top" | ||
| UnitPriceDiscount | | UnitPriceDiscount | ||
| Line 67: | Line 68: | ||
| not null | | not null | ||
| ((0.0)) | | ((0.0)) | ||
| − | | Discount amount. | + | | Discount amount. |
|- valign="top" | |- valign="top" | ||
| LineTotal | | LineTotal | ||
| Line 73: | Line 74: | ||
| | | | ||
| | | | ||
| − | | Per product subtotal. Computed as UnitPrice * (1 - UnitPriceDiscount) * OrderQty. | + | | Per product subtotal. Computed as UnitPrice * (1 - UnitPriceDiscount) * OrderQty. |
|- valign="top" | |- valign="top" | ||
| rowguid | | rowguid | ||
| Line 79: | Line 80: | ||
| not null | | not null | ||
| (newid()) | | (newid()) | ||
| − | | ROWGUIDCOL number uniquely identifying the record. Used to support a merge replication sample. | + | | ROWGUIDCOL number uniquely identifying the record. Used to support a merge replication sample. |
|- valign="top" | |- valign="top" | ||
| ModifiedDate | | ModifiedDate | ||
| Line 85: | Line 86: | ||
| not null | | not null | ||
| (getdate()) | | (getdate()) | ||
| − | | Date and time the record was last updated. | + | | Date and time the record was last updated. |
|} | |} | ||
| + | === Primary Key === | ||
| + | {| border="1" cellpadding="5" cellspacing="0" style="border-collapse:collapse" | ||
| + | |- style="background:silver" | ||
| + | | '''Primary Key | ||
| + | | '''Columns | ||
| + | |- | ||
| + | | PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID | ||
| + | | SalesOrderID, SalesOrderDetailID | ||
| + | |} | ||
| + | === Indexes === | ||
| + | {| border="1" cellpadding="5" cellspacing="0" style="border-collapse:collapse" | ||
| + | |- style="background:silver" | ||
| + | | '''Index | ||
| + | | '''Type | ||
| + | | '''Columns | ||
| + | |||
| + | |- | ||
| + | | AK_SalesOrderDetail_rowguid | ||
| + | | Unique | ||
| + | | rowguid | ||
| + | |- | ||
| + | | IX_SalesOrderDetail_ProductID | ||
| + | | | ||
| + | | ProductID | ||
| + | |} | ||
| + | === Check Constraints === | ||
| + | {| border="1" cellpadding="5" cellspacing="0" style="border-collapse:collapse" | ||
| + | |- style="background:silver" | ||
| + | | '''Check Constraint | ||
| + | | '''Expression | ||
| + | | '''Description | ||
| + | |||
| + | |- | ||
| + | | CK_SalesOrderDetail_OrderQty | ||
| + | | ([OrderQty]>(0)) | ||
| + | | Check constraint [OrderQty] > (0) | ||
| + | |- | ||
| + | | CK_SalesOrderDetail_UnitPrice | ||
| + | | ([UnitPrice]>=(0.00)) | ||
| + | | Check constraint [UnitPrice] >= (0.00) | ||
| + | |- | ||
| + | | CK_SalesOrderDetail_UnitPriceDiscount | ||
| + | | ([UnitPriceDiscount]>=(0.00)) | ||
| + | | Check constraint [UnitPriceDiscount] >= (0.00) | ||
| + | |} | ||
| + | |||
| + | === Foreign Keys === | ||
{| border="1" cellpadding="5" cellspacing="0" style="border-collapse:collapse" | {| border="1" cellpadding="5" cellspacing="0" style="border-collapse:collapse" | ||
|- style="background:silver" | |- style="background:silver" | ||
| Line 106: | Line 154: | ||
|} | |} | ||
| − | + | === Triggers === | |
{| border="1" cellpadding="5" cellspacing="0" style="border-collapse:collapse" | {| border="1" cellpadding="5" cellspacing="0" style="border-collapse:collapse" | ||
|- style="background:silver" | |- style="background:silver" | ||
| Line 117: | Line 165: | ||
|} | |} | ||
| + | Trigger iduSalesOrderDetail | ||
| + | <pre> | ||
| + | CREATE TRIGGER [Sales].[iduSalesOrderDetail] ON [Sales].[SalesOrderDetail] | ||
| + | AFTER INSERT, DELETE, UPDATE AS | ||
| + | BEGIN | ||
| + | DECLARE @Count int; | ||
| + | |||
| + | SET @Count = @@ROWCOUNT; | ||
| + | IF @Count = 0 | ||
| + | RETURN; | ||
| + | |||
| + | SET NOCOUNT ON; | ||
| + | |||
| + | BEGIN TRY | ||
| + | -- If inserting or updating these columns | ||
| + | IF UPDATE([ProductID]) OR UPDATE([OrderQty]) OR UPDATE([UnitPrice]) OR UPDATE([UnitPriceDiscount]) | ||
| + | -- Insert record into TransactionHistory | ||
| + | BEGIN | ||
| + | INSERT INTO [Production].[TransactionHistory] | ||
| + | ([ProductID] | ||
| + | ,[ReferenceOrderID] | ||
| + | ,[ReferenceOrderLineID] | ||
| + | ,[TransactionType] | ||
| + | ,[TransactionDate] | ||
| + | ,[Quantity] | ||
| + | ,[ActualCost]) | ||
| + | SELECT | ||
| + | inserted.[ProductID] | ||
| + | ,inserted.[SalesOrderID] | ||
| + | ,inserted.[SalesOrderDetailID] | ||
| + | ,'S' | ||
| + | ,GETDATE() | ||
| + | ,inserted.[OrderQty] | ||
| + | ,inserted.[UnitPrice] | ||
| + | FROM inserted | ||
| + | INNER JOIN [Sales].[SalesOrderHeader] | ||
| + | ON inserted.[SalesOrderID] = [Sales].[SalesOrderHeader].[SalesOrderID]; | ||
| + | |||
| + | UPDATE [Sales].[Individual] | ||
| + | SET [Demographics].modify('declare default element namespace | ||
| + | "http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/IndividualSurvey"; | ||
| + | replace value of (/IndividualSurvey/TotalPurchaseYTD)[1] | ||
| + | with data(/IndividualSurvey/TotalPurchaseYTD)[1] + sql:column ("inserted.LineTotal")') | ||
| + | FROM inserted | ||
| + | INNER JOIN [Sales].[SalesOrderHeader] | ||
| + | ON inserted.[SalesOrderID] = [Sales].[SalesOrderHeader].[SalesOrderID] | ||
| + | WHERE [Sales].[SalesOrderHeader].[CustomerID] = [Sales].[Individual].[CustomerID]; | ||
| + | END; | ||
| + | |||
| + | -- Update SubTotal in SalesOrderHeader record. Note that this causes the | ||
| + | -- SalesOrderHeader trigger to fire which will update the RevisionNumber. | ||
| + | UPDATE [Sales].[SalesOrderHeader] | ||
| + | SET [Sales].[SalesOrderHeader].[SubTotal] = | ||
| + | (SELECT SUM([Sales].[SalesOrderDetail].[LineTotal]) | ||
| + | FROM [Sales].[SalesOrderDetail] | ||
| + | WHERE [Sales].[SalesOrderHeader].[SalesOrderID] = [Sales].[SalesOrderDetail].[SalesOrderID]) | ||
| + | WHERE [Sales].[SalesOrderHeader].[SalesOrderID] IN (SELECT inserted.[SalesOrderID] FROM inserted); | ||
| + | |||
| + | UPDATE [Sales].[Individual] | ||
| + | SET [Demographics].modify('declare default element namespace | ||
| + | "http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/IndividualSurvey"; | ||
| + | replace value of (/IndividualSurvey/TotalPurchaseYTD)[1] | ||
| + | with data(/IndividualSurvey/TotalPurchaseYTD)[1] - sql:column("deleted.LineTotal")') | ||
| + | FROM deleted | ||
| + | INNER JOIN [Sales].[SalesOrderHeader] | ||
| + | ON deleted.[SalesOrderID] = [Sales].[SalesOrderHeader].[SalesOrderID] | ||
| + | WHERE [Sales].[SalesOrderHeader].[CustomerID] = [Sales].[Individual].[CustomerID]; | ||
| + | END TRY | ||
| + | BEGIN CATCH | ||
| + | EXECUTE [dbo].[uspPrintError]; | ||
| + | -- Rollback any active or uncommittable transactions before | ||
| + | -- inserting information in the ErrorLog | ||
| + | IF @@TRANCOUNT > 0 | ||
| + | BEGIN | ||
| + | ROLLBACK TRANSACTION; | ||
| + | END | ||
| + | |||
| + | EXECUTE [dbo].[uspLogError]; | ||
| + | END CATCH; | ||
| + | END; | ||
| + | </pre> | ||
| + | |||
| + | === References === | ||
{| border="1" cellpadding="5" cellspacing="0" style="border-collapse:collapse" | {| border="1" cellpadding="5" cellspacing="0" style="border-collapse:collapse" | ||
|- style="background:silver" | |- style="background:silver" | ||
| Line 127: | Line 258: | ||
| '''Child Object | | '''Child Object | ||
| + | |- | ||
| + | | Schema | ||
| + | | Schema | ||
| + | | [[Sales_(schema)|Sales]] | ||
| + | |||
| + | | | ||
| + | | | ||
|- | |- | ||
| Insert | | Insert | ||
| Line 178: | Line 316: | ||
|} | |} | ||
| − | + | === Dependencies === | |
{| border="1" cellpadding="5" cellspacing="0" style="border-collapse:collapse" | {| border="1" cellpadding="5" cellspacing="0" style="border-collapse:collapse" | ||
|- style="background:silver" | |- style="background:silver" | ||
| Line 196: | Line 334: | ||
| iduSalesOrderDetail | | iduSalesOrderDetail | ||
|} | |} | ||
| − | |||
Revision as of 23:05, 2 February 2010
Contents
wikibot
| Table | Sales.SalesOrderDetail |
| Description | Individual products associated with a specific sales order. See SalesOrderHeader. |
Columns
| Column | Data Type | Nullable | Default | Description |
| SalesOrderID | int | not null | Primary key. Foreign key to SalesOrderHeader.SalesOrderID. | |
| SalesOrderDetailID | int | not null | Primary key. One incremental unique number per product sold. | |
| CarrierTrackingNumber | nvarchar(25) | null | Shipment tracking number supplied by the shipper. | |
| OrderQty | smallint | not null | Quantity ordered per product. | |
| ProductID | int | not null | Product sold to customer. Foreign key to Product.ProductID. | |
| SpecialOfferID | int | not null | Promotional code. Foreign key to SpecialOffer.SpecialOfferID. | |
| UnitPrice | money | not null | Selling price of a single product. | |
| UnitPriceDiscount | money | not null | ((0.0)) | Discount amount. |
| LineTotal | Per product subtotal. Computed as UnitPrice * (1 - UnitPriceDiscount) * OrderQty. | |||
| rowguid | uniqueidentifier | not null | (newid()) | ROWGUIDCOL number uniquely identifying the record. Used to support a merge replication sample. |
| ModifiedDate | datetime | not null | (getdate()) | Date and time the record was last updated. |
Primary Key
| Primary Key | Columns |
| PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID | SalesOrderID, SalesOrderDetailID |
Indexes
| Index | Type | Columns |
| AK_SalesOrderDetail_rowguid | Unique | rowguid |
| IX_SalesOrderDetail_ProductID | ProductID |
Check Constraints
| Check Constraint | Expression | Description |
| CK_SalesOrderDetail_OrderQty | ([OrderQty]>(0)) | Check constraint [OrderQty] > (0) |
| CK_SalesOrderDetail_UnitPrice | ([UnitPrice]>=(0.00)) | Check constraint [UnitPrice] >= (0.00) |
| CK_SalesOrderDetail_UnitPriceDiscount | ([UnitPriceDiscount]>=(0.00)) | Check constraint [UnitPriceDiscount] >= (0.00) |
Foreign Keys
| Relation | Column | Referenced Column |
| Sales.SalesOrderHeader | SalesOrderID | SalesOrderID |
| Sales.SpecialOfferProduct | SpecialOfferID | SpecialOfferID |
Triggers
| Triggers | Type |
| iduSalesOrderDetail | ON INSERT UPDATE DELETE |
Trigger iduSalesOrderDetail
CREATE TRIGGER [Sales].[iduSalesOrderDetail] ON [Sales].[SalesOrderDetail]
AFTER INSERT, DELETE, UPDATE AS
BEGIN
DECLARE @Count int;
SET @Count = @@ROWCOUNT;
IF @Count = 0
RETURN;
SET NOCOUNT ON;
BEGIN TRY
-- If inserting or updating these columns
IF UPDATE([ProductID]) OR UPDATE([OrderQty]) OR UPDATE([UnitPrice]) OR UPDATE([UnitPriceDiscount])
-- Insert record into TransactionHistory
BEGIN
INSERT INTO [Production].[TransactionHistory]
([ProductID]
,[ReferenceOrderID]
,[ReferenceOrderLineID]
,[TransactionType]
,[TransactionDate]
,[Quantity]
,[ActualCost])
SELECT
inserted.[ProductID]
,inserted.[SalesOrderID]
,inserted.[SalesOrderDetailID]
,'S'
,GETDATE()
,inserted.[OrderQty]
,inserted.[UnitPrice]
FROM inserted
INNER JOIN [Sales].[SalesOrderHeader]
ON inserted.[SalesOrderID] = [Sales].[SalesOrderHeader].[SalesOrderID];
UPDATE [Sales].[Individual]
SET [Demographics].modify('declare default element namespace
"http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/IndividualSurvey";
replace value of (/IndividualSurvey/TotalPurchaseYTD)[1]
with data(/IndividualSurvey/TotalPurchaseYTD)[1] + sql:column ("inserted.LineTotal")')
FROM inserted
INNER JOIN [Sales].[SalesOrderHeader]
ON inserted.[SalesOrderID] = [Sales].[SalesOrderHeader].[SalesOrderID]
WHERE [Sales].[SalesOrderHeader].[CustomerID] = [Sales].[Individual].[CustomerID];
END;
-- Update SubTotal in SalesOrderHeader record. Note that this causes the
-- SalesOrderHeader trigger to fire which will update the RevisionNumber.
UPDATE [Sales].[SalesOrderHeader]
SET [Sales].[SalesOrderHeader].[SubTotal] =
(SELECT SUM([Sales].[SalesOrderDetail].[LineTotal])
FROM [Sales].[SalesOrderDetail]
WHERE [Sales].[SalesOrderHeader].[SalesOrderID] = [Sales].[SalesOrderDetail].[SalesOrderID])
WHERE [Sales].[SalesOrderHeader].[SalesOrderID] IN (SELECT inserted.[SalesOrderID] FROM inserted);
UPDATE [Sales].[Individual]
SET [Demographics].modify('declare default element namespace
"http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/IndividualSurvey";
replace value of (/IndividualSurvey/TotalPurchaseYTD)[1]
with data(/IndividualSurvey/TotalPurchaseYTD)[1] - sql:column("deleted.LineTotal")')
FROM deleted
INNER JOIN [Sales].[SalesOrderHeader]
ON deleted.[SalesOrderID] = [Sales].[SalesOrderHeader].[SalesOrderID]
WHERE [Sales].[SalesOrderHeader].[CustomerID] = [Sales].[Individual].[CustomerID];
END TRY
BEGIN CATCH
EXECUTE [dbo].[uspPrintError];
-- Rollback any active or uncommittable transactions before
-- inserting information in the ErrorLog
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRANSACTION;
END
EXECUTE [dbo].[uspLogError];
END CATCH;
END;
References
| Dependency Type | Object Type | Referenced Object | Child Type | Child Object |
| Schema | Schema | Sales | ||
| Insert | Table | Production.TransactionHistory | Trigger | iduSalesOrderDetail |
| Update | Table | Sales.Individual | Trigger | iduSalesOrderDetail |
| Select | Table | Sales.SalesOrderDetail | Trigger | iduSalesOrderDetail |
| Select | Table | Sales.SalesOrderHeader | Trigger | iduSalesOrderDetail |
| Update | Table | Sales.SalesOrderHeader | Trigger | iduSalesOrderDetail |
| Execute | Procedure | dbo.uspLogError | Trigger | iduSalesOrderDetail |
| Execute | Procedure | dbo.uspPrintError | Trigger | iduSalesOrderDetail |
Dependencies
| Reference Type | Object Type | Referencing Object | Child Type | Child Object |
| Select | Table | Sales.SalesOrderDetail | Trigger | iduSalesOrderDetail |
automatically generated
| Table | Sales.SalesOrderDetail |
| Description | Individual products associated with a specific sales order. See SalesOrderHeader. |
| Column | Data Type | Nullable | Default | Description / PK / Index |
| SalesOrderID | int | not null | Primary key. Foreign key to SalesOrderHeader.SalesOrderID. PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID | |
| SalesOrderDetailID | int | not null | Primary key. One incremental unique number per product sold. PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID | |
| CarrierTrackingNumber | nvarchar(25) | null | Shipment tracking number supplied by the shipper. | |
| OrderQty | smallint | not null | Quantity ordered per product. | |
| ProductID | int | not null | Product sold to customer. Foreign key to Product.ProductID. IX_SalesOrderDetail_ProductID | |
| SpecialOfferID | int | not null | Promotional code. Foreign key to SpecialOffer.SpecialOfferID. | |
| UnitPrice | money | not null | Selling price of a single product. | |
| UnitPriceDiscount | money | not null | (0.0) | Discount amount. |
| LineTotal | Per product subtotal. Computed as UnitPrice * (1 - UnitPriceDiscount) * OrderQty. | |||
| rowguid | uniqueidentifier | not null | (NEWID()) | ROWGUIDCOL number uniquely identifying the record. Used to support a merge replication sample. AK_SalesOrderDetail_rowguid |
| ModifiedDate | datetime | not null | (GETDATE()) | Date and time the record was last updated. |
| Relation | Column | Referenced Column |
| Sales.SalesOrderHeader | SalesOrderID | SalesOrderID |
| Sales.SpecialOfferProduct | SpecialOfferID | SpecialOfferID |
| Triggers | Type |
| iduSalesOrderDetail | ON INSERT UPDATE DELETE |
| Dependency Type | Object Type | Referenced Object | Child Type | Child Object |
| Schema | Schema | Sales | ||
| Insert | Table | Production.TransactionHistory | Trigger | iduSalesOrderDetail |
| Update | Table | Sales.Individual | Trigger | iduSalesOrderDetail |
| Select | Table | Sales.SalesOrderDetail | Trigger | iduSalesOrderDetail |
| Select | Table | Sales.SalesOrderHeader | Trigger | iduSalesOrderDetail |
| Update | Table | Sales.SalesOrderHeader | Trigger | iduSalesOrderDetail |
| Execute | Procedure | dbo.uspLogError | Trigger | iduSalesOrderDetail |
| Execute | Procedure | dbo.uspPrintError | Trigger | iduSalesOrderDetail |
| Reference Type | Object Type | Referencing Object | Child Type | Child Object |
| Select | Table | Sales.SalesOrderDetail | Trigger | iduSalesOrderDetail |