1409 lines
81 KiB
C#
1409 lines
81 KiB
C#
///
|
|
/// Copyright (c) 2015-2020 Sensus Slovensko a.s.
|
|
///
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using log4net;
|
|
using Oracle.DataAccess.Client; // ODP.NET Oracle managed provider
|
|
using Config;
|
|
using Config.Entities;
|
|
using Results.Output;
|
|
using System.Text;
|
|
using Events.Entities;
|
|
|
|
namespace TBF.BenchControl.Output.DB.SensusOracle
|
|
{
|
|
public enum Retv
|
|
{
|
|
OK,
|
|
Error,
|
|
}
|
|
|
|
public enum DBUsed
|
|
{
|
|
None,
|
|
Production,
|
|
Test,
|
|
Quality,
|
|
Count
|
|
}
|
|
|
|
public enum WMKind
|
|
{
|
|
iPERL,
|
|
Mechanical,
|
|
Count
|
|
}
|
|
|
|
/// <summary>
|
|
/// Test/Q designation mode for IperlLogger and IperlHead opto data files
|
|
/// </summary>
|
|
public enum DesigMode
|
|
{
|
|
Auto,
|
|
Based_on_procedure,
|
|
As_specified,
|
|
Count
|
|
}
|
|
|
|
|
|
public class Database : ComponentBase, IOperation, GenericDevices.IResultsWriter, GenericDevices.IStartInfoReader, Generic.IDevice
|
|
{
|
|
private static readonly ILog log = LogManager.GetLogger(typeof(Database));
|
|
public override string ToString() { return string.Format("{0}({1})", GetType().Namespace.Substring(17), Cfg.ToString(1)); }
|
|
|
|
public const int Anbid_StaraTura = 4;
|
|
|
|
DatabaseCfg dbCfg;
|
|
|
|
public DBUsed DBUsed { get { return (dbCfg == null || dbCfg.ProcParams == null) ? DBUsed.None : dbCfg.ProcParams.DBUsed; } }
|
|
public WMKind WMKind { get { return (dbCfg == null || dbCfg.ProcParams == null) ? WMKind.iPERL : dbCfg.ProcParams.WMKind; } }
|
|
public int WMTypeId { get { return (dbCfg == null || dbCfg.ProcParams == null) ? 0 : dbCfg.ProcParams.WMTypeId; } }
|
|
public int YearOfManufacture { get { return (dbCfg == null || dbCfg.ProcParams == null) ? DateTime.Now.Year : dbCfg.ProcParams.YearOfManufacture; } }
|
|
public bool SaveResults { get { return (dbCfg == null || dbCfg.ProcParams == null) ? false : dbCfg.ProcParams.SaveResults; } }
|
|
public bool ReadStartInfo { get { return (dbCfg == null || dbCfg.ProcParams == null) ? true : dbCfg.ProcParams.ReadStartInfo; } }
|
|
public bool StartInfoIsRequired { get { return (dbCfg == null || dbCfg.ProcParams == null) ? false : dbCfg.ProcParams.StartInfoIsRequired; } }
|
|
public DesigMode DesigMode { get { return (dbCfg == null || dbCfg.ProcParams == null) ? DesigMode.Auto : dbCfg.ProcParams.DesigMode; } }
|
|
public LogType DesigType { get { return (dbCfg == null || dbCfg.ProcParams == null) ? LogType.Just_Q3Q2Q1 : dbCfg.ProcParams.DesigType; } }
|
|
|
|
enum OpState
|
|
{
|
|
None,
|
|
ReadStartInfoScheduled,
|
|
ReadStartInfoRunning,
|
|
WriteResultsScheduled,
|
|
WriteResultsRunning,
|
|
}
|
|
|
|
OpState currentOpState;
|
|
bool opCompleted;
|
|
bool anyError;
|
|
|
|
|
|
/// <summary>
|
|
/// Start info is read into WaterMeter objects referenced by this array
|
|
/// </summary>
|
|
IList<Results.Entities.WaterMeter> waterMeters;
|
|
|
|
/// <summary>
|
|
/// Results to print
|
|
/// </summary>
|
|
Results.Entities.Batch batch;
|
|
|
|
OracleConnection productionDB; /// Production Oracle DB connection
|
|
OracleConnection qualityDB; /// Quality Oracle DB connection
|
|
OracleConnection testDB; /// Test Oracle DB connection
|
|
|
|
public OracleConnection SelectedDB
|
|
{
|
|
get
|
|
{
|
|
switch (DBUsed)
|
|
{
|
|
case DBUsed.Production: return productionDB;
|
|
case DBUsed.Quality: return qualityDB;
|
|
case DBUsed.Test: return testDB;
|
|
|
|
default:
|
|
case DBUsed.None:
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
///
|
|
/// The following 3 variables are always updated together
|
|
///
|
|
int wmTypeId;
|
|
int wmTypeRevision;
|
|
string procedureSignature;
|
|
IList<SensusTestInfo> oracleTestInfo; /// Raw incomplete test info from Oracle DB (or null)
|
|
SensusTestInfo[] completeTestInfo; /// Complete TBF test info obtained as the best match (never null when oracleTestInfo != null)
|
|
|
|
|
|
public Database() {}
|
|
|
|
public Database(Generic.IComponentCfg cfg)
|
|
: base(cfg)
|
|
{
|
|
dbCfg = cfg as DatabaseCfg;
|
|
currentOpState = OpState.None;
|
|
log.Warn(this.ToString());
|
|
}
|
|
|
|
///
|
|
/// IDevice interface implementation
|
|
///
|
|
public void Initialize()
|
|
{
|
|
if (dbCfg.DebugLevel == DebugMode.Simulate) return;
|
|
|
|
productionDB = new OracleConnection("Data Source=STARA01.WORLD;User Id=deltachef;Password=deltachef;");
|
|
qualityDB = new OracleConnection("Data Source=STARA01.WORLD;User Id=deltaqual;Password=test;");
|
|
testDB = new OracleConnection("Data Source=STARA_TEST.WORLD;User Id=deltachef;Password=deltachef;");
|
|
|
|
///
|
|
/// Do something with the database to see if the connection works well
|
|
///
|
|
if (DBUsed == DBUsed.Production)
|
|
{
|
|
SelectedDB.Open();
|
|
|
|
string rslt = "none";
|
|
OracleCommand cmd = new OracleCommand("SELECT standort FROM anbieter_sd WHERE anbid = 4", SelectedDB);
|
|
OracleDataReader dr = cmd.ExecuteReader();
|
|
if (dr.Read()) rslt = dr.GetString(0);
|
|
dr.Close();
|
|
|
|
SelectedDB.Close();
|
|
}
|
|
}
|
|
///
|
|
public void RunDeviceBefore() {}
|
|
public void RunDeviceAfter() {}
|
|
///
|
|
public void StopDevice()
|
|
{
|
|
if (testDB != null) testDB.Dispose();
|
|
if (qualityDB != null) qualityDB.Dispose();
|
|
if (productionDB != null) productionDB.Dispose();
|
|
}
|
|
public void StopDevice2() {}
|
|
|
|
|
|
/// <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>
|
|
public static IList<SensusTestInfo> GetOracleTestInfo(OracleConnection conn, int wmTypeId, out int wmTypeRevision, out string wzTyp, out string metrolKlasse, out string zulasszeichen, out string materialNr, out double q3, out DateTime timeStamp, out string remark)
|
|
{
|
|
///
|
|
/// Read 'incomplete' TestInfo from Oracle database containing only flowId-s ad qBezeichnung-s
|
|
///
|
|
IList<SensusTestInfo> oraDbTinfos = new List<SensusTestInfo>();
|
|
|
|
///
|
|
/// For a given 'wmTypeId' find the most recent active 'wmTypeRevision'
|
|
///
|
|
wmTypeRevision = -1;
|
|
wzTyp = string.Empty;
|
|
metrolKlasse = string.Empty;
|
|
zulasszeichen = string.Empty;
|
|
materialNr = string.Empty;
|
|
q3 = 0;
|
|
timeStamp = DateTime.MinValue;
|
|
remark = string.Empty;
|
|
|
|
OracleCommand cmd = new OracleCommand("SELECT rev_wztyp, wztyp, metrolklasse, zulasszeichen, materialnr, qmax, aenderungsdatum, bemerkung " +
|
|
"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
|
|
///
|
|
OracleDataReader dr = cmd.ExecuteReader();
|
|
while (dr.Read())
|
|
{
|
|
wmTypeRevision = dr.GetInt32(0);
|
|
wzTyp = dr.GetString(1);
|
|
metrolKlasse = dr.GetString(2);
|
|
zulasszeichen = dr.GetString(3);
|
|
materialNr = dr.GetString(4);
|
|
q3 = dr.GetDouble(5);
|
|
timeStamp = dr.GetDateTime(6);
|
|
remark = dr.GetString(7);
|
|
}
|
|
dr.Close();
|
|
|
|
if (wmTypeRevision == -1) return null; /// No 'wmTypeRevision' found
|
|
|
|
cmd = new OracleCommand("SELECT pruefungsnr, q_soll, pruefzeit, posfehlerkalt, negfehlerkalt, pruefbereichmin, pruefbereichmax, 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())
|
|
{
|
|
int pruefungsNr = dr.GetInt32(0);
|
|
double flow = Config.Units.ConvertFrom(Unit.lph, dr.GetDouble(1));
|
|
int testTime = dr.GetInt32(2);
|
|
double errLimHi = dr.GetDouble(3);
|
|
double errLimLo = dr.GetDouble(4);
|
|
int flowRangeMin = dr.GetInt32(5);
|
|
int flowRangeMax = dr.GetInt32(6);
|
|
string qBezeichnung = dr.GetString(7);
|
|
|
|
Range rng = (flowRangeMin == 90 && flowRangeMax == 100) ? Range.R90_100 :
|
|
((flowRangeMin == 95 && flowRangeMax == 105) ? Range.R95_105 :
|
|
((flowRangeMin == 100 && flowRangeMax == 110) ? Range.R100_110 : Range.Undefined));
|
|
|
|
oraDbTinfos.Add(new SensusTestInfo(pruefungsNr, qBezeichnung, flow, testTime, errLimLo, errLimHi, rng));
|
|
}
|
|
dr.Close();
|
|
|
|
if (oraDbTinfos.Count == 0) return null; /// No 'incomplete' TestInfo in Oracle DN for this 'wmTypeId' and 'wmTypeRevision'
|
|
|
|
oraDbTinfos = oraDbTinfos.OrderBy(x => x.PruefungsNrDB).ToList<SensusTestInfo>();
|
|
|
|
foreach (var ti in oraDbTinfos)
|
|
{
|
|
log.WarnFormat("VT_PRUEFPUNKT_SOLL_SD info : ID={0} Rev={1} PruefungsNr={2} QBezeichnung={3}", wmTypeId, wmTypeRevision, ti.PruefungsNrDB, ti.QBezeichnungDB);
|
|
}
|
|
|
|
return oraDbTinfos;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Reads information on start of a cycle, Events: Event.InfoRead
|
|
/// </summary>
|
|
/// <param name="waterMeters">Results of water meters</param>
|
|
/// <returns>Reference to the operation</returns>
|
|
public IOperation ReadStartInfoOp(IList<Results.Entities.WaterMeter> waterMeters)
|
|
{
|
|
if ((currentOpState == OpState.ReadStartInfoRunning) || (currentOpState == OpState.WriteResultsRunning))
|
|
{
|
|
throw new Exception("Sequence error");
|
|
}
|
|
else
|
|
{
|
|
this.waterMeters = waterMeters;
|
|
currentOpState = OpState.ReadStartInfoScheduled;
|
|
return this;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Writes the test cycle results into a file, Events: Event.ResultsWritten
|
|
/// </summary>
|
|
/// <param name="batch">Batch results</param>
|
|
/// <returns>Reference to the operation</returns>
|
|
public IOperation ProcessResultsOp(Results.Entities.Batch batch)
|
|
{
|
|
if (!SaveResults)
|
|
{
|
|
return null;
|
|
}
|
|
else if ((currentOpState == OpState.ReadStartInfoRunning) || (currentOpState == OpState.WriteResultsRunning))
|
|
{
|
|
throw new Exception("Sequence error");
|
|
}
|
|
else
|
|
{
|
|
this.batch = batch;
|
|
currentOpState = OpState.WriteResultsScheduled;
|
|
return this;
|
|
}
|
|
}
|
|
|
|
|
|
/// <summary>Start this operation</summary>
|
|
public void Start()
|
|
{
|
|
if (currentOpState == OpState.ReadStartInfoScheduled)
|
|
{
|
|
currentOpState = OpState.ReadStartInfoRunning;
|
|
}
|
|
else if (currentOpState == OpState.WriteResultsScheduled)
|
|
{
|
|
currentOpState = OpState.WriteResultsRunning;
|
|
}
|
|
|
|
opCompleted = false;
|
|
anyError = false;
|
|
}
|
|
|
|
/// <summary>Run this operation</summary>
|
|
/// <returns>Event.ResultsWritten or Event.Error</returns>
|
|
public Event Run()
|
|
{
|
|
if (currentOpState == OpState.ReadStartInfoRunning)
|
|
{
|
|
if (!opCompleted)
|
|
{
|
|
log.WarnFormat("{0} : Run() : currentOp = {1}", Name, currentOpState);
|
|
|
|
if (dbCfg.DebugLevel == DebugMode.Normal && SelectedDB != null && ReadStartInfo && waterMeters.Count != 0)
|
|
{
|
|
#if ORACLE_DB
|
|
log.WarnFormat("{0} : Run() : reading from database", Name);
|
|
if (ReadStartInfoFromDB(SelectedDB) == Retv.Error) anyError = true;
|
|
#endif
|
|
}
|
|
|
|
if (DesigMode == DesigMode.Based_on_procedure && StateMachine.Procedure != null)
|
|
{
|
|
Sequences.ProcessData.CompleteTestInfos = Results.Output.SensusTestInfo.CreateFromProcedure(StateMachine.Procedure);
|
|
}
|
|
else if (DesigMode == DesigMode.As_specified && DesigType >= 0 && DesigType < LogType.Count)
|
|
{
|
|
Sequences.ProcessData.CompleteTestInfos = SensusTestInfo.GetTestInfos(DesigType);
|
|
}
|
|
|
|
opCompleted = true;
|
|
}
|
|
|
|
return anyError ? Event.InfoNotRead : Event.InfoRead;
|
|
}
|
|
else if (currentOpState == OpState.WriteResultsRunning)
|
|
{
|
|
if (!opCompleted)
|
|
{
|
|
if (batch.WaterMeters.Count == 0) return Event.ResultsWritten;
|
|
|
|
if ((dbCfg.DebugLevel == DebugMode.Normal) && (SelectedDB != null))
|
|
{
|
|
log.WarnFormat("{0} : Run() : currentOp = {1}", Name, currentOpState);
|
|
#if ORACLE_DB
|
|
if (WriteResultsToDB(SelectedDB, batch, false) == Retv.Error) anyError = true;
|
|
#endif
|
|
}
|
|
opCompleted = true;
|
|
}
|
|
|
|
if (anyError && !string.IsNullOrEmpty(Events.DB.ConnectionString))
|
|
{
|
|
try
|
|
{
|
|
NHibernate.ISession session = Events.DB.CreateSession();
|
|
Events.DB.LoadSubscribers(session);
|
|
|
|
TBF.UiBridge.Bridge.TriggerEvent(session, Name, EventClass.ComputerResources, Severity.Error,
|
|
string.Format("Nepodarilo sa uložiť výsledky do Oracle: Číslo dávky={0}", batch.BatchNr),
|
|
string.Format("Nepodarilo sa uložiť výsledky do Oracle\r\nČíslo dávky = {0}", batch.BatchNr),
|
|
SubscriberGroup.Metrology | SubscriberGroup.Maintenance | SubscriberGroup.Production);
|
|
}
|
|
catch (Exception exc)
|
|
{
|
|
log.ErrorFormat("Triggering event(s) failed: {0}", exc.Message);
|
|
}
|
|
}
|
|
|
|
return anyError ? Event.ErrorProcessingResults : Event.ResultsWritten;
|
|
}
|
|
else
|
|
{
|
|
return Event.None;
|
|
}
|
|
}
|
|
|
|
/// <summary>Stop this operation</summary>
|
|
public void Stop()
|
|
{
|
|
currentOpState = OpState.None;
|
|
}
|
|
|
|
|
|
#if ORACLE_DB
|
|
public Retv ReadStartInfoFromDB(OracleConnection conn)
|
|
{
|
|
bool anyError = false;
|
|
try
|
|
{
|
|
conn.Open(); /// Open the Oracle database
|
|
|
|
foreach (var wMtr in waterMeters)
|
|
{
|
|
if ((wMtr != null) && (ReadSingleWMfromDB(conn, wMtr) != Retv.OK)) anyError = true;
|
|
}
|
|
}
|
|
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();
|
|
return anyError ? Retv.Error : Retv.OK;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Read start info of one water meter from the database
|
|
/// </summary>
|
|
/// <param name="conn">Oracke DB connection</param>
|
|
/// <param name="wm">Water meter entity</param>
|
|
/// <returns>Retv.OK when successful, Retv.Error on error</returns>
|
|
Retv ReadSingleWMfromDB(OracleConnection conn, Results.Entities.WaterMeter wm)
|
|
{
|
|
if (string.IsNullOrEmpty(wm.SerialNr)) return Retv.Error; /// No database activity possible w/o PCB number
|
|
|
|
try
|
|
{
|
|
/// Prepare a procedure signature to distinguish between different procedures with the same wmTypeId
|
|
IList<string> wmTestNames = new List<string>();
|
|
StringBuilder procedureSignatureSB = new StringBuilder();
|
|
foreach (var mtr in wm.RegularMeterTestRslts())
|
|
{
|
|
wmTestNames.Add(mtr.Name());
|
|
procedureSignatureSB.Append(mtr.Name());
|
|
procedureSignatureSB.Append("~");
|
|
}
|
|
|
|
if (oracleTestInfo == null || (wmTypeId == 0) || (wmTypeId != wm.WaterMeterData.WMTypeId) || (procedureSignature != procedureSignatureSB.ToString()))
|
|
{
|
|
///
|
|
/// Currnet test info. is not walid => Get a new one from Oracle and SensusTestInfo table
|
|
///
|
|
int wmTR;
|
|
string wzTypStr;
|
|
string metroKlasse;
|
|
string zulasszeichen;
|
|
string materialNr;
|
|
double q3 = 0;
|
|
DateTime timeStamp;
|
|
string remark;
|
|
IList<SensusTestInfo> rti = GetOracleTestInfo(conn, wm.WaterMeterData.WMTypeId, out wmTR, out wzTypStr, out metroKlasse, out zulasszeichen, out materialNr, out q3, out timeStamp, out remark);
|
|
|
|
if (rti != null)
|
|
{
|
|
/// All 5 updated together
|
|
wmTypeId = wm.WaterMeterData.WMTypeId;
|
|
wmTypeRevision = wmTR;
|
|
procedureSignature = procedureSignatureSB.ToString();
|
|
oracleTestInfo = rti;
|
|
string tInfoName;
|
|
completeTestInfo = SensusTestInfo.GetBestMatch(rti, wmTestNames, out tInfoName);
|
|
///
|
|
log.WarnFormat("Selected test info : {0}", tInfoName);
|
|
foreach (var cti in completeTestInfo)
|
|
{
|
|
log.WarnFormat("Selected test info : ID={0} Rev={1} Test={2} PrfNrDB={3} QBzDB={4} PrfNrOpto={5} QBzOpto={6} PrfNrLog={7} QBzLog={8} Range={9}", wmTypeId, wmTypeRevision,
|
|
cti.TestName, cti.PruefungsNrDB, cti.QBezeichnungDB, cti.PruefungsNrOpto, cti.QBezeichnungOpto, cti.PruefungsNrLog, cti.QBezeichnungLog, cti.Range);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return Retv.Error;
|
|
}
|
|
}
|
|
|
|
/// Write the test info. to WaterMeter entity
|
|
wm.RawTestInfos = oracleTestInfo;
|
|
wm.CompleteTestInfos = completeTestInfo;
|
|
wm.WMTypeRevision = wmTypeRevision;
|
|
|
|
/// Write the test info. to ProcessData
|
|
Sequences.ProcessData.RawTestInfos = oracleTestInfo;
|
|
Sequences.ProcessData.CompleteTestInfos = completeTestInfo;
|
|
|
|
|
|
OracleCommand cmd;
|
|
OracleDataReader dr;
|
|
|
|
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
|
|
///
|
|
/// 100*benchId+MPix, purchase_order, assigned_s/n, palette_nr, box_nr., complete_s/n, radio_address
|
|
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);
|
|
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();
|
|
return StartInfoIsRequired ? Retv.Error : Retv.OK;
|
|
}
|
|
dr.Close();
|
|
|
|
///
|
|
/// Read data from VT_ZAEHLER_PINDEX_PD
|
|
///
|
|
/// test_bench_ID, line_ID, WM_position, result, user_ID
|
|
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);
|
|
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
|
|
///
|
|
/// pruefindex, Q2_correction_RL, Q2_correction_LR, Q2_error_before_correction
|
|
cmd = new OracleCommand("SELECT pruefindex, q2correctionleft, q2correctionright, errq2 " +
|
|
"FROM vt_ip_zaehler_pindex_pd " +
|
|
"WHERE vt_fernum = :1 AND anbid = 4", conn);
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNr });
|
|
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);
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNr });
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 100 * testBenchID + maxPruefindex });
|
|
|
|
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 baseTestName = null;
|
|
foreach (var ti in completeTestInfo)
|
|
{
|
|
if (ti.PruefungsNrDB == testId)
|
|
{
|
|
int ix = ti.TestName.LastIndexOf(" (");
|
|
baseTestName = (ix < 0) ? ti.TestName : ti.TestName.Substring(0, ix);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!string.IsNullOrEmpty(baseTestName))
|
|
{
|
|
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 == baseTestName)
|
|
{
|
|
mtr.LastError = error;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
dr.Close();
|
|
|
|
///
|
|
/// Copy acquired data to WaterMeter object
|
|
///
|
|
wm.Pruefindex = maxPruefindex + 1; /// Increment the proefindex from Oracle so that it is the pruefindex of the current cycle
|
|
log.InfoFormat("Data of water meter {0} successfully read from ORACLE database.", wm.SerialNr);
|
|
log.DebugFormat(" MaxPruefindex = {0}", wm.Pruefindex);
|
|
#if TURA_SPECIAL
|
|
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);
|
|
#endif
|
|
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;
|
|
}
|
|
}
|
|
|
|
|
|
public Retv WriteResultsToDB(OracleConnection conn, Results.Entities.Batch batch, bool safeMode)
|
|
{
|
|
OracleTransaction transaction;
|
|
|
|
try
|
|
{
|
|
conn.Open(); /// Open the Oracle database
|
|
transaction = conn.BeginTransaction();
|
|
}
|
|
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;
|
|
}
|
|
|
|
try
|
|
{
|
|
SaveBatchData(conn, batch);
|
|
foreach (var wMtr in batch.WaterMeters)
|
|
{
|
|
if (WMKind == WMKind.iPERL)
|
|
{
|
|
if ((wMtr.ErrorFlags & ((int)ErrorFlagMask.E26 | (int)ErrorFlagMask.E27 | (int)ErrorFlagMask.E28)) == 0)
|
|
{
|
|
/// No production error => write the result of testing to Oracle DB
|
|
SaveIperlToDB(conn, wMtr, safeMode);
|
|
}
|
|
}
|
|
else if (WMKind == WMKind.Mechanical)
|
|
{
|
|
SaveMechanicalMeterToDB(conn, wMtr, safeMode);
|
|
}
|
|
}
|
|
|
|
transaction.Commit();
|
|
conn.Close();
|
|
log.ErrorFormat("Results of batch {0} correctly written to ORACLE DB", batch.BatchNr);
|
|
return Retv.OK;
|
|
}
|
|
catch (Exception exc)
|
|
{
|
|
transaction.Rollback();
|
|
conn.Close();
|
|
log.ErrorFormat("Results of batch {0} not written to ORACLE DB: {1}", batch.BatchNr, exc.Message);
|
|
return Retv.Error;
|
|
}
|
|
}
|
|
|
|
/// <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>();
|
|
|
|
{
|
|
OracleCommand cmd = new OracleCommand("SELECT pruefindex FROM vt_zaehler_pindex_pd WHERE vt_fernum = :1 AND anbid = 4", conn);
|
|
|
|
OracleParameter parm = new OracleParameter();
|
|
parm.OracleDbType = OracleDbType.Varchar2;
|
|
parm.Value = wm.SerialNr;
|
|
cmd.Parameters.Add(parm);
|
|
|
|
using (OracleDataReader dr = cmd.ExecuteReader())
|
|
{
|
|
while (dr.Read()) pruefindexes.Add(dr.GetInt32(0));
|
|
dr.Close();
|
|
}
|
|
}
|
|
{
|
|
/// purchase order assigned s/n radio address
|
|
OracleCommand cmd = new OracleCommand("SELECT max_pruefindex, auftragsnummer, z_nr_komplett, vt_modul_snr " +
|
|
"FROM vt_zaehler_pd " +
|
|
"WHERE vt_fernum = :1 AND anbid = 4", conn);
|
|
/// PCB number Producer ID
|
|
OracleParameter parm = new OracleParameter();
|
|
parm.OracleDbType = OracleDbType.Varchar2;
|
|
parm.Value = wm.SerialNr;
|
|
cmd.Parameters.Add(parm);
|
|
|
|
using (OracleDataReader dr = cmd.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;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Save common batch data
|
|
/// </summary>
|
|
/// <param name="b">Batch</param>
|
|
void SaveBatchData(OracleConnection conn, Results.Entities.Batch b)
|
|
{
|
|
IList<string> wmTestNames = new List<string>();
|
|
StringBuilder procedureSignatureSB = new StringBuilder();
|
|
foreach (var tr in b.RegularTestRslts())
|
|
{
|
|
wmTestNames.Add(tr.Name());
|
|
procedureSignatureSB.Append(tr.Name());
|
|
procedureSignatureSB.Append("~");
|
|
}
|
|
|
|
if ((oracleTestInfo == null) || (wmTypeId != b.WaterMeters[0].WaterMeterData.WMTypeId) || (wmTypeRevision == 0) || (procedureSignature != procedureSignatureSB.ToString()))
|
|
{
|
|
int wmTR = 0;
|
|
string wzTypStr;
|
|
string metroKlasse;
|
|
string zulasszeichen;
|
|
string materialNr;
|
|
double q3 = 0;
|
|
DateTime timeStamp;
|
|
string remark;
|
|
IList<SensusTestInfo> ti = GetOracleTestInfo(conn, b.WaterMeters[0].WaterMeterData.WMTypeId, out wmTR, out wzTypStr, out metroKlasse, out zulasszeichen, out materialNr, out q3, out timeStamp, out remark);
|
|
|
|
if (ti != null)
|
|
{
|
|
/// All 5 updated together
|
|
wmTypeId = b.WaterMeters[0].WaterMeterData.WMTypeId;
|
|
wmTypeRevision = wmTR;
|
|
procedureSignature = procedureSignatureSB.ToString();
|
|
oracleTestInfo = ti;
|
|
completeTestInfo = SensusTestInfo.GetBestMatch(oracleTestInfo, wmTestNames);
|
|
|
|
foreach (var cti in completeTestInfo)
|
|
{
|
|
log.WarnFormat("Selected test info : ID={0} Rev={1} Test={2} PrfNrDB={3} QBzDB={4} PrfNrOpto={5} QBzOpto={6} PrfNrLog={7} QBzLog={8} Range={9}", wmTypeId, wmTypeRevision,
|
|
cti.TestName, cti.PruefungsNrDB, cti.QBezeichnungDB, cti.PruefungsNrOpto, cti.QBezeichnungOpto, cti.PruefungsNrLog, cti.QBezeichnungLog, cti.Range);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
throw new Exception("No matching test infos found");
|
|
}
|
|
}
|
|
|
|
if (oracleTestInfo == null || completeTestInfo == null || wmTypeId == 0 || wmTypeRevision == 0)
|
|
{
|
|
throw new Exception("No matching test infos found");
|
|
}
|
|
|
|
|
|
if (!dbCfg.TestMode)
|
|
{
|
|
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," +
|
|
" druckentwaessern, spueldurchflussist, programmversion) " +
|
|
"VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, :14, :15, :16, :17)", 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 = b.WaterMeters[0].WaterMeterData.WMTypeId });
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = wmTypeRevision });
|
|
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) });
|
|
|
|
cmd.ExecuteNonQuery(); /// Returns nr. of updated rows
|
|
log.InfoFormat("VT_PRUEFREIHE_PD inserted, BatchNr={0}, TypeId={1}, TypeRev={2}, Start={3}", b.BatchNr, b.WaterMeters[0].WaterMeterData.WMTypeId, wmTypeRevision, b.StartTime);
|
|
}
|
|
else
|
|
{
|
|
log.WarnFormat("SIM: VT_PRUEFREIHE_PD inserted, BatchNr={0}, TypeId={1}, TypeRev={2}, Start={3}", b.BatchNr, b.WaterMeters[0].WaterMeterData.WMTypeId, wmTypeRevision, b.StartTime);
|
|
}
|
|
|
|
foreach (var testInfo in completeTestInfo)
|
|
{
|
|
if ((testInfo.PruefungsNrDB != 0) && (-20 <= testInfo.PruefungsNrDB) && (testInfo.PruefungsNrDB <= 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;
|
|
|
|
double Q_ist = (tr.VolumeMaster != 0) ? (tr.FlowVolume * tr.VolumeCTV / tr.VolumeMaster) : (double)tr.FlowVolume;
|
|
///
|
|
if (!dbCfg.TestMode)
|
|
{
|
|
#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
|
|
var 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.PruefungsNrDB; 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
|
|
|
|
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
|
|
log.InfoFormat("VT_PRUEFDURCHFLUSS_PD inserted ({0}, {1}, {2}, {3}, {4} ...)", Anbid_StaraTura, 18000 + b.TestBenchId, b.BatchNr, testInfo.PruefungsNrDB, Q_ist);
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
log.WarnFormat("SIM: VT_PRUEFDURCHFLUSS_PD inserted ({0}, {1}, {2}, {3}, {4} ...)", Anbid_StaraTura, 18000 + b.TestBenchId, b.BatchNr, testInfo.PruefungsNrDB, Q_ist);
|
|
}
|
|
}
|
|
}
|
|
|
|
log.InfoFormat("Batch data saved, batchNr={0}", b.BatchNr);
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Write one meter results into the database
|
|
/// </summary>
|
|
/// <param name="wmNr">0-based water meter number</param>
|
|
/// <param name="results">Sorted list of results to save</param>
|
|
void SaveIperlToDB(OracleConnection conn, Results.Entities.WaterMeter wm, bool safeMode)
|
|
{
|
|
if (safeMode && !wm.Passed) return;
|
|
|
|
if (string.IsNullOrEmpty(wm.SerialNr)) return; /// No database activity possible w/o PCB number
|
|
|
|
int maxpruefindexLowPart = ReadMaxPruefindex(conn, wm);
|
|
|
|
TBF.BenchControl.GenericDevices.IBenchInfo benchInfo = TBF.BenchControl.Sequences.ProcessData.BenchInfo;
|
|
int testBenchID = (benchInfo != null) ? benchInfo.TestBenchId : 1;
|
|
int MAX_Pruefindex = 100 * testBenchID + maxpruefindexLowPart + 1;
|
|
|
|
int Hydr_Pruefung;
|
|
if (wm.Passed)
|
|
{
|
|
/// Passed
|
|
if (maxpruefindexLowPart == 0)
|
|
Hydr_Pruefung = 96;
|
|
else
|
|
Hydr_Pruefung = 224;
|
|
}
|
|
else
|
|
{
|
|
/// Failed
|
|
Hydr_Pruefung = 97; /// Hydr. test failed, Pressure test passed
|
|
}
|
|
|
|
wm.Pruefindex = MAX_Pruefindex;
|
|
wm.HydrPruefung = Hydr_Pruefung;
|
|
SaveOrUpdateIperl(conn, wm, MAX_Pruefindex, Hydr_Pruefung);
|
|
}
|
|
|
|
void SaveOrUpdateIperl(OracleConnection conn, Results.Entities.WaterMeter wm, int max_Pruefindex, int hydr_Pruefung)
|
|
{
|
|
int sekundaere_Adr = wm.Passed ? 1 : 0;
|
|
int idBenutzer = 6; // = wm.Batch.UserNumber;
|
|
|
|
if (max_Pruefindex % 100 == 1)
|
|
{
|
|
if (!dbCfg.TestMode)
|
|
{
|
|
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 = YearOfManufacture });
|
|
|
|
cmd.ExecuteNonQuery();
|
|
log.InfoFormat("VT_ZAEHLER_PD inserted, PcbNr={0}, pos={1}, maxPruefix={2}", wm.SerialNr, wm.WMPosition, max_Pruefindex);
|
|
}
|
|
else
|
|
{
|
|
log.WarnFormat("SIM: VT_ZAEHLER_PD inserted, PcbNr={0}, pos={1}, maxPruefix={2}", wm.SerialNr, wm.WMPosition, max_Pruefindex);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (!dbCfg.TestMode)
|
|
{
|
|
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);
|
|
|
|
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 = YearOfManufacture });
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNr });
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Anbid_StaraTura });
|
|
|
|
cmd.ExecuteNonQuery();
|
|
log.InfoFormat("VT_ZAEHLER_PD updated, PcbNr={0}, pos={1}, maxPruefix={2}", wm.SerialNr, wm.WMPosition, max_Pruefindex);
|
|
}
|
|
else
|
|
{
|
|
log.WarnFormat("SIM: VT_ZAEHLER_PD updated, PcbNr={0}, pos={1}, maxPruefix={2}", wm.SerialNr, wm.WMPosition, max_Pruefindex);
|
|
}
|
|
}
|
|
|
|
if (!dbCfg.TestMode)
|
|
{
|
|
OracleCommand cmd = new OracleCommand("INSERT INTO vt_zaehler_pindex_pd(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 });
|
|
|
|
cmd.ExecuteNonQuery();
|
|
log.InfoFormat("VT_ZAEHLER_PINDEX_PD inserted, PcbNr={0}, pos={1}, pruefix={2}", wm.SerialNr, wm.WMPosition, max_Pruefindex % 100);
|
|
}
|
|
else
|
|
{
|
|
log.WarnFormat("SIM: VT_ZAEHLER_PINDEX_PD inserted, PcbNr={0}, pos={1}, pruefix={2}", wm.SerialNr, wm.WMPosition, max_Pruefindex % 100);
|
|
}
|
|
|
|
|
|
foreach (var testInfo in completeTestInfo)
|
|
{
|
|
if ((testInfo.PruefungsNrDB != 0) && (-20 <= testInfo.PruefungsNrDB) && (testInfo.PruefungsNrDB <= 20)) /// LU PruefungsNr-s are nonzero and between -20 and 20
|
|
{
|
|
Results.Entities.TestData tData = wm.GetTestData(testInfo.TestName);
|
|
Results.Entities.MeterTestRslt mtr;
|
|
if (tData == null)
|
|
{
|
|
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);
|
|
}
|
|
|
|
SaveMeterTestResult(conn, mtr, testInfo.PruefungsNrDB, max_Pruefindex, wmTypeRevision);
|
|
}
|
|
}
|
|
|
|
|
|
if (!dbCfg.TestMode)
|
|
{
|
|
double q2ErrWOCorrection = Math.Min(100.0, Math.Max(-100.0, wm.Q2ErrWOCorrection));
|
|
|
|
OracleCommand cmd = new OracleCommand("INSERT INTO vt_ip_zaehler_pindex_pd(vt_fernum, pruefindex, anbid," +
|
|
" withcorrection2hz, correction2hz, diff2hz8hz, withq2correction," +
|
|
" q2correctionright, errq2, q2correctionflowright, q2correctionleft) " +
|
|
"VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11)", conn);
|
|
|
|
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.Q2CorrRL != 0) || (wm.Q2CorrLR != 0)) ? 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 });
|
|
|
|
int rowsUpdated = cmd.ExecuteNonQuery();
|
|
log.InfoFormat("VT_IP_ZAEHLER_PINDEX_PD inserted, PcbNr={0}, pruefix={1}", wm.SerialNr, max_Pruefindex);
|
|
}
|
|
else
|
|
{
|
|
log.WarnFormat("SIM: VT_IP_ZAEHLER_PINDEX_PD inserted, PcbNr={0}, pruefix={1}", wm.SerialNr, max_Pruefindex);
|
|
}
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Write results of one mechanical meter into the database
|
|
/// </summary>
|
|
/// <param name="wmNr">0-based water meter number</param>
|
|
/// <param name="results">Sorted list of results to save</param>
|
|
void SaveMechanicalMeterToDB(OracleConnection conn, Results.Entities.WaterMeter wm, bool safeMode)
|
|
{
|
|
if (safeMode && !wm.Passed) return;
|
|
|
|
if (string.IsNullOrEmpty(wm.SerialNr)) return; /// No database activity possible w/o PCB number
|
|
|
|
int maxpruefindexLowPart = ReadMaxPruefindex(conn, wm);
|
|
|
|
TBF.BenchControl.GenericDevices.IBenchInfo benchInfo = TBF.BenchControl.Sequences.ProcessData.BenchInfo;
|
|
int testBenchID = (benchInfo != null) ? benchInfo.TestBenchId : 1;
|
|
int MAX_Pruefindex = 100 * testBenchID + maxpruefindexLowPart + 1;
|
|
|
|
int Hydr_Pruefung;
|
|
if (wm.Passed)
|
|
{
|
|
/// Passed
|
|
if (maxpruefindexLowPart == 0)
|
|
Hydr_Pruefung = 96;
|
|
else
|
|
Hydr_Pruefung = 224;
|
|
}
|
|
else
|
|
{
|
|
/// Failed
|
|
Hydr_Pruefung = 97; /// Hydr. test failed, Pressure test passed
|
|
}
|
|
|
|
wm.Pruefindex = MAX_Pruefindex;
|
|
wm.HydrPruefung = Hydr_Pruefung;
|
|
SaveOrUpdateMechanicalMeter(conn, wm, MAX_Pruefindex, Hydr_Pruefung);
|
|
}
|
|
|
|
void SaveOrUpdateMechanicalMeter(OracleConnection conn, Results.Entities.WaterMeter wm, int max_Pruefindex, int hydr_Pruefung)
|
|
{
|
|
int idBenutzer = 6; // = wm.Batch.UserNumber;
|
|
|
|
if (max_Pruefindex % 100 == 1)
|
|
{
|
|
if (!dbCfg.TestMode)
|
|
{
|
|
OracleCommand cmd = new OracleCommand("INSERT INTO vt_zaehler_pd(auftragsnummer, vt_identnummer, vt_fernum, max_pruefindex," +
|
|
" mbus_adr, liegenschafts_nr, sekundaere_adr, hydr_pruefung, mark_date, baujahr, eich_jahr," +
|
|
" umkarton_nr, palette_nr, zaehlernummer, prefix, suffix, z_nr_komplett, anbid, id_benutzer) " +
|
|
"VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, :14, :15, :16, :17, :18, :19)", conn);
|
|
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.PurchaseOrder }); /// :1
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = "88888888" }); /// :2
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNr }); /// :3
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = max_Pruefindex }); /// :4
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 0 }); /// :5 MBUS_ADR
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 0 }); /// :6 LIEGENSCHAFTS_NR
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 0 }); /// :7 Sekundaere_Adr
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = hydr_Pruefung }); /// :8
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.TimeStamp, Value = wm.Batch.EndTime }); /// :9
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = YearOfManufacture }); /// :10
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = YearOfManufacture }); /// :11
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 0 }); /// :12 UMKARTON_NR
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 0 }); /// :13 PALETTE_NR
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = wm.AssignedSerialNr }); /// :14
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.Prefix }); /// :15
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.Suffix }); /// :16
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.CompleteSerialNr }); /// :17
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Anbid_StaraTura }); /// :18
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = idBenutzer }); /// :19
|
|
|
|
cmd.ExecuteNonQuery();
|
|
log.InfoFormat("VT_ZAEHLER_PD inserted, PcbNr={0}, pos={1}, maxPruefix={2}", wm.SerialNr, wm.WMPosition, max_Pruefindex);
|
|
}
|
|
else
|
|
{
|
|
log.WarnFormat("SIM: VT_ZAEHLER_PD inserted, PcbNr={0}, pos={1}, maxPruefix={2}", wm.SerialNr, wm.WMPosition, max_Pruefindex);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (!dbCfg.TestMode)
|
|
{
|
|
OracleCommand cmd = new OracleCommand("UPDATE vt_zaehler_pd " +
|
|
"SET auftragsnummer=:1, vt_identnummer=:2, max_pruefindex=:3, mbus_adr=:4, liegenschafts_nr=:5," +
|
|
" sekundaere_adr=:6, hydr_pruefung=:7, mark_date=:8, baujahr=:9, eich_jahr=:10, umkarton_nr=:11," +
|
|
" palette_nr=:12, zaehlernummer=:13, prefix=:14, suffix=:15, z_nr_komplett=:16, id_benutzer=:17 " +
|
|
"WHERE vt_fernum = :18 AND anbid = :19", conn);
|
|
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.PurchaseOrder }); /// :1
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = "88888888" }); /// :2
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = max_Pruefindex }); /// :3
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 0 }); /// :4 MBUS_ADR
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 0 }); /// :5 LIEGENSCHAFTS_NR
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 0 }); /// :6 Sekundaere_Adr
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = hydr_Pruefung }); /// :7
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.TimeStamp, Value = wm.Batch.EndTime }); /// :8
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = YearOfManufacture }); /// :9
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = YearOfManufacture }); /// :10
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 0 }); /// :11 UMKARTON_NR
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 0 }); /// :12 PALETTE_NR
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = wm.AssignedSerialNr }); /// :13
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.Prefix }); /// :14
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.Suffix }); /// :15
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.CompleteSerialNr }); /// :16
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = idBenutzer }); /// :17
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNr }); /// :18
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Anbid_StaraTura }); /// :19
|
|
|
|
cmd.ExecuteNonQuery();
|
|
log.InfoFormat("VT_ZAEHLER_PD updated, PcbNr={0}, pos={1}, maxPruefix={2}", wm.SerialNr, wm.WMPosition, max_Pruefindex);
|
|
}
|
|
else
|
|
{
|
|
log.WarnFormat("SIM: VT_ZAEHLER_PD updated, PcbNr={0}, pos={1}, maxPruefix={2}", wm.SerialNr, wm.WMPosition, max_Pruefindex);
|
|
}
|
|
}
|
|
|
|
if (!dbCfg.TestMode)
|
|
{
|
|
OracleCommand cmd = new OracleCommand("INSERT INTO vt_zaehler_pindex_pd(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 });
|
|
|
|
cmd.ExecuteNonQuery();
|
|
log.InfoFormat("VT_ZAEHLER_PINDEX_PD inserted, PcbNr={0}, pos={1}, pruefix={2}", wm.SerialNr, wm.WMPosition, max_Pruefindex % 100);
|
|
}
|
|
else
|
|
{
|
|
log.WarnFormat("SIM: VT_ZAEHLER_PINDEX_PD inserted, PcbNr={0}, pos={1}, pruefix={2}", wm.SerialNr, wm.WMPosition, max_Pruefindex % 100);
|
|
}
|
|
|
|
|
|
foreach (var testInfo in completeTestInfo)
|
|
{
|
|
if ((testInfo.PruefungsNrDB != 0) && (-20 <= testInfo.PruefungsNrDB) && (testInfo.PruefungsNrDB <= 20)) /// LU PruefungsNr-s are nonzero and between -20 and 20
|
|
{
|
|
Results.Entities.TestData tData = wm.GetTestData(testInfo.TestName);
|
|
Results.Entities.MeterTestRslt mtr;
|
|
if (tData == null)
|
|
{
|
|
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);
|
|
}
|
|
|
|
SaveMeterTestResult(conn, mtr, testInfo.PruefungsNrDB, max_Pruefindex, wmTypeRevision);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/// <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>
|
|
int SaveMeterTestResult(OracleConnection conn, Results.Entities.MeterTestRslt mtr, int pruefungsNr, int max_Pruefindex, int wmTypeRevision)
|
|
{
|
|
double Q_wm = (mtr.TestTime != 0) ? (3600.0 * mtr.VolumeMeter / mtr.TestTime) : 0; /// in [l/hour]
|
|
double Q_wm_with_upper_bound = Math.Min(2 * 1000 * mtr.TestRslt.FlowVolume, Math.Max(0.0, Q_wm));
|
|
int retv = 0;
|
|
|
|
if (!dbCfg.TestMode)
|
|
{
|
|
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) " +
|
|
"VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, 0, :14, 0, :15, 0, 0)", conn);
|
|
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = mtr.WaterMeter.SerialNr }); /// :1 vt_fernum
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = max_Pruefindex }); /// :2 pruefindex
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = pruefungsNr }); /// :3 pruefungsnr
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Anbid_StaraTura }); /// :4 anbid
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = mtr.WaterMeter.WaterMeterData.WMTypeId }); /// :5 id_wztyp
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = wmTypeRevision }); /// :6 rev_wztyp
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 1 }); /// :7 rev_wzpruefpunkt
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Q_wm_with_upper_bound }); /// :8 q_wz
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Math.Min(100.0, Math.Max(-100.0, mtr.Error)) }); /// :9 q_fehler
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = mtr.Passed ? 1 : 0 }); /// :10 q_best
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 0 }); /// :11 niz
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Math.Max(-99999.999, Math.Min(mtr.VolumeStart, 99999.999)) }); /// :12 anfangzstand
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Math.Max(-99999.999, Math.Min(mtr.VolumeEnd, 99999.999)) }); /// :13 endzstand
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Math.Min(100.0, Math.Max(-100.0, mtr.KorrErrQ)) }); /// :14 korrerrq
|
|
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Math.Min(100000, mtr.TestTime) }); /// :15 tiz
|
|
|
|
retv = cmd.ExecuteNonQuery();
|
|
log.DebugFormat("VT_PRUEFREIHE_IST_PD inserted, PcbNr={0}, pruefungsNr={1}, error={2}", mtr.WaterMeter.SerialNr, pruefungsNr, mtr.Error);
|
|
}
|
|
else
|
|
{
|
|
log.WarnFormat("SIM: VT_PRUEFREIHE_IST_PD inserted, PcbNr={0}, pruefungsNr={1}, error={2}", mtr.WaterMeter.SerialNr, pruefungsNr, mtr.Error);
|
|
}
|
|
|
|
return retv;
|
|
}
|
|
#endif
|
|
}
|
|
}
|