多条数据曲线显示问题 ( 积分: 200 )

  • 主题发起人 主题发起人 leonychiu
  • 开始时间 开始时间
L

leonychiu

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾,请教下。
我的数据是:商品 月份 销量
A 一月 100
A 三月 200
A 六月 300
B 二月 1000
B 五月 2000
B 十月 3000
想显示的方式是:
X轴是:一月--------十二月
Y轴是:商品名
中间的点:销量。
目前的控件是DBCHART,不知道能不能实现,如果实现,不能的话哪个控件可以解决这个问题。谢谢。
 
各位大虾,请教下。
我的数据是:商品 月份 销量
A 一月 100
A 三月 200
A 六月 300
B 二月 1000
B 五月 2000
B 十月 3000
想显示的方式是:
X轴是:一月--------十二月
Y轴是:商品名
中间的点:销量。
目前的控件是DBCHART,不知道能不能实现,如果实现,不能的话哪个控件可以解决这个问题。谢谢。
 
用这几个就可以:
--------------
TDecisionGraph;
TDecisionPivot;
TDecisionQuery;
TDecisionSource;
DecisioTDecisionCube;
--------------
完全可以实现的。
 
我试下,可以的话马上就结,谢谢指教。
是不是DBCHART没有办法实现?!
 
listhano,我简单操作了点,可能之前没有用这些控件,是不是只是支持非ADO的哦。我的数据库是SQLSERVER,取不出来。有没有好的例子能介绍下。谢谢。
 
如果要用 DBCHART 显示,要分成两个数据集,每一个产品一个数据集
---------------------------------------
商品 月份 销量
A 一月 100
A 三月 200
A 六月 300
---------------------------------------
商品 月份 销量
B 二月 1000
B 五月 2000
B 十月 3000

object DBChart1: TDBChart
Left = 74
Top = 81
Width = 400
Height = 250
BackWall.Brush.Color = clWhite
BackWall.Brush.Style = bsClear
Title.Text.Strings = (
'TDBChart')
TabOrder = 3
object Series1: TBarSeries
Marks.ArrowLength = 20
Marks.Visible = True
DataSource = ADOQuery1
SeriesColor = clRed
XLabelsSource = '月份'
XValues.DateTime = False
XValues.Name = 'X'
XValues.Multiplier = 1
XValues.Order = loAscending
YValues.DateTime = False
YValues.Name = 'Bar'
YValues.Multiplier = 1
YValues.Order = loNone
YValues.ValueSource = '销售量'
end
object Series2: TBarSeries
Marks.ArrowLength = 20
Marks.Visible = True
DataSource = ADOQuery2
SeriesColor = clGreen
XLabelsSource = '月份'
XValues.DateTime = False
XValues.Name = 'X'
XValues.Multiplier = 1
XValues.Order = loAscending
YValues.DateTime = False
YValues.Name = 'Bar'
YValues.Multiplier = 1
YValues.Order = loNone
YValues.ValueSource = '销售量'
end
end
 
plenilune168,谢谢。
现在的问题是商品数量不固定(我想为了显示好看点固定为10个,但实际会50个或更多),月份都是1---12月
想实现:X轴为”月份“,Y轴为“商品”,曲线中的点为销售量。
不知道哪个方法最好?!用什么控件?
 
我也不知道这样的组件,不过使用一下子显示那么多商品不太实际,根本显示不下,如果固定10个,实在不行就用笨一点的方法放10个数据集,呵呵
 
这个也是我最后的打算,谢谢plenilune168。
我再等等其他高手建议后结分。
 
如果决策方可以的话,给你一个函数 ConnStr_BDE_FromADO_MSSQL (从一个函数库中分出来的依赖别的函数,虽然长了一点,凑伙还可以用),可以把 ADO 的数据连接字符串转换成BDE的连接字符串,放一个 Database 用这个转换的参数连接数据库,然后再连接决策方
我自己经常需要用这个在 ADO 和 BDE 数据连接控件之间转换,呵呵
uses Bde, DBTables, Registry;
function RightStr(S:string;Count:integer):string;
begin
//获取字符串右边起n个字符
RightStr:=Copy(s,Length(s)-Count+1,Count);
end;

function RDelete(S,Sub:string):string;
begin
//删除字符串右边的某一所有字符
sub:=copy(sub,1,1);
while RightStr(S,1)=subdo
Delete(S,length(s),1);
RDelete:=s;
end;

function ConnStr_ADO_GetKeyVal(ADOConnStr:WideString;
Key:string):string;
var pIndex,c:integer;
vConnStr,kConnStr:string;
begin
//获取ADO连接字符串键值
Key:=RDelete(Trim(Key),';');
if Key='' then
exit;
vConnStr:=Trim(ADOConnStr);
kConnstr:=vConnStr;
pIndex:=pos(UpperCase(Key),UpperCase(vConnStr));
if pIndex>0
then
begin
Delete(vConnstr,1,pIndex-1);
c:=pIndex;
pIndex:=pos('=',vConnStr);
c:=c+pIndex-1;
Delete(vConnStr,1,pIndex);
pIndex:=pos(';',vConnStr);
if pIndex>0 then
vConnStr:=copy(vConnStr,1,pIndex-1);
end
else
vConnStr:='';
Result:=vConnStr;
end;

procedure ReturnDefaultConnStr(pAliasName:string;pDriverName:string;pDefaultConnStr:TStrings);
var AddPassword: Boolean;
fDataBase:TDatabase;
begin
pDefaultConnStr.Clear;
AddPassword:=False;
fDataBase:=TDatabase.Create(nil);
try
if pDriverName<>'' then
begin
fDatabase.Session.GetDriverParams(pDriverName,pDefaultConnStr);
AddPassword:=(pDriverName<> szCFGDBSTANDARD);
end else
if pAliasName<>'' then
begin
fDatabase.Session.GetAliasParams(pAliasName,pDefaultConnStr);
AddPassword:=fDatabase.Session.GetAliasDriverName(pAliasName)<>szCFGDBSTANDARD;
end;
if AddPassword then
pDefaultConnStr.Add('PASSWORD=');
finally
fDataBase.Free;
fDataBase:=nil;
end;
end;

function Create_ODBC_DSN_MSSQL(DSN,Server,Database:string;
TrustConn:boolean):boolean;
var RegTemp:TRegistry;
Driver:string;
begin
//建立MSSQL ODBC 数据源
Result:=true;
RegTemp:=TRegistry.Create;
with RegTempdo
try
RootKey:=HKEY_LOCAL_MACHINE;
//读取SQL Server驱动路径
if KeyExists('Software/ODBC/ODBCINST.INI/SQL Server') then
begin
if OpenKey('Software/ODBC/ODBCINST.INI/SQL Server',false) then
Driver:=ReadString('Driver')
else
begin
Result:=false;
Raise Exception.Create('无法获取MSSQL驱动信息,建立数据源失败!');
end;
CloseKey;
end
else
begin
Result:=false;
Raise Exception.Create('找不到MSSQL驱动,建立数据源失败!');
end;

if OpenKey('Software/ODBC/ODBC.INI/ODBC Data Sources',True) then
begin
//注册一个DSN名称
WriteString(DSN,'SQL Server');
CloseKey;
if OpenKey('Software/ODBC/ODBC.INI/'+DSN,True) then
begin
if Database<>'' then
WriteString('Database',Database);
//默认数据库
WriteString('Server',Server);
WriteString('Driver',Driver);
WriteString('LastUser','sa');
if TrustConn then
WriteString('Trusted_Connection','Yes')
else
WriteString('Trusted_Connection','No');
end
else
begin
Result:=false;
Raise Exception.Create('建立ODBC数据源失败!');
end;
CloseKey;
end
else
begin
//创建键值失败
Result:=false;
Raise Exception.Create('建立ODBC数据源失败!');
end;
except
CloseKey;
FreeAndNil(RegTemp);
raise;
end;
RegTemp.CloseKey;
FreeAndNil(RegTemp);
end;

procedure ConnStr_BDE_FromADO_MSSQL(var BDEConnStr:WideString;
ADOConnStr:WideString;
ODBCDSN:string);
var Server,Database,Driver,UID,PWD:string;
TrustConn:boolean;
TempList:TStrings;
begin
//根据ADO连接参数生成BDE连接参数
TempList:=TStringList.Create;
try
TempList.Text:=BDEConnStr;
Server:=ConnStr_ADO_GetKeyVal(ADOConnStr,'Data Source');
Database:=ConnStr_ADO_GetKeyVal(ADOConnStr,'Initial Catalog');
UID:=ConnStr_ADO_GetKeyVal(ADOConnStr,'User ID');
PWD:=ConnStr_ADO_GetKeyVal(ADOConnStr,'Password');
TrustConn:=(Trim(ConnStr_ADO_GetKeyVal(ADOConnStr,'Integrated Security'))<>'');
if ODBCDSN='' then
ODBCDSN:=TempList.Values['ODBC DSN'];
if ODBCDSN='' then
ODBCDSN:=Server;
//获取默认连接参数
if Trim(TempList.Text)='' then
begin
ReturnDefaultConnStr('','SQL Server',TempList);
end;

//参数赋值
TempList.Values['SERVER NAME']:=Server;
TempList.Values['DATABASE NAME']:=Database;
TempList.Values['USER NAME']:=UID;
TempList.Values['PASSWORD']:=PWD;
TempList.Values['ODBC DSN']:=ODBCDSN;
Create_ODBC_DSN_MSSQL(ODBCDSN,Server,Database,TrustConn);
BDEConnStr:=TempList.Text;
finally
FreeAndNil(TempList);
end;
end;
 
谢谢plenilune168指点,我再等等有没有更方便的方法。
SOS
 
[:)]谢谢各位,还是用土办法做好了。
谢谢前面2位指点。
如有别的方法,我再送别的200分,要简单扼要点。
这个200我就先结了。主要谢谢2位关注
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部