资源描述
数据库系统课程设计
题 目 商品订购系统
学生姓名 于小涛
学 号1346002
学 院 计算机和软件学院
专 业 网络工程
指导老师 马瑞
二O一O年十二月三十日
商品订购系统
目 录
1.系统目标
1.1功效要求
1.2安全要求
1.3环境要求
2.概念设计
2.1系统E-R图
3.逻辑设计
3.1 数据表
3.2数据关系定义
3.3数据关系表
4.系统实现
4.1用户登录模块
4.2 视图设计以
4.3.关键设计代码
5试验心得
1 系统目标
1.1功效要求
基础表①基础信息管理:
1、产品信息管理:查询、增、删、改
2、用户信息管理:查询、增、删、改
3、订单信息管理:查询、增、删、改
②订购情况:
1.商家能够对产品信息表、用户信息表、订单和订单细节进行增加、删除、更新、打印报表
2.订单处理:
输入用户号,能查询用户所下订单
输入订单号,能查询出用户在订单订货情况
1.2 安全要求
用户登录时要有用户和密码,对于不正确用户和密码登录超出要求次数时应给予拒绝。
1.3 环境要求
1、数据库管理软件:Microsoft SQL Server
2、数据库设计采取软件:Microsoft Visual Basic 6.0
3、运行平台:windows xp
2 概念设计
2.1 系统E-R图
3.逻辑设计
3.1 数据表
(1)供给商表
列名
类型
主键
有效性规则
默认值
供给商ID
长整型
主键
>0
企业名称
文本
联络人姓名
文本
电话
文本
地址
文本
邮政编码
文本
(2)仓库表
列名
类型
主键
有效性规则
默认值
供给商ID
长整型
主键
>0
产品ID
长整型
主键
>0
库存量
长整型
>=0
0
订购量
长整型
>=0
0
(3)产品表
列名
类型
主键
有效性规则
默认值
产品ID
长整型
主键
>0
产品名称
文本
单价
货币
>=0
0
单位数量
文本
(4)用户表
列名
类型
主键
有效性规则
默认值
用户ID
长整型
主键
>0
企业名称
文本
联络人姓名
文本
电话
文本
地址
文本
邮政编码
文本
(5)订单表
列名
类型
主键
有效性规则
默认值
订单ID
长整型
主键
>0
订货日期
日期/时间
货主地址
文本
发货日期
日期/时间
到货状态
文本
(6)订单明细表
列名
类型
主键
有效性规则
默认值
产品ID
长整型
主键
>0
供给商ID
长整型
主键
>0
用户ID
长整型
主键
>0
订单ID
长整型
主键
>0
数量
长整型
1
折扣
单精度型
Between 0 and 1
0
(7)运货表
列名
类型
主键
有效性规则
默认值
订单ID
长整型
主键
>0
运货商ID
长整型
主键
>0
运费
货币
>=0
0
(8)运货商表
列名
类型
主键
有效性规则
默认值
运货商ID
长整型
主键
>0
运货商名称
文本
电话
文本
(9)用户表
列名
类型
主键
有效性规则
默认值
id
自动编号
主键
>0
用户名
文本
密码
文本
3.2数据关系定义
(1)数据表关系
对数据表关系进行创建,图以下:
(商品信息表)
3.3数据关系表
参考完整性说明
对于这八个表完整性全部含有级联更新,在仓库表中供给商ID不会是级联删除,因为当仓库不存在时候,并不代表其供给商就不存在了。仓库表中产品ID也不会因为当其存量为零时候,而不会再订购其产品。在订单明细表中产品ID、用户ID、供给商ID,全部不会因为订单终止而不存在。在订单表中订单ID将会伴随交易完成而被立即删除,所以订单ID是级联删除,同理运货表中订单ID也是级联删除。运货表中运货商ID不会因为交易完成,而使其运货商不再存在。
4 系统实现
4.1用户登录模块
登录窗体在此做一个权限设置,只被在该数据库中注册用户使用。利用Access中设计视图在其工作区类,使用其对应控件进行窗体制作,窗体见下图:
图7:登录窗体界面
窗体制作好后,就是对“确定”按钮编程进行对应控制,使其能够在用户名、密码全部正确情况下,跳转到“导航”窗体界面,点击“退出系统”按钮则能够退出数据库,其代码界面以下:
“确定”按钮编码界面
4.2 视图设计
(1)昂贵产品
SQL语句以下:
SELECT 产品名称,单价,单位数量
FROM 产品
WHER 单价>=300;
作用:能够更方便查询单价大于300,比较昂贵产品。
结果见下图:
昂贵产品查询图
(2)用户订货
SQL语句以下:
SELECT 供给商.企业名称,产品.产品名称,产品.单价,用户.企业名称,订单明细.数量
FROM 供给商,产品,用户,订单明细
WHERE (供给商.供给商ID=订单明细.供给商ID) AND (产品.产品ID=订单明细.产品ID) AND (用户.用户ID=订单明细.用户ID);
作用:方便在供给商、产品、用户、订单明细之间进行多表查询,这么能够使用户了解更多信息。
结果见下图:
图4:用户订货查询图
(3)仓库更新
SQL语句以下:
UPDATE 仓库 SET 订购量 = 50
WHERE 库存量=0;
作用:当仓库某产品存量为零时候,此更新查询能够进行再订购其订购量为50,这么就能够确保仓库产品存量一直是充足。
(4)订单整理
SQL语句以下:
DELETE *, 到货状态
FROM 订单
WHERE 到货状态="已收";
作用:经过这个删除查询,立即将订单中到货状态=“已收”交易统计进行删除,从而留出更多存放空间。
(5) 产品价格降序排列
SQL语句以下:
SELECT *
FROM 产品
ORDER BY 单价 DESC;
作用:将产品表中产品单价,按降序进行排列,方便用户对产品价格进行查询。
结果见下图:
图5:产品价格降序排列查询图
(6)统计
SQL语句以下:
SELECT "订单总计:", COUNT(*), "运费累计:", SUM(运费)
FROM 订单, 运货
WHERE (订单.订单ID=运货.订单ID) AND (到货状态="未收");
作用:对订单表中订单数目,运货表中总运费进行统计,这么有利于用户立即查看订单表、运货表动态。
结果见下图:
统计查询图
(3)产品查询窗体
在该窗体中能够方便查询你所要商品单价、单位数量,此窗体制作过程是利用向导来完成,其中还包含了一个子窗体,窗体见下图:
(4)订单查询窗体
该窗体方便查找各订单中订购是什么商品,窗体见下图:
4.3 关键设计代码
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
void proincrease(); /*增加商品*/
void order(); /*输入编号订购*/
void confirmorder(); /*确定订购*/
void confirmfilesave(); /*写入文件*/
void confirmfileopen(); /*显示订购信息*/
void goonorder(); /*继续订购*/
void account(); /*结账模块*/
void loginout(); /*退出系统*/
void success(); /*订购成功*/
void select (); /*选择菜单*/
void main() /*主程序*/
{
select();
}
int Ordernum=0;
int j=0;
int Last;
float usersum=0.00;
struct product /*商品结构*/
{
int productnum; /*商品编号*/
char productname[21]; /*商品名称*/
char producttype[21]; /*商品型号*/
float productprice; /*商品价格*/
char productplace[21]; /*商品产地*/
int productstock; /*库存数量*/
int productordered; /*已订购数量*/
}pro[10];
struct userproduct /*用户结构*/
{
int usernum; /*用户订购商品编号*/
int userquantity; /*用户订购数量*/
char productname[21]; /*商品名称*/
char producttype[21]; /*商品型号*/
float productprice; /*商品价格*/
char productplace[21]; /*商品产地*/
}userpro[100];
void DispMainmenu(); /*主菜单*/
void DispMaintainmenu(); /*管理维护菜单*/
void DispMainmenu()
{
system("cls");
printf("\n\n\n\n\n\n");
printf("**************************欢迎使用商品订购系统v1.0******************************\n\n");
printf(" ┏━━━━━━━━━━━━━━━━━━━┓\n");
printf(" ┃ 1.浏览商品 ┃\n");
printf(" ┃ 2.按名称查找 ┃\n");
printf(" ┃ 3.按型号查找 ┃\n");
printf(" ┃ 4.管理维护 ┃\n");
printf(" ┃ 0.退出系统 ┃\n");
printf(" ┗━━━━━━━━━━━━━━━━━━━┛\n\n\n");
printf("********************************************************************************\n\n\n\n\n");
printf("请选择~4:");
}
void DispMaintainmenu()
{
printf("\n\n\n\n\n\n\n");
printf("******************************管理维护子菜单************************************\n\n");
printf(" ┏━━━━━━━━━━━━━━━━━━━┓\n");
printf(" ┃ 1.查看商品 ┃\n");
printf(" ┃ 2.增加商品 ┃\n");
printf(" ┃ 0.返回主菜单 ┃\n");
printf(" ┗━━━━━━━━━━━━━━━━━━━┛\n\n\n");
printf("********************************************************************************\n\n\n\n\n");
printf("请选择~4:");
}
void open(); /*管理员浏览*/
void open()
{int i;
FILE *fp;
fp=fopen("shangpin.dat","rb");
printf("\n\n\n\n\n\n\n\n编号 名称 型号 价格 产地 库存已订购\n");
for(i=0;i<10;i++)
{fread(&pro[i],sizeof(struct product),1,fp);
printf("%4d %-10s %-12s %9.2f %-5s %5d %4d\n",pro[i].productnum,pro[i].productname,pro[i].producttype,pro[i].productprice,pro[i].productplace,pro[i].productstock,pro[i].productordered);
}
fclose(fp);
printf("\n\n\n\n\n共有%d条统计!\n\n",i);
printf("按任意键继续……");
getch();
}
void namefind(); /*按名称查找*/
void namefind()
{int i,k,r=0;
char str[21],c3;
FILE *fp;
fp=fopen("shangpin.dat","rb");
system("cls");
printf("\n请输入你要查找名称:");
scanf("%s",&str);
printf("\n您所查找%s\n",str);
for(i=0;i<10;i++)
{fread(&pro[i],sizeof(struct product),1,fp);
k=strcmp(pro[i].productname,str);
if (k==0)
{printf("%4d %-10s %-12s %9.2f %-5s %5d %4d\n",pro[i].productnum,pro[i].productname,pro[i].producttype,pro[i].productprice,pro[i].productplace,pro[i].productstock,pro[i].productordered);
r=r+1;}
}
fclose(fp);
printf("\n共有%d条统计!\n",r);
if(r!=0)
{printf("进入选购请按任意键,结账请按p,取消请按ESC:");
c3=getch();
if (c3==27)
{
printf("\n");system("cls");select();
}
else if (c3=='p'||c3=='P')
account();
printf("\n");
order();
}
else
{printf("\n按任意键继续……\n");
getchar();
select();}
}
void typefind(); /*按型号查找*/
void typefind()
{int i,k,r=0;
char str[21],c3;
FILE *fp;
fp=fopen("shangpin.dat","rb");
system("cls");
printf("\n请输入你要查找型号:");
scanf("%s",&str);
printf("您查找是%s\n",str);
for(i=0;i<10;i++)
{fread(&pro[i],sizeof(struct product),1,fp);
k=strcmp(pro[i].producttype,str);
if (k==0)
{printf("%4d %-10s %-12s %9.2f %-5s %5d %4d\n",pro[i].productnum,pro[i].productname,pro[i].producttype,pro[i].productprice,pro[i].productplace,pro[i].productstock,pro[i].productordered);
r=r+1;}
}
fclose(fp);
printf("共有%d条统计!\n",r);
if(r!=0)
{printf("进入选购请按任意键,结账请按p,取消请按ESC:");
c3=getch();
if (c3==27)
{
printf("\n");system("cls");select();
}
else if (c3=='p'||c3=='P')
account();
printf("\n");
order();
}
else
printf("\n按任意键继续……\n");
getchar();
select();
}
void prosave(); /*proincrease()调用存放函数*/
void prosave()
{
FILE *fp;
int i;
if((fp=fopen("shangpin.dat","wb"))==NULL)
{printf("不能打开文件!\n");
return;
}
for(i=0;i<10;i++)
if(fwrite(&pro[i],sizeof(struct product),1,fp)!=1)
printf("写入文件错误");
fclose(fp);
}
void proopen(); /*proincrease()调用显示函数*/
void proopen()
{int i;
FILE *fp;
fp=fopen("shangpin.dat","rb");
printf("编号 名称 型号 价格 产地 库存已订购\n");
for(i=0;i<10;i++)
{fread(&pro[i],sizeof(struct product),1,fp);
printf("%4d %-10s %-12s %9.2f %-5s %5d %4d\n",pro[i].productnum,pro[i].productname,pro[i].producttype,pro[i].productprice,pro[i].productplace,pro[i].productstock,pro[i].productordered);
}
fclose(fp);
}
void proincrease() /*增加商品*/
{
int i;
char c3;
system("cls");
for (i=0;i<10;i++)
{
do
{
pro[i].productprice=0.00;
pro[i].productnum=1+i;
printf("商品编号:");
printf("%d\n",pro[i].productnum);
printf("商品名称:");
scanf("%s",pro[i].productname);
printf("商品型号:");
scanf("%s",pro[i].producttype);
printf("商品价格:");
scanf("%f",&pro[i].productprice);
printf("商品产地:");
scanf("%s",pro[i].productplace);
printf("库存数量:");
scanf("%d",&pro[i].productstock);
do
{printf("已订购数量:");
scanf("%d",&pro[i].productordered);
}
while (pro[i].productordered<0||pro[i].productordered>pro[i].productstock);
printf("保留请按任意键,取消请按N:");
printf("\n");
c3=getch();
}
while (c3=='n'||c3=='N');
}
prosave();
proopen();
printf("\n按任意键继续……\n");
getch();
select();
}
void load(); /*浏览商品进入选购*/
void load()
{
int i;
char c3;
FILE *fp;
fp=fopen("shangpin.dat","rb");
printf("\n\n\n\n\n\n\n\n\n编号 名称 型号 价格 产地 库存已订购\n");
for(i=0;i<10;i++)
{fread(&pro[i],sizeof(struct product),1,fp);
printf("%4d %-10s %-12s %9.2f %-5s %5d %4d\n",pro[i].productnum,pro[i].productname,pro[i].producttype,pro[i].productprice,pro[i].productplace,pro[i].productstock,pro[i].productordered);
}
fclose(fp);
printf("\n共有%d条统计!\n",i);
printf("\n\n\n\n\n\n");
printf("进入选购请按任意键,结账请按p,取消请按ESC:");
c3=getch();
if (c3==27)
{
printf("\n");system("cls");select();
}
else if (c3=='p'||c3=='P')
account();
printf("\n");
order();
}
void orderquantity(); /*输入订购数量*/
void orderquantity()
{
char ch4;
do
{
printf("请输入您订购数量(1~%d)(后悔请输再返回):",Last);
scanf("%d",&userpro[j].userquantity);
if (userpro[j].userquantity>0&&userpro[j].userquantity<=(pro[Ordernum].productstock-pro[Ordernum].productordered))
break;
printf("\n输入错误,按任意键重输,按ESC返回……\n");
ch4=getch();
putchar('\n');
if (ch4==27)
load(); /*返回编号订购*/
}while(1);
}
void order() /*输入编号订购*/
{int i,r=0,a;
do
{
FILE *fp;
fp=fopen("shangpin.dat","rb");
do
{printf("\n请输入您想订购商品编号:");
scanf("%d",&userpro[j].usernum);
for(i=0;i<10;i++)
{fread(&pro[i],sizeof(struct product),1,fp);
if (pro[i].productnum==userpro[j].usernum)
{printf("%4d %-10s %-12s %9.2f %-5s %5d %4d\n",pro[i].productnum,pro[i].productname,pro[i].producttype,pro[i].productprice,pro[i].productplace,pro[i].productstock,pro[i].productordered);
r=r+1;Ordernum=i;a=i;break;
}
}
}
while (r==0);
fclose(fp);
Last=pro[a].productstock-pro[a].productordered;
if (pro[a].productstock-pro[a].productordered!=0)
{orderquantity();
confirmorder();
confirmfilesave();
goonorder();
account();
break;}
else
{printf("\n!!!!!!!!!!!!!!!!!!!!!!!!!该商品已售完!系统将自动返回~~!!!!!!!!!!!!!!!!!!!!!!!!\n\n");
printf("按任意键返回……");
getch();select();break;}
}
while(1);
}
void inputaddress(); /*输入邮寄地址*/
void inputaddress()
{
char ch3;
char address[41];
do{
printf("请输入您邮寄地址:\n");
scanf("%s",address);
printf("您地址是:%s\n\n",address);
printf("确定请按任意键,重输请按ESC");
ch3=getch();
putchar('\n');
if (ch3!=27)
success();}
while(ch3==27);
}
void confirmorder() /*确定订购*/
{
char ch5;
printf("确定订购该商品吗?(Y/N)\n");
do
{ch5=getch();
if (ch5=='n'||ch5=='N')
load();
else if (ch5=='y'||ch5=='Y')
{printf("已成功添加!\n");break;}
}
while(1);
}
void confirmfilesave() /*写入文件*/
{
strcpy(userpro[j].productname,pro[Ordernum].productname);
strcpy(userpro[j].productplace,pro[Ordernum].productplace);
userpro[j].productprice=pro[Ordernum].productprice;
strcpy(userpro[j].producttype,pro[Ordernum].producttype);
usersum=usersum+userpro[j].productprice*userpro[j].userquantity;
pro[Ordernum].productordered=pro[Ordernum].productordered+userpro[j].userquantity;
{
FILE *fp;
if((fp=fopen("dinggou.dat","ab+"))==NULL)
{printf("不能打开文件!\n");
return;
}
if(fwrite(&userpro[j],sizeof(struct userproduct),1,fp)!=1)
printf("写入文件错误");
fclose(fp);
j=j+1;}
{ FILE *fp1;
int i;
if((fp1=fopen("shangpin.dat","wb"))==NULL)
{printf("不能打开文件!\n");
return;
}
for(i=0;i<10;i++)
if(fwrite(&pro[i],sizeof(struct product),1,fp1)!=1)
printf("写入文件错误");
fclose(fp1);
}
}
void confirmfileopen() /*显示订购信息*/
{int i;
FILE *fp;
fp=fopen("dinggou.dat","rb");
printf("编号 名称 型号 价格 产地 订购数量 累计\n");
for(i=0;i<j;i++)
{fread(&userpro[i],sizeof(struct userproduct),1,fp);
printf("%4d %-10s %-12s %9.2f %-5s %5d %5.2f\n",userpro[i].usernum,userpro[i].productname,userpro[i].producttype,userpro[i].productprice,userpro[i].productplace,userpro[i].userquantity,(userpro[i].productprice*userpro[i].userquantity));
}
fclose(fp);
}
void goonorder() /*继续订购*/
{char c5;
printf("继续订购吗?(Y/N)\n");
do
{c5=getch();
if (c5=='Y'||c5=='y')
{load();break;
}
else if (c5=='n'||c5=='N')
break;
}
while(1);
}
void account() /*结账模块*/
{
char c7;
printf("\n\n\n\n\n\n\n\n\n\n\n\n您好,这里是收银台\n");
printf("\n您订购清单以下:\n");
confirmfileopen();
printf("\n\n您此次订购总消费为:%7.2f\n\n",usersum);
if (usersum==0)
{printf("您没有订购任何商品,按任意键退出系统!\n");getch();loginout();}
printf("\n\n请再次确定订购,按Y继续,按N取消此次订购并退出:\n");
do{
c7=getch();
if (c7=='y'||c7=='Y')
inputaddress();
else if (c7=='n'||c7=='N')
loginout();
else
;}
while(1);
}
void loginout() /*退出系统*/
{
printf("\n\n\n\n\n\n\n\n\n\n\n\n 谢谢使用,再见!\n\n\n\n\n\n\n\n\n\n\n\n\n");
exit(0);
}
void success() /*订购成功,退出*/
{
printf("\n\n您已成功订购!谢谢使用!\n\n");
exit(0);
}
void select() /*选择菜单*/
{
loop1:
DispMainmenu();
{char ch1;
do
ch1=getch();
while (ch1<'0'||ch1>'4');
switch(ch1)
{
case'1': load();break;
case'2': namefind();break;
case'3': typefind();break;
case'4': {
DispMaintainmenu();
{char ch2;
do
ch2=getch();
while (ch2<'0'||ch2>'4');
switch(ch2)
{
case'1': ope
展开阅读全文