首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > VFP >

(紧急)怎么拆分以下数据

2013-08-09 
(紧急)如何拆分以下数据,在线等要将以下数据“位号”进行拆分数据库为物资名称型号数量位号电阻A15q1,q2,q3,

(紧急)如何拆分以下数据,在线等
要将以下数据“位号”进行拆分

数据库为

物资名称  型号    数量    位号
电阻      A1        5     q1,q2,q3,q4,q5
电阻      A2        1     w1
电阻      A3        6     e1,e2,e3,e4,e5,e6

拆分后的正确数据为

物资名称  型号    数量    位号
电阻      A1        5     q1
电阻      A1        5     q2
电阻      A1        5     q3
电阻      A1        5     q4
电阻      A1        5     q5
电阻      A2        1     w1
电阻      A3        6     e1
电阻      A3        6     e2
电阻      A3        6     e3
电阻      A3        6     e4
电阻      A3        6     e5
电阻      A3        6     e6
[解决办法]
CREATE CURSOR T (物资名称 C(4),型号 C(2),数量 N(2),位号 C(2))
SELECT AB &&原表
SCAN
   FOR I=1 TO ALINES(AA,ALLTRIM(位号),[,])
       INSERT INTO T VALUES (AB.物资名称,AB.型号,AB.数量,AA[I])
   ENDFOR


ENDSCAN
SELECT T
BROWSE
[解决办法]
通常在这种应用中,被聚集的项目(比如你的位号)都有一个表用于存储相关的信息
所以可以这样写

CREATE CURSOR 位号表 ( 位号 C(2) )
INSERT INTO 位号表 VALUES ('q1')
INSERT INTO 位号表 VALUES ('q2')
INSERT INTO 位号表 VALUES ('q3')
INSERT INTO 位号表 VALUES ('q4')
INSERT INTO 位号表 VALUES ('q5')
INSERT INTO 位号表 VALUES ('q6')
INSERT INTO 位号表 VALUES ('e1')
INSERT INTO 位号表 VALUES ('e2')
INSERT INTO 位号表 VALUES ('e3')
INSERT INTO 位号表 VALUES ('e4')
INSERT INTO 位号表 VALUES ('e5')
INSERT INTO 位号表 VALUES ('e6')
INSERT INTO 位号表 VALUES ('w1')
INSERT INTO 位号表 VALUES ('w2')

CREATE CURSOR 数据表 ( 物资名称 C(10), 型号 C(10), 数量 N(2,0), 位号 C(50) )
INSERT INTO 数据表 VALUES ('电阻', 'A1', 5, 'q1,q2,q3,q4,q5')
INSERT INTO 数据表 VALUES ('电阻', 'A2', 1, 'w1')
INSERT INTO 数据表 VALUES ('电阻 ', 'A3', 6, 'e1,e2,e3,e4,e5,e6')

SELECT a.物资名称, a.型号, a.数量, b.位号 from 数据表 a, 位号表 b where find_in_set(b.位号, a.位号) > 0

FUNCTION find_in_set(v, s)
PRIVATE ALL
ALINES(a, s, ',')
RETURN ASCAN(a, v)

[解决办法]
Close Databases All
Create Cursor 原表 (物资名称 C(10),型号 C(10),数量 I,位号 C(50))
Insert Into 原表 (物资名称,型号,数量,位号) Values ('电阻','A1',5,'q1,q2,q3,q4,q5')
Insert Into 原表 (物资名称,型号,数量,位号) Values ('电阻','A2',1,'w1')
Insert Into 原表 (物资名称,型号,数量,位号) Values ('电阻','A3',6,'e1,e2,e3,e4,e5,e6')
Browse&& 原表数据'

Select * Into Table 结果表 From 原表 Where 1=0
Select 原表
Scan
lnArrayRowNum=Alines(aArray,Strtran(原表.位号,',',Chr(13)))
For lnI=1 To lnArrayRowNum
Insert Into 结果表 (物资名称,型号,数量,位号) Values (原表.物资名称,原表.型号,原表.数量,aArray(lnI))
Endfor
Endscan
Select 结果表
Browse


[解决办法]
W版的意思:
CREATE CURSOR lsb (bh n(4))
FOR I=1 TO 10
    INSERT INTO LSB VALUES (I)


ENDFOR
Create Cursor 原表 (物资名称 C(10),型号 C(10),数量 I,位号 C(50))
Insert Into 原表 (物资名称,型号,数量,位号) Values ('电阻','A1',5,'q1,q2,q3,q4,q5')
Insert Into 原表 (物资名称,型号,数量,位号) Values ('电阻','A2',1,'w1')
Insert Into 原表 (物资名称,型号,数量,位号) Values ('电阻','A3',6,'e1,e2,e3,e4,e5,e6')
*Browse        && 原表数据'
SELECT 物资名称,型号,数量,WH 位号 FROM (SELECT a.*,b.bh,STREXTRACT(','+a.位号+',',',',',',b.bh)+SPACE(33) WH FROM 原表 a inner JOIN lsb b ON LEN(ALLTRIM(a.位号))>=b.bh) A WHERE NOT EMPTY(WH)


[解决办法]
STREXTRACT(','+a.位号+',',[,],",",b.bh)
这样写你应该就明白了
红色部分:是要 搜索的字符串,前后加逗号是为了取每2个逗号之间的字符。
蓝色部分:开始分隔符
绿色部分:结束分隔符
b.bh:是从第几处取
因为 WWWWA 都用单引号表示逗号字符,所以你可能看晕了。

热点排行