我在dbgrid中增加一列,但是这一列的结果是通过sql语句得出来的,我不知道怎么写,求救!(100分)

  • 主题发起人 主题发起人 holmes
  • 开始时间 开始时间
H

holmes

Unregistered / Unconfirmed
GUEST, unregistred user!
我是delphi菜鸟(注:我用的是delphi 5),只知道一点皮毛上的皮毛,现在有个问题求各位高手解决:
在dbgrid中增加一列,但是这一列的结果是通过sql语句得出来的。具体的sql语句如下:
select m.*,calje=jeForm*Br,todaymoney=(Case Kind When '1' Then isnull(jeform,0) Else isnull(jeform,0)-isnull(jeusepreaccept,0) End)*br,
p.Name as CustomerName,jsrName=s.Name,
kmName= k.Name, jsfsName= j.Name,DerartName= d.Name,
KindName=(Case Kind When '0' Then '应收款' Else '预收款' End),
StateHin=(Case IsNull(EnterMan,'') When '' Then '未入帐' else '入帐' End)
from AcceptMaster m Left Join Personnel s On jsr= s.Code
left Join kmCode k On m.km=k.Code
left Join jsfs j On m.jsfs= j.Code
left Join Department d On m.Department=d.Code
left Join Customers p On m.Customer= p.Code
where (IsNull(Customer,'') Like :Customer
or IsNull(p.Name,'') like :Customer)
and Date>=:sd and Date<=:ed
and (Flag In ('0','2') and :fs1 = 1 or Flag='1' and :fs2 = 1)
and (Kind='0' and :ks1 = 1 or Kind='1' and :ks2 = 1)
order by m.sNo
这些语句我都不太懂是什么意思,请高手随便解释一下,现在我要添加的一列我已经通过sql语句查出来了,但是我不知道如何把它加到上面的语句里去。语句如下:
select sum(je-isnull(costprice*num,0)*br) as dprofit
from sellmaster , selldetail
where sellmaster.sno=selldetail.sno
如何能让这一列在dbgrid中显示出来??在线等,谢谢!!
 
你的程序有可能被多次运行了
用Halt解决
 
有可能存在一种情况
这个窗体的创建事件中引用了对数据表的一个操作
比如其中存在一个Query或者Table,Active属性被设置为True
而数据连接还没有存在
 
to xzhxu2006 能具体一点吗?你说的方法我不懂。

to muhx 你说的应该没可能吧,就算我active设置成true,也不可能在delphi中打不开啊```
 
你把你出错的单元代码贴出来我看看
 
好,没问题,稍等。
 
如果打不开就用记事本打开
然后把源码贴出来就可以了
 
procedure TFrmSetPer.BtnNweClick(Sender: TObject);
begin
ADOQuery1.Close;
DBGrid1.ReadOnly:=False;
ADOQuery1.Open;
end;

procedure TFrmSetPer.BtnDelClick(Sender: TObject);
begin
ADOQuery1.Delete;
end;

procedure TFrmSetPer.BtnCancelClick(Sender: TObject);
begin
Close;
end;

procedure TFrmSetPer.Button1Click(Sender: TObject);
begin
if ADOQuery1.State in [dsEdit , dsInsert] then
if MessageBox(0,'你已经对记录进行了更改,确定要提交吗?', '提交提示',MB_OKCANCEL)=IDOK then
ADOQuery1.Post;
end;

procedure TFrmSetPer.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;
 
把整个单元贴出来啊
我主要要看你对这个窗体的定义和引用方式
 
muhx 说的这个情况是可能的,我以前就遇到过,。原因可能是
你的数据库连接是动态写的,但是现在不能自动连接了(可能数据库有了变动)
所以其中存在一个Query或者Table,Active属性被设置为True
导致连接异常退出delphi编译环境,
你可以这样解决,,把出现问题的窗体文件用文本编辑器打开然后查找可能出现问题的控件。
我一般是这么查的,搜索关键字active,看它的赋值有没有是true的,有的话在文本编辑器里面直接改为false,然后delphi里面就可以打开这个窗体了,再找具体的原因
 
unit SetPer;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, DB, ADODB, StdCtrls;

type
TFrmSetPer = class(TForm)
DBGrid1: TDBGrid;
BtnNwe: TButton;
BtnDel: TButton;
BtnCancel: TButton;
ADOQuery1: TADOQuery;
DataSource1: TDataSource;
Button1: TButton;
procedure BtnNweClick(Sender: TObject);
procedure BtnDelClick(Sender: TObject);
procedure BtnCancelClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

var
FrmSetPer: TFrmSetPer;

implementation

uses dataMod;

{$R *.dfm}

procedure TFrmSetPer.BtnNweClick(Sender: TObject);
begin
ADOQuery1.Close;
DBGrid1.ReadOnly:=False;
ADOQuery1.Open;
end;

procedure TFrmSetPer.BtnDelClick(Sender: TObject);
begin
ADOQuery1.Delete;
end;

procedure TFrmSetPer.BtnCancelClick(Sender: TObject);
begin
Close;
end;

procedure TFrmSetPer.Button1Click(Sender: TObject);
begin
if ADOQuery1.State in [dsEdit , dsInsert] then
if MessageBox(0,'你已经对记录进行了更改,确定要提交吗?', '提交提示',MB_OKCANCEL)=IDOK then
ADOQuery1.Post;
end;

procedure TFrmSetPer.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;

end.
 
在你保存路径下找到这个单元对应的窗体文件名,假设是From1.dfm
使用记事本打开
找到ADOQuery1的定义
object ADOQuery1: TADOQuery
Active = True
改为
object ADOQuery1: TADOQuery
Active = False
然后保存
再在Delphi中编译一下
 
这段代码看不出是否是数据控件的问题,你能把窗体的代码文件粘贴出来吗?
用记事本打开单元文件对应的窗体文件(.dfm),然后粘贴过来看下啦
 
来自:muhx, 时间:2006-7-14 9:45:24, ID:3505243
在你保存路径下找到这个单元对应的窗体文件名,假设是From1.dfm
使用记事本打开
找到ADOQuery1的定义
object ADOQuery1: TADOQuery
Active = True
改为
object ADOQuery1: TADOQuery
Active = False
然后保存
再在Delphi中编译一下

此方法确实可行,
懒的打字,复制下,嘿
 
to muhx:非常感谢,真的像你说的那样,我改了后可以在delphi中打开了。
但是在运行的时候那样子,我要怎么改呢?可以再麻烦你一下不?
 
你都改过来了,重新编译,数据连接正确就好了,
 
1.检查一下你ADOQuery连接的ADOConnection在你这个窗体打开之前是否正确配置
2.不要让ADOQuery默认为True,设置它的Active默认选项为False。在运行中再打开
3.检查你的ADOConnection是否已经Connected = True,如果没有那么在你的ADOQuery.Active := True 之前要先 ADOConnection.Connected := True
4.检查你的SQL语句
 
非常感谢大家。问题解决了。
to muhx:真的很谢谢你``原来是我的表设计得有问题。郁闷``
 
另外我想再接着问一个问题(因为我没分了,省点分,呵呵)

我要控件程序的每个子窗体在运行的时候只能创建一个,要怎么弄?
 
var
FQdFileManager: TQdFileManager = nil;

function FileManager: TQdFileManager;
begin
if FQdFileManager = nil then
FQdFileManager := TQdFileManager.Create;
Result := FQdFileManager;
end;
 
后退
顶部