/// /// Copyright (c) 2015-2021 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 } /// /// Test/Q designation mode for IperlLogger and IperlHead opto data files /// 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})", ClassName, 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; /// /// Start info is read into WaterMeter objects referenced by this array /// IList waterMeters; /// /// Results to print /// 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 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; } public override void Initialize() { currentOpState = OpState.None; if (dbCfg.DebugLevel == DebugMode.Normal) { 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(); } log.FatalFormat("{0} initialized: {1}", Name, this); } else { log.FatalFormat("{0} simulated: {1}", Name, this); } } /// /// IDevice interface implementation /// 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() {} /// /// 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 ((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 (!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) { 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; } } /// 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; 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; } } /// /// /// /// /// /// 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(); } } { /// 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; } /// /// 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 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); } /// /// Write one meter results into the database /// /// 0-based water meter number /// Sorted list of results to save 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); } } /// /// Write results of one mechanical meter into the database /// /// 0-based water meter number /// Sorted list of results to save 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); } } } /// /// 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) { 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 = (mtr.VolumeRef > float.Epsilon) ? 1000 * mtr.TestRslt.FlowVolume * mtr.VolumeMeter / mtr.VolumeRef : 0 }); /// :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 int retv = cmd.ExecuteNonQuery(); log.DebugFormat("VT_PRUEFREIHE_IST_PD inserted, PcbNr={0}, pruefungsNr={1}, error={2}", mtr.WaterMeter.SerialNr, pruefungsNr, mtr.Error); return retv; } else { log.WarnFormat("SIM: VT_PRUEFREIHE_IST_PD inserted, PcbNr={0}, pruefungsNr={1}, error={2}", mtr.WaterMeter.SerialNr, pruefungsNr, mtr.Error); } return 0; } #endif } }