2015-09-04 18 views
0

我想知道如何配置分页数列数而不是行数。例如,我想在每页5列。 我怎么能意识到这一点?如何在RML中配置分页符的列数?

<blockTable colwidths="150,100,100,100,100,100" style="Table1"> 
    <tr> 
<td> 
     <para style="P8">NOM EMPLOYÉ</para> 
    </td> 
    <td> 
     <para style="P7">[[ repeatIn(get_employee_lines(example.company_id,example.date_start,example.date_end), 'o', 'td') ]]</para> 
     <para style="P7">[[ o['name'] ]]</para> 
    </td>  
    </tr> 
    <tr> 
<td> 
     <para style="P8">Matricule</para> 
    </td> 
    <td> 
     <para style="P7">[[ repeatIn(get_employee_lines(example.company_id,example.date_start,example.date_end), 'p', 'td') ]]</para> 
     <para style="P7">[[ p['matricule'] ]]</para> 
    </td>  
    </tr> 
    <tr> 
<td> 
     <para style="P8">HEURES SUPPLEÉMENTAIRES 100%</para> 
    </td> 
    <td> 
     <para style="P7">[[ repeatIn(get_employee_lines(example.company_id,example.date_start,example.date_end), 'a', 'td') ]]</para> 
     <para style="P7">[[ a['hours_overtime_100'] ]]</para> 
    </td>  
    </tr> 
    <tr> 
<td> 
     <para style="P8">ABSENCE</para> 
    </td> 
    <td> 
     <para style="P7">[[ repeatIn(get_employee_lines(example.company_id,example.date_start,example.date_end), 'b', 'td') ]]</para> 
     <para style="P7">[[ b['seetek_absence_day'] ]]</para> 
    </td>  
    </tr> 
<tr> 
<td> 
     <para style="P8">TOTAL BRUT</para> 
    </td> 
    <td> 
     <para style="P7">[[ repeatIn(get_employee_lines(example.company_id,example.date_start,example.date_end), 'c', 'td') ]]</para> 
     <para style="P7">[[ c['total_brut'] ]]</para> 
    </td>  
    </tr> 
     </blockTable> 
+0

不知道我理解你的问题。通常情况下,你定义了要放入页面的内容。所以如果你想要一个带有5列的表格,只需要一个包含5列的表格。 您的意思是说您的列数量未知,并且您想用它们填充连续的页面?你能否给我们一个更精确的例子? –

+0

我有一个循环,所以列的数量将取决于该循环的结果。我无法定义为什么我想在每个页面中定义的列数,我会找到5个或X列,使用这种方法,我不会松散通知,因为它们将在页面之外 –

+0

因此,您认为@ Andrei Boyanov –

回答

0

你为什么不尝试这样的事情:

<section> 
    <para> 
     [[ repeatIn(get_employee_slices(example.company_id, 
             example.date_start, 
             example.date_end, 
             5), 
        "slice") ]] 
    </para> 
     <blockTable colwidths="150,100,100,100,100,100" style="Table1"> 
     <tr> 
      <td> 
       <para style="P8">NOM EMPLOYÉ</para> 
      </td> 
      <td> 
       <para style="P7"> 
        [[ repeatIn(get_employee_lines(example.company_id, 
                example.date_start, 
                example.date_end, 
                slice, 5), 
           'o', 'td') ]] 
       </para> 
       <para style="P7">[[ o['name'] ]]</para> 
      </td>  
     </tr> 
     <tr> 
      <td> 
       <para style="P8">Matricule</para> 
      </td> 
      <td> 
       <para style="P7"> 
        [[ repeatIn(get_employee_lines(example.company_id, 
                example.date_start, 
                example.date_end, 
                slice, 5), 
           'o', 'td') ]] 
       </para> 
       <para style="P7">[[ o['matricule'] ]]</para> 
      </td>  
     </tr> 
     <!-- .... --> 
    </blockTable> 
</section> 

我增加额外的循环,这将创建N个不同的表(取决于你拥有的员工数量我打电话的不同部分。员工片“为了这个工作,你需要两样东西更多。

  • 创建名为get_employee_slices Python代码里面的方法这个方法应该返回连续numbe列表rs从0到N - 1:
  • 修改您现有的方法get_employee_lines添加两个附加参数 - number_of_slicesnumber_of_columns。此方法现在应只返回属于给定切片的员工 - 例如员工5到员工9.

希望这个想法非常清楚。我没有测试,所以可能会有一些错误。

遵循为get_employee_slices()实施建议:

def get_employee_slices(self, company, date_start, date_end, 
         columns, context=None): 

    payslip_pool = self.pool.get('hr.payslip') 
    ids = payslip_pool.search(self.cr, self.uid, 
           [('date', '>=', date_start), 
           ('date', '<=', date_end), 
           ('company_id', '=', company.id)]) 
    taille = int(len(ids)/columns) + \ 
       (len(ids) % columns > 0 and 1 or 0) 
    return range(taille) 
+0

这个想法是如此清楚我的朋友。非常感谢,但我不知道如何创建get_employee_slices –

+0

查看报告的代码。它在你的.rml文件附近的一些.py文件中。这是包含get_employee_lines()的文件。 或者你可能发现实施这种方法的逻辑有困难?告诉我,如果是这样。 –

+0

我已经尝试了我的朋友,但我得到了这个错误:except_osv:(u“name'slice'is not defined”,(,NameError(“name'slice'is defined” ,),) –

0

这里是我的代码:

def get_employee_slices(self, company_id, date_start, date_end, var, context=None): 
    res_list=[] 
    i = 0 
    obj2 = company_id.id 
    payslip_line = self.pool.get('hr.payslip') 
    obj_ids = payslip_line.search(self.cr, self.uid, [('date_from', '=', date_start), ('date_to', '=', date_end), ('company_id', '=', obj2)]) 
    for res in payslip_line.read(self.cr, self.uid, obj_ids, ['id', 'employee_id','seetek_worked_day','hours_overtime_100','seetek_absence_day','total_brut','retenue_source','net_payer'], context=False): 
     print res['employee_id'][1] 
     obj = {} 
     obj['name'] = res['employee_id'][1] 
     res_list.append(obj) 
    taille = len (res_list) 
    while i < taille: 
     print i 
     i = i +1 
     return i 

而RML:

<section> 
    <para> 
    [[ repeatIn(get_employee_slices(example.company_id, 
            example.date_start, 
            example.date_end, 
            5), 
       'slice') ]] 
</para> 
<blockTable colwidths="150,100,100,100,100,100" style="Table1"> 

    <tr> 
<td> 

     <para style="P8">NOM EMPLOYÉ</para> 
    </td> 
    <td> 

     <para style="P7">[[ repeatIn(get_employee_lines(example.company_id,example.date_start,example.date_end, slice, 5), 'o', 'td') ]]</para> 

     <para style="P7">[[ o['name'] ]]</para> 
    </td>  
    </tr> 
    <tr> 
<td> 
     <para style="P8">Matricule</para> 
    </td> 
    <td> 
     <para style="P7">[[ repeatIn(get_employee_lines(example.company_id,example.date_start,example.date_end), 'p', 'td') ]]</para> 
     <para style="P7">[[ p['matricule'] ]]</para> 
    </td>  
    </tr> 
0

当然,还有一个更好的解决方案。不是先调用一个给你片数的方法,然后再调用N次方法返回一部分员工的另一种方法,你可以修改现有的get_employee_lines,以便返回一个2维数组每行中的值的数量。

你修改的方法应该是这样的:

def get_employee_lines(self, company, date_start, date_end, 
         columns, context=None): 

    payslip_pool = self.pool.get('hr.payslip') 
    payslip_ids = payslip_pool.search(self.cr, self.uid, 
             [('date', '>=', date_start), 
             ('date', '<=', date_end), 
             ('company_id', '=', company.id)]) 
    records = payslip_line.read(self.cr, self.uid, payslip_ids, 
           ['id', 'employee_id', 
           'seetek_worked_day', 
           'hours_overtime_100', 
           'seetek_absence_day', 
           'total_brut', 
           'retenue_source', 
           'net_payer'], 
           context=context) 
    rows_count = int(len(records)/columns) + \ 
        (len(records) % columns > 0 and 1 or 0) 
    result = [list()] * rows_count 
    for i in xrange(rows_count): 
     for j in xrange(columns): 
      if len(records) <= 0: 
       break 
      result[i].append(records.pop()) 
    return result 

然后你可以通过以下方式来使用它在你的RML报告:

<section> 
    <para> 
     [[ repeatIn(get_employee_lines(example.company_id, 
             example.date_start, 
             example.date_end, 
             5), 
        "row") ]] 
    </para> 
     <blockTable colwidths="150,100,100,100,100,100" style="Table1"> 
     <tr> 
      <td> 
       <para style="P8">NOM EMPLOYÉ</para> 
      </td> 
      <td> 
       <para style="P7"> 
        [[ repeatIn(row), 'employee', 'td') ]] 
       </para> 
       <para style="P7">[[ employee['employee_id'][1] ]]</para> 
      </td>  
     </tr> 
     <tr> 
      <td> 
       <para style="P8">Matricule</para> 
      </td> 
      <td> 
       <para style="P7"> 
        [[ repeatIn(row, 'employee', 'td') ]] 
       </para> 
       <para style="P7">[[ employee['matricule'] ]]</para> 
      </td>  
     </tr> 
     <!-- .... --> 
    </blockTable> 
</section> 

再次,它没有经过测试。您可以根据自己的需求进行测试并对其进行调整。