Data output to text files, spreadsheets and databases, and to memory
|  | |
| Type: | Programming | 
| Rating: | 3 (intermediate) | 
| Description: | This example shows different ways of writing out data from a Mosel model, namely to 
 Accessing spreadsheets and databases Using initializations to data is written to spreadsheets or databases through the ODBC connector in a similar way as text files are accessed; all necessary SQL commands are generated automatically. With the extended filename to "mmodbc.odbc:data.mdb" the data will be written to the MS Access database data.mdb and the string "mmodbc.odbc:DSN=mysql;DB=data" could be used to access a mysql database named data. Instead of using an initializations block, we may write out data from a Mosel model directly with the corresponding SQL statements (this makes it possible, for example, to clear the data table before writing to it - this functionality is not available with spreadsheets) When working with Excel spreadsheets it is recommended to use one of the dedicated spreadsheet drivers from the mmsheet module: with the excel driver, the spreadsheet may remain open while writing to it from a Mosel model, in this case the data written out to the spreadsheet does not get saved, making it possible to re-run the application with different data sets without causing any lasting modifications to your spreadsheet. All other spreadsheet drivers require the spreadsheet file to be closed. The xls/xlsx drivers do not require an installation of Excel and are available for certain non-Windows platforms. The module mmoci (requires a separate license) defines a software-specific interface to Oracle databases that is used in a similar way as the ODBC connection provided through mmmodbc. With initializations to an extended filename will take a form like "mmoci.oci:debug;myname/mypassword@dbname" and it is equally possible to use PL/SQL statements directly. Data output in memory using I/O drivers Using initializations to it is also possible to send data from a Mosel model in memory to the calling application (C/C++, C# or Java). This is done using a combination of the I/O drivers mem (data held in memory) and raw driver (data in binary format) in C, drivers dotnet and dotnetraw in C# programs and drivers java and jraw in Java programs. Other options for data output Other possibilities of outputting data from a Mosel model include 
 | 
| File(s): | duo_out.mos, duosheet_out.mos, duoexc_out.mos, duooci_out.mos | 
| Data file(s): | data.csv, data.xls, data.xlsx, data.mdb, data.sqlite | 
|  | |
| duo_out.mos | 
| (!******************************************************
   Mosel Example Problems
   ====================== 
   file duo_out.mos 
   ```````````````` 
   Two ways of writing data to spreadsheets or 
   databases via ODBC.
 
   (c) 2008 Fair Isaac Corporation
       author: S. Heipcke, 2006, rev. Jan. 2014
*******************************************************!)
model "Duo output (ODBC)"
 uses "mmodbc"
 parameters
                                 ! Use Excel spreadsheet `data.xls'
!  CNCT = 'DSN=Excel Files;DBQ=C:/xpress/examples/mosel/WhitePapers/MoselODBC/data.xls'
!  CNCT = 'data.xls'
!  CNCTIO = "data.xls"
                                 ! Use Access database `data.mdb'
!  CNCT = 'DSN=MS Access Database;DBQ=C:/xpress/examples/mosel/WhitePapers/MoselODBC/data.mdb'
  CNCT = 'data.mdb'
  CNCTIO = "debug;data.mdb"
                                 ! Use mysql database `data' (not provided)
!  CNCT = 'DSN=mysql;DB=data'
!  CNCTIO = "debug;DSN=mysql;DB=data"
                                 ! Use SQLite database `data.sqlite' via ODBC
!  CNCT = 'DSN=sqlite;DATABASE=data.sqlite'
!  CNCTIO = "debug;DSN=sqlite;DATABASE=data.sqlite"
                                 ! Use SQLite database `data.sqlite' directly
!  CNCT = 'data.sqlite'
!  CNCTIO = "debug;data.sqlite"
 end-parameters
 declarations
  A: array(-1..1,5..7) of real
 end-declarations
 A :: [ 2,  4,  6,
       12, 14, 16,
       22, 24, 26]
! First method: use an initializations block with the odbc driver
! ATTENTION: results from previous runs must be removed previously;
! otherwise the new results will either be appended to the existing ones
! or, if one of the fields has been defined as a key field in a database,
! the insertion will fail.
 initializations to "mmodbc.odbc:"+CNCTIO
  A as "MyOutTable1"
 end-initializations
! Second method: use SQL statements 
 SQLconnect(CNCT)
 SQLexecute("delete from MyOutTable2") ! Cleaning up previous results: works
                                       ! only for databases, cannot be used
                                       ! with spreadsheets (instead, delete
                                       ! previous solutions directly in the
                                       ! spreadsheet file)
 SQLexecute("insert into MyOutTable2 (Index1,Index2,AValue) values (?,?,?)", A)
 SQLdisconnect
end-model
 | 
| duosheet_out.mos | 
| (!******************************************************
   Mosel Example Problems
   ====================== 
   file duosheet_out.mos 
   ````````````````````` 
   Writing data to spreadsheets using the 
   generic spreadsheet drivers.
 
   (c) 2012 Fair Isaac Corporation
       author: S. Heipcke, Dec. 2012
*******************************************************!)
model "Duo output (generic spreadsheet)"
 uses "mmsheet"
 parameters
  CNCTIO1 = "data.xls"           ! Use Excel spreadsheet `data.xls'
  CNCTIO2 = "data.xlsx"          ! Use Excel spreadsheet `data.xlsx'
  CNCTIO3 = "data.csv"           ! Use spreadsheet `data.csv'
 end-parameters
 declarations
  A: array(-1..1,5..7) of real
 end-declarations
 A :: [ 2,  4,  6,
       12, 14, 16,
       22, 24, 26]
! Use the xlsx driver:
! Data writing always starts at the same point, that is, results from 
! previous runs will be overwritten
! Options: skiph - skip the header line (first line of specified range)
!          grow  - start line of output range is selected, grow on demand
 initializations to "mmsheet.xls:"+CNCTIO1
  A as 'skiph;grow;MyOutTable1'
 end-initializations
(!
! Alternatively:
 initializations to "mmsheet.xls:"+CNCTIO1
  A as 'grow;MyOutTable3'
 end-initializations 
! Or: 
 initializations to "mmsheet.xls:"+CNCTIO1
  A as '[Sheet1$F3:H11]'
 end-initializations
!)
! Use the xlsx driver:
 initializations to "mmsheet.xlsx:"+CNCTIO2
  A as 'skiph;grow;MyOutTable1'
 end-initializations
! Use the csv driver:
 initializations to "mmsheet.csv:"+CNCTIO3
  A as 'grow;[F3:H3]'
 end-initializations
! **** Creating a new file ****
! Use the xls driver:
 initializations to "mmsheet.xls:anewfile.xls"
  A as 'skiph+;grow;[1$F:H](Index1,Index2,Value_of_A)'
 end-initializations
! Use the xlsx driver:
 initializations to "mmsheet.xlsx:anewfile.xlsx"
  A as 'skiph+;grow;[1$F:H](Index1,Index2,Value_of_A)'
 end-initializations
! Use the csv driver:
 initializations to "mmsheet.csv:anewfile.csv"
  A as 'skiph+;grow;[F:H](Index1,Index2,Value_of_A)'
 end-initializations
end-model
 | 
| duoexc_out.mos | 
| (!******************************************************
   Mosel Example Problems
   ====================== 
   file duoexc_out.mos 
   ``````````````````` 
   Writing data to Excel spreadsheets using the 
   excel IO driver.
 
   (c) 2008 Fair Isaac Corporation
       author: S. Heipcke, 2007, rev. Dec. 2012
*******************************************************!)
model "Duo output (Excel)"
 uses "mmsheet"
 parameters
  CNCT = 'data.xls'
 end-parameters
 declarations
  A: array(-1..1,5..7) of real
 end-declarations
 A :: [ 2,  4,  6,
       12, 14, 16,
       22, 24, 26]
! Use an initializations block with the excel driver:
! data writing always starts at the same point, that is, results from 
! previous runs will be overwritten
! Options: skiph - skip the header line (first line of specified range)
!          grow  - start line of output range is selected, grow on demand
 initializations to "mmsheet.excel:" + CNCT
  A as 'skiph;grow;MyOutTable1'
 end-initializations
(!
! Alternatively:
 initializations to "mmsheet.excel:" + CNCT
  A as 'grow;MyOutTable3'
 end-initializations 
! Or: 
 initializations to "mmsheet.excel:" + CNCT
  A as '[Sheet1$F3:H11]'
 end-initializations
!)
end-model
 | 
| duooci_out.mos | 
| (!******************************************************
   Mosel Example Problems
   ====================== 
   file duooci_out.mos 
   ``````````````````` 
   Two ways of writing data to Oracle databases.
 
   (c) 2008 Fair Isaac Corporation
       author: S. Heipcke, Jan. 2007
*******************************************************!)
model "Duo output (OCI)"
 uses "mmoci"
 parameters
  CNCT = 'myname/mypassword@dbname'
 end-parameters
 declarations
  A: array(-1..1,5..7) of real
 end-declarations
 A :: [ 2,  4,  6,
       12, 14, 16,
       22, 24, 26]
! First method: use an initializations block with the oci driver
! ATTENTION: results from previous runs must be removed previously;
! otherwise the new results will either be appended to the existing ones
! or, if one of the fields has been defined as a key field in the database,
! the insertion will fail.
 initializations to "mmoci.oci:debug;"+CNCT
  A as "MyOutTable1"
 end-initializations
! Second method: use SQL statements 
 OCIlogon(CNCT)
 OCIexecute("delete from MyOutTable2") ! Cleaning up previous results: works
                                       ! only for databases, cannot be used
                                       ! with spreadsheets (instead, delete
                                       ! previous solutions directly in the
                                       ! spreadsheet file)
 OCIexecute("insert into MyOutTable2 (Index1,Index2,AValue) values (:1,:2,:3)", A)
! Alternatively:
! OCIexecute("update MyOutTable2 set AValue=:3 where Index1=:1 and Index2=:2", A)
 OCIlogoff
end-model
**************************************************
! Creation of the output tables in an Oracle database:
 declarations
  tsucc: array ({false,true}) of string
 end-declarations
 tsucc(false):="failed"; tsucc(true):="succeeded"
 OCIexecute("create table MyOutTable1 (Index1 integer, Index2 integer, Value float)")
 writeln(" - Create MyOutTable1 (",tsucc(getparam("OCIsuccess")),")")
 OCIexecute("create table MyOutTable2 (Index1 integer, Index2 integer, AValue float)")
 writeln(" - Create MyOutTable2 (",tsucc(getparam("OCIsuccess")),")")
 | 
 
