注册 登录
编程论坛 VFP论坛

这段代码无法正常运行

王咸美 发布于 4 天前 07:10, 317 次点击
下列代码无法运行
由“课务分工.txt"表生成各班教师任课表(jsrkb.dbf),代码无法运行,请高手赐教,万分感谢!!!


程序代码(有点问题)

CLEAR ALL
CLOSE DATABASES ALL
SET SAFETY OFF
SET TALK OFF
SET CPCOMPILE TO 936  && 设置中文编码支持

* 创建临时表存储原始分工数据
CREATE CURSOR temp_data (;
    teacher_id C(3),;
    teacher_name C(20),;
    class_subj C(100);
)

* 导入课务分工.txt数据
APPEND FROM 课务分工.txt TYPE DELIMITED WITH TAB

* 创建目标表结构
CREATE TABLE jsrkb.dbf ;
(;
    N       N(3),       && 序号;
    B       C(20),      && 班级;
    班会    C(10),;
    道法    C(10),;
    品社    C(10),;
    科学    C(10),;
    语文    C(10),;
    数学    C(10),;
    英语    C(10),;
    体育    C(10),;
    音乐    C(10),;
    美术    C(10),;
    劳动    C(10),;
    信息    C(10),;
    综合    C(10),;
    语阅    C(10),;
    英阅    C(10),;
    自习1   C(10),;
    自习2   C(10);
)

* 解析数据主程序
LOCAL lcClass, lcSubject, lcTeacher
LOCAL ARRAY laClasses[1], laSubjects[18]
DIMENSION laSubjects[18]

* 定义学科映射表
laSubjects[1] = "班会"
laSubjects[2] = "道法"
laSubjects[3] = "品社"
laSubjects[4] = "科学"
laSubjects[5] = "语文"
laSubjects[6] = "数学"
laSubjects[7] = "英语"
laSubjects[8] = "体育"
laSubjects[9] = "音乐"
laSubjects[10] = "美术"
laSubjects[11] = "劳动"
laSubjects[12] = "信息"
laSubjects[13] = "综合"
laSubjects[14] = "语阅"
laSubjects[15] = "英阅"
laSubjects[16] = "自习1"
laSubjects[17] = "自习2"

* 获取所有班级列表
SELECT DISTINCT LEFT(class_subj, AT("班", class_subj)) AS classname FROM temp_data INTO ARRAY laClasses

* 主处理循环
FOR i = 1 TO ALEN(laClasses)
    lcClass = ALLTRIM(laClasses[i])
   
    * 插入新记录
    INSERT INTO jsrkb (N, B) VALUES (i, lcClass)
   
    * 处理每个学科
    FOR j = 1 TO ALEN(laSubjects)
        lcSubject = laSubjects[j]
        
        * 查找第一个匹配的教师
        SELECT TOP 1 teacher_name FROM temp_data ;
        WHERE class_subj LIKE lcClass + "%" + lcSubject + "%" ;
        INTO CURSOR cur_temp
        
        IF _TALLY > 0
            lcTeacher = cur_temp.teacher_name
            REPLACE IN jsrkb (lcSubject) WITH lcTeacher
        ENDIF
        
        USE IN cur_temp
    ENDFOR
ENDFOR

* 清理临时数据
USE IN temp_data
ERASE temp_data.dbf

* 最终整理
USE jsrkb
BROWSE TITLE "教师任课表生成结果"
RETURN

课务分工.txt(部分)
 001      曹文亮      一年级(2)班美术,四年级(3)班品社,计4节
 002      曹小虎      五年级(2)班科学,五年级(2)班数学,五年级(2)班信息,计8节
 003      曹艳      四年级(4)班科学,四年级(4)班数学,四年级(4)班体育,四年级(4)班信息,计10节
 004      陈杰      四年级(1)班英语,四年级(1)班劳动,四年级(1)班英阅,四年级(2)班英语,四年级(2)班劳动,四年级(2)班英阅,四年级(4)班英语,四年级(4)班劳动,四年级(4)班英阅,计15节
 005      陈金玉      四年级(6)班班会,四年级(6)班语文,四年级(6)班美术,四年级(6)班信息,四年级(6)班语阅,计11节
 006      陈留英      六年级(1)班语文,六年级(1)班音乐,六年级(1)班语阅,计8节
 007      陈苏艳      四年级(3)班班会,四年级(3)班英语,四年级(3)班英阅,四年级(5)班英语,四年级(5)班劳动,四年级(5)班英阅,四年级(6)班英语,四年级(6)班劳动,四年级(6)班英阅,计15节
 008      陈天明      三年级(1)班音乐,三年级(2)班音乐,三年级(6)班音乐,四年级(1)班音乐,四年级(3)班音乐,五年级(1)班音乐,五年级(2)班音乐,五年级(3)班音乐,计16节
 009      陈文生      一年级(2)班语文,一年级(2)班综合,一年级(2)班语阅,一年级(2)班自习1,计10节
 010      陈羊成      三年级(6)班体育,四年级(5)班体育,四年级(6)班体育,五年级(5)班体育,五年级(6)班体育,计15节


17 回复
#2
wengjl4 天前 15:36
* 查找第一个匹配的教师
        SELECT TOP 1 teacher_name FROM temp_data ;
        WHERE class_subj LIKE lcClass + "%" + lcSubject + "%" ;
        INTO CURSOR cur_temp
测试是这一句有错,提示:需要有 orde by 子句,可加了子句还是不行!
#3
王咸美4 天前 21:58
程序如何修改,盼指点!谢谢!
#4
schtg3 天前 06:29
可能需要查看一下数据表temp_data中是否有记录?
#5
wengjl3 天前 11:34
中间段修正不了,只好跳出来,换了另一车道,仅供参考 !

* 程序代码(有点问题)
* 生成 jsrkb.dbf 完整代码
* 作者:AI助手
* 日期:2023-10-15
* 源自:https://bbs.bc-cn.net/thread-514256-1-1.html
* 调试:于2025-4-11完成 (依理解,用会的,进行修正,成功)

    CLEAR ALL
    CLOSE DATABASES
    SET SAFETY OFF
    SET TALK OFF
    SET CPCOMPILE TO 936  && 设置中文编码支持
    LOCAL lcClass, lcSubject, lcTeacher
    LOCAL ARRAY laClasses[1], laSubjects[18]
    DIMENSION laSubjects[18]   
   
    CREATE TABLE temp(id C(5),name C(20),class_subj C(180))  &&& 创建了表
    SELECT temp
    APPEND FROM 课务分工.txt TYPE DELIMITED WITH TAB  &&& 导入课务分工.txt数据 (导入的又一个写法)   
    CREATE TABLE jsrkb_X(classname C(20),班会 C(10),道法 C(10),品社 C(10),科学 C(10),语文 C(10),数学 C(10),英语 C(10),;
           体育 C(10),音乐 C(10),美术 C(10), 劳动 C(10),信息 C(10),综合 C(10),语阅 C(10),英阅 C(10),自习1 C(10),自习2 C(10))   &&& 创建目标表结构
*!*    定义学科映射表   这一段,我一个50后的不会用,所以注释掉了 !
*!*        laSubjects[1] = "班会"
*!*        laSubjects[2] = "道法"
*!*        laSubjects[3] = "品社"
*!*        laSubjects[4] = "科学"
*!*        laSubjects[5] = "语文"
*!*        laSubjects[6] = "数学"
*!*        laSubjects[7] = "英语"
*!*        laSubjects[8] = "体育"
*!*        laSubjects[9] = "音乐"
*!*        laSubjects[10] = "美术"
*!*        laSubjects[11] = "劳动"
*!*        laSubjects[12] = "信息"
*!*        laSubjects[13] = "综合"
*!*        laSubjects[14] = "语阅"
*!*        laSubjects[15] = "英阅"
*!*        laSubjects[16] = "自习1"
*!*        laSubjects[17] = "自习2"
    * 获取所有班级列表到数组(laClasses)中
    SELECT DISTINCT LEFT(class_subj, AT("班", class_subj)+1) AS classname FROM temp INTO  ARRAY laClasses   && 提取唯一的年级班级名
    SELECT jsrkb_x
    APPEND FROM array laclasses
    CLOSE DATABASES
    * 转换处理
    SELECT 0
    USE temp alia kg
    SELECT 0
    USE jsrkb_x alia bmk
    SELECT bmk
    SCAN
      bjm=ALLTRIM(bmk.classname)
      SELECT kg
      SCAN
        rkap=ALLTRIM(kg.name)+[,]+ALLTRIM(kg.class_subj)
        lnLines = ALINES(laLines, rkap , .T. )  &&& 将表字段值赋值到数组中
        IF bjm$rkap  &&& 跳过不包含班级名的
          FOR EACH lcLine IN laLines
            lnFields = ALINES(laFields, lcLine, .F., [,])  
            jsxm=lafields(1)
            FOR k=2 to lnfields - 1
              njbjm= laFields(k)
              IF bjm$njbjm
                xkmc= STUFF(njbjm,1,len(bjm),[])       &&& 将包含的替换为空,留下的即为学科。
                zdm=[bmk.]+xkmc
                REPLACE &zdm. with jsxm
              ENDIF
            ENDFOR
          NEXT
        ENDIF
        SELECT kg
      ENDSCAN
      SELECT bmk
    ENDSCAN
    CLOSE DATABASES
    * 清理临时数据
    ERASE temp.dbf
    MESSAGEBOX("教师任课表生成结果 !",64,"提示:")
    QUIT
#6
王咸美3 天前 12:38
谢谢!非常感谢!
#7
王咸美3 天前 13:19
经验证,少 五年级(6)班教师任课情况
#8
wengjl3 天前 15:51
    * 获取所有班级列表到数组(laClasses)中
    SELECT DISTINCT LEFT(class_subj, AT("班", class_subj)+1) AS classname FROM temp INTO  ARRAY laClasses   && 提取唯一的年级班级名

是这一句生成班级时 ,少 五年级(6)班 。我也不知何故。  用我会的取出唯一的班级 需要写很长一段语句 哦!
#9
csyx3 天前 17:54
前面ds生成的代码跟垃圾差不了多少,给你段人写的代码吧
程序代码:
Local cc, ii
Local c科目, c班级, c分工, c教师
Local array a字段[1], a科目[1], aTemp[1]

Close Databases
Create cursor 任课表 (序号 I, 班级 V(20))
c科目 = '班会,道法,品社,科学,语文,数学,英语,体育,音乐,美术,劳动,信息,综合,语阅,英阅,自习1,自习2'
For ii = 1 to ALines(m.a科目, m.c科目, 1+4, ',')
    m.c科目 = m.a科目[m.ii]
    Alter table 任课表 add column &c科目 V(10)
EndFor
Index on 班级 tag 班级

Create Cursor 课务分工 (序号 V(3), 教师 V(10), 分工 V(254))
Append From 课务分工.txt DELIMITED with tab
Scan all
    m.c教师 = 教师
    m.c分工 = Strtran(分工, '', ',')
    For ii = 1 to ALines(aTemp, m.c分工, 1+4, ',')
        m.cc = aTemp[m.ii]
        If Like('??年级(*)班*', m.cc)
            m.c班级 = StrExtract(m.cc, '', '', 1, 4)
            m.c科目 = Strtran(m.cc, m.c班级, '')
            If !Seek(m.c班级, '任课表')
                Insert into 任课表 (班级) Values (m.c班级)
            EndIf
            Replace next 1 (m.c科目) with m.c教师 in 任课表
        EndIf
    EndFor
EndScan
Use in 课务分工

Update 任课表 set 序号 = Val(Chrtranc(Leftc(班级,1), '一二三四五六', '123456'))*1000 ;
                        + Val(StrExtract(班级,'',''))
Select * from 任课表 order by 序号 into dbf jsrkb
Use in 任课表
Alter table jsrkb alter column 序号 V(3)
Update jsrkb set 序号 = Padl(Recno(), 3, '0')
Locate
Browse nowait




[此贴子已经被作者于2025-4-11 18:15编辑过]

#10
王咸美3 天前 19:33
谢谢!
#11
wengjl前天 10:33
以下是引用csyx在2025-4-11 17:54:21的发言:

前面ds生成的代码跟垃圾差不了多少,给你段人写的代码吧
Local cc, ii
Local c科目, c班级, c分工, c教师
Local array a字段[1], a科目[1], aTemp[1]

Close Databases
Create cursor 任课表 (序号 I, 班级 V(20))
c科目 = '班会,道法,品社,科学,语文,数学,英语,体育,音乐,美术,劳动,信息,综合,语阅,英阅,自习1,自习2'
For ii = 1 to ALines(m.a科目, m.c科目, 1+4, ',')
    m.c科目 = m.a科目[m.ii]
    Alter table 任课表 add column &c科目 V(10)
EndFor
Index on 班级 tag 班级

Create Cursor 课务分工 (序号 V(3), 教师 V(10), 分工 V(254))
Append From 课务分工.txt DELIMITED with tab
Scan all
    m.c教师 = 教师
    m.c分工 = Strtran(分工, ',', ',')
    For ii = 1 to ALines(aTemp, m.c分工, 1+4, ',')
        m.cc = aTemp[m.ii]
        If Like('??年级(*)班*', m.cc)
            m.c班级 = StrExtract(m.cc, '', '班', 1, 4)
            m.c科目 = Strtran(m.cc, m.c班级, '')
            If !Seek(m.c班级, '任课表')
                Insert into 任课表 (班级) Values (m.c班级)
            EndIf
            Replace next 1 (m.c科目) with m.c教师 in 任课表
        EndIf
    EndFor
EndScan
Use in 课务分工

Update 任课表 set 序号 = Val(Chrtranc(Leftc(班级,1), '一二三四五六', '123456'))*1000 ;
                        + Val(StrExtract(班级,'(',')'))
Select * from 任课表 order by 序号 into dbf jsrkb
Use in 任课表
Alter table jsrkb alter column 序号 V(3)
Update jsrkb set 序号 = Padl(Recno(), 3, '0')
Locate
Browse nowait


代码很好——短小精悍,我用的是 VFP8.0 有些不能识别,改了一下就好用了,谢谢!
#12
csyx前天 12:05
ds生成的代码就不用考虑了。草草看了一下,至少存在十处以上的错误或不妥,即使你把所有的语法错误都更正并运行通过了也没用。语法上的错误通过训练应该容易改进,然而代码中存在的算法逻辑混乱就不清楚它能否自己纠正了。例如,收集所有班级的算法中,它只从每位教师第1个分管项中提取,这样一来,不在所有教师第1个分管项中的班级都会丢失 ...... 权且当它是一个超级搜索引擎吧,至少能帮人类把解题所需的原材料一股脑弄来

另:突然发现解题思路被ds带坑里了,当遇到课务分工.txt第三列超出vfp字段最大254字符限制时 append from ...  deli with tab 行不通



[此贴子已经被作者于2025-4-12 13:22编辑过]

#13
wengjl前天 13:28
是不是用数组,可以超越 254 这个宽度的限制?
#14
csyx前天 14:19
以下是引用wengjl在2025-4-12 13:28:27的发言:
是不是用数组,可以超越 254 这个宽度的限制?

超长内容存到备注字段内就好。只是备注字段就无法用 appe from ... 导入了,好在这种应用场景,数据量极小,自己解析都很快
只有本站会员才能查看附件,请 登录
随手添加了几处原始数据意外情况(参见:课务分工.txt)的处理

#15
wengjl前天 14:21
感谢您的回复!
#16
王咸美前天 16:37
如果“课务分工.txt"格式如下,代码应如何改?盼指点!
 001      曹文亮:    一(2)美术,四(3)品社,计4节
 002      曹小虎:    五(2)科学,五(2)数学,五(2)信息,计8节
 

[此贴子已经被作者于2025-4-12 20:02编辑过]

#17
wengjl昨天 08:47
If Like('??年级(*)班*', m.cc)
把这一行中的  年级 班 3个字去掉试试
#18
王咸美昨天 09:48
谢谢!
1