`
sunfengcheng
  • 浏览: 181107 次
  • 性别: 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
分享到:
评论

相关推荐

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

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

    delphi 开发经验技巧宝典源码

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

    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函数...

    第一部分 界面设计

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

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

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

    C#编程经验技巧宝典

    72 &lt;br&gt;0102 将字符串首字母转换大写 72 &lt;br&gt;0103 如何进行字节数组和字符串的相互转换 72 &lt;br&gt;0104 如何把一个按空格分割的字符串存储在一个ArrayList数组中 73 &lt;br&gt;4.2 获取字符串信息 73 ...

    Visual C++程序开发范例宝典(PDF扫描版).part3

     cc实例184 执行一个外部程序直到其结束   cc实例185 调用具有参数的可执行程序   6.7 线程同步   cc实例186 利用事件对象实现线程同步   cc实例187 利用互斥对象实现线程同步   cc实例188 利用...

    Visual C++程序开发范例宝典(PDF扫描版).part2

     cc实例184 执行一个外部程序直到其结束   cc实例185 调用具有参数的可执行程序   6.7 线程同步   cc实例186 利用事件对象实现线程同步   cc实例187 利用互斥对象实现线程同步   cc实例188 利用...

    Visual C++ 程序开发范例宝典 源码 光盘 part2

    cc实例269 多表联合查询 cc实例270 对联合查询后的结果进行排序 9.13 内连接查询 cc实例271 简单内连接查询 cc实例272 复杂内连接查询 cc实例273 使用内连接选择一个表与另一个表中行相关的所有行 9.14...

Global site tag (gtag.js) - Google Analytics