2014-01-03 4 views
0

У меня есть эта проблема. Я должен сгенерировать отчет с использованием отчетов Jasper, тогда мне нужно обновить некоторые записи в соответствии с некоторыми условиями. Вот некоторый код:Подождите, пока генератор отчетов не обновит записи

def crearReporte = { 
    //FIRST: generate the report 
    chain(controller:'jasper',action:'index',params:params) 
    //SECOND: update the reported information 
    def recepciones = RecepcionDeEstano.findAllByTransportePagadoAndFechaDeRecepcionBetween("NO",fechaInicial1,fechaFinal1) 
    pagarTransporte recepciones 
} 

def pagarTransporte = { lista -> 
    lista.each { 
     it.transportePagado="SI" 
     it.save() 
    } 
} 

Мой отчет должен поле в transporte_pagado записи, то имеющее значение 'NO', но операция обновления выполняется так сразу, что записи и transporte_pagado поля, участвующие обновляют 'SI' до генерируемых отчета дают как результат и пустой отчет.

Как я могу отложить операцию обновления? Или, как я могу выполнить задачу строго после завершения другой задачи?

ответ

0

Я решил свою проблему (ну, Sergio Michels помог мне). Это код, который я использовал (я изменил некоторый класс домена и имена переменных, чтобы предложить общее решение):

def createReport = { 
    Map reportParams = [:] 
    byte[] bytes 
    //report parameters 
    reportParams.put("PARAM_1",params.param1) 
    reportParams.put("PARAM_2",params.param2) 
    reportParams.put("PARAM_N",params.paramn) 

    //here I had to write some IF's to know what report to send 
    if(aCondition1) 
     def reportDef = new JasperReportDef(name:'my_report1.jasper',fileFormat:JasperExportFormat.PDF_FORMAT,parameters: reportParams) 
     bytes = jasperService.generateReport(reportDef).toByteArray()   
     //update records after they are reported 
     doSomeUpdate param1 
    } 
    if(aCondition2) 
     def reportDef = new JasperReportDef(name:'my_report2.jasper',fileFormat:JasperExportFormat.PDF_FORMAT,parameters: reportParams) 
     bytes = jasperService.generateReport(reportDef).toByteArray()   
     //update records after they are reported 
     doSomeUpdate param2 
    } 
    //send report for download 
    response.addHeader("Content-Disposition", 'attachment; filename="report.pdf"') 
    response.contentType = 'application/pdf' 
    response.outputStream << bytes 
    response.outputStream.flush() 
} 

Я обнаружил, что в этом случае лучше использовать сервер вместо цепи. Это работает как прелесть!

Смежные вопросы