PDA

View Full Version : Sửa va góp ý hộ em đoạn code



tieukeke
26-05-2011, 07:15
Em đang viết đề tài quản lý lương :
+ cơ sơ dữ liệu:


create database test
go
use test
create table qlyluong
(
magv char(7) not null primary key,
hoten nvarchar(50) not null unique,
ngaysinh datetime,
hsl float,
luongcb money,
luong money,
thenganhang nvarchar(50),
chucvu char(7)
)

+ Em muốn viết một procedure để nhập và sinh mã tự động cho trường magv
với yêu cầu :
- là giảng viên thêm GV+001
- là cán bộ thêm CG+001
em sinh phần số xong + trường chucvu (GV hoặc CB)
-trường luongcb = 750000
-trường luong nếu là giảng viên (gv) luong= luongcb*hsl+40% là cán bộ luong= luongcb*hsl+30%

create procedure procthembang
@hoten nvarchar(50)
@ngaysinh datetime
@hsl float
@chucvu char(7)
@thenganhang nvarchar(50)
as
begin
Declare @magv char(7)
declare @luongcb money
declare @luong money
declare @tg char(7)
if not exists (select * from qlyluong)
Set @magv=1
else
Set @magv=(select RIGHT(MAX(magv),5) from qlyluong)+1
Set @magv=@chucvu+REPLICATE('0',5-LEN(@magv))+@magv
set @luongcb=750000
set @tg= left(@magv,2)
if @tg='GV' set @luong=(@hsl*@luongcb)+((@hsl*@luongcb)/100)*40
else
set @luong=(@hsl*@luongcb)+((@hsl*@luongcb)/100)*30
insert into qlyluong values(@magv,@hoten,@ngaysinh,@hsl,@luongcb,@luong ,@chucvu,@thenganhang)
end
Em làm nhưng vẫn lỗi các anh giúp em với .Em xin cảm ơn

Truongtn
26-05-2011, 09:45
Hi bạn,

Mình không xem kỹ code của bạn, chỉ góp ý là thiết kế của bạn là không tuân chuẩn thứ nhất. Trường MaGV bao gồm thông tin của trường chức vụ. Bạn nên bỏ tiền tố chức vụ trong trường MaGV, để trường này tự động tăng thôi. Khi tạo bản ghi lương mới, tùy theo chức vụ mà tính lương thôi.

chip07
26-05-2011, 11:54
Hi, mình cũng ko xem code của bạn (^_^), cơ bản là vì cố gắng hiểu suy nghĩ của người khác thật ko dễ gì. Mình tạo sp cho trường hợp của bạn, bạn có thể tham khảo qua.



CREATE TABLE tblQLLuong
(
MS nvarchar(5),
Ten nvarchar(50),
NgaySinh datetime,
HSL money,
LuongCB money,
Luong money,
ChucVu nvarchar(2),
TheNganHang nvarchar(50)
)

GO

CREATE PROCEDURE spQLLuong
@Ten nvarchar(50),
@NgaySinh datetime,
@HSL money,
@ChucVu nvarchar(2),
@TheNganHang nvarchar(50)

AS
BEGIN
INSERT INTO tblQLLuong (MS, Ten, NgaySinh, HSL, LuongCB, Luong, ChucVu, TheNganHang)
SELECT @chucvu
+ ISNULL(LEFT('000', 3 - LEN(MAX(RIGHT(MS,3)) + 1)),'00')
+ ISNULL(CAST(MAX(RIGHT(MS,3)) + 1 AS nvarchar(3)),'1') MS
, @Ten Ten
, @NgaySinh NgaySinh
, @HSL HSL
, 750000 LuongCB
, CASE
WHEN @ChucVu LIKE 'GV%'
THEN (@HSL*750000)+((@HSL*750000)/100)*40
ELSE (@HSL*750000)+((@HSL*750000)/100)*30
END Luong
, @ChucVu ChucVu
, @TheNganHang TheNganHang
FROM tblQLLuong
WHERE MS LIKE @chucvu + '%'

END

GO

tieukeke
26-05-2011, 13:13
Hi bạn,

Mình không xem kỹ code của bạn, chỉ góp ý là thiết kế của bạn là không tuân chuẩn thứ nhất. Trường MaGV bao gồm thông tin của trường chức vụ. Bạn nên bỏ tiền tố chức vụ trong trường MaGV, để trường này tự động tăng thôi. Khi tạo bản ghi lương mới, tùy theo chức vụ mà tính lương thôi.

Cám ơn bạn đã góp ý mình thiết kế như vậy để sinh theo Magv cho máy hiểu khi nào là GV khi nào là CB . mình cũng không còn cách nào khác tối ưu mong bạn có thể góp ý cho minh cách xây dựng cơ sở dữ liệu cho tối ưu theo các dạng chuẩn

[=========> Bổ sung bài viết <=========]


Hi, mình cũng ko xem code của bạn (^_^), cơ bản là vì cố gắng hiểu suy nghĩ của người khác thật ko dễ gì. Mình tạo sp cho trường hợp của bạn, bạn có thể tham khảo qua.



CREATE TABLE tblQLLuong
(
MS nvarchar(5),
Ten nvarchar(50),
NgaySinh datetime,
HSL money,
LuongCB money,
Luong money,
ChucVu nvarchar(2),
TheNganHang nvarchar(50)
)

GO

CREATE PROCEDURE spQLLuong
@Ten nvarchar(50),
@NgaySinh datetime,
@HSL money,
@ChucVu nvarchar(2),
@TheNganHang nvarchar(50)

AS
BEGIN
INSERT INTO tblQLLuong (MS, Ten, NgaySinh, HSL, LuongCB, Luong, ChucVu, TheNganHang)
SELECT @chucvu
+ ISNULL(LEFT('000', 3 - LEN(MAX(RIGHT(MS,3)) + 1)),'00')
+ ISNULL(CAST(MAX(RIGHT(MS,3)) + 1 AS nvarchar(3)),'1') MS
, @Ten Ten
, @NgaySinh NgaySinh
, @HSL HSL
, 750000 LuongCB
, CASE
WHEN @ChucVu LIKE 'GV%'
THEN (@HSL*750000)+((@HSL*750000)/100)*40
ELSE (@HSL*750000)+((@HSL*750000)/100)*30
END Luong
, @ChucVu ChucVu
, @TheNganHang TheNganHang
FROM tblQLLuong
WHERE MS LIKE @chucvu + '%'

END

GO

Cám ơn bạn đã gủi code cho mình . code chạy trơn chu lắm rất mong được làm quen với bạn . mình là hiếu Gmail:dohieupp@gmail.com .0986315516 .chúc bạn một ngày tốt lành

chip07
26-05-2011, 14:34
@tieukeke: na, rất vui được giúp bạn (^_^)