Subtipos



1)
Dado un grupo de subtipos, para incluir en el mismo subtipos inferidos (pertenecientes a la tabla extendida de la tabla base del grupo), es necesario incluir en el grupo a la(s) clave(s) foránea(s) a través de las cuales se accede a dichos atributos inferidos que se necesitan.

 Ejemplo:

 Transacción Cliente

ClienteId*
ClienteNombre
ClienteTel
PaisId
PaisNombre

 Transacción Pais

PaisId*
PaisNombre
ContinenteId
ContinenteNombre

 Transaccion Continente

ContinenteId*
ContinenteNombre

 Transaccion Factura

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).

Subtipo

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:
Los atributos coloreados en verde pertenecen a un mismo grupo de subtipos.
 Transacción Factura
 Transacción Continente