2015-08-19 12:17:02 +00:00
///
2019-02-06 09:34:43 +00:00
/// Copyright (c) 2015-2019 Sensus Slovensko a.s.
2015-08-19 12:17:02 +00:00
///
using System ;
using System.Collections.Generic ;
using System.IO ;
2018-09-19 05:50:49 +00:00
using System.Linq ;
2015-08-19 12:17:02 +00:00
using log4net ;
2015-08-19 15:45:29 +00:00
using Oracle.DataAccess.Client ; // ODP.NET Oracle managed provider
2016-08-02 21:08:16 +00:00
using Config ;
2015-12-04 16:17:20 +00:00
using Config.Entities ;
2015-08-19 12:17:02 +00:00
2018-09-11 11:39:33 +00:00
namespace TBF.BenchControl.Output.DB.SensusOracle
2015-08-19 12:17:02 +00:00
{
2016-01-08 09:23:36 +00:00
public enum Retv
2015-12-18 18:05:13 +00:00
{
OK ,
Error ,
}
2019-01-09 12:48:51 +00:00
public class Database : ComponentBase , IOperation , GenericDevices . IResultsWriter , GenericDevices . IStartInfoReader , Generic . IDevice
2015-08-19 12:17:02 +00:00
{
private static readonly ILog log = LogManager . GetLogger ( typeof ( Database ) ) ;
2019-02-06 09:34:43 +00:00
public override string ToString ( ) { return string . Format ( "{0}({1})" , GetType ( ) . Namespace . Substring ( 17 ) , Cfg . ToString ( 1 ) ) ; }
2015-08-19 12:17:02 +00:00
2018-09-11 11:39:33 +00:00
const int Anbid_StaraTura = 4 ;
public DatabaseCfg dbCfg ;
2019-01-09 12:48:51 +00:00
2017-11-10 09:32:43 +00:00
enum CurrentOp
{
None ,
CheckBarcodeScanning ,
WriteResults ,
2019-01-09 12:48:51 +00:00
ReadStartInfo ,
2017-11-10 09:32:43 +00:00
}
CurrentOp currentOp ;
bool opCompleted ;
bool anyError ;
///
/// iPerls to verify
///
GenericDevices . IRegisterReader [ ] iperlHeads ;
2015-08-19 12:17:02 +00:00
2019-01-23 07:34:31 +00:00
/// <summary>
/// Start info is read into WaterMeter objects referenced by this array
/// </summary>
Results . Entities . WaterMeter [ ] waterMeters ;
2015-08-19 12:17:02 +00:00
/// <summary>
/// Results to print
/// </summary>
2016-01-06 21:37:19 +00:00
Results . Entities . Batch batch ;
2016-02-09 07:31:14 +00:00
OracleConnection connection ; /// Oracle database connection
2017-11-10 09:32:43 +00:00
2019-01-23 07:34:31 +00:00
///
2019-02-06 09:34:43 +00:00
/// The following 3 variables are always updated together
2019-01-23 07:34:31 +00:00
///
2019-02-06 09:34:43 +00:00
int wmTypeId ;
int wmTypeRevision ;
2019-01-23 07:34:31 +00:00
SensusTestInfo [ ] completeTestInfos ; /// Contains (1) range (90-100/100-110), (2) TBF test name, (3) string form of the flowId ...
/// ... in addition to incomplete test info from Oracle
2017-03-22 09:25:07 +00:00
2016-01-06 21:37:19 +00:00
public Database ( ) { }
2015-08-19 12:17:02 +00:00
2016-08-05 12:32:36 +00:00
public Database ( Generic . IComponentCfg cfg )
2015-08-19 12:17:02 +00:00
: base ( cfg )
{
2018-09-04 06:38:57 +00:00
dbCfg = cfg as DatabaseCfg ;
2015-08-19 12:17:02 +00:00
2017-11-10 09:32:43 +00:00
currentOp = CurrentOp . None ;
2015-08-19 12:17:02 +00:00
log . Debug ( this . ToString ( ) ) ;
}
2019-01-23 07:34:31 +00:00
///
/// IDevice interface implementation
///
2015-08-19 15:45:29 +00:00
public void Initialize ( )
{
2018-09-04 06:38:57 +00:00
switch ( dbCfg . DBUsed )
2017-03-14 12:30:01 +00:00
{
case DBUsed . Production :
connection = new OracleConnection ( "Data Source=STARA01.WORLD;User Id=deltachef;Password=deltachef;" ) ;
break ;
case DBUsed . Quality :
2018-09-10 14:39:19 +00:00
connection = new OracleConnection ( "Data Source=STARA01.WORLD;User Id=deltaqual;Password=test;" ) ;
2017-03-14 12:30:01 +00:00
break ;
case DBUsed . Test :
connection = new OracleConnection ( "Data Source=STARA_TEST.WORLD;User Id=deltachef;Password=deltachef;" ) ;
break ;
default :
connection = null ;
break ;
}
2015-08-20 16:14:22 +00:00
2018-09-04 06:38:57 +00:00
if ( dbCfg . DebugLevel = = DebugMode . Simulate ) return ;
2016-01-08 18:18:45 +00:00
2015-08-21 12:30:47 +00:00
///
/// Do something with the database to see if the connection works well
///
2017-03-14 12:30:01 +00:00
if ( connection ! = null )
{
connection . Open ( ) ;
string rslt = "none" ;
OracleCommand cmd = new OracleCommand ( "select Standort from ANBIETER_SD where ANBID = 4" , connection ) ;
OracleDataReader dr = cmd . ExecuteReader ( ) ;
if ( dr . Read ( ) ) rslt = dr . GetString ( 0 ) ;
dr . Close ( ) ;
connection . Close ( ) ;
}
2015-08-21 12:30:47 +00:00
}
2019-01-23 07:34:31 +00:00
///
2015-08-19 15:45:29 +00:00
public void RunDeviceBefore ( ) { }
public void RunDeviceAfter ( ) { }
2019-01-23 07:34:31 +00:00
///
2015-08-19 15:45:29 +00:00
public void StopDevice ( )
{
2016-02-09 07:31:14 +00:00
if ( connection ! = null ) connection . Dispose ( ) ;
2015-08-19 15:45:29 +00:00
}
2017-12-05 18:26:07 +00:00
public void StopDevice2 ( ) { }
2019-01-23 07:34:31 +00:00
/// <summary>
/// Get a complete information about tests given water meter type Id and revision
/// </summary>
/// <param name="conn">An open Oracle DB connection</param>
/// <param name="wmTypeId">Water meter type Id</param>
/// <param name="wmTypeRevision">Water meter type revision</param>
/// <returns>SensusTestInfos array</returns>
2019-02-06 09:34:43 +00:00
SensusTestInfo [ ] GetMatchingTestInfo ( OracleConnection conn , int wmTypeId , out int wmTypeRevision )
2019-01-23 07:34:31 +00:00
{
///
/// Read 'incomplete' TestInfo from Oracle database containing only flowId-s ad qBezeichnung-s
///
IList < SensusTestInfo > oraDbTinfos = new List < SensusTestInfo > ( ) ;
2019-02-06 09:34:43 +00:00
///
/// For a given 'wmTypeId' find the most recent active 'wmTypeRevision'
///
wmTypeRevision = - 1 ;
OracleCommand cmd = new OracleCommand ( "select REV_WZTYP from VT_WZTYP_SD where ANBID=4 and ID_WZTyp=:1 and AKTIV=:2" , conn ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = wmTypeId } ) ; ///:1
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = 1 } ) ; ///:2
2019-01-23 07:34:31 +00:00
///
OracleDataReader dr = cmd . ExecuteReader ( ) ;
while ( dr . Read ( ) )
2019-02-06 09:34:43 +00:00
{
wmTypeRevision = dr . GetInt32 ( 0 ) ;
}
dr . Close ( ) ;
if ( wmTypeRevision = = - 1 ) return null ; /// No 'wmTypeRevision' found
cmd = new OracleCommand ( "select PruefungsNr, PosFehlerKalt, QBezeichnung from VT_PRUEFPUNKT_SOLL_SD where ANBID=4 and ID_WZTyp=:1 and Rev_WZTyp=:2" , conn ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = wmTypeId } ) ; ///:1
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = wmTypeRevision } ) ; ///:2
///
dr = cmd . ExecuteReader ( ) ;
while ( dr . Read ( ) )
2019-01-23 07:34:31 +00:00
{
int pruefungsNr = dr . GetInt32 ( 0 ) ;
double errLimHi = dr . GetDouble ( 1 ) ;
string qBezeichnung = dr . GetString ( 2 ) ;
oraDbTinfos . Add ( new SensusTestInfo ( pruefungsNr , string . Empty , qBezeichnung , Range . R100_110 , errLimHi . ToString ( ) ) ) ;
}
dr . Close ( ) ;
if ( oraDbTinfos . Count = = 0 ) return null ; /// No 'incomplete' TestInfo in Oracle DN for this 'wmTypeId' and 'wmTypeRevision'
///
/// Find a matching complete test info
///
SensusTestInfo [ ] cmpltTinfos = null ;
oraDbTinfos = oraDbTinfos . OrderBy ( x = > x . PruefungsNr ) . ToList < SensusTestInfo > ( ) ;
for ( LogType lt = 0 ; lt < LogType . Count ; lt + + )
{
SensusTestInfo [ ] myTinfos = SensusTestInfo . GetTestInfos ( lt ) ;
if ( SensusTestInfo . AreCompatible ( oraDbTinfos , myTinfos ) )
{
cmpltTinfos = myTinfos ;
break ;
}
}
foreach ( var ti in oraDbTinfos )
{
log . WarnFormat ( "VT_PRUEFPUNKT_SOLL_SD info : ID_WZTyp={0} Rev_WZTyp={1} PruefungsNr={2} PosFehlerKalt={3} QBezeichnung={4}" ,
wmTypeId , wmTypeRevision , ti . PruefungsNr , ti . TestName , ti . QBezeichnung ) ;
}
if ( cmpltTinfos ! = null )
{
foreach ( var ti in cmpltTinfos )
{
log . WarnFormat ( "Selected test info : ID_WZTyp={0} Rev_WZTyp={1} PruefungsNr={2} Str={3} QBezeichnung={4} Range={5} Test={6}" ,
wmTypeId , wmTypeRevision , ti . PruefungsNr , ti . PruefungsNrStr , ti . QBezeichnung , ti . Range , ti . TestName ) ;
}
}
return cmpltTinfos ;
}
2019-01-09 12:48:51 +00:00
/// <summary>
/// Reads information on start of a cycle, Events: Event.InfoRead
/// </summary>
2019-01-23 07:34:31 +00:00
/// <param name="waterMeters">Results of water meters</param>
2019-01-09 12:48:51 +00:00
/// <returns>Reference to the operation</returns>
2019-01-23 07:34:31 +00:00
public IOperation ReadStartInfoOp ( Results . Entities . WaterMeter [ ] waterMeters )
2019-01-09 12:48:51 +00:00
{
if ( ! dbCfg . ReadStartInfo )
{
return null ;
}
else if ( currentOp ! = CurrentOp . None )
{
throw new Exception ( "Sequence error" ) ;
}
else
{
currentOp = CurrentOp . ReadStartInfo ;
2019-01-23 07:34:31 +00:00
this . waterMeters = waterMeters ;
2019-01-09 12:48:51 +00:00
return this ;
}
}
2015-08-19 12:17:02 +00:00
/// <summary>
/// Writes the test cycle results into a file, Events: Event.ResultsWritten
/// </summary>
2019-01-09 12:48:51 +00:00
/// <param name="batch">Batch results</param>
2015-08-19 12:17:02 +00:00
/// <returns>Reference to the operation</returns>
2016-01-06 21:37:19 +00:00
public IOperation WriteResultsOp ( Results . Entities . Batch batch )
2015-08-19 12:17:02 +00:00
{
2019-01-09 12:48:51 +00:00
if ( ! dbCfg . SaveResults )
{
return null ;
}
else if ( currentOp ! = CurrentOp . None )
2018-09-10 14:39:19 +00:00
{
2018-09-11 11:39:33 +00:00
throw new Exception ( "Sequence error" ) ;
2018-09-10 14:39:19 +00:00
}
2019-01-09 12:48:51 +00:00
else
{
currentOp = CurrentOp . WriteResults ;
this . batch = batch ;
return this ;
}
2015-08-19 12:17:02 +00:00
}
2017-11-10 09:32:43 +00:00
public IOperation CheckBarcodeScanningOp ( GenericDevices . IRegisterReader [ ] iperlHeads )
{
if ( currentOp ! = CurrentOp . None )
2018-09-11 11:39:33 +00:00
{
2017-11-10 09:32:43 +00:00
throw new Exception ( "Sequence error" ) ;
2018-09-11 11:39:33 +00:00
}
2017-11-10 09:32:43 +00:00
2018-09-11 11:39:33 +00:00
currentOp = CurrentOp . CheckBarcodeScanning ;
2017-11-10 09:32:43 +00:00
this . iperlHeads = iperlHeads ;
return this ;
}
2019-01-23 07:34:31 +00:00
2015-08-19 12:17:02 +00:00
/// <summary>Start this operation</summary>
public void Start ( )
{
2017-11-10 09:32:43 +00:00
opCompleted = false ;
anyError = false ;
}
2015-11-12 23:03:33 +00:00
2015-12-18 18:05:13 +00:00
/// <summary>Run this operation</summary>
/// <returns>Event.ResultsWritten or Event.Error</returns>
public Event Run ( )
{
2019-01-09 12:48:51 +00:00
if ( currentOp = = CurrentOp . ReadStartInfo )
2017-11-10 09:32:43 +00:00
{
if ( ! opCompleted )
{
2019-01-23 07:34:31 +00:00
if ( waterMeters . Length = = 0 ) return Event . ResultsWritten ;
2017-11-10 09:32:43 +00:00
#if ORACLE_DB
2019-01-23 07:34:31 +00:00
if ( ( dbCfg . DebugLevel = = DebugMode . Normal ) & & ( connection ! = null ) )
2017-11-10 09:32:43 +00:00
{
2019-01-23 07:34:31 +00:00
if ( ReadStartInfoFromDB ( connection ) = = Retv . Error ) anyError = true ;
2019-01-09 12:48:51 +00:00
}
#endif
opCompleted = true ;
}
return anyError ? Event . InfoNotRead : Event . InfoRead ;
}
else if ( currentOp = = CurrentOp . WriteResults )
{
if ( ! opCompleted )
{
if ( batch . WaterMeters . Count = = 0 ) return Event . ResultsWritten ;
#if ORACLE_DB
2019-01-23 07:34:31 +00:00
if ( ( dbCfg . DebugLevel = = DebugMode . Normal ) & & ( connection ! = null ) )
2019-01-09 12:48:51 +00:00
{
if ( WriteResultsToDB ( connection , batch , false ) = = Retv . Error ) anyError = true ;
2017-11-10 09:32:43 +00:00
}
#endif
opCompleted = true ;
}
2015-12-18 18:05:13 +00:00
2018-09-11 11:39:33 +00:00
return anyError ? Event . ResultsNotWritten : Event . ResultsWritten ;
2017-11-10 09:32:43 +00:00
}
else if ( currentOp = = CurrentOp . CheckBarcodeScanning )
{
if ( ! opCompleted )
{
2017-02-14 12:25:43 +00:00
#if ORACLE_DB
2019-01-23 07:34:31 +00:00
if ( ( dbCfg . DebugLevel = = DebugMode . Normal ) & & ( connection ! = null ) )
2017-11-10 09:32:43 +00:00
{
if ( CheckBarcodeScanning ( connection , iperlHeads ) = = Retv . Error ) anyError = true ; ;
}
2016-01-08 09:23:36 +00:00
#endif
2017-11-10 09:32:43 +00:00
opCompleted = true ;
}
2016-02-08 15:34:37 +00:00
2018-09-11 11:39:33 +00:00
return anyError ? Event . CheckNotDone : Event . CheckDone ;
2017-11-10 09:32:43 +00:00
}
else
{
return Event . None ;
}
2015-12-18 18:05:13 +00:00
}
/// <summary>Stop this operation</summary>
public void Stop ( )
{
2017-11-10 09:32:43 +00:00
currentOp = CurrentOp . None ;
2015-12-18 18:05:13 +00:00
}
2015-08-19 12:17:02 +00:00
2017-02-14 12:25:43 +00:00
#if ORACLE_DB
2018-09-10 14:39:19 +00:00
public Retv CheckBarcodeScanning ( OracleConnection conn , GenericDevices . IRegisterReader [ ] iPerlHeads )
2017-11-10 09:32:43 +00:00
{
try
{
conn . Open ( ) ; /// Open the Oracle database
foreach ( var rr in iPerlHeads )
{
//WaterMeters.iPerl.WaterMeter iPerlHead = rr as WaterMeters.iPerl.WaterMeter;
//if (iPerlHead != null)
//{
// OracleCommand cmd = new OracleCommand("select * from IP_ENDTEST_PD where PCBNUMBER = :1 and TESTSTATIONNAME = :2", conn);
// OracleParameter param;
// param = new OracleParameter("PCBNUMBER", OracleDbType.Varchar2); param.Value = iPerlHead.SerialNr; cmd.Parameters.Add(param);
// param = new OracleParameter("TESTSTATIONNAME", OracleDbType.Varchar2); param.Value = "STAWL001"; cmd.Parameters.Add(param);
// bool exists = false; /// true = RF_Power record exists
// OracleDataReader dr1 = cmd.ExecuteReader();
// if (dr1.Read()) { exists = true; }
// dr1.Close();
// if (!exists)
// {
// iPerlHead.CommFailed = true;
// }
//}
}
}
catch ( Exception exc )
{
log . ErrorFormat ( "Barcode scanning records were not checked: {1}" , exc . Message ) ;
conn . Close ( ) ;
return Retv . Error ;
}
conn . Close ( ) ;
return Retv . OK ;
}
2019-01-23 07:34:31 +00:00
public Retv ReadStartInfoFromDB ( OracleConnection conn )
2019-01-09 12:48:51 +00:00
{
2019-01-23 07:34:31 +00:00
bool anyError = false ;
2019-01-09 12:48:51 +00:00
try
{
conn . Open ( ) ; /// Open the Oracle database
2019-01-23 07:34:31 +00:00
foreach ( var wMtr in waterMeters )
2019-01-09 12:48:51 +00:00
{
2019-01-23 07:34:31 +00:00
if ( ( wMtr ! = null ) & & ( ReadSingleWMfromDB ( conn , wMtr ) ! = Retv . OK ) ) anyError = true ;
2019-01-09 12:48:51 +00:00
}
}
catch ( Exception exc )
{
log . ErrorFormat ( "Reading from ORACLE DB failed, batch={0}, error={1}" , batch . BatchNr , exc . Message ) ;
conn . Close ( ) ;
return Retv . Error ;
}
conn . Close ( ) ;
2019-01-23 07:34:31 +00:00
return anyError ? Retv . Error : Retv . OK ;
2019-01-09 12:48:51 +00:00
}
/// <summary>
/// Read start info of one water meter from the database
2019-01-23 07:34:31 +00:00
/// </summary>
2019-02-06 09:34:43 +00:00
/// <param name="conn">Oracke DB connection</param>
/// <param name="wm">Water meter entity</param>
/// <returns>Retv.OK when successful, Retv.Error on error</returns>
2019-01-23 07:34:31 +00:00
Retv ReadSingleWMfromDB ( OracleConnection conn , Results . Entities . WaterMeter wm )
2019-01-09 12:48:51 +00:00
{
2019-01-23 07:34:31 +00:00
if ( string . IsNullOrEmpty ( wm . SerialNr ) ) return Retv . Error ; /// No database activity possible w/o PCB number
try
{
2019-02-06 09:34:43 +00:00
if ( completeTestInfos = = null | | ( wmTypeId = = 0 ) | | ( wmTypeId ! = wm . WaterMeterData . WMTypeId ) )
2019-01-23 07:34:31 +00:00
{
2019-02-06 09:34:43 +00:00
int wmTR ;
SensusTestInfo [ ] ti = GetMatchingTestInfo ( conn , wm . WaterMeterData . WMTypeId , out wmTR ) ;
2019-01-23 07:34:31 +00:00
if ( ti ! = null )
{
2019-02-06 09:34:43 +00:00
/// All 3 updated together
wmTypeId = wm . WaterMeterData . WMTypeId ;
wmTypeRevision = wmTR ;
2019-01-23 07:34:31 +00:00
completeTestInfos = ti ;
2019-02-06 09:34:43 +00:00
/// Write to WaterMeter entity
wm . TestInfos = ti ;
wm . WMTypeRevision = wmTR ;
Sequences . ProcessData . TestInfos = ti ;
2019-01-23 07:34:31 +00:00
}
else
{
return Retv . Error ;
}
}
OracleCommand cmd ;
OracleDataReader dr ;
// SELECT * FROM VT_ZAEHLER_PD WHERE VT_Fernum = :1 AND ANBID = 4
int maxPruefindex = 0 ;
string purchaseOrder = string . Empty ;
int assignedSerialNr = 0 ;
int paletteNr = 0 ;
int umkartonNr = 0 ;
string completeSerialNr = string . Empty ;
string radioAddress = string . Empty ;
int testBenchID = 0 ;
int pruefreiheID = 0 ;
int wmPosition = 0 ;
bool passed = false ;
int resultCode = 0 ;
int userId = 0 ;
int q2CorrectionRL = 0 ;
int q2CorrectionLR = 0 ;
double q2ErrorBeforeCorrection = 0 ;
///
/// Read data from VT_ZAEHLER_PD
///
cmd = new OracleCommand ( "select MAX_PRUEFINDEX, AUFTRAGSNUMMER, ZAEHLERNUMMER, PALETTE_NR, UMKARTON_NR, Z_NR_KOMPLETT, VT_MODUL_SNR from VT_ZAEHLER_PD where VT_FERNUM = :1 AND ANBID = 4" , conn ) ;
/// 100*benchId+MPix, purchase_order, assigned_s/n, palette_nr, box_nr., complete_s/n, radio_address
cmd . Parameters . Add ( new OracleParameter { ParameterName = "1" , OracleDbType = OracleDbType . Varchar2 , Value = wm . SerialNr } ) ;
dr = cmd . ExecuteReader ( ) ;
if ( dr . Read ( ) )
{
int i = 0 ;
int benchId_x_100_plus_MaxPruefindex = dr . GetInt32 ( i + + ) ;
maxPruefindex = benchId_x_100_plus_MaxPruefindex % 100 ;
testBenchID = benchId_x_100_plus_MaxPruefindex / 100 ;
try { purchaseOrder = dr . GetString ( i + + ) ; } catch { purchaseOrder = string . Empty ; }
try { assignedSerialNr = dr . GetInt32 ( i + + ) ; } catch { assignedSerialNr = 0 ; }
try { paletteNr = dr . GetInt32 ( i + + ) ; } catch { paletteNr = 0 ; }
try { umkartonNr = dr . GetInt32 ( i + + ) ; } catch { umkartonNr = 0 ; }
try { completeSerialNr = dr . GetString ( i + + ) ; } catch { completeSerialNr = string . Empty ; }
try { radioAddress = dr . GetString ( i + + ) ; } catch { radioAddress = string . Empty ; }
}
else
{
///
/// Water meter with given PCB number was not found in ORACLE
///
log . ErrorFormat ( "Water meter {0} was not found in ORACLE database." , wm . SerialNr ) ;
dr . Close ( ) ;
2019-02-06 09:34:43 +00:00
return dbCfg . StartInfoIsRequired ? Retv . Error : Retv . OK ;
2019-01-23 07:34:31 +00:00
}
dr . Close ( ) ;
2019-01-09 12:48:51 +00:00
2019-01-23 07:34:31 +00:00
///
/// Read data from VT_ZAEHLER_PINDEX_PD
///
cmd = new OracleCommand ( "select PRUEFINDEX, ID_WZPRUEFREIHE, WT_PLATZ_NR, WZGUT, ID_BENUTZER from VT_ZAEHLER_PINDEX_PD where VT_FERNUM = :1 AND ANBID = 4" , conn ) ;
/// test_bench_ID, line_ID, WM_position, result, user_ID
cmd . Parameters . Add ( new OracleParameter { ParameterName = "1" , OracleDbType = OracleDbType . Varchar2 , Value = wm . SerialNr } ) ;
dr = cmd . ExecuteReader ( ) ;
while ( dr . Read ( ) )
{
int i = 0 ;
int prfix = ( dr . GetInt32 ( i + + ) % 100 ) ;
if ( prfix = = maxPruefindex )
{
pruefreiheID = dr . GetInt32 ( i + + ) ;
wmPosition = dr . GetInt32 ( i + + ) ;
passed = ( dr . GetInt32 ( i + + ) ! = 0 ) ;
userId = dr . GetInt32 ( i + + ) ;
}
}
dr . Close ( ) ;
///
/// Read data from VT_IP_ZAEHLER_PINDEX_PD
///
cmd = new OracleCommand ( "select PRUEFINDEX, Q2CORRECTIONLEFT, Q2CORRECTIONRIGHT, ERRQ2 from VT_IP_ZAEHLER_PINDEX_PD where VT_FERNUM = :1 AND ANBID = 4" , conn ) ;
/// pruefindex, Q2_correction_RL, Q2_correction_LR, Q2_error_before_correction
2019-02-06 09:34:43 +00:00
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Varchar2 , Value = wm . SerialNr } ) ;
2019-01-23 07:34:31 +00:00
dr = cmd . ExecuteReader ( ) ;
while ( dr . Read ( ) )
{
int i = 0 ;
int prfix = ( dr . GetInt32 ( i + + ) % 100 ) ;
if ( prfix = = maxPruefindex )
{
q2CorrectionRL = dr . GetInt32 ( i + + ) ;
q2CorrectionLR = dr . GetInt32 ( i + + ) ;
q2ErrorBeforeCorrection = dr . GetDouble ( i + + ) ;
}
}
dr . Close ( ) ;
///
/// Read data from VT_PRUEFREIHE_IST_PD
///
/// testID, flow, rel.err., passed
cmd = new OracleCommand ( "select PRUEFUNGSNR, Q_WZ, Q_FEHLER, Q_BEST from VT_PRUEFREIHE_IST_PD where VT_FERNUM = :1 AND PRUEFINDEX = :2 AND ANBID = 4" , conn ) ;
2019-02-06 09:34:43 +00:00
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Varchar2 , Value = wm . SerialNr } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = 100 * testBenchID + maxPruefindex } ) ;
2019-01-23 07:34:31 +00:00
dr = cmd . ExecuteReader ( ) ;
while ( dr . Read ( ) )
{
int i = 0 ;
int testId = dr . GetInt32 ( i + + ) ;
double flow = dr . GetDouble ( i + + ) ;
double error = dr . GetDouble ( i + + ) ;
bool testPassed = ( dr . GetInt32 ( i + + ) ! = 0 ) ;
string testName = null ;
foreach ( var ti in completeTestInfos )
{
if ( ti . PruefungsNr = = testId )
{
testName = ti . TestName ;
break ;
}
}
2019-01-09 12:48:51 +00:00
2019-01-23 07:34:31 +00:00
if ( ! string . IsNullOrEmpty ( testName ) )
{
foreach ( var mtr in wm . MeterTestRslts )
{
string mtrTestName = mtr . TestRslt . Name ( ) ;
int ix = mtrTestName . LastIndexOf ( " (" ) ;
string mtrBaseTestName = ( ix < 0 ) ? mtrTestName : mtrTestName . Substring ( 0 , ix ) ;
if ( mtrBaseTestName = = testName )
{
mtr . LastError = error ;
}
}
}
}
dr . Close ( ) ;
///
/// Copy acquired data to WaterMeter object
///
2019-02-06 09:34:43 +00:00
wm . Pruefindex = maxPruefindex + 1 ; /// Increment the proefindex from Oracle so that it is the pruefindex of the current cycle
2019-01-30 08:49:08 +00:00
log . InfoFormat ( "Data of water meter {0} successfully read from ORACLE database." , wm . SerialNr ) ;
log . DebugFormat ( " MaxPruefindex = {0}" , wm . Pruefindex ) ;
#if TURA_SPECIAL
2019-01-23 07:34:31 +00:00
wm . AssignedSerialNr = assignedSerialNr ;
wm . CompleteSerialNr = completeSerialNr ;
wm . RadioAddress = radioAddress ;
wm . PaletteNr = paletteNr ;
wm . UmkartonNr = umkartonNr ;
wm . ProdTestBench = Results . Utils . BenchNameFromOracleBenchID ( testBenchID ) ;
wm . ProdWMPosition = wmPosition ;
wm . ProdUserName = userId . ToString ( ) ;
wm . ProdPurchaseOrder = purchaseOrder ;
wm . ProdPassed = passed ;
wm . ProdResultCode = resultCode ;
wm . ProdQ2CorrRL = q2CorrectionRL ;
wm . ProdQ2CorrLR = q2CorrectionLR ;
log . DebugFormat ( " AssignedSerialNr = {0}" , wm . AssignedSerialNr ) ;
log . DebugFormat ( " CompleteSerialNr = {0}" , wm . CompleteSerialNr ) ;
log . DebugFormat ( " RadioAddress = {0}" , wm . RadioAddress ) ;
log . DebugFormat ( " PaletteNr = {0}" , wm . PaletteNr ) ;
log . DebugFormat ( " UmkartonNr = {0}" , wm . UmkartonNr ) ;
log . DebugFormat ( " ProdTestBench = {0}" , wm . ProdTestBench ) ;
log . DebugFormat ( " ProdWMPosition = {0}" , wm . ProdWMPosition ) ;
log . DebugFormat ( " ProdUserName = {0}" , wm . ProdUserName ) ;
log . DebugFormat ( " ProdPurchaseOrder = {0}" , wm . ProdPurchaseOrder ) ;
log . DebugFormat ( " ProdPassed = {0}" , wm . ProdPassed ) ;
log . DebugFormat ( " ProdResultCode = {0}" , wm . ProdResultCode ) ;
log . DebugFormat ( " ProdQ2CorrRL = {0}" , wm . ProdQ2CorrRL ) ;
log . DebugFormat ( " ProdQ2CorrLR = {0}" , wm . ProdQ2CorrLR ) ;
2019-01-30 08:49:08 +00:00
#endif
2019-01-23 07:34:31 +00:00
return Retv . OK ;
}
catch ( Exception exc )
{
log . ErrorFormat ( "Error reading data of water meter {0} from ORACLE database: {1}" , wm . SerialNr , exc . Message ) ;
return Retv . Error ;
}
2019-01-09 12:48:51 +00:00
}
public Retv WriteResultsToDB ( OracleConnection conn , Results . Entities . Batch batch , bool safeMode )
2015-12-18 18:05:13 +00:00
{
2019-02-18 08:00:18 +00:00
OracleTransaction transaction ;
2016-02-09 07:31:14 +00:00
2016-01-08 09:23:36 +00:00
try
{
2016-02-09 07:31:14 +00:00
conn . Open ( ) ; /// Open the Oracle database
transaction = conn . BeginTransaction ( ) ;
2019-02-18 08:00:18 +00:00
}
catch ( Exception exc )
{
log . ErrorFormat ( "Results of batch {0} not written to ORACLE DB (phase 1): {1}" ,
batch . BatchNr , exc . Message ) ;
conn . Close ( ) ;
return Retv . Error ;
}
2016-02-09 07:31:14 +00:00
2019-02-18 08:00:18 +00:00
try
{
2016-02-09 07:31:14 +00:00
SaveBatchData ( conn , batch ) ;
2019-01-09 12:48:51 +00:00
foreach ( var wMtr in batch . WaterMeters )
{
SaveSingleWM2DB ( conn , wMtr , safeMode ) ;
}
2015-12-18 18:05:13 +00:00
2016-01-08 09:23:36 +00:00
transaction . Commit ( ) ;
2019-02-18 08:00:18 +00:00
conn . Close ( ) ;
log . ErrorFormat ( "Results of batch {0} correctly written to ORACLE DB" , batch . BatchNr ) ;
return Retv . OK ;
2016-01-08 09:23:36 +00:00
}
catch ( Exception exc )
{
2019-02-18 08:00:18 +00:00
transaction . Rollback ( ) ;
2016-01-08 09:23:36 +00:00
conn . Close ( ) ;
2019-02-18 08:00:18 +00:00
log . ErrorFormat ( "Results of batch {0} not written to ORACLE DB: {1}" , batch . BatchNr , exc . Message ) ;
2016-01-08 09:23:36 +00:00
return Retv . Error ;
2015-08-19 12:17:02 +00:00
}
}
/// <summary>
2015-08-20 16:14:22 +00:00
/// Write one meter results into the database
2015-08-19 12:17:02 +00:00
/// </summary>
2015-11-10 22:29:14 +00:00
/// <param name="wmNr">0-based water meter number</param>
/// <param name="results">Sorted list of results to save</param>
2018-09-04 06:38:57 +00:00
void SaveSingleWM2DB ( OracleConnection conn , Results . Entities . WaterMeter wm , bool safeMode )
2015-08-19 12:17:02 +00:00
{
2019-01-09 12:48:51 +00:00
if ( safeMode & & ! wm . Passed ) return ;
2015-08-20 16:14:22 +00:00
2019-01-09 12:48:51 +00:00
if ( string . IsNullOrEmpty ( wm . SerialNr ) ) return ; /// No database activity possible w/o PCB number
2015-08-21 12:30:47 +00:00
2019-01-09 12:48:51 +00:00
int maxpruefindexLowPart = ReadMaxPruefindex ( conn , wm ) ;
2015-08-19 12:17:02 +00:00
2019-01-09 12:48:51 +00:00
int MAX_Pruefindex = 100 * dbCfg . TestBenchId + maxpruefindexLowPart + 1 ;
2015-08-20 16:14:22 +00:00
2015-08-21 12:30:47 +00:00
int Hydr_Pruefung ;
2016-01-08 09:23:36 +00:00
if ( wm . Passed )
2015-08-22 18:37:43 +00:00
{
/// Passed
if ( maxpruefindexLowPart = = 0 )
Hydr_Pruefung = 96 ;
2015-08-21 12:30:47 +00:00
else
2015-08-22 18:37:43 +00:00
Hydr_Pruefung = 224 ;
2015-08-21 12:30:47 +00:00
}
2015-11-12 23:03:33 +00:00
else
2015-08-22 18:37:43 +00:00
{
2016-01-08 09:23:36 +00:00
/// Failed
Hydr_Pruefung = 97 ; /// Hydr. test failed, Pressure test passed
2015-11-12 23:03:33 +00:00
}
2015-08-21 12:30:47 +00:00
2016-02-18 00:08:14 +00:00
wm . Pruefindex = MAX_Pruefindex ;
wm . HydrPruefung = Hydr_Pruefung ;
2016-02-09 07:31:14 +00:00
SaveOrUpdateWM ( conn , wm , MAX_Pruefindex , Hydr_Pruefung ) ;
2016-01-08 09:23:36 +00:00
}
2015-11-10 22:29:14 +00:00
2019-01-09 12:48:51 +00:00
/// <summary>
///
/// </summary>
/// <param name="conn"></param>
/// <param name="wm"></param>
/// <returns></returns>
int ReadMaxPruefindex ( OracleConnection conn , Results . Entities . WaterMeter wm )
{
/// Create a list of all prufindexes for a given PCB Number (the list is initially empty)
IList < int > pruefindexes = new List < int > ( ) ;
string purchaseOrder ;
string assignedSerialNr ;
string radioAddress ;
{
OracleParameter parm = new OracleParameter ( ) ;
parm . OracleDbType = OracleDbType . Varchar2 ;
parm . Value = wm . SerialNr ;
OracleCommand cmd1 = new OracleCommand ( "SELECT Pruefindex FROM VT_ZAEHLER_PINDEX_PD WHERE VT_Fernum = :1 AND ANBID = 4" , conn ) ;
cmd1 . Parameters . Add ( parm ) ;
OracleDataReader dr = cmd1 . ExecuteReader ( ) ;
while ( dr . Read ( ) ) { pruefindexes . Add ( dr . GetInt32 ( 0 ) ) ; }
dr . Close ( ) ;
}
{
OracleParameter parm = new OracleParameter ( ) ;
parm . OracleDbType = OracleDbType . Varchar2 ;
parm . Value = wm . SerialNr ;
OracleCommand cmd1 = new OracleCommand ( "SELECT Max_Pruefindex, Auftragsnummer, Z_Nr_Komplett, VT_Modul_Snr FROM VT_ZAEHLER_PD WHERE VT_Fernum = :1 AND ANBID = 4" , conn ) ;
/// purchase order assigned s/n radio address PCB number Producer ID
cmd1 . Parameters . Add ( parm ) ;
OracleDataReader dr = cmd1 . ExecuteReader ( ) ;
while ( dr . Read ( ) )
{
pruefindexes . Add ( dr . GetInt32 ( 0 ) ) ;
}
dr . Close ( ) ;
}
/// Determine MAX_Pruefindex
int maxPrfIndex = 0 ;
foreach ( var pix in pruefindexes )
{
if ( ( pix % 100 ) > maxPrfIndex ) maxPrfIndex = ( pix % 100 ) ;
}
return maxPrfIndex ;
}
2015-10-23 12:00:22 +00:00
2019-01-23 07:34:31 +00:00
2016-01-08 09:23:36 +00:00
/// <summary>
/// Save common batch data
/// </summary>
/// <param name="b">Batch</param>
2018-09-04 06:38:57 +00:00
void SaveBatchData ( OracleConnection conn , Results . Entities . Batch b )
2016-08-02 21:08:16 +00:00
{
2019-02-06 09:34:43 +00:00
if ( ( wmTypeId ! = b . WaterMeters [ 0 ] . WaterMeterData . WMTypeId ) | | ( completeTestInfos = = null ) | | ( wmTypeRevision = = 0 ) )
2017-03-22 09:25:07 +00:00
{
2019-02-06 09:34:43 +00:00
int wmTR = 0 ;
SensusTestInfo [ ] ti = GetMatchingTestInfo ( conn , b . WaterMeters [ 0 ] . WaterMeterData . WMTypeId , out wmTR ) ;
2018-09-19 05:50:49 +00:00
2019-01-23 07:34:31 +00:00
if ( ti ! = null )
2018-09-26 07:36:20 +00:00
{
2019-02-06 09:34:43 +00:00
/// All 3 updated together
2019-01-23 07:34:31 +00:00
completeTestInfos = ti ;
2019-02-06 09:34:43 +00:00
wmTypeId = b . WaterMeters [ 0 ] . WaterMeterData . WMTypeId ;
wmTypeRevision = wmTR ;
2018-09-19 05:50:49 +00:00
}
else
{
throw new Exception ( "No matching test infos found" ) ;
}
2017-03-22 09:25:07 +00:00
}
2019-02-06 09:34:43 +00:00
if ( completeTestInfos = = null | | wmTypeId = = 0 | | wmTypeRevision = = 0 )
{
throw new Exception ( "No matching test infos found" ) ;
}
2019-01-23 07:34:31 +00:00
OracleCommand cmd = new OracleCommand ( "INSERT INTO VT_PRUEFREIHE_PD(ANBID, ID_Pruefstand, ID_WzPruefreihe, ID_WZTyp, " +
"Rev_WZTyp, Rev_Pruefstand_WZTyp, StartDatumZeit, EndDatumZeit, Betriebsart, " +
"QVzKontakt, FuellenBegDruck, DruckEvakVorne, DruckEvakHinten, DruckBeiAbpressen, " +
2018-09-19 05:50:49 +00:00
"Druckentwaessern, SpuelDurchflussIst, ProgrammVersion)" +
" VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, :14, :15, :16, :17)" , conn ) ;
2019-02-05 13:13:37 +00:00
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = Anbid_StaraTura } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = 18000 + b . TestBenchId } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = b . BatchNr } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = b . WaterMeters [ 0 ] . WaterMeterData . WMTypeId } ) ;
2019-02-06 09:34:43 +00:00
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = wmTypeRevision } ) ;
2019-02-05 13:13:37 +00:00
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = 1 } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . TimeStamp , Value = b . StartTime } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . TimeStamp , Value = b . EndTime } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Varchar2 , Value = string . Empty } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = 0 } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = 0 } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = 0 } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = 0 } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = 0 } ) ; /// TODO: DruckBeiAbpressen
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = 0 } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = 0 } ) ; /// TODO: SpuelDurchflussIst
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Varchar2 , Value = string . Format ( "TBF v.{0}" , b . ProgramVersion ) } ) ;
2018-09-19 05:50:49 +00:00
cmd . ExecuteNonQuery ( ) ; /// Returns nr. of updated rows
foreach ( var testInfo in completeTestInfos )
2016-08-02 21:08:16 +00:00
{
2019-02-06 09:34:43 +00:00
if ( ( - 20 < = testInfo . PruefungsNr ) & & ( testInfo . PruefungsNr < = 20 ) ) /// LU PruefungsNr-s are between -20 and 20
{
Results . Entities . TestRslt tr = b . GetTestRslt ( testInfo . TestName , 0 ) ;
if ( tr = = null ) tr = b . GetTestRslt ( testInfo . TestName , 1 ) ; /// TODO: Remove this workaround for large watermeters with multiple parts at Q3
if ( tr = = null ) continue ;
#if false
OracleCommand cmd2 = new OracleCommand ( "INSERT INTO VT_PRUEFDURCHFLUSS_PD(ANBID, ID_Pruefstand, ID_WzPruefreihe, PruefungsNr, PVOL, PMasse, " +
"MinDurchfluss, MaxDurchfluss, Q_ist, KFaktor, Q_VZ, F_VZ, RegelEinstellZeit, Drehzahl, BeginnDruck_Vorne, " +
"BeginnDruck_Hinten, EndDruck_Vorne, EndDruck_Hinten, TVWZ, IVWZ, Verwendeter_VZ, BeginnGewicht, EndGewicht) " +
"VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, :14, :15, :16, :17, :18, :19, :20, :21, :22, :23)" , conn ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = Anbid_StaraTura } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = 18000 + b . TestBenchId } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = b . BatchNr } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = testInfo . PruefungsNr } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = Units . ConvertTo ( Unit . l , tr . VolumeCTV ) } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = Units . ConvertTo ( Unit . kg , tr . MassEnd - tr . MassStart ) } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = Units . ConvertTo ( Unit . lph , tr . FlowMin ) } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = Units . ConvertTo ( Unit . lph , tr . FlowMax ) } ) ;
double Q_ist = ( tr . VolumeMaster ! = 0 ) ? ( tr . FlowVolume * tr . VolumeCTV / tr . VolumeMaster ) : ( double ) tr . FlowVolume ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = Units . ConvertTo ( Unit . lph , Q_ist ) } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = tr . ConstMaster } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = Units . ConvertTo ( Unit . lph , tr . FlowVolume ) } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = tr . ErrorMaster } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = ( double ) tr . FlowSetTime } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = 0 } ) ; /// TODO
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = Units . ConvertTo ( Unit . bar , tr . PressUpStart ) } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = Units . ConvertTo ( Unit . bar , tr . PressDownStart ) } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = Units . ConvertTo ( Unit . bar , tr . PressUpEnd ) } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = Units . ConvertTo ( Unit . bar , tr . PressDownEnd ) } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = tr . TestTime } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = tr . PulsesMaster } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = 0 } ) ; /// TODO
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = Units . ConvertTo ( Unit . kg , tr . MassStart ) } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = Units . ConvertTo ( Unit . kg , tr . MassEnd ) } ) ;
cmd2 . ExecuteNonQuery ( ) ; /// Returns nr. of updated rows
#else
OracleCommand cmd2 = new OracleCommand ( "INSERT INTO VT_PRUEFDURCHFLUSS_PD(" +
"ANBID, ID_Pruefstand, ID_WzPruefreihe, PruefungsNr, " +
"PVOL, PMasse, MinDurchfluss, MaxDurchfluss, " +
"Q_ist, KFaktor, Q_VZ, F_VZ, RegelEinstellZeit, Drehzahl, " +
"BeginnDruck_Vorne, BeginnDruck_Hinten, EndDruck_Vorne, EndDruck_Hinten, " +
"TVWZ, IVWZ, Verwendeter_VZ, BeginnGewicht, EndGewicht)" +
" VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, :14, :15, " +
":16, :17, :18, :19, :20, :21, :22, :23)" , conn ) ;
OracleParameter parm ;
parm = new OracleParameter ( "ANBID" , OracleDbType . Int32 ) ; parm . Value = Anbid_StaraTura ; cmd2 . Parameters . Add ( parm ) ; ///:1
parm = new OracleParameter ( "ID_Pruefstand" , OracleDbType . Int32 ) ; parm . Value = 18000 + b . TestBenchId ; cmd2 . Parameters . Add ( parm ) ; ///:2
parm = new OracleParameter ( "ID_WzPruefreihe" , OracleDbType . Int32 ) ; parm . Value = b . BatchNr ; cmd2 . Parameters . Add ( parm ) ; ///:3
parm = new OracleParameter ( "PruefungsNr" , OracleDbType . Int32 ) ; parm . Value = testInfo . PruefungsNr ; cmd2 . Parameters . Add ( parm ) ; ///:4
///
parm = new OracleParameter ( "PVOL" , OracleDbType . Double ) ; parm . Value = Units . ConvertTo ( Unit . l , tr . VolumeCTV ) ; cmd2 . Parameters . Add ( parm ) ; ///:5
parm = new OracleParameter ( "PMasse" , OracleDbType . Double ) ; parm . Value = Units . ConvertTo ( Unit . kg , tr . MassEnd - tr . MassStart ) ; cmd2 . Parameters . Add ( parm ) ; ///:6
parm = new OracleParameter ( "MinDurchfluss" , OracleDbType . Double ) ; parm . Value = Units . ConvertTo ( Unit . lph , tr . FlowMin ) ; cmd2 . Parameters . Add ( parm ) ; ///:7
parm = new OracleParameter ( "MaxDurchfluss" , OracleDbType . Double ) ; parm . Value = Units . ConvertTo ( Unit . lph , tr . FlowMax ) ; cmd2 . Parameters . Add ( parm ) ; ///:8
double Q_ist = ( tr . VolumeMaster ! = 0 ) ? ( tr . FlowVolume * tr . VolumeCTV / tr . VolumeMaster ) : ( double ) tr . FlowVolume ;
parm = new OracleParameter ( "Q_ist" , OracleDbType . Double ) ; parm . Value = Units . ConvertTo ( Unit . lph , Q_ist ) ; cmd2 . Parameters . Add ( parm ) ; ///:9
parm = new OracleParameter ( "KFaktor" , OracleDbType . Double ) ; parm . Value = tr . ConstMaster ; cmd2 . Parameters . Add ( parm ) ; ///:10
parm = new OracleParameter ( "Q_VZ" , OracleDbType . Double ) ; parm . Value = Units . ConvertTo ( Unit . lph , tr . FlowVolume ) ; cmd2 . Parameters . Add ( parm ) ; ///:11
parm = new OracleParameter ( "F_VZ" , OracleDbType . Double ) ; parm . Value = tr . ErrorMaster ; cmd2 . Parameters . Add ( parm ) ; ///:12
parm = new OracleParameter ( "RegelEinstellZeit" , OracleDbType . Double ) ; parm . Value = ( double ) tr . FlowSetTime ; cmd2 . Parameters . Add ( parm ) ; ///:13
parm = new OracleParameter ( "Drehzahl" , OracleDbType . Int32 ) ; parm . Value = 0 ; /* TODO */ cmd2 . Parameters . Add ( parm ) ; ///:14
///
parm = new OracleParameter ( "BeginnDruck_Vorne" , OracleDbType . Double ) ; parm . Value = Units . ConvertTo ( Unit . bar , tr . PressUpStart ) ; cmd2 . Parameters . Add ( parm ) ; ///:15
parm = new OracleParameter ( "BeginnDruck_Hinten" , OracleDbType . Double ) ; parm . Value = Units . ConvertTo ( Unit . bar , tr . PressDownStart ) ; cmd2 . Parameters . Add ( parm ) ; ///:16
parm = new OracleParameter ( "EndDruck_Vorne" , OracleDbType . Double ) ; parm . Value = Units . ConvertTo ( Unit . bar , tr . PressUpEnd ) ; cmd2 . Parameters . Add ( parm ) ; ///:17
parm = new OracleParameter ( "EndDruck_Hinten" , OracleDbType . Double ) ; parm . Value = Units . ConvertTo ( Unit . bar , tr . PressDownEnd ) ; cmd2 . Parameters . Add ( parm ) ; ///:18
///
parm = new OracleParameter ( "TVWZ" , OracleDbType . Double ) ; parm . Value = tr . TestTime ; cmd2 . Parameters . Add ( parm ) ; ///:19
parm = new OracleParameter ( "IVWZ" , OracleDbType . Int32 ) ; parm . Value = tr . PulsesMaster ; cmd2 . Parameters . Add ( parm ) ; ///:20
parm = new OracleParameter ( "Verwendeter_VZ" , OracleDbType . Int32 ) ; parm . Value = 0 ; /* TODO */ cmd2 . Parameters . Add ( parm ) ; ///:21
parm = new OracleParameter ( "BeginnGewicht" , OracleDbType . Double ) ; parm . Value = Units . ConvertTo ( Unit . kg , tr . MassStart ) ; cmd2 . Parameters . Add ( parm ) ; ///:22
parm = new OracleParameter ( "EndGewicht" , OracleDbType . Double ) ; parm . Value = Units . ConvertTo ( Unit . kg , tr . MassEnd ) ; cmd2 . Parameters . Add ( parm ) ; ///:23
cmd2 . ExecuteNonQuery ( ) ; /// Returns nr. of updated rows
#endif
}
2016-08-02 21:08:16 +00:00
}
2016-02-09 13:30:21 +00:00
log . InfoFormat ( "Batch data saved, batchNr={0}" , b . BatchNr ) ;
2016-08-02 21:08:16 +00:00
}
2015-11-10 22:29:14 +00:00
2018-09-04 06:38:57 +00:00
void SaveOrUpdateWM ( OracleConnection conn , Results . Entities . WaterMeter wm , int max_Pruefindex , int hydr_Pruefung )
2016-01-08 09:23:36 +00:00
{
int sekundaere_Adr = wm . Passed ? 1 : 0 ;
2016-12-22 07:24:31 +00:00
int idBenutzer = 6 ; // = wm.Batch.UserNumber;
2016-01-08 09:23:36 +00:00
if ( max_Pruefindex % 100 = = 1 )
{
2019-02-05 13:13:37 +00:00
OracleCommand cmd = new OracleCommand ( "INSERT INTO VT_ZAEHLER_PD(Auftragsnummer, VT_Identnummer, VT_Fernum, Max_Pruefindex," +
" Zaehlernummer, Sekundaere_Adr, Hydr_Pruefung, ID_Benutzer, ANBID, Baujahr)" +
" VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10)" , conn ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Varchar2 , Value = wm . PurchaseOrder } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Varchar2 , Value = "IPBATMXX" } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Varchar2 , Value = wm . SerialNr } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = max_Pruefindex } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = - 1 } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = sekundaere_Adr } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = hydr_Pruefung } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = idBenutzer } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = Anbid_StaraTura } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = dbCfg . Baujahr } ) ;
2016-01-08 09:23:36 +00:00
cmd . ExecuteNonQuery ( ) ;
2016-02-09 13:30:21 +00:00
log . InfoFormat ( "VT_ZAEHLER_PD inserted, PcbNr={0}, pos={1}, maxPruefix={2}" , wm . SerialNr , wm . WMPosition , max_Pruefindex ) ;
}
2016-01-08 09:23:36 +00:00
else
2015-11-10 22:29:14 +00:00
{
2016-01-08 09:23:36 +00:00
OracleCommand cmd = new OracleCommand ( "UPDATE VT_ZAEHLER_PD SET Auftragsnummer = :1, VT_Identnummer = :2, Max_Pruefindex = :3, Hydr_Pruefung= :4, ID_Benutzer= :5, Baujahr= :6 WHERE VT_Fernum = :7 and ANBID = :8" , conn ) ;
2019-02-05 13:13:37 +00:00
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Varchar2 , Value = wm . PurchaseOrder } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Varchar2 , Value = "IPBATMXX" } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = max_Pruefindex } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = hydr_Pruefung } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = idBenutzer } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = dbCfg . Baujahr } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Varchar2 , Value = wm . SerialNr } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = Anbid_StaraTura } ) ;
2016-01-08 09:23:36 +00:00
cmd . ExecuteNonQuery ( ) ;
2016-02-09 13:30:21 +00:00
log . InfoFormat ( "VT_ZAEHLER_PD updated, PcbNr={0}, pos={1}, maxPruefix={2}" , wm . SerialNr , wm . WMPosition , max_Pruefindex ) ;
}
2016-01-08 09:23:36 +00:00
{
OracleCommand cmd = new OracleCommand ( "INSERT INTO VT_ZAEHLER_PINDEX_PD(" +
2019-02-05 13:13:37 +00:00
"VT_Fernum, Pruefindex, ANBID, ID_Pruefstand, ID_WzPruefreihe, Hydr_Pruefung, " +
"ReedKontakt, ReedKontaktOK, ReedKontaktZeit, KorrImprate, FestWertWZ, PtestOK, " +
"Zaehlerstand, WT_Platz_NR, WZgut, ID_Benutzer, AnzahlPruefungen)" +
" VALUES (:1, :2, :3, :4, :5, :6, 0, 0, 0, :7, 0, :8, 0, :9, :10, :11, :12)" , conn ) ; /// ReedKontakt = ReedKontaktOK = ReedKontaktZeit = FestWertWZ = Zaehlerstand = 0
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Varchar2 , Value = wm . SerialNr } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = max_Pruefindex } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = Anbid_StaraTura } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = 18000 + wm . Batch . TestBenchId } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = wm . Batch . BatchNr } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = hydr_Pruefung } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = wm . OrigCalibFactor } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = 0 } ) ; /// TODO
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = wm . WMPosition } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = wm . Passed ? 1 : 0 } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = idBenutzer } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = 3 } ) ;
2016-01-08 09:23:36 +00:00
cmd . ExecuteNonQuery ( ) ;
2016-02-09 13:30:21 +00:00
log . InfoFormat ( "VT_ZAEHLER_PINDEX_PD inserted, PcbNr={0}, pos={1}, pruefix={2}" , wm . SerialNr , wm . WMPosition , max_Pruefindex % 100 ) ;
}
2016-01-08 09:23:36 +00:00
2017-03-22 09:25:07 +00:00
2018-09-19 05:50:49 +00:00
foreach ( var testInfo in completeTestInfos )
2017-03-22 09:25:07 +00:00
{
2019-02-06 09:34:43 +00:00
if ( ( - 20 < = testInfo . PruefungsNr ) & & ( testInfo . PruefungsNr < = 20 ) ) /// LU PruefungsNr-s are between -20 and 20
2017-07-14 14:31:05 +00:00
{
2019-02-06 09:34:43 +00:00
Results . Entities . TestData tData = wm . GetTestData ( testInfo . TestName ) ;
Results . Entities . MeterTestRslt mtr ;
if ( tData = = null )
2017-07-14 14:31:05 +00:00
{
2019-02-06 09:34:43 +00:00
throw new Exception ( string . Format ( "'{0}' test results missing, watermeter {1}" , testInfo . TestName , wm . WMPosition ) ) ;
}
else if ( tData . Repeats = = 1 )
{
mtr = wm . GetMeterTestRslt ( testInfo . TestName ) ;
if ( mtr = = null ) throw new Exception ( string . Format ( "'{0}' test results missing, watermeter {1}" , testInfo . TestName , wm . WMPosition ) ) ;
}
else
{
Results . Entities . MeterTestRslt firstMtr = wm . GetMeterTestRslt ( Utils . TestTitle ( tData , 1 ) ) ;
if ( firstMtr = = null ) throw new Exception ( string . Format ( "'{0}' test results missing, watermeter {1}" , Utils . TestTitle ( tData , 1 ) , wm . WMPosition ) ) ;
mtr = new Results . Entities . MeterTestRslt ( ) ;
mtr . CopyContentFrom ( firstMtr ) ;
mtr . TestRslt = firstMtr . TestRslt ;
mtr . WaterMeter = firstMtr . WaterMeter ;
for ( int i = 2 ; i < = tData . Repeats ; i + + )
{
Results . Entities . MeterTestRslt nextMtr = wm . GetMeterTestRslt ( Utils . TestTitle ( tData , i ) ) ;
if ( nextMtr = = null ) throw new Exception ( string . Format ( "'{0}' test results missing, watermeter {1}" , Utils . TestTitle ( tData , i ) , wm . WMPosition ) ) ;
mtr . TestTime + = nextMtr . TestTime ;
mtr . VolumeMeter + = nextMtr . VolumeMeter ;
mtr . VolumeRef + = nextMtr . VolumeRef ;
mtr . VolumeEnd = nextMtr . VolumeEnd ;
mtr . Passed = ( mtr . Passed & & nextMtr . Passed ) ;
}
mtr . Error = Formulas . ErrorFromVolumes ( mtr . VolumeMeter , mtr . VolumeRef ) ;
2017-07-14 14:31:05 +00:00
}
2017-03-22 09:25:07 +00:00
2019-02-06 09:34:43 +00:00
SaveMeterTestResult ( conn , mtr , testInfo . PruefungsNr , max_Pruefindex , wmTypeRevision ) ;
}
2015-11-10 22:29:14 +00:00
}
2016-01-08 09:23:36 +00:00
2017-07-14 14:31:05 +00:00
2016-01-08 09:23:36 +00:00
{
2016-02-10 21:20:15 +00:00
double q2ErrWOCorrection = Math . Min ( 100.0 , Math . Max ( - 100.0 , wm . Q2ErrWOCorrection ) ) ;
2016-01-08 09:23:36 +00:00
OracleCommand cmd = new OracleCommand ( "INSERT INTO VT_IP_ZAEHLER_PINDEX_PD(" +
"VT_Fernum, Pruefindex, ANBID, WITHCORRECTION2HZ, CORRECTION2HZ, DIFF2HZ8HZ, " +
2018-12-07 13:44:54 +00:00
"WITHQ2CORRECTION, Q2CORRECTIONRIGHT, ERRQ2, Q2CORRECTIONFLOWRIGHT, Q2CORRECTIONLEFT)" +
2016-01-08 09:23:36 +00:00
" VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11)" , conn ) ;
2019-02-05 13:13:37 +00:00
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Varchar2 , Value = wm . SerialNr } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = max_Pruefindex } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = Anbid_StaraTura } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = wm . Hz2CorrectionDone ? 1 : 0 } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = wm . Hz2Correction } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = Math . Min ( 99.0 , Math . Max ( - 99.0 , wm . Diff2Hz8Hz ) ) } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = wm . Q2CorrectionDone ? 1 : 0 } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = wm . Q2CorrLR } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = q2ErrWOCorrection } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = wm . Q2CorrFlowRight } ) ; /// 1 = R->L
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = wm . Q2CorrRL } ) ;
2016-01-08 09:23:36 +00:00
int rowsUpdated = cmd . ExecuteNonQuery ( ) ;
2016-02-09 13:30:21 +00:00
log . InfoFormat ( "VT_IP_ZAEHLER_PINDEX_PD inserted, PcbNr={0}, pruefix={1}" , wm . SerialNr , max_Pruefindex ) ;
}
2016-01-08 09:23:36 +00:00
}
/// <summary>
/// Saves a water meter result of a single test
/// </summary>
/// <param name="q">q = 0, 1, 2 or 3 (Adj., Q1, Q2, Q3)</param>
/// <returns>Nr. of rows updated</returns>
2019-02-06 09:34:43 +00:00
int SaveMeterTestResult ( OracleConnection conn , Results . Entities . MeterTestRslt mtr , int pruefungsNr , int max_Pruefindex , int wmTypeRevision )
2016-01-08 09:23:36 +00:00
{
double Q_wm = 3600.0 * mtr . VolumeMeter / mtr . TestTime ; /// in [l/hour]
2016-06-06 14:00:28 +00:00
double Q_wm_with_upper_bound = Math . Min ( 2 * 1000 * mtr . TestRslt . FlowVolume , Math . Max ( 0.0 , Q_wm ) ) ;
2016-01-08 09:23:36 +00:00
OracleCommand cmd = new OracleCommand ( "INSERT INTO VT_PRUEFREIHE_IST_PD(" +
"VT_Fernum, Pruefindex, PruefungsNr, ANBID, ID_WZTyp, Rev_WZTyp, Rev_WZPruefpunkt, " +
"Q_WZ, Q_Fehler, Q_Best, NIZ, AnfangZStand, EndZStand, " +
"KorrErrQok, KorrErrQ, KorrQWz, TIZ, Vol_WZ_US, TempMittel_US)" +
2017-11-13 15:17:36 +00:00
" VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, 0, :14, 0, :15, 0, 0)" , conn ) ;
2016-01-08 09:23:36 +00:00
2019-02-05 11:36:17 +00:00
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Varchar2 , Value = mtr . WaterMeter . SerialNr } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = max_Pruefindex } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = pruefungsNr } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = Anbid_StaraTura } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = mtr . WaterMeter . WaterMeterData . WMTypeId } ) ;
2019-02-06 09:34:43 +00:00
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = wmTypeRevision } ) ;
2019-02-05 11:36:17 +00:00
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = 1 } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = Q_wm_with_upper_bound } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = Math . Min ( 100.0 , Math . Max ( - 100.0 , mtr . Error ) ) } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = mtr . Passed ? 1 : 0 } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Int32 , Value = 0 } ) ;
2019-02-06 09:34:43 +00:00
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = Math . Max ( - 99999.999 , Math . Min ( mtr . VolumeStart , 99999.999 ) ) } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = Math . Max ( - 99999.999 , Math . Min ( mtr . VolumeEnd , 99999.999 ) ) } ) ;
2019-02-05 11:36:17 +00:00
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = Math . Min ( 100.0 , Math . Max ( - 100.0 , mtr . KorrErrQ ) ) } ) ;
cmd . Parameters . Add ( new OracleParameter { OracleDbType = OracleDbType . Double , Value = Math . Min ( 100000 , mtr . TestTime ) } ) ;
2016-02-09 13:30:21 +00:00
int retv = cmd . ExecuteNonQuery ( ) ;
2019-02-05 11:36:17 +00:00
log . DebugFormat ( "VT_PRUEFREIHE_IST_PD inserted, PcbNr={0}, pruefungsNr={1}, error={2}" , mtr . WaterMeter . SerialNr , pruefungsNr , mtr . Error ) ;
2016-02-09 13:30:21 +00:00
return retv ;
}
2016-01-08 09:23:36 +00:00
#endif
2019-02-06 09:34:43 +00:00
}
2015-08-19 12:17:02 +00:00
}