FacturaId*
FacturaFch
ClienteId
ClienteNombre
ClienteTel
PaisId
PaisNombre
ContinenteId
ContinenteNombre
FacturaPaisId
FacturaPaisNombre
FacturaContinenteId
FacturaContinenteNombre
Es decir, el grupo de subtipos definido es:
Grupo de subtipos: FacturaPais
Con este diseño del ejemplo, se define que cada factura tiene un cliente (el cual tiene un país que pertenece a un continente) y que la factura por su parte tiene un país asociado (el país de emisión de la factura, el cual pertenece a un continente).
FacturaPaisId: subtipo de PaisId Primario
FacturaPaisNombre: subtipo de PaisNombre Inferido
FacturaContinenteId: subtipo de ContinenteId Inferido
FacturaContinenteNombre: subtipo de ContinenteNombre Inferido
En la transacción ?Factura? había necesidad de inferir el nombre del continente correspondiente al país de la factura (FacturaContinenteNombre). Y para ello fue necesario incluir en el grupo, así como en la transacción, tanto al atributo que se deseaba inferir (subtipo inferido FacturaContinenteNombre) como a la clave foránea a través de la cual se accede a dicho atributo (FacturaContinenteId).
De olvidar este concepto, en tiempo de especificación saldrán advertencias y/o errores indicando que atributos subtipos no podrán ser instanciados y/o modificados (en caso de haberles hecho alguna asignación, suma, resta, etc.).
Concluyendo, si en algún objeto GX (de cualquier tipo, es decir: reportes, procedimientos, etc) se necesita referenciar subtipos inferidos, será necesario incluir en el grupo de subtipos y en la transacción asociada a dicho grupo de subtipos a:
· los subtipos inferidos
· la(s) clave(s) foránea(s) a través de las cuales se accede a dichos atributos inferidos
2) Es importante recordar también lo siguiente.
Si desde una tabla ORIGEN se llega a una tabla DESTINO navegando por su extendida por más de un camino (uno a través del supertipo y el otro a través de subtipos), es necesario indicarle a GeneXus cuál es el camino por el cual queremos navegar (si por el camino del subtipo o por el del supertipo).
Ejemplo: Queremos un listado de todas las FACTURAS por CONTINENTE (teniendo en cuenta el PAIS en el cual fue emitida la FACTURA, es decir, queremos hacer el camino marcado en rojo en el diagrama de abajo).
El listado (haciendo JOIN) correcto, es el siguiente:
For each ContinenteI
Print Continente
&Continente =ContinenteId
For each
Where FacturaContinenteId = &Continente //al mencionar el subtipo, le indico que navegue a través del continente correspondiente
al país de emisión de la factura (y no a través del continente correspondiente al país del cliente de la factura)}
Print Factura
Endfor
Endfor
For each ContinenteId
Print Continente
For each
Print Factura
Endfor
Endfor
Nota: otra solución válida sería hacienda un corte de control por FacturaContinenteId en FACTURAS.
Esta solución es incorrecta porque se está haciendo un JOIN automático entre CONTINENTE y FACTURA a través del supertipo (ContinenteId, que se refiere al continente correspondiente al país del cliente de la factura. Es decir, a la nacionalidad del cliente y no al país de emisión de la Factura). El listado INCORRECTO es el siguiente: