当前位置:主页>仓库管理软件> 列表

##################求一算法关于字符窜##

企业管理软件版1楼: 有2张表
表1 表2
字段1 字段2 字段1 字段2
001001 001050 001005 001006
001020 001050
001011 001011

表1 为票据号码从001001---001050 共50张票据
表2 为零散票据 票据号码从 001005-001006
001021-001050
001011
共33张票据
我想用2个循环 把表2的数据从表1抛除 得到表1中还没有使用的票据号
例如上例:我要得到如下表:
未用票据: 001001-001004
001007-001010
001012-001020
谢谢!

2楼: 好别扭的表. 如仓库管理免费软件

3楼: 试试这个。。。。我没测试,有1点要求:表2中票据段不能有重复的
Q1里存表1数据,Q2里存表2数据,Q2数据要先按从小到大排序

var
st,ed:integer;
i:integer;
begin
st:=q1.Fields[0].AsInteger;
ed:=q1.Fields[1].AsInteger;
q1.Delete;
for i:=0 to q2.RecordCount-1 do
begin
if q2.Fields[0].AsInteger=>st then
begin
q1.Insert;
q1.Fields[0].Value:=st;
if q2.Fields[1].AsInteger<=ed then
begin
q1.Fields[1].Value:=q2.Fields[0].Value;
st:=q2.Fields[1].AsInteger;
q1.Post;
end
else
begin
q1.Fields[1].Value:=ed;
q1.Post;
break;
end;
end;
q2.Next;
end;
end;

4楼: 把表2的數據換成''00''+cast(字段2+1 as char)﹐字段1-1插入到表1 中﹐然后用循環把
表1的字段2上移一下再刪除掉字段1=字段2的就行了。

5楼: 用个临时表存储结果表也可以,我回去试试!

6楼: select * from 表1 a,(select 字段1 as aaa from 表2 union select 字段2 from 表2)b where 字段1<>aaa and 字段2<>aaa

如没有问题请尽快结贴,因为很多人抢分!

企业管理软件版7楼: select a.* from (select 字段1 as aaa from 表2 union select 字段2 from 表1)a,(select 字段1 as aaa from 表2 union select 字段2 from 表2)b where a.aaa<>b.aaa

8楼: to 饭前饭后
你的方法厉害啊,只用sql搞定

分不是问题,明天到单位试过后就结帖

9楼: 饭兄的方法显然不能得到楼主要的答案,不可能直接通过select获得要求的结果的
要的是范围的比较的结果

比较笨但又比较有效的方法是采用游标,把表二的字段1、2 convert成整数再来进行大小的毕竟,表一是最小值和最大值,将表二按字段1、2分别映射成2个子表c、d,按字段的值排序,再分别和表一进行比较,通过加1减1来获得票据段

10楼: 只用SQL? 那怎么生成多条记录啊。。。。。我SQL不熟。。。。

11楼: to 饭前饭后,hs-kill,
我试了都不行啊!

12楼: to 萧月禾,
我对游标不熟啊,只能用循环了 如用友财务软件免费版

13楼: 我那个不行?? 有错误吗?

企业管理软件版14楼: to hs-kill
结果不对,你建个表试试你的代码,我用sql2000

15楼: 试试这个,我刚测完,身边没有SQL2000,我用MYSQL测的:

数据库:
CREATE TABLE IF NOT EXISTS t1 (
f1 varchar(255) NOT NULL DEFAULT ''0'' ,
f2 varchar(255) NOT NULL DEFAULT ''''
);

INSERT INTO t1 VALUES("001001", "001050");

//----------------------------------------------

CREATE TABLE IF NOT EXISTS t2 (
f1 varchar(255) NOT NULL DEFAULT ''0'' ,


f2 varchar(255) NOT NULL DEFAULT ''''
);

INSERT INTO t2 VALUES("001005", "001006");
INSERT INTO t2 VALUES("001021", "001050");
INSERT INTO t2 VALUES("001011", "001011");

//------------------------------
程序:
procedure TForm1.Button1Click(Sender: TObject);
function addzero(x,l:integer):string;
var
s:string;
m:integer;
begin
s:=inttostr(x);
for m:=1 to l-length(s) do
s:=''0''+s;
result:=s;
end;
var
st,ed:integer;
i,l:integer;
begin
q1.Close;
q1.SQL.Text:=''select * from t1'';
q1.Open;
q2.Close;
q2.SQL.Text:=''select * from t2 order by f1'';
q2.Open;

l:=length(q1.Fields[0].AsString);

st:=q1.Fields[0].AsInteger;
ed:=q1.Fields[1].AsInteger;
q1.Delete;
for i:=0 to q2.RecordCount-1 do
begin
if q2.Fields[0].AsInteger>st then
begin
q1.Insert;
q1.Fields[0].Value:=addzero(st,l);
if q2.Fields[1].AsInteger
begin
q1.Fields[1].Value:=addzero(q2.Fields[0].AsInteger-1,l);
st:=q2.Fields[1].AsInteger+1;
q1.Post;
end
else
begin
q1.Fields[1].Value:=addzero(q2.Fields[0].AsInteger-1,l);
q1.Post;
break;
end;
end
else
st:=q2.Fields[1].AsInteger+1;
q2.Next;
end;
end;

16楼: 怎么会有这么蹩脚的表?
建议重新建立表
表1 只有一个字段,有50条票据号的纪录
表2 只有一个字段,有33条票据号的纪录
然后操作简单明了
然后再使用
''delete from 表1 where 表1.field1=表2.field1''
然后
''Select field1 from 表1''

17楼: to hs-kill
非常感谢,但有的数据结果不对,你能再改改吗?
例如:
表一 表2
001-050 001-001
005-010
019-049

得到结果为 002-004
011-018
没有 050-050

18楼: 哦 呵呵 最后加个判断:

procedure TForm1.Button1Click(Sender: TObject);
function addzero(x,l:integer):string;
var
s:string;
m:integer;
begin
s:=inttostr(x);
for m:=1 to l-length(s) do
s:=''0''+s;
result:=s;
end;
var
st,ed:integer;
i,l:integer;
begin
q1.Close;
q1.SQL.Text:=''select * from t1'';
q1.Open;
q2.Close;
q2.SQL.Text:=''select * from t2 order by f1'';
q2.Open;

l:=length(q1.Fields[0].AsString);

st:=q1.Fields[0].AsInteger;
ed:=q1.Fields[1].AsInteger;
q1.Delete;
q2.First;
for i:=0 to q2.RecordCount-1 do
begin
if q2.Fields[0].AsInteger>st then
begin
q1.Insert;
q1.Fields[0].Value:=addzero(st,l);
if q2.Fields[1].AsInteger begin
q1.Fields[1].Value:=addzero(q2.Fields[0].AsInteger-1,l);
st:=q2.Fields[1].AsInteger+1;
q1.Post;
end
else
begin
q1.Fields[1].Value:=addzero(q2.Fields[0].AsInteger-1,l);
[red] st:=q2.Fields[1].AsInteger+1;[/red]
q1.Post;
break;
end;
end
else
st:=q2.Fields[1].AsInteger+1;
q2.Next;
end;
[red]
if st<=ed then
begin
q1.Insert;
q1.Fields[0].Value:=addzero(st,l);
q1.Fields[1].Value:=addzero(ed,l);
q1.Post;
end;[/red]
end;

19楼: to to hs-kill
太感谢了哥们,呵呵