joinColumn

Le joinColumn sono colonne virtuali che non si basano su un valore «vero» di partenza, come invece fanno le altre colonne virtuali , ma su un valore che è desunto dalle condizioni settate nella relation.

Permettono quindi di combinare i dati da due o più tabelle basandosi su una condizione che specifica come le righe delle tabelle sono correlate tra loro. La joinColumn viene valorizzata specificando una condizione (cnd) che andiamo a definire nella relazione.

Supponiamo di avere in Sandbox una tabella listino che permette di indicare per un certo prodotto un prezzo_personalizzato a seconda del cliente_tipo_codice:

class Table(object):
  def config_db(self,pkg):
      tbl=pkg.table('listino', pkey='id', name_long='Listino', name_plural='Listini',caption_field='caption')
      self.sysFields(tbl)

      tbl.column('prodotto_id', size='22', name_long='Prodotto'
                 ).relation('prodotto.id', relation_name='listini')
      tbl.column('cliente_tipo_codice', size=':5', name_long='Tipo cliente'
                 ).relation('cliente_tipo.codice', relation_name='listini')
      tbl.column('prezzo_personalizzato', dtype='money', name_long='Prezzo personalizzato',
                 defaultFrom='@prodotto_id.prezzo_unitario')

      tbl.column('data_inizio', dtype='D', name_long='Data inizio')
      tbl.column('data_fine', dtype='D', name_long='Data fine')

      tbl.formulaColumn('caption', "$cliente_tipo_codice || ' - ' ||@prodotto_id.codice")

È a questo punto possibile individuare nella fattura_riga, partendo dalla data e dal cliente di una fattura, il prezzo di listino personalizzato per i clienti di quella categoria:

tbl.joinColumn('prezzo_listino', name_long='Prezzo listino'
                  ).relation('listino.prezzo_personalizzato',
                  cnd="""@prezzo_listino.prodotto_id=$prodotto_id AND
                          @prezzo_listino.cliente_tipo_codice=@fattura_id.@cliente_id.cliente_tipo_codice AND
                          @fattura_id.data BETWEEN @prezzo_listino.data_inizio AND @prezzo_listino.data_fine""")

Suggerimento

Si noti che ai fini della joinColumn non è richiesta una formula o un path relazionale ma la valorizzazione è il risultato della condizione specificata nella relazione

Il prezzo di listino può a questo punto essere un riferimento per impostare un prezzo di default o può semplicemente essere visualizzato come termine di paragone rispetto al prezzo unitario che si sta impostando nella riga fattura.


Parametri:

Nome parametro

Tipo

Descrizione

cnd

T

Permette di identificare una condition finalizzata a valorizzare la relazione

Autore della sezione: Davide Paci