FICO Xpress Optimization Examples Repository
FICO Optimization Community FICO Xpress Optimization Home
Back to examples browserPrevious exampleNext example

Reading and writing union types

A union is a container capable of holding an object of one of a predefined set of types. Its declaration specifies the set of compatible types or the predefined union type 'any'. The examples display the resulting types when populating union type entities from external data sources. It is also shown how to convert the type of union entities from textual types to 'date' or 'time' types as defined by the Mosel module mmsystem.
  • The model version in unioninout1.mos shows how to work with Mosel's text data file format.
  • Databases can be accessed from Mosel through an ODBC connection using the odbc driver (unioninout.mos) or with SQL statements (unioninout2.mos).
  • For Oracle databases a software-specific connection is provided by the module mmoci (unioninout4.mos).
  • Microsoft Excel spreadsheets can be accessed via the software-specific driver excel (unioninout3.mos). Alternatively, models can use the dedicated I/O drivers xsl/xlsx (unioninout5.mos) from the mmsheet module that support manipulating spreadsheet files on various platforms without having to install Microsoft Excel.
  • Module mmsheet also provides an I/O driver for csv files (unioninout6.mos).
Further explanation of this example: Xpress Whitepaper 'Using ODBC and other database interfaces with Mosel', Section Examples - Working with union types.

Source Files

Data Files


   Mosel Example Problems

   file unioninout.mos
   Reading/writing unions from/t databases via ODBC.
   - Using 'initializations from' with odbc IO driver -
   (c) 2021 Fair Isaac Corporation
       author: S. Heipcke, Apr. 2021
model "Union handling (ODBC)"
 uses 'mmodbc', 'mmsystem'

                              ! Use mysql database `uniondata' (not provided)
!  CNCTIO = 'mmodbc.odbc:debug;DSN=mysql;DB=uniondata'
                              ! Use SQLite database 'uniondata.sqlite' via ODBC
!  CNCTIO = 'mmodbc.odbc:debug;DSN=sqlite;DATABASE=uniondata.sqlite'
                              ! Use SQLite database 'uniondata.sqlite' directly
   CNCTIO = "mmodbc.odbc:debug;uniondata.sqlite"

   L,L2: list of any
   L3: list of text or real
   LS: list of text

 ! Date and time formats
(! Access and Excel:
 setparam("timefmt", "%y-%0m-%0d %0H:%0M:%0S")
 setparam("datefmt", "%y-%0m-%0d")
 setparam("datetimefmt", "%y-%0m-%0d %0H:%0M:%0S")
(! mysql:
 setparam("timefmt", "%0H:%0M:%0S")
 setparam("datefmt", "%y-%0m-%0d")
 setparam("datetimefmt", "%y-%0m-%0d %0H:%0M:%0S")
(! SQLite:
 setparam("timefmt", "%0H:%0M:%0S")
 setparam("datefmt", "%y-%0m-%0d")
 setparam("datetimefmt", "%y-%0m-%0d %0H:%0M:%0S")


 ! Reading data of different types from a database
 initializations from CNCTIO
   L as "UnionTab"
   L2 as "UnionLst"
   L3 as "UnionTab"

 write("L orig: ")
 forall(i in L) write (i,": ", i.typeid, "; ")
 ! Date and time types are read in textual form
 write("L new:  ")
 forall(i in L) write (i,": ", i.typeid, "; ")

 ! Reading into a list defined with a restricted set of types
 write("L3:     ")
 forall(i in L3) write (i,": ", i.typeid, "; ")

 ! Textual database types are always read as string
 write("L2:     ")
 forall(i in L2) write (i,": ", i.typeid, "; ")

(! Delete existing contents of result tables: 
  SQLexecute("delete from UnionOut")
  SQLexecute("delete from Union2Out")
 LS:=sum(i in L) [text(i)]

 initializations to CNCTIO
  ! Writing data of type 'any' to a database table with various different types
   L as "UnionOut(IVal,RVal,BVal,SVal,DVal,TVal)"
  ! Writing data of type 'any' into textual fields of a database
   L as "Union2Out"
  ! Writing data of a union type to a database
   L3 as "UnionOut(IVal,RVal,BVal,SVal,DVal,TVal)"
  ! Writing text-format data to a database table with various different types
   LS as "UnionOut(IVal,RVal,BVal,SVal,DVal,TVal)"

 writeln("Output to DB terminated.")


Back to examples browserPrevious exampleNext example