马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?站点注册
×
## PbIdea uo_chart 图表控件实战 - 结合 SQL Server 数据库
作者:在神
---
前言
uo_chart 是 PbIdea 提供的图表控件,支持多种图表类型,包括折线图、柱状图、饼图、雷达图、仪表盘等。本文介绍如何结合 SQL Server 数据库,从数据库读取数据并生成图表。
---
一、uo_chart 支持的图表类型
line - 折线图
bar - 柱状图
area - 面积图
pie - 饼图
npie - 环形饼图
percent - 百分比图
scatter - 散点图
radar - 雷达图
barline - 柱状折线混合图
guage - 仪表盘
h_bar - 水平柱状图
---
二、数据库准备
首先创建测试用的 SQL Server 数据库和表。
- -- 创建数据库
- CREATE DATABASE ChartDemo
- GO
- USE ChartDemo
- GO
- -- 创建销售数据表
- CREATE TABLE SalesData (
- ID INT IDENTITY(1,1) PRIMARY KEY,
- SaleDate DATE NOT NULL,
- ProductName NVARCHAR(100) NOT NULL,
- SaleAmount DECIMAL(18,2) NOT NULL,
- Quantity INT NOT NULL
- )
- GO
- -- 插入测试数据
- INSERT INTO SalesData (SaleDate, ProductName, SaleAmount, Quantity)
- VALUES
- ('2026-01-01', '产品 A', 15000.00, 100),
- ('2026-01-01', '产品 B', 25000.00, 150),
- ('2026-01-01', '产品 C', 18000.00, 120),
- ('2026-02-01', '产品 A', 18000.00, 120),
- ('2026-02-01', '产品 B', 30000.00, 180),
- ('2026-02-01', '产品 C', 22000.00, 140),
- ('2026-03-01', '产品 A', 20000.00, 130),
- ('2026-03-01', '产品 B', 35000.00, 200),
- ('2026-03-01', '产品 C', 25000.00, 160),
- ('2026-04-01', '产品 A', 22000.00, 140),
- ('2026-04-01', '产品 B', 38000.00, 220),
- ('2026-04-01', '产品 C', 28000.00, 180)
- GO
复制代码
---
三、基本用法示例
1、创建图表对象
- // 创建图表对象
- uo_chart lchart = create uo_chart
- // 设置图表类型
- lchart.is_charttype = "line" // 折线图
- // 设置标题
- lchart.is_title = "销售数据统计"
- lchart.is_title1 = "2026 年 1-4 月"
- // 设置图例
- lchart.is_legend[1] = "销售额"
- lchart.is_legend[2] = "数量"
- // 设置背景颜色
- lchart.il_backcolor = RGB(255, 255, 255)
- // 设置字体颜色
- lchart.il_textcolor = RGB(0, 0, 0)
- // 设置坐标轴颜色
- lchart.il_axiscolor = RGB(128, 128, 128)
- // 设置线宽
- lchart.ii_linewidth = 2
- // 设置是否显示网格线
- lchart.ib_DrawGridV = true
- lchart.ib_DrawGridH = true
- // 设置是否使用曲线
- lchart.ib_curve = true
- // 销毁对象
- destroy lchart
复制代码
2、从数据库读取数据并生成折线图
- // 连接数据库
- uo_database ldb = create uo_database
- ldb.DBMS = "MSS"
- ldb.ServerName = "localhost"
- ldb.DatabaseName = "ChartDemo"
- ldb.LogID = "sa"
- ldb.LogPassword = "password"
- ldb.Open()
- // 创建图表对象
- uo_chart lchart = create uo_chart
- // 设置图表类型
- lchart.is_charttype = "line"
- lchart.is_title = "月度销售趋势"
- lchart.is_title1 = "2026 年"
- // 查询数据
- string ls_sql = "SELECT CONVERT(char(7), SaleDate, 120) as MonthName, SUM(SaleAmount) as TotalAmount FROM SalesData GROUP BY CONVERT(char(7), SaleDate, 120) ORDER BY MonthName"
- uo_recordset lrs = ldb.ExecuteSQL(ls_sql)
- // 准备数据
- string ls_xdata[] // X 轴标签
- double ld_ydata[] // Y 轴数据
- long ll_count = 0
- do while lrs.FetchNext()
- ll_count++
- ls_xdata[ll_count] = lrs.GetField("MonthName").GetString()
- ld_ydata[ll_count] = lrs.GetField("TotalAmount").GetDouble()
- loop
- // 设置数据
- lchart.SetXData(ls_xdata)
- lchart.SetYData(ld_ydata)
- // 设置图例
- lchart.is_legend[1] = "销售额"
- // 绘制图表(绘制到窗口)
- lchart.Paint(this, PAINT_HWND)
- // 清理资源
- ldb.Close()
- destroy ldb
- destroy lchart
复制代码
3、生成柱状图
- uo_chart lchart = create uo_chart
- // 设置图表类型为柱状图
- lchart.is_charttype = "bar"
- lchart.is_title = "产品销量对比"
- lchart.is_title1 = "2026 年 4 月"
- // 查询数据
- string ls_sql = "SELECT ProductName, SUM(Quantity) as TotalQty FROM SalesData WHERE SaleDate = '2026-04-01' GROUP BY ProductName"
- uo_recordset lrs = ldb.ExecuteSQL(ls_sql)
- string ls_xdata[]
- double ld_ydata[]
- long ll_count = 0
- do while lrs.FetchNext()
- ll_count++
- ls_xdata[ll_count] = lrs.GetField("ProductName").GetString()
- ld_ydata[ll_count] = lrs.GetField("TotalQty").GetDouble()
- loop
- // 设置数据
- lchart.SetXData(ls_xdata)
- lchart.SetYData(ld_ydata)
- // 设置 3D 效果
- lchart.ib_3dbar = true
- // 绘制
- lchart.Paint(this, PAINT_HWND)
- destroy lchart
复制代码
4、生成饼图
- uo_chart lchart = create uo_chart
- // 设置图表类型为饼图
- lchart.is_charttype = "pie"
- lchart.is_title = "产品销售占比"
- lchart.is_title1 = "2026 年 1-4 月"
- // 查询数据
- string ls_sql = "SELECT ProductName, SUM(SaleAmount) as TotalAmount FROM SalesData GROUP BY ProductName"
- uo_recordset lrs = ldb.ExecuteSQL(ls_sql)
- string ls_labels[]
- double ld_values[]
- long ll_count = 0
- do while lrs.FetchNext()
- ll_count++
- ls_labels[ll_count] = lrs.GetField("ProductName").GetString()
- ld_values[ll_count] = lrs.GetField("TotalAmount").GetDouble()
- loop
- // 设置数据
- lchart.SetPieData(ls_labels, ld_values)
- // 设置颜色
- lchart.il_color[1] = RGB(255, 0, 0)
- lchart.il_color[2] = RGB(0, 255, 0)
- lchart.il_color[3] = RGB(0, 0, 255)
- // 绘制
- lchart.Paint(this, PAINT_HWND)
- destroy lchart
复制代码
5、生成仪表盘
- uo_chart lchart = create uo_chart
- // 设置图表类型为仪表盘
- lchart.is_charttype = "guage"
- lchart.is_title = "系统性能监控"
- lchart.is_title1 = "CPU 使用率"
- // 设置百分比值
- lchart.id_percent[1] = 75.5 // 75.5%
- // 设置最大值
- lchart.id_maxvalue[1] = 100
- // 绘制
- lchart.Paint(this, PAINT_HWND)
- destroy lchart
复制代码
6、生成多系列折线图
- uo_chart lchart = create uo_chart
- // 设置图表类型
- lchart.is_charttype = "line"
- lchart.is_title = "各产品月度销售趋势"
- lchart.is_title1 = "2026 年"
- // 查询数据
- string ls_sql = "SELECT CONVERT(char(7), SaleDate, 120) as MonthName, ProductName, SUM(SaleAmount) as TotalAmount FROM SalesData GROUP BY CONVERT(char(7), SaleDate, 120), ProductName ORDER BY MonthName, ProductName"
- uo_recordset lrs = ldb.ExecuteSQL(ls_sql)
- // 按产品分组数据
- string ls_months[]
- double ld_product_a[]
- double ld_product_b[]
- double ld_product_c[]
- long ll_month_count = 0
- long ll_a = 0, ll_b = 0, ll_c = 0
- do while lrs.FetchNext()
- string ls_month = lrs.GetField("MonthName").GetString()
- string ls_product = lrs.GetField("ProductName").GetString()
- double ld_amount = lrs.GetField("TotalAmount").GetDouble()
-
- // 添加月份
- if ll_month_count = 0 or ls_months[ll_month_count] <> ls_month then
- ll_month_count++
- ls_months[ll_month_count] = ls_month
- end if
-
- // 按产品分类
- if ls_product = "产品 A" then
- ll_a++
- ld_product_a[ll_a] = ld_amount
- elseif ls_product = "产品 B" then
- ll_b++
- ld_product_b[ll_b] = ld_amount
- elseif ls_product = "产品 C" then
- ll_c++
- ld_product_c[ll_c] = ld_amount
- end if
- loop
- // 设置 X 轴
- lchart.SetXData(ls_months)
- // 设置多系列 Y 轴数据
- lchart.SetYData(ld_product_a)
- lchart.AddYData(ld_product_b)
- lchart.AddYData(ld_product_c)
- // 设置图例
- lchart.is_legend[1] = "产品 A"
- lchart.is_legend[2] = "产品 B"
- lchart.is_legend[3] = "产品 C"
- // 绘制
- lchart.Paint(this, PAINT_HWND)
- destroy lchart
复制代码
---
四、常用属性说明
图表类型
- is_charttype - 图表类型:line, bar, area, pie, npie, percent, scatter, radar, barline, guage, h_bar
标题与图例
- is_title - 主标题
- is_title1 - 副标题
- is_legend[] - 图例数组
颜色设置
- il_backcolor - 背景颜色
- il_textcolor - 字体颜色
- il_axiscolor - 坐标轴颜色
- il_color[] - 数据系列颜色数组
- il_colorstyle - 颜色风格:1~14
样式设置
- ii_linewidth - 线宽
- ib_curve - 是否使用曲线
- ib_3dbar - 是否 3D 柱状图
- ib_stack - 是否堆叠
- ib_DrawGridV - 是否显示垂直网格线
- ib_DrawGridH - 是否显示水平网格线
- ii_nodeType - 节点类型:0 无,1 方块,2 圆,3 空心圆
其他
- ii_padding - 边距
- ii_alpha - 透明度
- is_picture - 生成的图片文件名
---
五、注意事项
1. 对象使用完毕后必须 destroy,否则内存泄漏
2. 绘制图表前需要先设置好数据和样式
3. 颜色使用 RGB() 函数生成
4. 饼图数据不需要 X 轴,使用 SetPieData() 方法
5. 仪表盘使用 id_percent[] 和 id_maxvalue[] 设置值
6. 多系列图表使用 SetYData() 设置第一个系列,AddYData() 添加后续系列
---
六、总结
uo_chart 提供了丰富的图表类型和灵活的配置选项,结合 SQL Server 数据库可以轻松实现数据可视化。本文介绍了基本的用法和常见图表类型的生成方法,更多高级功能请参考官方文档。
---
作者:在神
本文基于 PbIdea 官方文档和实际使用经验整理,如有错误欢迎指正。 |