注册 登录
编程论坛 新人交流区

[求助]有关动态sql语句写法,紧急求助

jsxwr 发布于 2007-10-22 16:59, 1627 次点击

我是个pb的新手,很多东西只是皮毛,为了锻炼一下,决定为局里写个教职工信息管理系统,现在遇到了棘手问题,请高手紧急赐招,先谢了——

我有a,b两张表,一个教职工信息,一个是教职工信息修改,两张结构相同,比如:

序号 数值型
姓名 字符型
性别 字符型
出生年月 字符型
工作时间 日期时间型
学历 字符型

现在我在数据窗口中对该表信息进行修改,对教职工的修改同时更新a表,b表是为上报的信息做准备的,仅仅保存对原表修改后的记录,没有修改的字段不记录。

对数据窗口更新的代码很简单,但对修改部分记录到b表的代码该如何写?由于修改的列不确定,是否一定要使用动态的sql语句才可以完成?该怎么写,在线急等!!!

[此贴子已经被作者于2007-10-22 17:48:11编辑过]

17 回复
#2
jsxwr2007-10-22 17:38
只有本站会员才能查看附件,请 登录

这是用来修改数据的dw_2
#3
jsxwr2007-10-22 19:28

在保存按钮的clicked事件中,本人先用

s_xb=dw_2.getitemstring(1,"性别")
if s_xb="" or isnull(s_xb) then
messagebox("提示","请为该职工选择性别!")
dw_2.setcolumn("性别")
dw_2.setfocus()
return
end if
s_xm=dw_2.getitemstring(1,"姓名")
if s_xm="" or isnull(s_xm) then
messagebox("提示","请为该职工输入姓名!")
dw_2.setcolumn("姓名")
dw_2.setfocus()
return
end if
…………

对数据窗口中的信息进行检查,并将相应内容保存到 s_xm,s_xb……等变量中

由于新建中不存在修改内容判定,所以相对轻松,用dw_2.update后提交信息就可以,然后通过

insert into 教职工信息新增 select * from 教职工信息 where 序号=:i_xh ;

将新增信息放到“教职工信息新增”表中以便上报即可,暂不作讨论。主要问题是对已有记录修改问题——

[此贴子已经被作者于2007-10-22 19:29:28编辑过]

#4
jsxwr2007-10-22 19:42

下面是关键部分,想对修改记录进行保存了,可能也是问题开始的时候——

string s_sql1,s_sql2,s_sql_up
s_sql1 = "序号"
s_sql2 =":i_xh"
s_sql_up="序号=:i_xh"


由于有部分教职工存在重复修改现象,所以用s_sql1和s_sql2 来为新增加insert修改记录准备相关字段及值,s_sql_up 为重复修改准备更新项目

if dw_2.getitemstring(1,"姓名",Primary!,True)<>dw_2.getitemstring(1,"姓名",Primary!,false) then
s_sql1 = s_sql1 +",姓名"
s_sql2 = s_sql2 +",:s_xm"
s_sql_up =s_sql_up + ",姓名=:s_xm"
end if
if dw_2.getitemstring(1,"性别",Primary!,True)<>dw_2.getitemstring(1,"性别",Primary!,false) then
s_sql1 = s_sql1 +",性别"
s_sql2 = s_sql2 +",:s_xb"
s_sql_up =s_sql_up + "性别=:s_xb"
end if
…………

通过上述处理,将被修改的相应字段名及值 存入字符串变量中,以便组成sql语句——

[此贴子已经被作者于2007-10-22 19:44:10编辑过]

#5
leejun2007-10-22 19:43
好久没研究这个了。。。
#6
jsxwr2007-10-22 20:03

检测当前教职工在修改记录(b表)中是否存在,存在则更新,否则新增

select count(*) into :i_cur_s from 教职工信息修改 where 序号=:i_xh ;
string s_sql_sql
if i_cur_s = 0 then
s_sql_sql= "insert into 教职工信息修改 (" + s_sql1 + ") values (" + s_sql2 +")"
else
s_sql_sql=" update 教职工信息修改 set " + s_sql_up +" where 序号= :i_xh"
end if


如果单纯从格式上看,s_sql_sql中储存的是标准sql语句,形如:

insert into 教职工信息修改 ( 序号,姓名,性别 ) values ( :i_xh,:s_xm,:s_xb )

update 教职工信息修改 set 序号=:i_xh,姓名=:s_xm,性别=:s_xb where 序号= :i_xh

可能最主要的问题也出在这里,组合成的sql语句,不符合相关语法要求,所以通过下面的

execute immediate :s_sql_sql;

来运行时,就出错了!提示信息如下:

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

现在我也只能写到这儿了,下面只能请高手赐招了,到底如何组合这个语句才合法?

#7
jsxwr2007-10-22 21:26
急盼有人早日回贴呀!!
#8
Kendy1234562007-10-23 09:59

错误是数据库访问出错 看起来似乎数据库连接语句不正确
你访问ACCESS的数据库连接字符串是什么?

#9
jsxwr2007-10-23 11:38
回复:(Kendy123456)错误是数据库访问出错 看起来似...

可能最主要的问题也出在这里,组合成的sql语句,不符合相关语法要求:

execute immediate :s_sql_sql;

s_sql_sql 是字符串变量,其值为

insert into 教职工信息修改 ( 序号,姓名,性别 ) values ( :i_xh,:s_xm,:s_xb )
或者
update 教职工信息修改 set 序号=:i_xh,姓名=:s_xm,性别=:s_xb where 序号= :i_xh

//其中字段表和变量表都是由其它字符串变量提供的,具体项目和值不固定,取决于实际被修改情况。

可能是组成sql语句时,其中的变量没有传递过来,导致执行时参数不足,出现错误

[fly]到底如何解决,我一直没有弄清楚,请高手支招![/fly]

#10
比蜗牛快些2007-10-23 20:01
pb不懂,你用其它的我可能还能帮忙,不好意思。
#11
nuciewth2007-10-24 13:10
SQL已经忘的差不多啦.
简单的查询还会点.
#12
e4lich2007-10-24 20:56
序号 数值型
姓名 字符型
性别 字符型
出生年月 字符型
工作时间 日期时间型
学历 字符型
你这里的所有的值都insert进去了吗?还有你两张表的数据类型有没不同啊??
#13
jsxwr2007-10-24 23:18
回复:(e4lich)序号 数值型姓名 字符型性别 ...
A表中这些字段已经有明确的值了,修改时通过数据窗口直接提交就可以了,关键B表与A表完全同构,需要将修改的情况记录下来,但序号作为唯一的ID是必须写入B表的,两表中的字段也只有三种类型,数值、字符和datetime
#14
e4lich2007-10-25 20:24
用setitem和getitemstring还有getitemdecimal吧,具体的已经发到你的邮箱了,参考下吧!
#15
jsxwr2007-10-25 22:06
谢谢,我相信可以搞定这个问题了,多一个不可见的数据窗口,是个好主意。
想想还是PB的功能强大,支持一下。
#16
sky_yang_sky2007-10-30 12:02

你序號在數據庫中為數據型,在中間你把它轉化為字符串了,所以在插入的時候還是要轉化為數據型的呀

#17
popypopy2007-10-30 13:26

没用过PB,只用过sqlserver20000

#18
lijianyan2007-11-18 16:07
没用过BP SQL2000也不是很熟  所以帮不上楼主的忙
1