2013-05-12 2 views
3

Je suis déjà désolé ... Je suis tout à fait nouveau pour tout ce truc d'affichage, mais je fais de mon mieux ...Fonction/procédure stockée pour insérer entre deux tables fondée sur la condition

j'ai eu deux tables ... 'Client' et 'Chambres' ... un seul client avec un CU_ID UNIQUE reste dans une chambre (avec un ROOM_ID UNIQUE, malheureusement pour moi, parfois il y a 2 ou 3 CU_ID restant dans la même pièce ... ils s'enregistrent généralement le même jour, donc le CheckInDate devrait être le même ...

Quand ils check in et le RoomNo est entré sur le 'Customer'-Table je voudrais le Bit-Field' occupé ' dans la table 'Rooms' pour être réglé sur "TRUE" .Cette partie j'ai été fait avec un Trigger (voir b elow) ...

L'astuce est quand ils vérifient ... Si un utilisateur marque manuellement le "Occupé" - (Bit) Champ pour cet ID de Chambre comme "FAUX", alors je voudrais définir le DepartDate sur la Customer-Table pour tout client restant dans cette pièce au moment de Getdate().

Voilà mes tableaux, Trigger, et certaines données de test:

CREATE TABLE [dbo].[Rooms](
[Room_ID] [int] IDENTITY(1,1) NOT NULL, 
[Room_No] [nvarchar](50) NULL, 
[Occupied] [bit] NULL, 
    [CheckInDate] [int] NULL, 

CONSTRAINT [PK_Rooms] PRIMARY KEY CLUSTERED 
(
[Room_ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

CREATE TABLE [dbo].[Customer](
[CU_ID] [int] IDENTITY(5000,1) NOT NULL, 
[CheckInDate] [datetime] NULL, 
[RoomNo] [int] NOT NULL, 
[Nights_Booked] [int] NULL, 
[DepartDate] [datetime] NULL, 
CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED 
(
[CU_ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

ALTER TABLE [dbo].[Customer] WITH CHECK ADD CONSTRAINT [FK_Customer_Rooms] FOREIGN KEY([RoomNo]) 
REFERENCES [dbo].[Rooms] ([Room_ID]) 
GO 

ALTER TABLE [dbo].[Customer] CHECK CONSTRAINT [FK_Customer_Rooms] 
GO 

-- 2 Tables created including PK/FK Relationship 

Voici mon Trigger pour la première étape ... mettre à jour la colonne bit occupé à True lorsque ROOM_ID est utilisé pour le nouveau Check-In:

Create TRIGGER [dbo].[Occupied] 
ON [dbo].[Customer] 
FOR INSERT 
NOT FOR REPLICATION 
AS 
BEGIN 
IF TRIGGER_NESTLEVEL() > 1 
RETURN 
UPDATE Rooms 
SET [Occupied] = 'True' 
FROM Rooms r 
JOIN Customer cu 
ON cu.[RoomNo] = r.[Room_ID] 
Join INSERTED INS 
ON cu.[RoomNo] = INS.[RoomNo] 
END 
GO 

J'entre des données de test dans les deux ...

SET IDENTITY_INSERT Rooms ON 

INSERT INTO Rooms 
(Room_ID, Room_No, Occupied) 
SELECT 1, 'A14', 0 UNION ALL 
SELECT 2, 'B2', 0 UNION ALL 
SELECT 3, 'C3', 0 UNION ALL 
SELECT 4, 'D8', 0 UNION ALL 
SELECT 5, 'K9', 0 

SET IDENTITY_INSERT Rooms OFF 

GO 

SET IDENTITY_INSERT Customer ON 

INSERT INTO Customer 
(CU_ID, CheckInDate, RoomNo, Nights_Booked, DepartDate) 
SELECT 5000, '2013-05-10', 1, 4, NULL UNION ALL 
SELECT 5001, '2013-05-10', 1, 4, NULL UNION ALL 
SELECT 5002, '2013-05-10', 2, 2, NULL UNION ALL 
SELECT 5003, '2013-05-10', 3, 3, NULL UNION ALL 
SELECT 5004, '2013-05-11', 4, 4, NULL UNION ALL 
SELECT 5005, '2013-05-11', 4, 4, NULL UNION ALL 
SELECT 5006, '2013-05-11', 4, 4, NULL 

SET IDENTITY_INSERT Customer OFF 

-- Test Data entered in rows on 'Rooms' and 'Customer'-Tables 

Les travaux de déclenchement bien et il met à jour tous les enregistrements avec le même Room_ID (RoomNo respectivement sur Customer Table).

J'ai essayé de résoudre mon problème avec d'autres déclencheurs. Et je reçois SQL Server pour entrer la date de départ en fonction de la date d'arrivée du client spécifique, si je la transmets à la table de salle. Malheureusement, il ne met à jour les données avec la première entrée faite pour ce Room_ID spécifique sur le Rooms-Table ... et il semble maladroitement passer beaucoup de va-et-vient entre les deux tables. Je suppose que je besoin d'une procédure stockée/fonction pour accomplir effectivement que:

  • sur Insérer du compte rendu client passe RÉCENTS CheckInDate et insérer dans la chambre Table Champ CheckInDate
  • Lorsque Rooms.Occupied est marqué comme « Faux », régler le Départ jour pour tous les CU_ID avec Customer.RoomNo = Rooms.Room_ID ET Customer.CheckInDate = Rooms.CheckInDate à GETDATE() ...

je lutte avec la première partie - comment passer le CheckInDate sur Insérer et si une valeur est existante le mettre à jour avec la date plus récente ...

Aucune idée, encore une fois ... Je suis toute nouvelle :)

Merci pour toute aide à l'avance !!!

+1

Les déclencheurs sont un désordre impossible à maintenir. Écrire un frontal qui met à jour à la fois l'utilisateur et la table de pièce avec des requêtes distinctes. (Bonne question d'ailleurs, j'ai voté pour cela, peut-être que quelqu'un sans phobie déclencheur y répondra :)) – Andomar

+0

Bravo pour la réponse :) Le frontal n'est pas une option (3ème partie) - Les déclencheurs sont un gâchis - le simple dans ce cas, changer un Bit-Field en True sur Insert est plutôt maintenable - c'est pourquoi je cherchais plus d'idées pour Stored Procedure/Function pour obtenir ce que je veux - des idées appréciées - merci pour le Vote;) – user2312782

Répondre

0

Bienvenue dans StackOverflow. À l'avenir, il nous serait très utile de garder les exemples courts. Dans ce cas, par exemple, tout ce dont nous aurions besoin est de quelques colonnes de chaque table (aucune des options/contraintes).

Vous ne devez pas mettre à jour manuellement les bits. Utilisez des procédures stockées à la place.

CREATE PROCEDURE [dbo].[usp_CheckoutRoom] (
    @RoomID 
) 
AS 
    UPDATE [dbo].[Rooms] 
    SET [Occupied] = 0 
    WHERE [Room_ID] = @RoomID 

    UPDATE [dbo].[Customer] 
    SET [DepartDate] = GETDATE() 
    WHERE [RoomNo] = @RoomID 
END 

Je suppose que vous travaillez toujours sur la conception de votre système, mais ce qui se passe si un seul client vérifie plusieurs chambres? Vous avez besoin d'une table de références croisées client/pièce.

[dbo].[Customer] 
[dbo].[Room] 
[dbo].[CustomerRoom] 

Notez également qu'il est pas évident que [dbo]. [Client]. [RoomNo] est en fait la [RoomID].

+0

Hi J Lo, désolé pour le long Post, je vais le garder plus court dans le futur, on m'a dit d'y mettre autant d'informations que possible ... comme je l'ai dit, toute cette publication est nouvelle pour moi :) Mise à jour de la Bit-Field est fait par l'utilisateur final via .asp-Application, de sorte que l'un est correctif. Nous avions trois tables, mais notre logique d'affaires fonctionne différemment, donc [CustomerRoom] est inutile, car le client reçoit une place, donc ce n'est pas comme une réservation d'hôtel ... Merci déjà de toute façon – user2312782

Questions connexes