程序员考试试题
一、 编写一个简化的进货单审核的存储过程(注:答题前请认真阅读附件中的相关预备
知识,并可查阅SYBASE数据库相关的技术资料)。
要求如下:
1、必须使用游标(注:可查看存储过程的相关知识)。
2、产生一个新的库存批次号,并插入表KCPCXX(注:库存批次号是从1开始的流水号)。
3、插入或更新表SPFPCJC和KCSP (注:有的商品可能不是第一次进货)。
4、据产生的库存批次号和当前日期更新表JHD的KCPCH和SHRQ字段。
(提示:此存储过程的输入参数只有一个就是@JLBH,简化起见不需要输出参数) ------注:如果熟悉SQLSERVER,也可用SQLSQRVER写。
------ 最好用Begin tran exec 过程名 参数 Bollback 能通过。如果通不过,语法别错误太大也行。
二、自己建一个表,以这个表为基础,建一个视图文件。以及一个简单触发器
三、从某种角度来说,要想成为一名优秀的程序员必须具备以下三点:1、扎实的专业知识
和丰富的行业经验2、强烈的责任心和一丝不苟的工作态度3、可预见性,即对将要开
发或正在开发的程序可能存在问题的预见性和程序的可扩展性。你是否想成为一名优秀
的程序员,如是请客观评估自己目前的差距有多大,并怎样在日常的工作中尽快缩短
差距,
四、翻译Delphi开发环境中关于控件TTable的联机帮助(注:可查阅英文字典)。
Use TTable to access data in a single database table using the Borland Database Engine (BDE). TTable provides direct access to every record and field in an underlying database table, whether it is from Paradox, dBASE, Access, FoxPro, an ODBC-compliant database, or an SQL database on a remote server, such as InterBase, Oracle, Sybase, MS-SQL Server, Informix, or DB2. A table component can also work with a subset of records within a database table using ranges and filters.
At design time, create, delete, update, or rename the database table connected to a TTable by right-clicking on the TTable and using the pop-up menu.
附件
分为四个部分:1、关于单据的说明2、相关术语或字段的说明3、相关表结构说明4、
存储过程实例(注:不必深入研究,目的只是了解实际的存储过程的写法,并可灵活运用其
中的局部内容)
1、关于单据的说明:
商场发生的各种业务例如:进货、返厂、配货、返仓、调拨、变进价等在信息系统中一
般都会以单据的形式
下来,记录单据的过程在信息系统中称为单据处理。单据处理一般
分为录入和审核两步。每种单据在系统中保存时一般是采用主从表的形式。即共用信息一般
放在主表中,明细信息一般放在从表中。以进货单为例:主表JHD(进货单)记录的是本次进
货的所有商品的共同的部门(DEPTID)和供货单位(GHDW)及总的进货金额(JHJE)等信息。从
表JHDITEM(进货单明细表)记录的是各个商品(SP_ID)的进货单价(JHDJ)、进货数量(JHSL)、
进货金额(JHJE)等信息。录入完成后,主表中只有一条记录,而从表根据本次进货的商品的
多少可能有多条记录。在审核之前,此单据是可以再次调出进行修改的,并可以删除。审核
后此单据就真正生效了,商品的库存会增加,同时会写其它的相关内容,此时的单据就不允
许修改和删除了。
2、相关术语或字段的说明:
关于部门(DEPTID)的说明:在商场中,部门一般分为进货部门、销售部门和其它行政部门。
进货部门负责商品的进货,销售部门负责商品的销售,其它行政部门不参与系统流程的处理。
以进货部门为例:进货部门一般根据商品的类别分为百货、家电、服装、针绵、食品等。
关于商品(SP_ID)的说明:商品是信息系统处理的基本对象,商场的进、销、调、存都与商
品有关。为了便于管理和数据分析,商品都属于某个部门。
关于批次(KCPCH)的说明:进货是按部门和供货商进行的。同一个供货商同一个部门的不同
商品在进货时可共用一张进货单。每张进货单在审核时都会产生一个新的批次(同一个商品
即使在同一个供货商同一个部门下,当发生多次进货时,每次都会产生一个新的批次)。这
样同一个商品在不同的批次上进价可能不一样,当发生销售后,在记成本时,可以按照先进
先出的原则依次取各个批次的进价,以达到准确的成本核算。
3、相关的表结构说明:
create table JHD (
JLBH int not null,
DEPTID varchar(10) not null,
GHDW varchar(6) not null,
JHJE money default 0 not null,
DJSJ datetime not null,
SHRQ datetime null,
KCPCH int null,
constraint PK_JHD primary key (JLBH)
)
表名:
JHD 进货单
字段名:
JLBH 记录编号,在录入时由系统自动产生
DEPTID 部门代码,指商场的进货部门的编码
GHDW 供货单位,给商场供货的供应商代码
JHJE 进货金额,本次进货的总进货金额
DJSJ 登记时间,录入进货单时系统自动给出
SHRQ 审核日期,在审核时反写此字段值
KCPCH 库存批次号,在审核时反写此字段值
create table JHDITEM (
JLBH int not null,
INX int not null,
SP_ID int not null,
JHDJ money null,
JHSL numeric(16,4) default 0 not null,
JHJE money default 0 not null,
constraint PK_JHDITEM primary key (JLBH, INX)
)
表名:
JHDITEM 进货单明细
字段名:
JLBH 记录编号,可与主表的JLBH作表连接
INX 子表单的顺序号
SP_ID 商品的系统内部编号,一个商品唯一对应一个ID号
JHDJ 进货单价
JHSL 进货数量
JHJE 进货金额
create table KCPCXX (
KCPCH int not null,
GHDW varchar(6) not null,
JHDBH int null,
constraint PK_KCPCXX primary key (KCPCH)
)
表名:
KCPCXX 库存批次信息,它是表SPFPCJC(商品分批次结存)的主表,通过字段KCPCH连
接
字段名:
KCPCH 库存批次号
GHDW 供货单位
JHDBH 进货单编号,也就是表JHD的JLBH
create table SPFPCJC (
DEPTID varchar(10) not null,
SP_ID int not null,
KCPCH int not null,
JHDJ float default 0 null,
JHSL numeric(16,4) default 0 not null,
JCSL numeric(16,4) default 0 not null,
JCJE money default 0 not null,
constraint PK_SPFPCJC primary key (DEPTID, SP_ID, KCPCH) )
表名:
SPFPCJC 商品分批次结存,它是表KCPCXX(库存批次信息)的子表,通过字段KCPCH连
接
字段名:
DEPTID 部门代码,指商场的进货部门的编码
SP_ID 商品的系统内部编号,一个商品唯一对应一个ID号
KCPCH 库存批次号
JHDJ 进货单价
JHSL 进货数量
JCSL 结存数量
JCJE 结存金额
create table KCSP (
DEPTID varchar(10) not null,
SP_ID int not null,
KCSL numeric(16,4) default 0 not null,
constraint PK_GTSP primary key (DEPTID, SP_ID)
)
表名:
KCSP 库存商品,它与表SPFPCJC的区别是:表SPFPCJC记录的是每个部门(DEPTID)
的每个商品(SP_ID)的每个批次(KCPCH)的库存情况,而表KCSP记录的是每个部门(DEPTID)
的每个商品(SP_ID)的库存情况。
字段名:
DEPTID 部门代码,指商场的进货部门的编码
SP_ID 商品的系统内部编号,一个商品唯一对应一个ID号 KCSL 库存数量
4、存储过程实例:(长益公司BFV52 返厂单审核存储过程)
Create Procedure THD_SH @JLBH int,
@SHR int,
@RetFlag int OutPut,
@RetStr char(50) OutPut
as
begin
declare @Dept char(10),
@KCDD char(8),
@SP_ID int,
@SPCODE char(10),
@SPTYPE tinyint,
@KCPCH int,
@THSL numeric(16,4),
@BZHL float,
@THJS int,
@THJE_JJ money,
@ZZSJE money,
@ZZSJE_17 money,
@ZZSJE_13 money
select @RetFlag = 0,@RetStr = ''
if exists (select * from JXCRCLBJ where datediff(day,RQ,getdate()) = 0)
begin
raiserror 30001 '本日已经结帐,不能进行操作'
return
end
if exists (select * from THCL where ZXR is not null and JLBH = @JLBH)
begin
raiserror 30001 '本单已经审核!'
return
end
if not exists(select 1 from THCLITEMKCDD
where JLBH = @JLBH)
begin
execute GetKCDD_THCL @JLBH,@RetFlag=@RetFlag output ,@RetStr=@RetStr output
if @RetFlag <> 0
return
end
declare THCLITEMCur cursor
for select DEPTID,SP_ID,sum(THSL)
from THCLITEM
where JLBH = @JLBH
group by DEPTID,SP_ID
for read only
open THCLITEMCur
fetch THCLITEMCur into @Dept,@SP_ID,@THSL
while (@@sqlstatus = 0)
begin
if isnull((select sum(THXS) from THCLITEMKCDD
where JLBH = @JLBH
and DEPTID = @Dept
and SP_ID = @SP_ID),0) <> @THSL
begin
select @SPCODE = SPCODE from SPXX where SP_ID = @SP_ID
select @RetFlag = 1
select @RetStr = '商品('+ rtrim(@SPCODE)+')各批次的退货数量与各库存地点的不相等'
return
end
fetch THCLITEMCur into @Dept,@SP_ID,@THSL
end
close THCLITEMCur
deallocate cursor THCLITEMCur
declare CurFPC_A cursor
for select DEPTID,SP_ID,sum(THXS)
from THCLITEMKCDD
where JLBH = @JLBH
group by DEPTID,SP_ID
for read only
open CurFPC_A
fetch CurFPC_A into @Dept,@SP_ID,@THSL
while (@@sqlstatus = 0)
begin
if isnull((select sum(THSL) from THCLITEM
where JLBH = @JLBH
and DEPTID = @Dept
and SP_ID = @SP_ID),0) <> @THSL
begin
select @SPCODE = SPCODE from SPXX where SP_ID = @SP_ID
select @RetFlag = 1
select @RetStr = '商品('+ rtrim(@SPCODE)+')各批次的退货数量与各库存地点的不相等'
return
end
fetch CurFPC_A into @Dept,@SP_ID,@THSL
end
close CurFPC_A
deallocate cursor CurFPC_A
declare THCLITEMCur cursor
for
select DEPTID,SP_ID,KCPCH,THSL,THJE_JJ,ZZSJE
from THCLITEM
where JLBH = @JLBH
for read only
open THCLITEMCur
fetch THCLITEMCur into @Dept,@SP_ID,@KCPCH,@THSL,@THJE_JJ,@ZZSJE
while (@@sqlstatus = 0)
begin
if exists (select 1 from SPFPCJC
where DEPTID = @Dept
and SP_ID = @SP_ID
and KCPCH = @KCPCH
and JCSL < @THSL)
begin
select @SPCODE = SPCODE from SPXX where SP_ID = @SP_ID
select @RetFlag = 1
select @RetStr = '商品('+ rtrim(@SPCODE)+')本批结存不够退货(批次号:'+convert(char(6),@KCPCH)+')'
return
end
else
begin
update SPFPCJC
set THSL = THSL + @THSL,
JCSL = JCSL - @THSL,
JCJE = JCJE - @THJE_JJ
where DEPTID = @Dept
and SP_ID = @SP_ID
and KCPCH = @KCPCH
end
fetch THCLITEMCur into @Dept,@SP_ID,@KCPCH,@THSL,@THJE_JJ,@ZZSJE
end
close THCLITEMCur
deallocate cursor THCLITEMCur
declare THCLITEMKCDDCur cursor for
select I.DEPTID,I.SP_ID,I.KCDD,I.BZHL,I.THJS,I.THXS,X.SPTYPE,X.SPCODE
from THCLITEMKCDD I,SPXX X
where I.SP_ID=X.SP_ID
and I.JLBH = @JLBH
for read only
open THCLITEMKCDDCur
fetch THCLITEMKCDDCur into @Dept,@SP_ID,@KCDD,@BZHL,@THJS,@THSL,@SPTYPE,@SPCODE
while (@@sqlstatus = 0)
begin
if exists (select 1 from SPKCSLZ
where DEPTID = @Dept
and SP_ID = @SP_ID
and KCDD = @KCDD
and BZHL = @BZHL
and YXKCXS < @THSL)
begin
select @RetFlag = 1,@RetStr = '商品('+ rtrim(@SPCODE)+')库存数量不够退货(库存地点代码:'+@KCDD+')'
return
end
else
begin
if @KCDD = "01"
begin
if @SPTYPE<>4 --非黄金商品
select @THJS=round(@THSL/@BZHL,0)
update GTSP
set GZKCSL = GZKCSL - @THSL
where DEPTID = @Dept
and SP_ID = @SP_ID
end
update SPKCSLZ
set YXKCXS = YXKCXS - @THSL,
YXKCJS = YXKCJS - @THJS
where DEPTID = @Dept
and SP_ID = @SP_ID
and KCDD = @KCDD
and BZHL = @BZHL
end
fetch THCLITEMKCDDCur into
@Dept,@SP_ID,@KCDD,@BZHL,@THJS,@THSL,@SPTYPE,@SPCODE
end
close THCLITEMKCDDCur
deallocate cursor THCLITEMKCDDCur
select @ZZSJE_17 = isnull(sum(A.ZZSJE),0)
from THCLITEM A,SPFPCJC B
where A.JLBH = @JLBH
and A.SP_ID = B.SP_ID
and A.DEPTID=B.DEPTID
and A.KCPCH=B.KCPCH
and B.JXSL = 0.17
select @ZZSJE_13 = isnull(sum(A.ZZSJE),0)
from THCLITEM A,SPFPCJC B
where A.JLBH = @JLBH
and A.SP_ID = B.SP_ID
and A.DEPTID=B.DEPTID
and A.KCPCH=B.KCPCH
and B.JXSL = 0.13
select @ZZSJE = sum(ZZSJE),
@THJE_JJ = sum(THJE_JJ)
from THCLITEM
where JLBH = @JLBH
update THCL
set ZXRQ = convert(datetime,convert(char(20),getdate(),102)),
ZXR = @SHR,
ZXRMC =(select PERSON_NAME from RYXX where PERSON_ID=@SHR),
THJE_JJ = @THJE_JJ,
ZZSJE_17 = @ZZSJE_17,
ZZSJE_13 = @ZZSJE_13,
ZZSJE_QT = @ZZSJE - @ZZSJE_17 - @ZZSJE_13
where JLBH = @JLBH
if (select HSFS from THCL where JLBH=@JLBH)=0
begin
declare @HTH int,
@GHDW char(6),
@DEPTID char(10),
@JSFF smallint
select @HTH=HTH,@GHDW=GHDW from THCL where JLBH=@JLBH
select @DEPTID=DEPTID from HT where HTH=@HTH
select @JSFF=JSFF from HT_ZY where HTH=@HTH
select @THJE_JJ=(-1)*@THJE_JJ -@ZZSJE
execute Write_WLDWWLZ @GHDW,@DEPTID,@HTH,3,@JLBH,@JSFF,0,@THJE_JJ
end
end