| (!******************************************************
   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'
 parameters
                              ! 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"
 end-parameters
 declarations
   L,L2: list of any
   L3: list of text or real
   LS: list of text
 end-declarations
 ! 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")
!)
 setparam("SQLverbose",true)
 ! Reading data of different types from a database
 initializations from CNCTIO
   L as "UnionTab"
   L2 as "UnionLst"
   L3 as "UnionTab"
 end-initializations
 write("L orig: ")
 forall(i in L) write (i,": ", i.typeid, "; ")
 writeln
 ! Date and time types are read in textual form 
 L(5).date:=date(text(L(5)))
 L(6).time:=time(text(L(6)))
 write("L new:  ")
 forall(i in L) write (i,": ", i.typeid, "; ")
 writeln
 ! Reading into a list defined with a restricted set of types
 write("L3:     ")
 forall(i in L3) write (i,": ", i.typeid, "; ")
 writeln
 ! Textual database types are always read as string 
 write("L2:     ")
 forall(i in L2) write (i,": ", i.typeid, "; ")
 writeln
(! Delete existing contents of result tables: 
  SQLconnect(CNCT)
  SQLexecute("delete from UnionOut")
  SQLexecute("delete from Union2Out")
  SQLdisconnect
!)
 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)"
 end-initializations
 writeln("Output to DB terminated.")
end-model
 | 
| (!******************************************************
   Mosel Example Problems
   ====================== 
   file unioninout2.mos
   ````````````````````
   Reading/writing unions from/to databases via ODBC.
   - Using SQL commands -
   
   (c) 2021 Fair Isaac Corporation
       author: S. Heipcke, Apr. 2021
*******************************************************!)
model "Union handling (SQL)"
 uses 'mmodbc', 'mmsystem'
 parameters
                              ! Use mysql database `uniondata' (not provided)
!  CNCT = 'DSN=mysql;DB=uniondata'
                              ! Use SQLite database 'uniondata.sqlite' via ODBC
!  CNCT = 'DSN=sqlite;DATABASE=uniondata.sqlite'
                              ! Use SQLite database 'uniondata.sqlite' directly 
   CNCT = "uniondata.sqlite"
 end-parameters
 procedure gendb
   declarations
     L: list of any
     tsucc: array ({false,true}) of string
   end-declarations
   tsucc(false):="failed"; tsucc(true):="succeeded"
   setparam("SQLverbose",true)
(! mysql date and time formats:
 setparam("timefmt", "%0H:%0M:%0S")
 setparam("datefmt", "%y-%0m-%0d")
 setparam("datetimefmt", "%y-%0m-%0d %0H:%0M:%0S")
!)
(! SQLite date and time formats:
   setparam("timefmt", "%0H:%0M:%0S")
   setparam("datefmt", "%y-%0m-%0d")
   setparam("datetimefmt", "%y-%0m-%0d %0H:%0M:%0S")
!)
   fdelete('uniondata.sqlite')
   SQLconnect(CNCT)
   SQLexecute("drop table UnionTab")
   SQLexecute("drop table UnionLst")
   SQLexecute("drop table UnionOut")
   SQLexecute("drop table Union2Out")
   SQLexecute("create table UnionTab (IVal integer, RVal real, BVal boolean, SVal varchar(20), DVal date, TVal timestamp(3))")  !sqlite
 !  SQLexecute("create table UnionTab (IVal integer, RVal real, BVal boolean, SVal varchar(20), DVal date, TVal time(3))")   !mysql
   writeln(" - Create UnionTab (",tsucc(getparam("SQLsuccess")),")")
   SQLexecute("insert into UnionTab (IVal,RVal,SVal,BVal,TVal,DVal) values(?1,?2,?3,?4,?5,?6)", [ 5, 1.75, "some text", true, '11:25:30', '2021-03-20' ])
   writeln(" - Insert values into UnionTab (",tsucc(getparam("SQLsuccess")),",",
        getparam("SQLrowcnt"),'/',getparam("SQLrowxfr")," rows)")
 
   SQLexecute("create table UnionLst (UValues varchar(20))")
   writeln(" - Create UnionLst (",tsucc(getparam("SQLsuccess")),")")
   SQLexecute("insert into UnionLst (UValues) values (?1)", [string(5), string(1.75), string(true), "some text", '2021-03-20', '11:25:30'])
   writeln(" - Insert values into UnionLst (",tsucc(getparam("SQLsuccess")),",",
        getparam("SQLrowcnt"),'/',getparam("SQLrowxfr")," rows)")
   SQLexecute("create table UnionOut (IVal integer, RVal real, BVal boolean, SVal varchar(20), DVal date, TVal timestamp(3))")  !sqlite
 !  SQLexecute("create table UnionOut (IVal integer, RVal real, BVal boolean, SVal varchar(20), DVal date, TVal time(3))")   !mysql
   writeln(" - CreateUnionOut (",tsucc(getparam("SQLsuccess")),")")
   SQLexecute("create table Union2Out (UnionValues varchar(20))")
   writeln(" - Create Union2Out (",tsucc(getparam("SQLsuccess")),")")
   SQLdisconnect
 end-procedure
! gendb
 declarations
   L,L2: list of any
   L3: list of text or real
   LS: list of text
 end-declarations
 setparam("SQLverbose",true)
 setparam("SQLdebug",true)
 SQLconnect(CNCT)
 ! Reading data of different types from a database
 SQLexecute("select * from UnionTab", L)
 write("L orig: ")
 forall(i in L) write (i,": ", i.typeid, "; ")
 writeln
 ! Date and time types are read in textual form 
 L(5).date:=date(text(L(5)))
 L(6).time:=time(text(L(6)))
 write("L new:  ")
 forall(i in L) write (i,": ", i.typeid, "; ")
 writeln
 ! Reading into a list defined with a restricted set of types
 SQLexecute("select * from UnionTab", L3)
 write("L3:     ")
 forall(i in L3) write (i,": ", i.typeid, "; ")
 writeln
 ! Textual database types are always read as string 
 SQLexecute("select * from UnionLst", L2)
 write("L2:     ")
 forall(i in L2) write (i,": ", i.typeid, "; ")
 writeln
 ! Writing data of type 'any' to a database
 SQLexecute("delete from UnionOut")
 SQLexecute("insert into UnionOut (IVal,RVal,BVal,SVal,DVal,TVal) values(?1,?2,?3,?4,?5,?6)", L)
 writeln(" - writing L into UnionOut succeeded (",getparam("SQLsuccess"),")")
 ! Writing data of type 'any' into textual fields of a database
 SQLexecute("delete from Union2Out")
 SQLexecute("insert into Union2Out (UnionValues) values(?1)", L)
 writeln(" - writing L into Union2Out succeeded (",getparam("SQLsuccess"),")")
 ! Writing data of a union type to a database
 SQLexecute("insert into UnionOut (IVal,RVal,BVal,SVal,DVal,TVal) values(?1,?2,?3,?4,?5,?6)", L3)
 writeln(" - writing L3 into UnionOut succeeded (",getparam("SQLsuccess"),")")
 ! Writing text-format data to a database table with various different types
 LS:=sum(i in L) [text(i)]
 SQLexecute("insert into UnionOut (IVal,RVal,BVal,SVal,DVal,TVal) values(?1,?2,?3,?4,?5,?6)", LS)
 writeln(" - writing LS into UnionOut succeeded (",getparam("SQLsuccess"),")")
 SQLdisconnect
end-model
 | 
| (!******************************************************
   Mosel Example Problems
   ====================== 
   file unioninout3.mos
   ````````````````````
   Reading/writing unions from/to
   spreadsheets or databases.
   - Using 'initializations from' with the excel driver -
   
   (c) 2021 Fair Isaac Corporation
       author: S. Heipcke, Apr. 2021
*******************************************************!)
model "Union handling (Excel)"
uses 'mmsheet','mmsystem'
 parameters
  CSTR= 'mmsheet.excel:uniondata.xlsx'
  CSTR_OUT= 'mmsheet.excel:uniondataout.xlsx'
 end-parameters
 function convertexceltime(r: real): time
   ra:=abs(r)
   if ra<1 then
     returned:=time(round(ra*24*60*60*1000))
   else
     returned:=time(round((ra-floor(ra))*24*60*60*1000))
   end-if
 end-function
 declarations
   L,L2,L3: list of any
   LU: list of text or real
   LU2: list of text or real or boolean
 end-declarations
! Reading data of different types from an Excel file
 initializations from CSTR
   L as "skiph;[A:A]"
   L2 as "skiph;[C:C]"
   L3 as "skiph;[E:E]"
   LU as "skiph;[C:C]"   ! This would fail to read from [A:A] due to missing boolean type
   LU2 as "skiph;[A:A]"   
 end-initializations
 write("L orig: ")
 forall(i in L) write (i,": ", i.typeid, "; ")
 writeln
! Date types are read in textual form, time types have a numerical value 
 L(5).date:=date(L(5).string)
 L(6).time:=convertexceltime(L(6).real)
 write("L new:  ")
 forall(i in L) write (i,": ", i.typeid, "; ")
 writeln
! List defined with a restricted set of types
 write("LU:     ")
 forall(i in LU) write (i,": ", i.typeid, "; ")
 writeln
 write("LU2:    ")
 forall(i in LU2) write (i,": ", i.typeid, "; ")
 writeln
 ! Contents formated as 'text'
 write("L2:     ")
 forall(i in L2) write (i,": ", i.typeid, "; ")
 writeln
 ! Contents formated as 'text' enforced via preceding apostrophe
 write("L3:     ")
 forall(i in L3) write (i,": ", i.typeid, "; ")
 writeln
 ! The 'msheet.excel' driver does not create files
 fcopy("uniondata.xlsx","uniondataout.xlsx")
 ! Writing data of type 'any' to an Excel file
 initializations to CSTR_OUT
   L as "[Output$A:A]"
   LU as "[Output$R1C3:R1C"+(2+LU.size)+"]"
 end-initializations
end-model
 | 
| (!******************************************************
   Mosel Example Problems
   ====================== 
   file unioninout4.mos
   ````````````````````
   Reading/writing unions from/to an Oracle database.
   - Using 'initializations' and OCI statements -
   
   (c) 2021 Fair Isaac Corporation
       author: S. Heipcke, Apr. 2021
*******************************************************!)
model "Union handling (OCI)"
 uses "mmoci", "mmsystem"
 parameters
  DB="myname/mypassword@dbname"     ! Login to Oracle database (not provided)
 end-parameters
 procedure gendb
   declarations
     L: list of any
     tsucc: array ({false,true}) of string
   end-declarations
   tsucc(false):="failed"; tsucc(true):="succeeded"
   setparam("OCIverbose",true)
  ! Oracle date and time formats:
   setparam("timefmt", "%0d-%N-%0Y %0h.%0M.%0S.%0s %P")
   setparam("datefmt", "%0d-%N-%0Y")
   setparam("datetimefmt", "%0d-%N-%0Y %0h.%0M.%0S.%0s %P")
   OCIlogon(DB)
(!
   OCIexecute("drop table UnionTab")
   OCIexecute("drop table UnionLst")
   OCIexecute("drop table UnionOut")
   OCIexecute("drop table Union2Out")
!)
   OCIexecute("create table UnionTab (IVal integer, RVal float, BVal number(1,0), SVal varchar(20), DVal date, TVal timestamp(3))")
   writeln(" - Create UnionTab (",tsucc(getparam("OCIsuccess")),")")
   OCIexecute("insert into UnionTab (IVal,RVal,SVal,BVal,TVal,DVal) values(:1,:2,:3,:4,:5,:6)", [ 5, 1.75, "some text", true, '1-Jan-1 11:25:30am', '20-Mar-2021' ])
   writeln(" - Insert values into UnionTab (",tsucc(getparam("OCIsuccess")),",",
        getparam("OCIrowcnt"),'/',getparam("OCIrowxfr")," rows)")
 
   OCIexecute("create table UnionLst (UValues varchar(20))")
   writeln(" - Create UnionLst (",tsucc(getparam("OCIsuccess")),")")
   OCIexecute("insert into UnionLst (UValues) values (:1)", [string(5), string(1.75), string(true), "some text", '20-Mar-2021', '1-Jan-0 11:25:30am'])
   writeln(" - Insert values into UnionLst (",tsucc(getparam("OCIsuccess")),",",
        getparam("OCIrowcnt"),'/',getparam("OCIrowxfr")," rows)")
   OCIexecute("create table UnionOut (IVal integer, RVal float, BVal number(1,0), SVal varchar(20), DVal date, TVal timestamp(3))")
   writeln(" - CreateUnionOut (",tsucc(getparam("OCIsuccess")),")")
   OCIexecute("create table Union2Out (UnionValues varchar(25))")
   writeln(" - Create Union2Out (",tsucc(getparam("OCIsuccess")),")")
   OCIlogoff
 end-procedure
 gendb
 declarations
   L,L2: list of any
   L3: list of text or real
   LS: list of text
 end-declarations
 
 setparam("OCIverbose",true)
 setparam("OCIdebug",true)
 OCIlogon(DB)
 ! Reading data of different types from a database
 OCIexecute("select * from UnionTab", L)
 write("L orig: ")
 forall(i in L) write (i,": ", i.typeid, "; ")
 writeln
 ! Date and time types are read in textual form 
 L(5).date:=date(text(L(5)))
 L(6).datetime:=datetime(text(L(6)))
 write("L new:  ")
 forall(i in L) write (i,": ", i.typeid, "; ")
 writeln
 ! Reading into a list defined with a restricted set of types
 OCIexecute("select * from UnionTab", L3)
 write("L3:     ")
 forall(i in L3) write (i,": ", i.typeid, "; ")
 writeln
 ! Textual database types are always read as string 
 OCIexecute("select * from UnionLst", L2)
 write("L2:     ")
 forall(i in L2) write (i,": ", i.typeid, "; ")
 writeln
 ! Writing data of type 'any' to a database
 OCIexecute("delete from UnionOut")
 OCIexecute("insert into UnionOut (IVal,RVal,BVal,SVal,DVal,TVal) values(:1,:2,:3,:4,:5,:6)", L)
 writeln(" - writing L into UnionOut succeeded (",getparam("OCIsuccess"),")")
 ! Writing data of type 'any' into textual fields of a database
 OCIexecute("delete from Union2Out")
 OCIexecute("insert into Union2Out (UnionValues) values(:1)", L)
 writeln(" - writing L into Union2Out succeeded (",getparam("OCIsuccess"),")")
 ! Writing data of a union type to a database
 OCIexecute("insert into UnionOut (IVal,RVal,BVal,SVal,DVal,TVal) values(:1,:2,:3,:4,:5,:6)", L3)
 writeln(" - writing L3 into UnionOut succeeded (",getparam("OCIsuccess"),")")
 ! Writing text-format data to a database table with various different types
 LS:=sum(i in L) [text(i)]
 OCIexecute("insert into UnionOut (IVal,RVal,BVal,SVal,DVal,TVal) values(:1,:2,:3,:4,:5,:6)", LS)
 writeln(" - writing LS into UnionOut succeeded (",getparam("OCIsuccess"),")")
 OCIlogoff
end-model
 | 
| (!******************************************************
   Mosel Example Problems
   ====================== 
   file unioninout5.mos
   ````````````````````
   Reading/writing unions from/to spreadsheets.
   - Using 'initializations from' with the xls/xlsx driver -
   
   (c) 2021 Fair Isaac Corporation
       author: S. Heipcke, Apr. 2021
*******************************************************!)
model "Union handling (generic spreadsheet)"
 uses "mmsheet", "mmsystem"
 parameters
  CSTR_IN= 'mmsheet.xls:uniondata.xls'
!  CSTR_IN= 'mmsheet.xlsx:uniondata.xlsx'
  CSTR_OUT= 'mmsheet.xls:uniondataout.xls'
!  CSTR_OUT= 'mmsheet.xlsx:uniondataout.xlsx'
 end-parameters
 
 declarations
   L,L2,L3: list of any
   LU: list of text or real
   LU2: list of text or real or boolean
 end-declarations
! Date and time formats (make sure to use the default format of mmsystem,
! not the format used for display in the spreadsheet)
 setparam("timefmt", "%0H:%0M:%0S")
 setparam("datefmt", "%.y-%0m-%0d")
 setparam("datetimefmt", "%.y-%0m-%0dT%0H:%0M:%0S")
! Reading data of different types from a spreadsheet file
 initializations from CSTR_IN
   L as "skiph;[A:A]"
   L2 as "skiph;[C:C]"
   L3 as "skiph;[E:E]"
   LU as "skiph;[C:C]"   ! This would fail to read from [A:A] due to missing boolean type
   LU2 as "skiph;[A:A]"   
 end-initializations
 write("L orig: ")
 forall(i in L) write (i,": ", i.typeid, "; ")
 writeln
! Date and time types are read in textual form 
 L(5).date:=date(L(5).string)
 L(6).time:=time(L(6).string)
 write("L new:  ")
 forall(i in L) write (i,": ", i.typeid, "; ")
 writeln
! List defined with a restricted set of types
 write("LU:     ")
 forall(i in LU) write (i,": ", i.typeid, "; ")
 writeln
 write("LU2:    ")
 forall(i in LU2) write (i,": ", i.typeid, "; ")
 writeln
 ! Contents formated as 'text'
 write("L2:     ")
 forall(i in L2) write (i,": ", i.typeid, "; ")
 writeln
 ! Contents formated as 'text' enforced via preceding apostrophe
 write("L3:     ")
 forall(i in L3) write (i,": ", i.typeid, "; ")
 writeln
 ! Writing data of type 'any' to a spreadsheet file
 initializations to CSTR_OUT
   L as "[]"
   LU as "[R1C3:R1C"+(2+LU.size)+"]"
 end-initializations
end-model
 |