Crear registros de entitys diferentes en el mismo formulario

A veces tenemos un formulario, que contiene entitys relacionados y deseamos desde el formulario principal agregar también el entity referenciado.

Ejemplo:

Al crear un articulo necesitamos tener articulos creados, podemos agregar un tabview donde colocamos la opciòn para crear registros de tamano.

```java

```



## **Código .xhtml**

* Agregar un tabView
* Crear un <b:inputText si deseamos en mayúsculas de 100 caracteres mask="A{1,100}
* Agregamos un <b:commandButton> con el parametro process="@this, form:idtamano"
* El action invocamos al metodo save() de tamanoController.save()
* De esta manera se guarda el tamano, y al usar el <p:autocomplete> muestra el nuevo valor en el mismo formulario.
* 
```java
 <b:tabView activeIndex="0" id="tabview" rendered="#{articuloController.writable}" >
                    <b:tab title="#{msg['tab.tamano']}">
                        <f:facet name="anchor"><b:iconAwesome name="address-card"  /></f:facet>
                        <b:panelGrid id="panel" colSpans="6,6" size="xs" > 
                            <b:inputText       

                                placeholder="#{app['info.ingresenuevodato']}"
                                value="#{tamanoController.tamano.descripcion}"                     
                                required="false"
                                mask="A{1,100}"
                                id="tamano"
                                immediate="true"
                                />


                            <b:commandButton rendered="#{articuloController.writable and applicationMenu.tamano.create}"                          
                                             value="#{app['button.save']}"
                                             iconAwesome="fa-floppy-o"
                                             title="#{app['button.save']}"
                                             process="@This,:form:tamano"
                                             action="#{tamanoController.save()}" 
                                             update=":form:content" /> 
                        </b:panelGrid>
                    </b:tab>
                </b:tabView>
```


## Codigo completo


```
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html>
<ui:composition template="/layout/template.xhtml" 
                xmlns="http://www.w3.org/1999/xhtml"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:b="http://bootsfaces.net/ui"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:p="http://primefaces.org/ui"
                xmlns:a="http://xmlns.jcp.org/jsf/composite/avbravo"
                xmlns:e="http://xmlns.jcp.org/jsf/composite/extensions"
                > 
    <ui:define name="content">
        <!--<h:outputStylesheet library="bsf" name="css/thumbnails.css"/>-->

        <style>
            .thumbnail { max-width: 100%; }
            img.thumbnail:hover, img.thumbnail:focus {
                border: 1px solid;
                border-color: #428BCA;
            }
        </style>
        <h1>#{msg['titleview.articulo']}</h1>
        <hr/>
        <b:form id="form"  prependId="false"  rendered="#{loginController.loggedIn and applicationMenu.articulo.create}" onkeypress="if (event.keyCode == 13) {
                    return false;
                }">
            <h:panelGroup id="content" layout="block"> 
                <p:remoteCommand  update=":form:content :form:precioventapublico, :form:precioventacredito"
                                  name="remotecosto" actionListener="#{articuloController.calcularPrecio()}"/>

                <a:messages id="msg"/>
                <a:new label="#{msg['field.idarticulo']}"

                       disabled="true"
                       id="idarticulo"
                       value="#{articuloController.articulo.idarticulo}"
                       isnew="#{articuloController.isNew()}"
                       new="#{articuloController.start()}"
                       rendererList="#{applicationMenu.articulo.list}"
                       list="#{articuloController.prepare('golist',articuloController.articulo)}"

                       />
                <b:panel title="#{app['title.data']}">



                    <b:panelGrid id="panel" colSpans="2,10" size="xs" rendered="#{articuloController.writable}"> 


                        <p:outputLabel  value="#{msg['field.descripcpion']}" />
                        <a:inputText value="#{articuloController.articulo.descripcion}"  readonly="true" id="descripcion"  label="#{msg['field.descripcion']}" />

                        <p:outputLabel value="#{msg['field.grupoarticulotitle']}"/>
                        <e:autocompletegrupoarticulo listener="#{articuloController.handleSelectGenerarDescripcion}"
                                                     value="#{articuloController.articulo.grupoarticulo}"
                                                     itemLabel=" #{p.descripcion}"
                                                     field="descripcion"
                                                     size="50"
                                                     required="true"
                                                     update=" :form:content :form:msg,:form:descripcion , :form:idarticulo"/>



                        <p:outputLabel value="#{msg['field.proveedor']}"/>
                        <e:autocompleteproveedor listener="#{articuloController.handleSelectGenerarDescripcion}"
                                                 value="#{articuloController.articulo.proveedor}"
                                                 itemLabel=" #{p.idproveedor}"
                                                 size="50"
                                                 required="true"
                                                 field="idproveedor"
                                                 update=" :form:content"/>



                        <p:outputLabel value="#{msg['field.modelo']}"/>
                        <p:autoComplete scrollHeight="250"
                                        dropdown="false" size="35"
                                        required="true"
                                        requiredMessage="#{msg['field.modelo']} #{app['info.required']}"
                                        emptyMessage="#{app['info.nohayregistros']}"
                                        value="#{articuloController.articulo.modelo}"
                                        completeMethod="#{articuloController.completeDescripcionAndModelo}"
                                        var="p" itemLabel="#{p.descripcion}" itemValue="#{p}" forceSelection="true"> 
                            <f:converter binding="#{modeloConverter}"/>
                            <f:attribute name="field" value="descripcion"/>
                            <f:attribute name="fielddropdown" value="false"/>
                            <f:attribute name="fieldquerylenth" value="1"/>
                            <p:ajax event="itemSelect" listener="#{articuloController.handleSelectGenerarDescripcion}"
                                    update=" :form:content" /> 
                            <f:facet name="itemtip">
                                <h:panelGrid columns="1" cellpadding="5">
                                    <h:outputText value="#{p.descripcion}" />
                                    <h:outputText value="#{p.idmodelo}" />
                                    <h:outputText value="#{msg['field.grupoarticulo']} #{p.grupoarticulo.descripcion}" />
                                </h:panelGrid>
                            </f:facet>
                        </p:autoComplete>

                        <p:outputLabel value="#{msg['field.tamano']}"/>
                        <e:autocompletetamano listener="#{articuloController.handleSelectGenerarDescripcion}"
                                              value="#{articuloController.articulo.tamano}"
                                              itemLabel=" #{p.descripcion}"
                                              field="descripcion"
                                              required="true"
                                              size="50"
                                              update=" :form:content"/>


                        <p:outputLabel value="#{msg['field.color']}"/>
                        <e:autocompletecolor listener="#{articuloController.handleSelectGenerarDescripcion}"
                                             value="#{articuloController.articulo.color}"
                                             itemLabel=" #{p.idcolor}"
                                             field="idcolor"
                                             required="true"
                                             update=":form:content"/>



                        <p:outputLabel value="#{msg['field.bodega']}"/>
                        <e:autocompletebodega 
                            id="bodega"
                            value="#{articuloController.articulo.bodega}"
                            itemLabel=" #{p.idbodega}"
                            dropdown="true"
                            required="true"
                            field="idbodega"
                            update=":form:bodega"/> 


                        <p:outputLabel  value="#{msg['field.cantidadexistenciainicial']}"/>
                        <p:inputText rendered="#{articuloController.writable}" id="cantidad" 
                                     value="#{articuloController.articulo.cantidad}"
                                     placeholder="#{msg['field.cantidad']}"  maxlength="55" 
                                     required="true" requiredMessage="#{msg['field.cantidad']} #{app['info.required']}"/>


                        <p:outputLabel  value="#{msg['field.reorden']}"/>
                        <p:inputText rendered="#{articuloController.writable}" id="reorden"                                           
                                     value="#{articuloController.articulo.reorden}"
                                     placeholder="#{msg['field.reorden']}"  maxlength="55" 
                                     required="true" requiredMessage="#{msg['field.reorden']} #{app['info.required']}"/>

                        <p:outputLabel value="#{msg['field.costo']}"/>

                        <b:inputText
                            id="costo" value="#{articuloController.articulo.costo}"
                            rendered="#{articuloController.writable}"

                            placeholder="#{msg['field.costo']}"  maxlength="25" 
                            onkeypress="if (event.keyCode == 13) {
                                        remotecosto();
                                        return false;
                                    }"

                            required="true" requiredMessage="#{msg['field.costo']} #{app['info.required']}">

                            <f:facet name="append">
                                <b:commandButton
                                    look="primary"
                                    iconAwesome="fa-calculator" 
                                    rendered="#{articuloController.writable}" 
                                    title="#{app['button.search']}" 
                                    action="#{articuloController.calcularPrecio()}"/>

                            </f:facet>
                        </b:inputText>



                        <p:outputLabel  value="#{msg['field.precioventapublico']}"/>
                        <p:inputText rendered="#{articuloController.writable}" id="precioventapublico" 
                                     value="#{articuloController.articulo.precioventapublico}"
                                     placeholder="#{msg['field.precioventapublico']}"
                                     maxlength="55" 
                                     readonly ="true"
                                     required="true" requiredMessage="#{msg['field.precioventapublico']} #{app['info.required']}"/>



                        <p:outputLabel  value="#{msg['field.precioventacredito']}"/>
                        <p:inputText rendered="#{articuloController.writable}" id="precioventacredito"
                                     value="#{articuloController.articulo.precioventacredito}"
                                     placeholder="#{msg['field.precioventacredito']}"  maxlength="55" 
                                     readonly ="true"
                                     required="true" requiredMessage="#{msg['field.precioventacredito']} #{app['info.required']}"/>



                        <p:outputLabel  value="#{msg['field.activo']}" />
                        <a:yesno value="#{articuloController.articulo.activo}" id="activo"  required="true"/>


                        <a:save rendered="#{articuloController.writable and applicationMenu.articulo.create}"
                                save="#{articuloController.save()}" />


                    </b:panelGrid>


                </b:panel>
                <b:tabView activeIndex="0" id="tabview" rendered="#{articuloController.writable}" >
                    <b:tab title="#{msg['tab.tamano']}">
                        <f:facet name="anchor"><b:iconAwesome name="address-card"  /></f:facet>
                        <b:panelGrid id="panel" colSpans="6,6" size="xs" > 
                            <b:inputText       

                                placeholder="#{app['info.ingresenuevodato']}"
                                value="#{tamanoController.tamano.descripcion}"                     
                                required="false"
                                mask="A{1,100}"
                                id="tamano"
                                immediate="true"
                                />


                            <b:commandButton rendered="#{articuloController.writable and applicationMenu.tamano.create}"                          
                                             value="#{app['button.save']}"
                                             iconAwesome="fa-floppy-o"
                                             title="#{app['button.save']}"
                                             process="@This,:form:tamano"
                                             action="#{tamanoController.save()}" 
                                             update=":form:content" /> 
                        </b:panelGrid>
                    </b:tab>
                </b:tabView>
            </h:panelGroup>

        </b:form>
        <a:denegado renderedcondition="#{!loginController.loggedIn or !applicationMenu.articulo.create}" />

        <br/><br/><br/>
    </ui:define>
</ui:composition>


```

Last updated