I have a very specific situation / problem and I was wondering how I should sole it. I have a table called T_DAGTAAK_DETAIL which looks like this :
Code: Select all
CREATE TABLE [dbo].[T_DAGTAAK_DETAIL](
[DagtaakDetailId] [int] IDENTITY(1,1) NOT NULL,
[DagtaakId] [int] NOT NULL,
[ArtikelId] [int] NOT NULL,
[Aantal] [decimal](11, 4) NOT NULL,
[Prijs] [float] NOT NULL,
[Subtotaal] AS ([Aantal]*[Prijs]),
[InVerwerking] [decimal](11, 4) NOT NULL,
[Verwerkt] [decimal](11, 4) NOT NULL,
CONSTRAINT [PK_T_DAGTAAK_DETAIL] PRIMARY KEY CLUSTERED
(
[DagtaakDetailId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Code: Select all
SELECT [T_DAGTAAK_DETAIL].[DagtaakDetailId]
,[T_DAGTAAK_DETAIL].[DagtaakId]
,[T_DAGTAAK_DETAIL].[ArtikelId]
,[T_DAGTAAK_DETAIL].[Aantal]
,[T_DAGTAAK_DETAIL].[Prijs]
,[T_DAGTAAK_DETAIL].[Subtotaal]
,[T_DAGTAAK_DETAIL].[Verwerkt]
,[T_ARTIKEL].[Thumbnail]
FROM [T_DAGTAAK_DETAIL]
JOIN T_ARTIKEL ON T_DAGTAAK_DETAIL.ArtikelId = T_ARTIKEL .ArtikelId
Code: Select all
CREATE PROCEDURE [dbo].[P_CREATE_DAGTAAK_DETAIL]
(
@DagTaakId AS INT = 0,
@ArtikelId AS INT = 0,
@Aantal AS DECIMAL( 11, 0 ) = 0,
@Prijs AS FLOAT--,
)
AS
BEGIN
DECLARE @DagTaakDetailId INT
SET @Prijs = coalesce( @Prijs, 0 )
IF ( EXISTS( SELECT DagtaakDetailId FROM T_DAGTAAK_DETAIL TDD WHERE ArtikelId = @ArtikelId AND DagtaakId = @DagTaakId ) )
BEGIN
SELECT @DagTaakDetailId = DagtaakDetailId FROM T_DAGTAAK_DETAIL TDD WHERE ArtikelId = @ArtikelId AND DagtaakId = @DagTaakId
UPDATE T_DAGTAAK_DETAIL SET Aantal = Aantal + @Aantal WHERE DagtaakId = @DagTaakId AND ArtikelId = @ArtikelId
RETURN @DagTaakDetailId
END
ELSE
BEGIN
INSERT INTO T_DAGTAAK_DETAIL
(
DagtaakId
,ArtikelId
,Aantal
,Prijs
)
VALUES
(
@DagTaakId
,@ArtikelId
,@Aantal
,@Prijs
)
RETURN scope_identity()
END
END
Code: Select all
{:DagtaakDetailId = CALL P_CREATE_DAGTAAK_DETAIL;1 (:DagTaakId, :ArtikelId, :Aantal, :Prijs)}
Code: Select all
procedure TdtmDagtaak.qryDagtaakDetailAfterUpdateExecute(
Sender: TCustomMSDataSet; StatementTypes: TStatementTypes; Params: TMSParams);
var
iDagtaakDetailId : Integer;
begin
inherited;
if stInsert in StatementTypes then
begin
iDagtaakDetailId := Integer(Params.ParamByName('DagtaakDetailId').Value);
Sender.FieldByName('DagtaakDetailId').ReadOnly := False;
try
Sender.FieldByName('DagtaakDetailId').NewValue := iDagtaakDetailId;
finally
Sender.FieldByName('DagtaakDetailId').ReadOnly := True;
end;
end;
end;
procedure TdtmDagtaak.qryDagtaakDetailBeforeUpdateExecute(
Sender: TCustomMSDataSet; StatementTypes: TStatementTypes; Params: TMSParams);
begin
inherited;
if stInsert in StatementTypes then
begin
Params.ParamByName('DagtaakDetailId').ParamType := ptResult;
end;
end;
The problem occurs when users try to add a record for which a DagtaakId and ArtikelId combination already exists. In that case after the post, the system seems to have updated the existing record in the DB. But on my display (in the grid) I now still see 2 lines for that ArtikelId ... one with the correctly updated Aantal (Qty), but the old line with the previous quantity is still there as well.
Is there any way I could work around that problem or solve it ? I could probably refresh the whole dataset after every post, but I'm wondering if there isn't an easier / more efficient way to achieve the same thing.
Best regards,
Stefaan