1. sql存儲過程:USE [MES] GO /****** Object: StoredProcedure [dbo].[GetNXJL] Script Date: 09/27/2010 13:53:20 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[GetNXJL] @bh varchar(10), @yf int=0 AS BEGIN SET NOCOUNT ON; if @yf=0 begin select *,convert(varchar(10),DATEADD(YEAR,1,kxyf)-1,111)as jssj,b.kxts-b.yxts as syts from( select a.*, cast((case a.Account_Id when a.Account_Id then(select isnull(SUM(CAST(REPLACE(REPLACE(SUBSTRING(CONVERT(nvarchar(20),isnull(qjsj,'00:00'),120),12,5),':3','.5'),':','.') AS numeric(18, 2))),0) from RES_KQQJ where Account_Id=a.Account_Id and qjrq>=a.kxyf and (qjlb='探親假' OR qjlb='年休假'))end)/8.0 as numeric(18,2)) as yxts from( select account_id,full_name,CONVERT(varchar(4),getdate(),111)+SUBSTRING(convert(varchar(10),jcrq,111),5,6)as kxyf,cast(dbo.Get_NXTS_JCRQ(@bh,jcrq,dateadd(day,1,CONVERT(varchar(4),year(getdate()))+substring(CONVERT(varchar(10),jcrq,111),5,6))) as numeric(18,2))as kxts from Res_User_Temp where Account_Id=@bh)a)b end else begin if @yf=-1 begin select b.*,b.kxts-b.yxts as syts from( select a.*, cast((case a.Account_Id when a.Account_Id then(select isnull(SUM(CAST(REPLACE(REPLACE(SUBSTRING(CONVERT(nvarchar(20),isnull(qjsj,'00:00'),120),12,5),':3','.5'),':','.') AS numeric(18, 2))),0) from RES_KQQJ where Account_Id=a.Account_Id and (qjrq between a.kxyf and a.jssj) and (qjlb='探親假' OR qjlb='年休假'))end)/8.0 as numeric(18,2)) as yxts from ( select account_id,full_name, convert(varchar(10),DATEADD(YEAR,1,CONVERT(varchar(4),year(getdate())-1,111)+SUBSTRING(convert(varchar(10),jcrq,111),5,6))-1,111)as jssj, CONVERT(varchar(4),year(getdate())-1,111)+SUBSTRING(convert(varchar(10),jcrq,111),5,6)as kxyf, cast(dbo.Get_NXTS_JCRQ(@bh,jcrq,dateadd(day,1,CONVERT(varchar(4),year(getdate())-1)+substring(CONVERT(varchar(10),jcrq,111),5,6))) as numeric(18,2))as kxts from Res_User_Temp where Account_Id=@bh )a )b end else begin select b.*,b.kxts-b.yxts as syts from( select a.*, cast((case a.Account_Id when a.Account_Id then(select isnull(SUM(CAST(REPLACE(REPLACE(SUBSTRING(CONVERT(nvarchar(20),isnull(qjsj,'00:00'),120),12,5),':3','.5'),':','.') AS numeric(18, 2))),0) from RES_KQQJ where Account_Id=a.Account_Id and (qjrq between a.kxyf and a.jssj) and (qjlb='探親假' OR qjlb='年休假'))end)/8.0 as numeric(18,2)) as yxts from ( select account_id,full_name, convert(varchar(10),DATEADD(YEAR,1,CONVERT(varchar(4),year(getdate())-2,111)+SUBSTRING(convert(varchar(10),jcrq,111),5,6))-2,111)as jssj, CONVERT(varchar(4),year(getdate())-2,111)+SUBSTRING(convert(varchar(10),jcrq,111),5,6)as kxyf, cast(dbo.Get_NXTS_JCRQ(@bh,jcrq,dateadd(day,1,CONVERT(varchar(4),year(getdate())-2)+substring(CONVERT(varchar(10),jcrq,111),5,6))) as numeric(18,2))as kxts from Res_User_Temp where Account_Id=@bh )a )b end end END GO2. 執行: exec GetNXJL '12475',0 /* account_id full_name kxyf kxts yxts jssj syts ----------- -------------------------------------------------- -------------- --------------------------------------- --------------------------------------- ---------- --------------------------------------- 32524 陸蘭勤 2010/05/05 5.00 0.00 2011/05/04 5.00*/3. 再用ado組件循環將上面的帶參數的存儲過程(for...to...do while...not...do)寫入textbox...類似以下:procedure TRes_HrCq_HBD_F.GetDistinctHBCB; begin cx_hbcb.Properties.Items.Clear; cx_hbcb.Text:=''; qry_BaseTemp.Close; qry_BaseTemp.SQL.Clear; qry_BaseTemp.SQL.Add( ' select CB from Res_User_Temp where CB is not null group by CB ' ); qry_BaseTemp.Open; while not qry_BaseTemp.Eof do begin cx_hbcb.Properties.Items.Add(Trim(qry_BaseTemp.fieldbyname('CB').AsString)); qry_BaseTemp.Next; end; end;
这。你用的是SQL SERVER? parameter '@abc' not found 就是存储过程里没这个参数。
你不是有一个存储过程吗?你看那存储过程是怎么写的。 比如create or replace procedure 存储过程名(param1 in type,param2 out type) 这不有两个参数吗,分别为param1,param2 一个是in,一个是out 你就一个一个对着这个参数名字来就是了。
我从网上找了一个. function Replace(var s:string;const SourceChar:pchar;const RChar:pchar) //第一个参数是原串,第二个是模式串,第三个是替换串 var ta,i,j:integer; m,n,pn,sn:integer; SLen,SCLen,RCLen:integer;//SLen表示原串的长度,SCLen表示模式传的长度,RCLen表示替换串的长度 IsSame:integer; newp:array of char;//用来保存替换后的字符数组 begin SLen:=strlen(pchar(s));SCLen:=strlen(SourceChar);RCLen:=strlen(RChar); j:=pos(string(SourceChar),s); s:=s+chr(0);ta:=0;i:=j; while s[i]<>chr(0) do //这个循环用ta统计模式串在原串中出现的次数 begin n:=0;IsSame:=1; for m:=i to i+SCLen-1 do begin if m>SLen then begin IsSame:=0;break; end; if s[m]<>sourceChar[n] then begin IsSame:=0;break; end; n:=n+1; end; if IsSame=1 then begin ta:=ta+1;i:=m; end else i:=i+1; end; if j>0 then begin pn:=0;sn:=1; setlength(newp,SLen-ta*SCLen+ta*RCLen+1);//分配newp的长度,+1表示后面还有一个#0结束符 while s[sn]<>chr(0) do //主要循环,开始替换 begin n:=0;IsSame:=1; for m:=sn to sn+SCLen-1 do //比较子串是否和模式串相同 begin if m>SLen then begin IsSame:=0;break; end; if s[m]<>sourceChar[n] then begin IsSame:=0;break; end; n:=n+1; end; if IsSame=1 then//相同 begin for m:=0 to RCLen-1 do begin newp[pn]:=RChar[m];pn:=pn+1; end; sn:=sn+SCLen; end else begin //不同 newp[pn]:=s[sn]; pn:=pn+1;sn:=sn+1; end; end; newp[pn]:=#0; s:=string(newp); //重置s,替换完成! end; end; 这个函数怎么用? 我把参数直接传递进去以后.到了最后这一句.s:=string(newp);跟踪发现.newp的值是正确的,但赋给s以后,s是空值. -- 如果s不为空,调用函数里面的值是改变了还是没改变? 还是要弄个str1=Replace(str1,str2,str3),这样?那么是不是需要定义replace为string类型?
默认参数是传值, 不会被改变} function MyF1(x: Integer): Integer; begin Inc(x); Result := x; end; {var参数是传址, 会被改变} function MyF2(var x: Integer): Integer; begin Inc(x); Result := x; end;
ADOQuery1.Parameters.ParamByName()
创建方法和连接都很简单。
StorPro:=TADOStoredProc.Create(nil);
然后定义存储过程的名字和输入参数:
StorPro.ProcedureName:=ProName;
StorPro.Parameters.clear;
StorPro.Close;
StorPro.Parameters.CreateParameter('as_gh', ftString, pdInput , 10, NULL);
StorPro.Parameters.CreateParameter('as_in', ftString, pdInput , 100, NULL);
StorPro.Parameters.CreateParameter('as_out', ftString, pdOutput , 255, NULL);
大家可能看到函数CreateParameter中的第3个参数,pdInput 就是用来定义此参数是输入参数函数输出参数。具体的参数函数是:存储过程参数名称、类型、输入输出参数类型、长度还有就是最后一个参数Delphi帮助中说是Value: OleVariant,不过我没有用过。一般我赋值为NULL。
上面的过程是定义这个存储过程的参数。在调用的时候自然需要给参数赋值。
赋值过程为(其中WorkID和DataID是事先定义好的两个变量):
StorPro.Parameters[0].value :=WorkID;
StorPro.Parameters[1].value :=DataID;
赋值完成后运行此存储过程:
StorPro.prepared:=true;
StorPro.ExecProc;
好了存储过程调用以后,我们希望得到这次存储过程返回的参数'as_out'的值。
fxh7622:=StorPro.Parameters.parambyname('as_out').Value;
这个时候存储过程返回的值就保存在了fxh7622里面。
其实获得存储过程的返回值比较简单,希望对大家有帮助。
GO
/****** Object: StoredProcedure [dbo].[GetNXJL] Script Date: 09/27/2010 13:53:20 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[GetNXJL]
@bh varchar(10),
@yf int=0
AS
BEGIN
SET NOCOUNT ON;
if @yf=0
begin
select *,convert(varchar(10),DATEADD(YEAR,1,kxyf)-1,111)as jssj,b.kxts-b.yxts as syts from(
select a.*,
cast((case a.Account_Id when a.Account_Id then(select isnull(SUM(CAST(REPLACE(REPLACE(SUBSTRING(CONVERT(nvarchar(20),isnull(qjsj,'00:00'),120),12,5),':3','.5'),':','.') AS numeric(18, 2))),0) from RES_KQQJ where Account_Id=a.Account_Id and qjrq>=a.kxyf and (qjlb='探親假' OR qjlb='年休假'))end)/8.0 as numeric(18,2)) as yxts
from(
select account_id,full_name,CONVERT(varchar(4),getdate(),111)+SUBSTRING(convert(varchar(10),jcrq,111),5,6)as kxyf,cast(dbo.Get_NXTS_JCRQ(@bh,jcrq,dateadd(day,1,CONVERT(varchar(4),year(getdate()))+substring(CONVERT(varchar(10),jcrq,111),5,6))) as numeric(18,2))as kxts
from Res_User_Temp where Account_Id=@bh)a)b
end else
begin
if @yf=-1
begin
select b.*,b.kxts-b.yxts as syts from(
select a.*,
cast((case a.Account_Id when a.Account_Id then(select isnull(SUM(CAST(REPLACE(REPLACE(SUBSTRING(CONVERT(nvarchar(20),isnull(qjsj,'00:00'),120),12,5),':3','.5'),':','.') AS numeric(18, 2))),0) from RES_KQQJ where Account_Id=a.Account_Id and (qjrq between a.kxyf and a.jssj) and (qjlb='探親假' OR qjlb='年休假'))end)/8.0 as numeric(18,2)) as yxts
from
(
select account_id,full_name,
convert(varchar(10),DATEADD(YEAR,1,CONVERT(varchar(4),year(getdate())-1,111)+SUBSTRING(convert(varchar(10),jcrq,111),5,6))-1,111)as jssj,
CONVERT(varchar(4),year(getdate())-1,111)+SUBSTRING(convert(varchar(10),jcrq,111),5,6)as kxyf,
cast(dbo.Get_NXTS_JCRQ(@bh,jcrq,dateadd(day,1,CONVERT(varchar(4),year(getdate())-1)+substring(CONVERT(varchar(10),jcrq,111),5,6))) as numeric(18,2))as kxts from Res_User_Temp where Account_Id=@bh
)a
)b
end
else
begin
select b.*,b.kxts-b.yxts as syts from(
select a.*,
cast((case a.Account_Id when a.Account_Id then(select isnull(SUM(CAST(REPLACE(REPLACE(SUBSTRING(CONVERT(nvarchar(20),isnull(qjsj,'00:00'),120),12,5),':3','.5'),':','.') AS numeric(18, 2))),0) from RES_KQQJ where Account_Id=a.Account_Id and (qjrq between a.kxyf and a.jssj) and (qjlb='探親假' OR qjlb='年休假'))end)/8.0 as numeric(18,2)) as yxts
from
(
select account_id,full_name,
convert(varchar(10),DATEADD(YEAR,1,CONVERT(varchar(4),year(getdate())-2,111)+SUBSTRING(convert(varchar(10),jcrq,111),5,6))-2,111)as jssj,
CONVERT(varchar(4),year(getdate())-2,111)+SUBSTRING(convert(varchar(10),jcrq,111),5,6)as kxyf,
cast(dbo.Get_NXTS_JCRQ(@bh,jcrq,dateadd(day,1,CONVERT(varchar(4),year(getdate())-2)+substring(CONVERT(varchar(10),jcrq,111),5,6))) as numeric(18,2))as kxts from Res_User_Temp where Account_Id=@bh
)a
)b
end
end
END
GO2. 執行:
exec GetNXJL '12475',0 /*
account_id full_name kxyf kxts yxts jssj syts
----------- -------------------------------------------------- -------------- --------------------------------------- --------------------------------------- ---------- ---------------------------------------
32524 陸蘭勤 2010/05/05 5.00 0.00 2011/05/04 5.00*/3. 再用ado組件循環將上面的帶參數的存儲過程(for...to...do while...not...do)寫入textbox...類似以下:procedure TRes_HrCq_HBD_F.GetDistinctHBCB;
begin
cx_hbcb.Properties.Items.Clear;
cx_hbcb.Text:='';
qry_BaseTemp.Close;
qry_BaseTemp.SQL.Clear;
qry_BaseTemp.SQL.Add( ' select CB from Res_User_Temp where CB is not null group by CB ' );
qry_BaseTemp.Open;
while not qry_BaseTemp.Eof do
begin
cx_hbcb.Properties.Items.Add(Trim(qry_BaseTemp.fieldbyname('CB').AsString));
qry_BaseTemp.Next;
end;
end;
连接断开
parameter '@nomber' not found
这个是什么意思?
exec [test]..sp_procedure_params_rowset N'getinfo', 1, NULL, NULL
parameter '@abc' not found 就是存储过程里没这个参数。
比如create or replace procedure 存储过程名(param1 in type,param2 out type)
这不有两个参数吗,分别为param1,param2 一个是in,一个是out
你就一个一个对着这个参数名字来就是了。
ADOStoredProc1.Close;
ADOStoredProc1.ProcedureName:= 'P_Add;1 ';//主意此句
ADOStoredProc1.Parameters.Refresh;
ADOStoredProc1.Parameters[1].value:=edit1.Text;
ADOStoredProc1.Parameters[2].value:=edit2.Text;
ADOStoredProc1.Parameters[3].value:=edit3.Text;
ADOStoredProc1.Prepared;
sp1.ExecProc;
exec GetNXJL @bh=32524,@yf=0delphi:
qry_BaseTemp.Close;
qry_BaseTemp.SQL.Clear;
qry_BaseTemp.SQL.Add(' exec SP_HR_DAY_AUDIT @bh=12475,@yf=0 ');//根據自己的需要修改
qry_BaseTemp.ExecSQL;
project->option->勾选Build with runtime packages,这样程序会小,运行时会多吃内存。
没玩过2010,你自己查查吧。
大点无所谓吧。现在的电脑可都比较好啊。
我都找不到到底是引用了那些东西.
view->project manageer
view->units
.
.
.
要看这种类型的东西一般都是通过视图view来查看的。
具体没搞懂你说的。
再或者你到project->view source里面看uses 下面的内容
我的目的是要修改一下别人做好的程序里面的这个托盘图标.我没找到在哪里修改.
那个程序里肯定有一个 xxxx : TNotifyIcondataA; //用于增加和删除系统状态图标
xxxx.hIcon := Application.Icon.handle; //指定系统状态栏显示应用程序的图标句柄
一般来说他的托盘图标就是应用程序的图标。
假设是这样的,那么你只要去改应用程序的图标。
project->options->application里面你就可以看到一个icon了。改吧。
下班,闪人。
.这个程序生成了一个txt格式的报表文件.
上下各有一行文字.中间是从数据库读取出来的.
怎么也找不到生成上下上下落款在哪里.....
(1)你没找到
(2)很有可能是从某个地方接收了什么什么数据之后,又把这个数据赋值给了2个变量。
最后再把这2个变量当作上下落款给了txt。
有的话,那就肯定会有显示,我很确定。
D2010这个IDE和我不大熟,我跟它没什么交集啊。 东西就那么多,全放在那里,怎么也逃不掉的,耐心找。
function GetDataInfo(const Buffer; Count: Cardinal): string;
begin
SetLength(Result, Count div 2);
Move(Buffer, Result[1], Count);
end;
跟踪到result的时候.只是中间的一段内容.但是到了move执行以后,就有了上下文了...这个该怎么解决呀?
其中buffer为source(源数据),result[1]为destination(目标)
move会把buffer给到result。看这个buffer从哪里来的。
就是说你查找一下哪里用了这个GetDataInfo(*,*),找到buffer就知道了。
使用的时候,这个函数的buffer是空值.
----------------------------------
变通的解决方式是,得到了最后的值以后.用c中的replace函数,替代了其中的一个字符串.就可以得到我想要的结果了.
不指导delphi中有没有这个函数?
begin
SetLength(Result, Count div 2);
Move(Buffer, Result[1], Count);
end;这样还不是函数原型?
你找到什么时候用的GetDataInfo这个函数,看传进来的第一个参数。
而且.这个move函数是相当的麻烦.还有汇编语言写的代码.
------------------
这样行了.能不能用个repalce直接替换一下字符串?
--
另外问一下:
dephli是传递地址还是传递值?
function Replace(var s:string;const SourceChar:pchar;const RChar:pchar)
//第一个参数是原串,第二个是模式串,第三个是替换串
var
ta,i,j:integer;
m,n,pn,sn:integer;
SLen,SCLen,RCLen:integer;//SLen表示原串的长度,SCLen表示模式传的长度,RCLen表示替换串的长度
IsSame:integer;
newp:array of char;//用来保存替换后的字符数组
begin
SLen:=strlen(pchar(s));SCLen:=strlen(SourceChar);RCLen:=strlen(RChar);
j:=pos(string(SourceChar),s);
s:=s+chr(0);ta:=0;i:=j;
while s[i]<>chr(0) do //这个循环用ta统计模式串在原串中出现的次数
begin
n:=0;IsSame:=1;
for m:=i to i+SCLen-1 do
begin
if m>SLen then begin IsSame:=0;break; end;
if s[m]<>sourceChar[n] then begin IsSame:=0;break; end;
n:=n+1;
end;
if IsSame=1 then begin ta:=ta+1;i:=m; end else i:=i+1;
end;
if j>0 then
begin
pn:=0;sn:=1;
setlength(newp,SLen-ta*SCLen+ta*RCLen+1);//分配newp的长度,+1表示后面还有一个#0结束符
while s[sn]<>chr(0) do //主要循环,开始替换
begin
n:=0;IsSame:=1;
for m:=sn to sn+SCLen-1 do //比较子串是否和模式串相同
begin
if m>SLen then begin IsSame:=0;break; end;
if s[m]<>sourceChar[n] then begin IsSame:=0;break; end;
n:=n+1;
end;
if IsSame=1 then//相同
begin
for m:=0 to RCLen-1 do
begin
newp[pn]:=RChar[m];pn:=pn+1;
end;
sn:=sn+SCLen;
end
else
begin //不同
newp[pn]:=s[sn];
pn:=pn+1;sn:=sn+1;
end;
end;
newp[pn]:=#0;
s:=string(newp); //重置s,替换完成!
end;
end;
这个函数怎么用?
我把参数直接传递进去以后.到了最后这一句.s:=string(newp);跟踪发现.newp的值是正确的,但赋给s以后,s是空值.
--
如果s不为空,调用函数里面的值是改变了还是没改变?
还是要弄个str1=Replace(str1,str2,str3),这样?那么是不是需要定义replace为string类型?
默认参数是传值, 不会被改变}
function MyF1(x: Integer): Integer;
begin
Inc(x);
Result := x;
end;
{var参数是传址, 会被改变}
function MyF2(var x: Integer): Integer;
begin
Inc(x);
Result := x;
end;
ss:='abcdefg';
ss := StringReplace(ss, 'a', 'b' ,[rfReplaceAll, rfIgnoreCase]);
ShowMessage(ss);
这样可以解决.
分都给您了.肖肖.多谢您持续的关注与帮助.多谢了.