Crear registros de entitys diferentes en el mismo formulario
PreviousDos campos como campo llaveNextFormulario con llave secundaria sin mostrar autoincrementable
Last updated
Was this helpful?
Last updated
Was this helpful?
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>
```