注册 登录
编程论坛 VFP论坛

求助:每10个字段值用单引号隔开后连接为一组

chychychy 发布于 2023-07-11 08:23, 1203 次点击
有dbf数据(图1),其中有ksh字段(ksh1字段为了看方便是后加的),想ksh字段用英文引号隔开每10个一组连接,效果如图2(只是效果,因为不会目前和dbf表实际数据不一致)
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录



[此贴子已经被作者于2023-7-11 08:35编辑过]

14 回复
#2
pnyjq2023-07-11 09:20
* 水平有限,代码质量一般,仅供参考
程序代码:
Create Cursor zl(序号 C(10), 考号 C(200))

Local lcKh, lcId, n
lcKh = ""
lcId = ""
n = 0
Select sy
Scan
    n = n + 1
    If n = 1
        lcId = Alltrim(sy.xh)
        lcKh = Transform(sy.Ksh)
    Else
        lcKh = lcKh + ";" + Transform(sy.Ksh)
        
        * 满十行插入一行到新表
        If n = 10
            n = 0    && 计数器归零
            lcId = lcId + " - " + Alltrim(sy.xh)
            Insert Into zl(序号, 考号) values(lcId, lcKh)
        EndIf
    EndIf
EndScan

* 收集最后漏掉的零头
If n > 0
    Go bottom &&这里要回到表的末尾,不然xh的值为空的,而不是最后一个
    lcId = lcId + " - " + Alltrim(sy.xh)
    Insert Into zl(序号, 考号) values(lcId, lcKh)
EndIf

Select zl
Browse

只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2023-7-11 09:24编辑过]

#3
laowan0012023-07-11 09:24
程序代码:

CLOSE DATABASES

LOCAL xii,xstr,xxh
SELECT CAST(0 AS int) 序号,SPACE(8) 序号1,SPACE(200) 连接后 FROM sy WHERE 1=2 INTO CURSOR syout READWRITE

xii = 0
xxh = ''
xstr = ''
SELECT sy
SCAN
    IF EMPTY(xxh)
        xxh = alltrim(xh)+'-'
    ENDIF

    xii = xii + 1
    xstr = xstr + ';' + alltrim(ksh)
    IF xii=10 OR RECNO()=RECCOUNT()
        xxh = xxh + alltrim(xh)
        INSERT INTO syout (序号1,连接后) VALUES (xxh,SUBSTR(xstr,2))
        xii = 0
        xstr = ''
        xxh = ''
    ENDIF
ENDSCAN
SELECT syout
REPLACE ALL 序号 WITH RECNO()

SELECT * FROM syout


如果按楼主图示,连接后字段内容最后有分号的话,是下面这段程序
程序代码:

CLOSE DATABASES

LOCAL xii,xstr,xxh
SELECT CAST(0 AS int) 序号,SPACE(8) 序号1,SPACE(200) 连接后 FROM sy WHERE 1=2 INTO CURSOR syout READWRITE

SELECT sy
GO TOP
xii = 0
xxh = ''
xstr = ''
SELECT sy
SCAN
    IF EMPTY(xxh)
        xxh = alltrim(xh)+'-'
    ENDIF

    xii = xii + 1
    xstr = xstr + alltrim(ksh) + ';'
    IF xii=10 OR RECNO()=RECCOUNT()
        xxh = xxh + alltrim(xh)
        INSERT INTO syout (序号1,连接后) VALUES (xxh,xstr)
        xii = 0
        xstr = ''
        xxh = ''
    ENDIF
ENDSCAN
SELECT syout
REPLACE ALL 序号 WITH RECNO()

SELECT * FROM syout


[此贴子已经被作者于2023-7-11 09:37编辑过]

#4
pnyjq2023-07-11 09:33
IF xii=10 OR RECNO()=RECCOUNT()
版主这一行代码高呀
#5
pnyjq2023-07-11 09:34

* 收集最后漏掉的零头
If n > 0
    Go bottom &&这里要回到表的末尾,不然xh的值为空的,而不是最后一个
    lcId = lcId + " - " + Alltrim(sy.xh)
    Insert Into zl(序号, 考号) values(lcId, lcKh)
EndIf

直接省掉了我后面的一这段
#6
sdta2023-07-11 09:39
; 这是英文引号?
#7
sdta2023-07-11 10:14
程序代码:
CLOSE DATABASES
CREATE CURSOR test (xh c(4), xh1 c(10), ksh c(150))
USE sy IN 0
STORE 0 TO ln1, ln2
ln2 = ln1 + 1
lc = SPACE(0)
SELECT sy
SCAN
    lc = lc + "'" + ksh && 单引号分隔字段值
    ln1 = ln1 + 1
    IF MOD(ln1, 10) = 0 OR RECNO() = RECCOUNT()
        INSERT INTO test VALUES (PADL(CEILING(ln1/10), 4,
'0'), PADL(ln2, 4, '0') + '-' + PADL(RECNO("sy"), 4, '0'), SUBSTR(lc, 2))
        lc = SPACE(0)
        ln2 = ln1 + 1
    ENDIF     
ENDSCAN
SELECT test
BROWSE
#8
sdta2023-07-11 10:37
只有本站会员才能查看附件,请 登录
#9
chychychy2023-07-11 11:16
回复 6楼 sdta
不好意思,,说错了,需要用英文分号隔开
#10
chychychy2023-07-11 11:24
回复 3楼 laowan001
谢谢,学习了
#11
chychychy2023-07-11 11:25
回复 2楼 pnyjq
谢谢,学习了
#12
chychychy2023-07-11 11:26
回复 7楼 sdta
谢谢,代码更精简,学习了
#13
sdta2023-07-11 11:42
以下是引用chychychy在2023-7-11 11:16:49的发言:

不好意思,,说错了,需要用英文分号隔开

那就把单引号改为分号吧
#14
schtg2023-07-11 11:45
学习啦,谢谢!
#15
chychychy2023-07-11 15:15
回复 13楼 sdta
测试,全部成功,虽然还没全明白,先拿来主义,慢慢消化一下。
1