/// /// Copyright (c) 2015-2019 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; using System.IO; 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; namespace TBF.BenchControl.Output.DB.SensusOracle { public enum Retv { OK, Error, } 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)); } const int Anbid_StaraTura = 4; public DatabaseCfg dbCfg; enum OpState { None, ReadStartInfoScheduled, ReadStartInfoRunning, WriteResultsScheduled, WriteResultsRunning, } OpState currentOpState; bool opCompleted; bool anyError; /// /// iPerls to verify /// GenericDevices.IRegisterReader[] iperlHeads; /// /// Start info is read into WaterMeter objects referenced by this array /// IList waterMeters; /// /// Results to print /// Results.Entities.Batch batch; OracleConnection connection; /// Oracle database connection /// /// The following 3 variables are always updated together /// int wmTypeId; int wmTypeRevision; string procedureSignature; IList 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.Debug(this.ToString()); } /// /// IDevice interface implementation /// public void Initialize() { switch (dbCfg.DBUsed) { case DBUsed.Production: connection = new OracleConnection("Data Source=STARA01.WORLD;User Id=deltachef;Password=deltachef;"); break; case DBUsed.Quality: connection = new OracleConnection("Data Source=STARA01.WORLD;User Id=deltaqual;Password=test;"); break; case DBUsed.Test: connection = new OracleConnection("Data Source=STARA_TEST.WORLD;User Id=deltachef;Password=deltachef;"); break; default: connection = null; break; } if (dbCfg.DebugLevel == DebugMode.Simulate) return; /// /// Do something with the database to see if the connection works well /// 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(); } } /// public void RunDeviceBefore() {} public void RunDeviceAfter() {} /// public void StopDevice() { if (connection != null) connection.Dispose(); } public void StopDevice2() { } /// /// Get a complete information about tests given water meter type Id and revision /// /// An open Oracle DB connection /// Water meter type Id /// Water meter type revision /// SensusTestInfos array public static IList 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 oraDbTinfos = new List(); /// /// 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(); 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; } /// /// Reads information on start of a cycle, Events: Event.InfoRead /// /// Results of water meters /// Reference to the operation public IOperation ReadStartInfoOp(IList waterMeters) { if (!dbCfg.ReadStartInfo) { return null; } else if ((currentOpState == OpState.ReadStartInfoRunning) || (currentOpState == OpState.WriteResultsRunning)) { throw new Exception("Sequence error"); } else { this.waterMeters = waterMeters; currentOpState = OpState.ReadStartInfoScheduled; return this; } } /// /// Writes the test cycle results into a file, Events: Event.ResultsWritten /// /// Batch results /// Reference to the operation public IOperation ProcessResultsOp(Results.Entities.Batch batch) { if (!dbCfg.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; } } /// Start this operation public void Start() { if (currentOpState == OpState.ReadStartInfoScheduled) { currentOpState = OpState.ReadStartInfoRunning; } else if (currentOpState == OpState.WriteResultsScheduled) { currentOpState = OpState.WriteResultsRunning; } opCompleted = false; anyError = false; } /// Run this operation /// Event.ResultsWritten or Event.Error public Event Run() { if (currentOpState == OpState.ReadStartInfoRunning) { if (!opCompleted) { if (waterMeters.Count == 0) return Event.ResultsWritten; if ((dbCfg.DebugLevel == DebugMode.Normal) && (connection != null)) { log.WarnFormat("{0} : Run() : currentOp = {1}", Name, currentOpState); #if ORACLE_DB if (ReadStartInfoFromDB(connection) == Retv.Error) anyError = true; #endif } 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) && (connection != null)) { log.WarnFormat("{0} : Run() : currentOp = {1}", Name, currentOpState); #if ORACLE_DB if (WriteResultsToDB(connection, batch, false) == Retv.Error) anyError = true; #endif } opCompleted = true; } return anyError ? Event.ErrorProcessingResults : Event.ResultsWritten; } else { return Event.None; } } /// Stop this operation 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; } /// /// Read start info of one water meter from the database /// /// Oracke DB connection /// Water meter entity /// Retv.OK when successful, Retv.Error on error 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 wmTestNames = new List(); 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 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; // 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(); return dbCfg.StartInfoIsRequired ? Retv.Error : Retv.OK; } dr.Close(); /// /// 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 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 ((wMtr.ErrorFlags & ((int)ErrorFlagMask.E26 | (int)ErrorFlagMask.E27 | (int)ErrorFlagMask.E28)) == 0) { /// No production error => write the result of testing to Oracle DB SaveSingleWM2DB(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; } } /// /// Write one meter results into the database /// /// 0-based water meter number /// Sorted list of results to save void SaveSingleWM2DB(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; SaveOrUpdateWM(conn, wm, MAX_Pruefindex, Hydr_Pruefung); } /// /// /// /// /// /// 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 pruefindexes = new List(); { 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(); } } { 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); /// purchase order assigned s/n radio address 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; } /// /// Save common batch data /// /// Batch void SaveBatchData(OracleConnection conn, Results.Entities.Batch b) { IList wmTestNames = new List(); 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 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 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.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); } void SaveOrUpdateWM(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 = dbCfg.Baujahr }); 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 = dbCfg.Baujahr }); 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); } } /// /// Saves a water meter result of a single test /// /// q = 0, 1, 2 or 3 (Adj., Q1, Q2, Q3) /// Nr. of rows updated int SaveMeterTestResult(OracleConnection conn, Results.Entities.MeterTestRslt mtr, int pruefungsNr, int max_Pruefindex, int wmTypeRevision) { double Q_wm = 3600.0 * mtr.VolumeMeter / mtr.TestTime; /// 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 }); 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 }); 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.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 }); 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)) }); 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) }); 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 } }