标题:求助!一道编程题,给定课程从键盘输入,直接回车时结束查询
只看楼主
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
程序代码:
CLEAR ALL
CLEAR

USE "学生表stu" ALIAS "stu" IN 0
USE "选课表xk" ALIAS "xk" IN 0
USE "课程表kc" ALIAS "kc" IN 0

kc_name = ""        && 用于接收用户输入的课程名字符串
ACCEPT "请输入待查询的课程名:" TO kc_name
IF !EMPTY(kc_name)
    SELECT "kc"
    LOCATE ALL FOR ALLTRIM(课程名) == ALLTRIM(kc_name)
    IF FOUND()
        Show_Information(ALLTRIM(课程号))
    ELSE
        ? "数据库中不存在所输入的课程名!"
    ENDIF
ENDIF

CLOSE TABLES ALL
CLEAR ALL
RETURN

*------------------------
* 根据课程号输出信息
*------------------------
PROCEDURE Show_Information(kc_id)
    LOCAL stu_id        && 学生的学号stu_id
    LOCAL kc_score      && 课程成绩
   
    SELECT "xk"
    GOTO TOP
    DO WHILE !EOF()
        IF ALLTRIM(课程号) == kc_id
            stu_id = ALLTRIM(学号)
            kc_score = 成绩
            SELECT "stu"
            LOCATE ALL FOR ALLTRIM(学号) == stu_id
            IF FOUND()
                ? 姓名, kc_score
            ENDIF
        ENDIF
        SELECT "xk"
        SKIP
    ENDDO
   
ENDPROC




[ 本帖最后由 TonyDeng 于 2014-7-5 11:50 编辑 ]

授人以渔,不授人以鱼。
2014-07-05 11:44
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
不要以为我代码中多处使用alltrim()函数是多余,等你修改了其中一个表的某个字段长度、但并没有同步其他相关表的同一字段时,就知道什么叫错。又或者人工输入数据表数据的时候,同一字段的某些记录并没对齐时,也一样会错(找不到应有的数据)。

授人以渔,不授人以鱼。
2014-07-05 11:53
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
数据记录不过千,locate和索引查找的效率没多大差别,而对foxpro而言,若表有索引,则locate for指令在可能的时候会自动使用索引。因此,这个程序不用刻意建立索引也是没问题的。在locate for的时候,alltrim()和==算符会导致查询变慢(即可能会禁止Rushmore),但这是逻辑需要,不要回避它,程序的正确性和健壮性比速度快有更高的优先级。


[ 本帖最后由 TonyDeng 于 2014-7-5 12:09 编辑 ]

授人以渔,不授人以鱼。
2014-07-05 12:04
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
把界面和逻辑分开,怎么通过可视化界面获得kc_name和kc_id的值是另外的问题,不要夹杂到这里的查询逻辑中,从界面中得到值后传送到这里,然后把查询到的数据传送回去给界面。这个代码已经给你示范了任何需要的数据都能获得的手段,因为它是深入到原子级别的数据项提取数据的,你想要什么就有什么,不会多余,也不会遗漏,而且资源消耗也是最少的。

授人以渔,不授人以鱼。
2014-07-05 12:17
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
回复 22 楼 TonyDeng
楼主用的VFP版本可能是6.0,你的代码经楼主运行后,可能会发生错误。
原代码一行
PROCEDURE Show_Information(kc_id)


改为两行
PROCEDURE Show_Information
LPARAMETERS kc_id

坚守VFP最后的阵地
2014-07-05 12:35
sash
Rank: 4
等 级:业余侠客
威 望:6
帖 子:63
专家分:245
注 册:2014-4-25
得分:3 
楼主啊,上课没认真听吧? 实际上这道题非常简单,关键语句只有一句,就可得到你要的结果。语句如下:
SELECT b.学号,c.姓名,b.成绩 FROM 课程表kc a INNER JOIN 选课表xk b ON a.课程号=b.课程号 INNER JOIN 学生表stu c ON b.学号=c.学号 ;
 WHERE a.课程名=ALLTRIM(thisform.text1.Value) INTO CURSOR 结果表jg
  不知道这样的语句你的老师是否教过你,你上面写的那么多的语句,绝大多数是多余的!而且要完成你的题目,没有操作界面时不行的,根据你
作业的,我给你做了个样列,你可在VFP9.0下运行。希望对你有点帮助。

三个表.zip (3.35 KB)


[ 本帖最后由 sash 于 2014-7-5 12:49 编辑 ]
2014-07-05 12:48
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
VFP6基础都弄不明白,VFP9.......



[ 本帖最后由 sdta 于 2014-7-5 12:54 编辑 ]

坚守VFP最后的阵地
2014-07-05 12:52
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
程序代码:
Clear 
kc_name = ""
accept "请输入待查询的课程名:" to kc_name
Select * From 课程表kc Where alltrim(课程名)=alltrim(kc_name) Into Cursor Temp
If Reccount("Temp")=0
    Return messagebox("课程名<"+kc_name+">不存在")
Endif 
If Not Empty(kc_name)
    select a.课程名, b.学号,c.姓名,b.成绩 from 课程表kc a Inner join 选课表xk b on a.课程号=b.课程号 ;
     Inner join 学生表stu c on b.学号=c.学号 where alltrim(a.课程名)=alltrim(kc_name) into cursor 结果表jg
    if reccount("结果表jg")=0
        messagebox("没有人选择该课程<"+kc_name+">")
    else
        browse
    Endif
Else
    messagebox("kc_name 不能为空")
Endif 

坚守VFP最后的阵地
2014-07-05 14:10
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
以下是引用talo6060在2014-7-5 11:13:09的发言:

表传上了,现在就求大神帮帮忙

我一个学农学的做VF真心搞不来

工作后能用得着VFP的,现在学习只是打基础。

坚守VFP最后的阵地
2014-07-05 14:18
talo6060
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2014-7-5
得分:0 
以下是引用sdta在2014-7-5 12:35:35的发言:

楼主用的VFP版本可能是6.0,你的代码经楼主运行后,可能会发生错误。
原代码一行


改为两行

是6.0 真的发生错误了。。。
2014-07-05 16:23



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-433729-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.364203 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved