Thursday, November 13, 2014

Usando < p:cellEditor > para editar dos celdas de un datatable

Pensemos que tenemos un datatable en el cual las celdas pago y exoneración son editables, deseamos que se actualice el saldo, en base a los valores en estas dos celdas.

En nuestro archivo .xhtml
agregamos un <p:remoteCommand>
  <p:remoteCommand name="onCellEditTableComplete"  update=":form:growl,:form:datatableImpuestos" />

En el <p:datatable>

   <p:dataTable id="datatableImpuestos"
                                             rows="10"
                                             value="#{pagoseventualesSearchController.listRecibosdetalles}" 
                                             var="item"
                                             paginator="true"
                                             rowKey="#{item.idnivel6}"
                                             selectionMode="single"
                                             emptyMessage="#{app['info.notienedeudapendiente']}"

                                             selection="#{pagoseventualesSearchController.selected}"
                                             filteredValue="#{pagoseventualesSearchController.filtered}" 
                                             editable="true" editMode="cell"

                                             > 
Agregamos <p:ajax>
<p:ajax event="cellEdit" listener="#{pagoseventualesSearchController.onCellEdit}" 
                                            update=":form:growl,:form:datatableImpuestos,:form:mensajes" 
                                            oncomplete="onCellEditTableComplete()"/>


En las columnas usamos <p:cellEditor>

  <p:column headerText="#{msg.pago}">
                                        <p:cellEditor>
                                            <f:facet name="output"><h:outputText value="#{item.pago}" /></f:facet>
                                            <f:facet name="input"><p:inputText value="#{item.pago}" style="width:100%" label="Year"/></f:facet>
                                        </p:cellEditor>
                                    </p:column>
                                    <p:column headerText="#{msg.exoneracion}">
                                        <p:cellEditor>
                                            <f:facet name="output"><h:outputText value="#{item.exoneracion}" /></f:facet>
                                            <f:facet name="input"><p:inputText value="#{item.exoneracion}" style="width:100%" label="Year"/></f:facet>
                                        </p:cellEditor>
                                    </p:column>





                                    <p:column>
                                        <f:facet name="header">
                                            <p:outputLabel value="#{msg.saldo}"/>
                                        </f:facet>
                                        <p:outputLabel value="#{item.saldo}" >
                                            <f:convertNumber type="number"   groupingUsed="true"
                                                             minFractionDigits="2" pattern="#0.00"/>
                                        </p:outputLabel>
                                    </p:column>


En el @NamedBeans creamos el metodo onCellEdit
obtiene le fila seleccionada
            selected = listRecibosdetalles.get(event.getRowIndex());

permite asignar valores a las columnas especificas
listRecibosdetalles.get(event.getRowIndex()).setPago(0.0);


 public void onCellEdit(CellEditEvent event) {
 try {

            selected = listRecibosdetalles.get(event.getRowIndex());

            Object oldValue = event.getOldValue();
            Object newValue = event.getNewValue();
            if (newValue != null && !newValue.equals(oldValue)) {
             if (selected.getPago() < 0) {
                    JSFUtil.warningDialog(rf.getMensajeArb("info.message"), rf.getMensajeArb("info.valornegativo"));
                    listRecibosdetalles.get(event.getRowIndex()).setPago(0.0);
                    selected.setPago(0.0);
                    listRecibosdetalles.get(event.getRowIndex()).setSaldo(selected.getSaldoanterior() - selected.getPago() - selected.getExoneracion());
                }
}

No comments: