注册 登录
编程论坛 VFP论坛

求助:已知某学生选修的三门科目,如何从表中找出该学生可以填报的志愿信息?

jinanshui 发布于 2021-05-10 05:42, 6379 次点击
已知学校,志愿要求表,如果已知某学生选修的三门科目,例如是物,化,生,这个学生可以填报
(1)必须科数=0(即必修科目=不限),
也可以填报
(2)必修科数=1,但是必修科目中必须至少有一科是物,化,生中的其中一科的,例如物化生,化生地,生史地,物,化,物地,化政等,这些都行.
(3)必修科数=2,但是必修科目必须是物,化,生其中两科的
(4)必修科数=3,但是必修科目必须全部是物,化,生所有三科.

已知
只有本站会员才能查看附件,请 登录
某学生选修的三门科目,例如是物,化,生,如何从表中找出该学生所有可以填报的志愿信息?
不知道,各位大侠理解我的意思吗?我的语言表达不好,请各位大侠原谅.
请各位大侠出手帮助,谢谢

[此贴子已经被作者于2021-5-10 05:55编辑过]

52 回复
#2
laowan0012021-05-10 08:42
LOCAL xfile
xfile = SYS(2015)
SELECT *,0 已选必修科数 FROM 样表 INTO CURSOR &xfile READWRITE

REPLACE ALL 已选必修科数 WITH 已选必修科数+1 FOR AT('物',必修科目)>0
REPLACE ALL 已选必修科数 WITH 已选必修科数+1 FOR AT('化',必修科目)>0
REPLACE ALL 已选必修科数 WITH 已选必修科数+1 FOR AT('生',必修科目)>0

SELECT * FROM &xfile

新增的列“已选必修科数”与“必修科数”比较
if 已选必修科数>=必修科数
    && 合格
else
    && 不合格,样表中只有第36行不合格
endif

试下看是不是你要的结果
#3
laowan0012021-05-10 08:46
第2行也不合格
#4
xuminxz2021-05-10 09:32
数据不全啊,没有学生信息。是不是少了一个表,其中最少要有考生号和成绩吧。
#5
jinanshui2021-05-10 09:39
谢谢各位老师,回复4楼xuminxz老师,不需要学生信息.
#6
jinanshui2021-05-10 09:40
我试一下
#7
jinanshui2021-05-10 09:53
回复 2楼 laowan001老师,不行,谢谢
要求是把选修物化生的学生可以填报的志愿信息全部找出来,必修科数为0即必修科目为不限的,任何人都能填报,谢谢


[此贴子已经被作者于2021-5-10 09:55编辑过]

#8
xuminxz2021-05-10 10:03
我的理解能力比较差,还是没明白你想做什么?学生可能选修的组合不知道,如何统计?
选修信息从哪来,是表单中输入(如何输入),还是数据表中得到(表的结构是什么,是放在一个字段中,还是3个字段,还是6个字段中)?

[此贴子已经被作者于2021-5-10 10:11编辑过]

#9
laowan0012021-05-10 10:11
回复 7楼 jinanshui
你所说的“可以填报的志愿信息”指的是各种排列组合的结果吗?
#10
laowan0012021-05-10 10:14
针对样表中的第2行和第36行,你希望的结果是什么?具体说明一下
#11
jinanshui2021-05-10 10:14
回复4楼xuminxz老师,
例如我选修了物化生,我想找到所有我能填报志愿,列成表,表的结构和样表一样就可以,和附件中一样的电子表格也可以.谢谢
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2021-5-10 10:20编辑过]

#12
sdta2021-05-10 10:23
针对物、化、生科目,代码如下
SELECT * FROM 样表 WHERE ALLTRIM(必修科目) == "不限" OR "物" $ 必修科目 OR "化" $ 必修科目 OR "生" $ 必修科目
#13
sdta2021-05-10 10:25
不能报考的专业
SELECT *, RECNO() 原位置 FROM 样表 WHERE NOT (ALLTRIM(必修科目) == "不限" OR "物" $ 必修科目 OR "化" $ 必修科目 OR "生" $ 必修科目)
#14
xuminxz2021-05-10 10:37
程序代码:
CLOSE TABLES all
USE 样表
ad=.t.
FOR i=1 TO FCOUNT()
    IF FIELD(i)='TJ'
        ad=.f.
        EXIT
    ENDIF
ENDFOR
IF ad
    ALTER TABLE 样表 ADD tj i
    ALTER TABLE 样表 ADD ks i
ENDIF
REPLACE ks WITH  VAL(必修科数),tj with 0 all
DELETE FOR ks>0 all
REPLACE  tj with tj+1 FOR '' $ 必修科目
REPLACE  tj with tj+1 FOR ''$ 必修科目
REPLACE  tj with tj+1 FOR ''$ 必修科目
SELECT * FROM 样表 INTO CURSOR tjjg WHERE tj>=ks
#15
sdta2021-05-10 10:44
程序代码:
LOCAL km[3]
* 如果只有两门科目,可以将某一门设置为空字符
km[1] = "物"
km[2] = "化"
km[3] = "生"
* 构造条件表达式
lcStr = 'ALLTRIM(必修科目) == "不限"'
FOR lnJ = 1 TO ALEN(km, 1)
    lcStr = lcStr + IIF(EMPTY(km[lnJ]), '', ' OR "' + km[lnJ] + '" $ 必修科目')
ENDFOR
* 符合报考条件的院校
SELECT * FROM 样表 WHERE &lcStr
* 不符合报考条件的院校
SELECT * FROM 样表 WHERE NOT (&lcStr)
#16
xuminxz2021-05-10 11:17
只有本站会员才能查看附件,请 登录

问题最好说清楚,完全可以在excel中直接操作的。
#17
jinanshui2021-05-10 11:51
谢谢各位老师,我的表述不清楚,给大家带来很多困扰,对不起.
#18
jinanshui2021-05-10 11:53
回复15楼  sdta老师,谢谢.
#19
gs25367856782021-05-10 13:27
朋友你到老车二群下载吧
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2021-5-10 13:29编辑过]

#20
gs25367856782021-05-10 13:31
提示: 该帖被管理员或版主屏蔽,只有管理员可见
#21
sdta2021-05-10 13:32
以下是引用gs2536785678在2021-5-10 13:27:39的发言:

朋友你到老车二群下载吧

这是老车教你的绝技
#22
sdta2021-05-10 13:33
以下是引用gs2536785678在2021-5-10 13:31:01的发言:

把四个表
temp1,temp2,temp3,temp4
合并起来就可以了。

这个群前段时间不是被封了?
#23
gs25367856782021-05-10 13:35
朋友你有所不知啊,如今梅子论坛不开,老车建立三大群
已经成为业界公认领军!
欢迎朋友投奔老车三大群
#24
sdta2021-05-10 13:36
回复 23楼 gs2536785678
你在老车群是二掌柜?
#25
gs25367856782021-05-10 13:38
部门经理
知道朋友是个vf9高人,所以力邀朋友加入
#26
sdta2021-05-10 13:43
以下是引用gs2536785678在2021-5-10 13:38:40的发言:

部门经理
知道朋友是个vf9高人,所以力邀朋友加入

只是初入狐门,用自己所学尽量帮助更多的人
前段时间看到一个从老车群中跑出来一个狐友,说自己的问题,在老车群中难倒不少高手,特来BCCN论坛请教,本论坛随便一个狐友就解决了这个问题。
#27
gs25367856782021-05-10 13:55
朋友说笑了,任何地方都是高手与初学并存。
#28
sdta2021-05-10 13:59
在老车群中,任何人与老车在群中发生冲突,总有一帮打手,虎视眈眈,奋起一脚就将异己踢出门外,这种群希望大家不要随便加入。
#29
gs25367856782021-05-10 14:02
提示: 该帖被管理员或版主屏蔽,只有管理员可见
#30
jinanshui2021-05-10 14:40
都是我的老师
#31
laowan0012021-05-10 15:31

LOCAL xfile,bxkm[3],ii
bxkm[1] = '物'        && bxkm数组保存已选的科目,其中元素值可以为空‘’
bxkm[2] = '政'
bxkm[3] = '地'

xfile = SYS(2015)
SELECT *,CAST(0 AS INT) 已选必修科数 FROM 样表 INTO CURSOR &xfile READWRITE

FOR ii=1 TO ALEN(bxkm)
    IF !EMPTY(bxkm[ii])
        REPLACE ALL 已选必修科数 WITH 已选必修科数+1 FOR AT(bxkm[ii],必修科目)>0
    ENDIF
ENDFOR

REPLACE ALL 已选必修科数 WITH 0 FOR 已选必修科数<VAL(必修科数)
REPLACE ALL 已选必修科数 WITH 1 FOR 已选必修科数>=VAL(必修科数)

SELECT * FROM &xfile WHERE 已选必修科数>0        && 这些就是可填报的志愿

这个意思对吗?
#32
laowan0012021-05-10 15:33
梅子论坛里,老车粗口被封,之前也是极力的广告挖人,现在又在这里拉人头了
#33
sdta2021-05-10 15:46
以下是引用laowan001在2021-5-10 15:33:54的发言:

梅子论坛里,老车粗口被封,之前也是极力的广告挖人,现在又在这里拉人头了

从朋友口中得知,老车此人是有前科之人。原来如此!
#34
zhousr2021-05-10 16:23
试试下面的吧:

Xk1="物"
Xk2="化"
Xk3="生"

SELECT * FROM 样表 WHERE .F. INTO table cx READWRITE
SCAN
    SCATTER MEMO TO bb &&将当前记录包括备注字段读入数组bb
    If ("1"$必修科数) and ("&xk1"$必修科目 or "&xk2"$必修科目or "&xk3"$必修科目)
    INSERT INTO cx FROM ARRAY bb
    ENDIF
    If ("2"$必修科数) and (("&Xk1"$必修科目and "&xk2"$必修科目) or;
     ("&xk1"$必修科目and "&xk3"$必修科目) OR ("&xk2"$必修科目and "&xk3"$必修科目))
    INSERT INTO cx FROM ARRAY bb
    ENDIF
    If ("3"$必修科数) AND ("&Xk1"$必修科目and "&xk2"$必修科目and "&xk3"$必修科目)
    INSERT INTO cx FROM ARRAY bb
    ENDIF
    IF ("0"$必修科数)
    INSERT INTO cx FROM ARRAY bb
    ENDIF
ENDSCAN
#35
jinanshui2021-05-10 16:49
谢谢各位老师,都很厉害.
#36
sdta2021-05-10 16:56
楼主的问题应该与必修科目有关系,与必修科数关系不大
#37
jinanshui2021-05-10 18:44
回复36楼,sdta老师,您好,必修科数为1时,也有很大关系.
#38
jinanshui2021-05-10 18:49
回复31楼,laowan001老师,很对,谢谢
#39
jinanshui2021-05-10 18:53
回复34楼,zhousr老师,得到的是空表.
#40
吹水佬2021-05-10 19:37
这样呢
*可填报
SELECT * FROM 样表 WHERE CHRTRANC(必修科目,"不限物化生","") != 必修科目
*不可填报
SELECT * FROM 样表 WHERE CHRTRANC(必修科目,"不限物化生","") == 必修科目
#41
jinanshui2021-05-10 21:17
回复40楼,吹水佬,老师,您就是神,太厉害了.
#42
radiofan2021-05-11 07:54
以下是引用jinanshui在2021-5-10 21:17:10的发言:

回复40楼,吹水佬,老师,您就是神,太厉害了.


没有对比就没有伤害
#43
laowan0012021-05-11 08:19
佩服!!!
#44
schtg2021-05-11 20:34
向大家学习!
#45
zhousr2021-05-12 22:22
我的代码是在我一直用的代码的基础上改造了一下,没测试。一测试,还真是空表
因为字段等不一样,可能真的会是空表,但我用了几年了,没问题,能出满意的结果
吹版的代码,我试了,真能出正确结果,但我真还没看懂。这代码牛,我再好好学习一下!
何叫大神!!!

[此贴子已经被作者于2021-5-12 22:24编辑过]

#46
jinanshui2021-06-18 08:02
以下是引用吹水佬在2021-5-10 19:37:17的发言:

这样呢
*可填报
SELECT * FROM 样表 WHERE CHRTRANC(必修科目,"不限物化生","") != 必修科目
*不可填报
SELECT * FROM 样表 WHERE CHRTRANC(必修科目,"不限物化生","") == 必修科目


吹版,您好,这个代码在试验时出现了小问题,请指导,谢谢
SELECT * FROM 样表 WHERE CHRTRANC(必修科目,"不限物生地","") != 必修科目
这个临床医学和口腔医学不应该出现,因为它要求必修科目为“物化”两个都要必修,科目数为2就是两个都要必修,
可能我当时的描述不清楚,对不起抱歉,请老师指导
只有本站会员才能查看附件,请 登录
#47
wengjl2021-06-18 15:31
xx1=[物]
xx2=[化]
xx3=[生]
SELECT * from 样表 WHERE '0'$必修科数 OR (xx1$必修科目 AND xx2$必修科目 AND xx3$必修科目 AND '3'$必修科数) OR ('2'$必修科数 AND ((xx1$必修科目 and xx2$必修科目) OR  (xx3$必修科目 and xx2$必修科目) OR (xx1$必修科目 and xx3$必修科目))) OR ('1'$必修科数 AND xx1$必修科目) OR  ('1'$必修科数 AND xx2$必修科目)  OR  ('1'$必修科数 AND xx3$必修科目) into table 可填报志愿的清单


84条数据中可提取到82条,对不对?

[此贴子已经被作者于2021-6-18 15:52编辑过]

#48
wengjl2021-06-18 15:38
供测试的数据太少
#49
jinanshui2021-06-19 00:56
以下是引用wengjl在2021-6-18 15:31:45的发言:

xx1=[物]
xx2=[化]
xx3=[生]
SELECT * from 样表 WHERE '0'$必修科数 OR (xx1$必修科目 AND xx2$必修科目 AND xx3$必修科目 AND '3'$必修科数) OR ('2'$必修科数 AND ((xx1$必修科目 and xx2$必修科目) OR  (xx3$必修科目 and xx2$必修科目) OR (xx1$必修科目 and xx3$必修科目))) OR ('1'$必修科数 AND xx1$必修科目) OR  ('1'$必修科数 AND xx2$必修科目)  OR  ('1'$必修科数 AND xx3$必修科目) into table 可填报志愿的清单


84条数据中可提取到82条,对不对?


对的,谢谢老师
#50
吹水佬2021-06-20 16:44
回复 46楼 jinanshui
是有点问题,这样呢
*可填报
SELECT 必修科数,必修科目 FROM 样表 WHERE (LENC(CHRTRANC(必修科目,", ",""))-LENC(CHRTRANC(必修科目,", 物生地","")))>=VAL(必修科数)
*不可填报
SELECT 必修科数,必修科目 FROM 样表 WHERE !(LENC(CHRTRANC(必修科目,", ",""))-LENC(CHRTRANC(必修科目,", 物生地","")))>=VAL(必修科数)
#51
jinanshui2021-06-22 04:05
以下是引用吹水佬在2021-6-20 16:44:45的发言:

是有点问题,这样呢
*可填报
SELECT 必修科数,必修科目 FROM 样表 WHERE (LENC(CHRTRANC(必修科目,", ",""))-LENC(CHRTRANC(必修科目,", 物生地","")))>=VAL(必修科数)
*不可填报
SELECT 必修科数,必修科目 FROM 样表 WHERE !(LENC(CHRTRANC(必修科目,", ",""))-LENC(CHRTRANC(必修科目,", 物生地","")))>=VAL(必修科数)

谢谢,老师.
12