`
sunfengcheng
  • 浏览: 184338 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

通过托放创建一个自定义的报表

阅读更多
[size=large][color=brown]通过托放创建一个自定义的报表

不管是用户还是程序员都习惯了,手动托控件的应用程序。 但是在web 中实现比较麻烦,今天我就告诉你一个就像桌面上应用程序一样的恶实例。

解决的方法:
  使用 rails 。 为了描述这个解决的方法, 例如  你正在为一个用户数据库提供 WEB 接口,同时 ,公司中的其他人员也正在使用这个数据库 , 每个人浏览了报表之后都可能 会有不同的想法,这些想法是关于他们愿意看到报表中显示了那些字段,你想提供一个操作简单,反应迅速的界面,让用户可以自己定义报表的版本。
  报表时在数据库中的用户表中选择出来的,表的定义:

db/schema.rb:

ActiveRecord::Schema.define(:version => 1) do

  create_table "customers", :force => true do |t| 
    t.column "company_name", :string
    t.column "contact_name", :string
    t.column "contact_title", :string
    t.column "address", :string
    t.column "city", :string
    t.column "region", :string
    t.column "postal_code", :string
    t.column "country", :string
    t.column "phone", :string
    t.column "fax", :string
  end 
end

创建一个视图 来举例出客户的 列表。 并且每一列都能托放,那就的定义一个放置你托放的列。添加一个运行报表的链接,以及一个让报表复位的链接。
  app/views/customers/report.rhtml:

<
h1>Custom Report</h1>

<% for column in Customer.column_names %>
  <div id="<%= column %>" style="cursor:move;">
    <%= column %>;
  </div>  
  <%= draggable_element("#{column}", :revert => false) %>
<% end %>

<div id="select-columns">
  <% if session['select_columns'] %>
    <%= session['select_columns'].join(", ").to_s %>
  <% end %>
</div>

<%= link_to_remote "Run Report",
                   :update => "report",
                   :url => { :action => "run" } %>

(<%= link_to "reset", :action => 'reset' %>)


<div id="report">
</div>

<%= drop_receiving_element("select-columns",
                           :update => "select-columns",
                           :url => { :action => "add_column" }) %>


在 Customers 控制器中定义一个 add_column ,用来对那些列被放入接受区域的时候触发的ajax 请求响应, 在定义 一个运行报表的方法以及一个同通过清除 色素sion 哈希表的 select_cloumns 来复位报表。
[
quote]controllers/customers_controller.rb:

class CustomersController < ApplicationController

  def report 
  end

  def add_column
    if session['select_columns'].nil?
      session['select_columns'] = []
    end
    session['select_columns'] << params[:id]
    render :text => session['select_columns'].join(", ").to_s
  end

  def run
    if session['select_columns'].nil?
      render :text => '<p style="color: red;">no fields selected</p>'
    else        
      @customers = Customer.find_by_sql("select 
          #{session['select_columns'].join(", ").to_s} from customers")
      render :partial => 'report'
    end
  end

  def reset
    session['select_columns'] = nil
    redirect_to :action => 'report'
  end
end

现在创建一个名字是_report.rhtml 的局部的视图来显示报表本身。

app/views/customers/_report.rhtml:

<table>
  <tr>
  <% for column in session['select_columns'] %>
    <th><%= column %></th> 
  <% end %>
  </tr>
  
  <% for customer in @customers %>
    <tr>
    <% for column in session['select_columns'] %>
      <td><%=h customer.send(column) %></td> 
    <% end %>
    </tr>
  <% end %>
</table>
布局当然修要包含 javascript 库以及定义 在报表视图中用来接受 区域的样式。
app/views/layouts/customers.rhtml:

<html>
<head>
  <title>Customers: <%= controller.action_name %></title>
  <%= stylesheet_link_tag 'scaffold' %>
  <%= javascript_include_tag :defaults %>
  <style type="text/css">
    #select-columns {
      position:         relative;
      width:            400px;
      height:           90px;
      background-color: #e2e2e2;
      border:           2px solid #ccc;
      margin-top:       20px;
      padding:          10px;
    }
  </style> 
</head>
<body>

<p style="color: green"><%= flash[:notice] %></p>

<%= yield %>

</body>
</html>
   [/color][/size]
3
0
分享到:
评论

相关推荐

    在Windows窗体应用程序中打印和制作报表(精).doc

    程序员需要创建一个处理PrintPage事件的过程,在此过程中,利用`PrintPageEventArgs`参数中的Graphics对象来绘制页面内容。`HasMorePages`属性决定是否需要继续打印更多的页面。如果该属性为False,表示仅打印当前...

    C++Builder精彩编程实例集锦的源代码后3部分.rar

    实例202 如何在一个数据集中浏览另一个数据集的数据 实例203 如何在数据库更新过程中增加事务操作 实例204 如何在程序中实现查找字段 实例205 如何在程序中实现自定义字段 实例206 如何使用字段拖放功能 实例...

    delphi控件集合

    2. **Elib**:Elib是一个通用的控件库,包含了一系列实用的组件,如日期时间选择器、颜色选择器、图像处理控件等。Elib的设计目的是简化常见的开发任务,提高代码的可读性和可维护性,使开发者能够快速构建用户界面...

    EXCEL study

    用户可以根据需要,使用VBA等编程语言在Excel中创建自定义函数,从而扩展Excel的功能。 十一、表头下面衬张图片 在表头下方衬托图片,可以使得表格更加美观,增强视觉效果。 十二、用连字符“&”来合并文本 使用...

    delphi 开发经验技巧宝典源码

    0136 使用FileCreate函数创建一个图形文件 88 0137 使用GetCurrentDir函数返回当前目录 89 0138 在指定路径中搜索指定的文件 89 0139 使用FileExists函数判断指定文件是否存在 90 0140 使用FileGetAttr函数...

    pb 数据窗口 拖拽 dragdrop

    拖放功能允许用户通过鼠标将数据从一个位置移动到另一个位置,提供了更加直观和用户友好的交互体验。 在PB中实现数据窗口的拖放操作主要涉及以下几个关键知识点: 1. **DragDrop事件**:这是PB中处理拖放操作的...

    vc++ 应用源码包_1

    操作大文件,自定义了一个操作大文件的类,并进行了测试。 chapter7 实现了声音录制等功能。 CHtmlViewProjV2 详细演示了HtmlView的使用与HtmlView事件站点拦截的实现、js调用。 CIVStringSet_Demo 自定义了一个...

    vc++ 应用源码包_6

    操作大文件,自定义了一个操作大文件的类,并进行了测试。 chapter7 实现了声音录制等功能。 CHtmlViewProjV2 详细演示了HtmlView的使用与HtmlView事件站点拦截的实现、js调用。 CIVStringSet_Demo 自定义了一个...

    vc++ 应用源码包_2

    操作大文件,自定义了一个操作大文件的类,并进行了测试。 chapter7 实现了声音录制等功能。 CHtmlViewProjV2 详细演示了HtmlView的使用与HtmlView事件站点拦截的实现、js调用。 CIVStringSet_Demo 自定义了一个...

    vc++ 应用源码包_5

    操作大文件,自定义了一个操作大文件的类,并进行了测试。 chapter7 实现了声音录制等功能。 CHtmlViewProjV2 详细演示了HtmlView的使用与HtmlView事件站点拦截的实现、js调用。 CIVStringSet_Demo 自定义了一个...

    vc++ 应用源码包_3

    操作大文件,自定义了一个操作大文件的类,并进行了测试。 chapter7 实现了声音录制等功能。 CHtmlViewProjV2 详细演示了HtmlView的使用与HtmlView事件站点拦截的实现、js调用。 CIVStringSet_Demo 自定义了一个...

    vc++ 开发实例源码包

    操作大文件,自定义了一个操作大文件的类,并进行了测试。 chapter7 实现了声音录制等功能。 CHtmlViewProjV2 详细演示了HtmlView的使用与HtmlView事件站点拦截的实现、js调用。 CIVStringSet_Demo 自定义了一个...

    delphi 开发经验技巧宝典源码06

    0136 使用FileCreate函数创建一个图形文件 88 0137 使用GetCurrentDir函数返回当前目录 89 0138 在指定路径中搜索指定的文件 89 0139 使用FileExists函数判断指定文件是否存在 90 0140 使用FileGetAttr函数...

    C#源码参考 winform练习源码大全208个例子打包下载

    "综合实例"则将以上多种技术结合,提供了一个完整功能的应用程序案例,帮助开发者了解如何在实际项目中整合各种技术。 这些源码实例覆盖了C# WinForm开发的各个方面,对于初学者来说是一份宝贵的参考资料,对于有...

    R12-库存管理系统基础

    通过本章的学习,读者将对Oracle Inventory Management有一个全面的认识。 **1.4 库存功能** Oracle Inventory Management提供了丰富的功能来支持企业的库存管理需求: - **接收到发放的活动周期**:从接收货物到...

    函数接口日志GIT 11111111111111

    1. **初始化仓库**:使用`git init`命令创建一个新的Git仓库,或者`git clone`克隆远程仓库到本地。 2. **添加文件**:使用`git add`命令将文件添加到暂存区,例如`git add .`将所有更改添加进去。 3. **提交更改*...

    第一部分 界面设计

    实例202 如何在一个数据集中浏览另一个数据集的数据 实例203 如何在数据库更新过程中增加事务操作 实例204 如何在程序中实现查找字段 实例205 如何在程序中实现自定义字段 实例206 如何使用字段拖放功能 实例...

    C++Builder精彩编程实例集锦的源代码前3部分.rar

    实例202 如何在一个数据集中浏览另一个数据集的数据 实例203 如何在数据库更新过程中增加事务操作 实例204 如何在程序中实现查找字段 实例205 如何在程序中实现自定义字段 实例206 如何使用字段拖放功能 实例...

    一洽在线客服系统操作手册

    一洽在线客服系统为用户提供了一个集登录管理、实时监控、菜单设置于一体的综合平台。通过细致的功能划分,帮助企业提升客服工作效率和服务质量。从登录界面到系统主界面的各个部分都进行了精心设计,确保用户能够...

Global site tag (gtag.js) - Google Analytics