/// /// Copyright (c) 2015-2021 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; using System.Linq; using log4net; #if MANAGED using Oracle.ManagedDataAccess.Client; #else using Oracle.DataAccess.Client; #endif using Common; using Config; using Config.Entities; using Results.Output; using System.Text; using Events.Entities; namespace TBF.Rig.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)); } DatabaseCfg dbCfg; public int Anbid_Producer { get { return dbCfg.ProducerId; } } 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; public OracleConnection ProductionDB; /// Production Oracle DB connection public OracleConnection QualityDB; /// Quality Oracle DB connection public 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; //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;"); ProductionDB = new OracleConnection(string.Format("Data Source={0};User Id={1};Password={2};", dbCfg.ProductionDataSource, dbCfg.ProductionUserId, dbCfg.ProductionPassword)); QualityDB = new OracleConnection(string.Format("Data Source={0};User Id={1};Password={2};", dbCfg.QualityDataSource, dbCfg.QualityUserId, dbCfg.QualityPassword)); TestDB = new OracleConnection(string.Format("Data Source={0};User Id={1};Password={2};", dbCfg.TestDataSource, dbCfg.TestUserId, dbCfg.TestPassword)); /// /// Do something with the database to see if the connection works well /// if (dbCfg.DebugLevel == DebugMode.Normal) { SelectedDB.Open(); string rslt = "none"; OracleCommand cmd = new OracleCommand("SELECT standort FROM anbieter_sd WHERE anbid = :1", ProductionDB); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Anbid_Producer }); 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 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=:1 AND id_wztyp=:2 AND aktiv=:3", conn); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Anbid_Producer }); 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, WMKind, 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 = :2", conn); cmd.Parameters.Add(new OracleParameter { ParameterName = "1", OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNr }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Anbid_Producer }); 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 = :2", conn); cmd.Parameters.Add(new OracleParameter { ParameterName = "1", OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNr }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Anbid_Producer }); 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 = :2", conn); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNr }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Anbid_Producer }); 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 = :3", conn); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNr }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 100 * testBenchID + maxPruefindex }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Anbid_Producer }); 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, WMKind wmKind, 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 = :2", conn); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNr }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Anbid_Producer }); 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 = :2", conn); /// PCB number Producer ID cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNr }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Anbid_Producer }); 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.DebugLevel == DebugMode.Normal) { 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_Producer }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = dbCfg.TestBenchGroupId + 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.DebugLevel == DebugMode.Normal) { #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_Producer }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = dbCfg.TestBenchGroupId + 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_Producer; cmd2.Parameters.Add(parm); ///:1 parm = new OracleParameter("ID_Pruefstand", OracleDbType.Int32); parm.Value = dbCfg.TestBenchGroupId + 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_Producer, dbCfg.TestBenchGroupId + b.TestBenchId, b.BatchNr, testInfo.PruefungsNrDB, Q_ist); #endif } else { log.WarnFormat("SIM: VT_PRUEFDURCHFLUSS_PD inserted ({0}, {1}, {2}, {3}, {4} ...)", Anbid_Producer, dbCfg.TestBenchGroupId + 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.Rig.GenericDevices.IBenchInfo benchInfo = TBF.Rig.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 (dbCfg.DebugLevel == DebugMode.Normal) { 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_Producer }); int updatedRows = cmd.ExecuteNonQuery(); int insertedRows = 0; if (updatedRows == 0) { 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_Producer }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = YearOfManufacture }); insertedRows = cmd.ExecuteNonQuery(); if (insertedRows == 0) { throw new Exception(string.Format("Failed to insert or update VT_ZAEHLER_PD: PcbNr={0}, pos={1}, maxPruefix={2}", wm.SerialNr, wm.WMPosition, max_Pruefindex)); } } if (insertedRows > 0) { log.InfoFormat("VT_ZAEHLER_PD {0} row inserted, PcbNr={1}, pos={2}, maxPruefix={3}", insertedRows, wm.SerialNr, wm.WMPosition, max_Pruefindex); } else { log.InfoFormat("VT_ZAEHLER_PD: {0} rows updated, PcbNr={1}, pos={2}, maxPruefix={3}", updatedRows, wm.SerialNr, wm.WMPosition, max_Pruefindex); } } else { log.WarnFormat("SIM: VT_ZAEHLER_PD inserted or updated, PcbNr={0}, pos={1}, maxPruefix={2}", wm.SerialNr, wm.WMPosition, max_Pruefindex); } if (dbCfg.DebugLevel == DebugMode.Normal) { 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_Producer }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = dbCfg.TestBenchGroupId + 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: pressure test 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.DebugLevel == DebugMode.Normal) { 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_Producer }); 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.Rig.GenericDevices.IBenchInfo benchInfo = TBF.Rig.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; string vt_identnummer = wm.SerialNr.Length > 8 ? wm.SerialNr.Substring(0, 8) : wm.SerialNr; if (dbCfg.DebugLevel == DebugMode.Normal) { //OracleCommand cmd = new OracleCommand("UPDATE vt_zaehler_pd " + // "SET max_pruefindex=:3, vt_identnummer=:4, auftragsnummer=:5, vt_baugruppen_nr=:6, mbus_adr=:7, liegenschafts_nr=:8," + // " sekundaere_adr=:9, hydr_pruefung=:10, mark_date=:11, baujahr=:12, eich_jahr=:13, umkarton_nr=:14," + // " palette_nr=:15, zaehlernummer=:16, prefix=:17, suffix=:18, z_nr_komplett=:19, id_benutzer=:20," + // " albatrosid=:21, vt_modul_snr=:22 " + // "WHERE vt_fernum = :1 AND anbid = :2", conn); OracleCommand cmd = new OracleCommand("UPDATE vt_zaehler_pd " + "SET max_pruefindex=:3, vt_identnummer=:4, auftragsnummer=:5, vt_baugruppen_nr=:6, mbus_adr=:7, liegenschafts_nr=:8," + " sekundaere_adr=:9, hydr_pruefung=:10, baujahr=:11, eich_jahr=:12, umkarton_nr=:13," + " palette_nr=:14, zaehlernummer=:15, prefix=:16, suffix=:17, z_nr_komplett=:18, id_benutzer=:19," + " albatrosid=:20, vt_modul_snr=:21 " + "WHERE vt_fernum = :1 AND anbid = :2", conn); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNr }); /// 1 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Anbid_Producer }); /// 2 /// cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = max_Pruefindex }); /// 3 max_pruefindex cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = vt_identnummer }); /// 4 vt_identnummer cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.PurchaseOrder }); /// 5 auftragsnummer cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNrAux }); /// 6 vt_baugruppen_nr = PCB number of 640 meter cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 0 }); /// 7 mbus_adr cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 0 }); /// 8 liegenschafts_nr cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = wm.AssignedSerialNr }); /// 9 sekundaere_adr cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = hydr_Pruefung }); /// 10 //cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.TimeStamp, Value = wm.Batch.EndTime }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = YearOfManufacture }); /// 11 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = YearOfManufacture }); /// 12 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 0 }); /// 13 umkarton_nr cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 0 }); /// 14 palette_nr cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = wm.AssignedSerialNr }); /// 15 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.Prefix }); /// 16 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.Suffix }); /// 17 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.CompleteSerialNr }); /// 18 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = idBenutzer }); /// 19 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.OriRadioAddress }); /// 20 albatrosid = original radio address cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.RadioAddress }); /// 21 vt_modul_snr = new radio address int updatedRows = cmd.ExecuteNonQuery(); int insertedRows = 0; if (updatedRows == 0) { cmd = new OracleCommand("INSERT INTO vt_zaehler_pd(vt_fernum, max_pruefindex, vt_identnummer, auftragsnummer, vt_baugruppen_nr," + " 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, albatrosid, vt_modul_snr) " + "VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, :14, :15, :16, :17, :18, :19, :20, :21, :22)", conn); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNr }); /// 1 vt_fernum cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = max_Pruefindex }); /// 2 max_pruefindex cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = vt_identnummer }); /// 3 vt_identnummer cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.PurchaseOrder }); /// 4 auftragsnummer cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNrAux }); /// 5 vt_baugruppen_nr = PCB number of 640 meter cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 0 }); /// 6 mbus_adr cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 0 }); /// 7 liegenschafts_nr cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = wm.AssignedSerialNr }); /// 8 sekundaere_adr cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = hydr_Pruefung }); /// 9 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.TimeStamp, Value = wm.Batch.EndTime }); /// 10 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = YearOfManufacture }); /// 11 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = YearOfManufacture }); /// 12 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 0 }); /// 13 umkarton_nr cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 0 }); /// 14 palette_nr cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = wm.AssignedSerialNr }); /// 15 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.Prefix }); /// 16 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.Suffix }); /// 17 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.CompleteSerialNr }); /// 18 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Anbid_Producer }); /// 19 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = idBenutzer }); /// 20 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.OriRadioAddress }); /// 21 albatrosid = original radio address cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.RadioAddress }); /// 22 vt_modul_snr = new radio address insertedRows = cmd.ExecuteNonQuery(); if (insertedRows == 0) { throw new Exception(string.Format("Failed to insert or update VT_ZAEHLER_PD: PcbNr={0}, pos={1}, maxPruefix={2}", wm.SerialNr, wm.WMPosition, max_Pruefindex)); } } if (insertedRows > 0) { log.InfoFormat("VT_ZAEHLER_PD {0} row inserted, PcbNr={1}, pos={2}, maxPruefix={3}", insertedRows, wm.SerialNr, wm.WMPosition, max_Pruefindex); } else { log.InfoFormat("VT_ZAEHLER_PD: {0} rows updated, PcbNr={1}, pos={2}, maxPruefix={3}", updatedRows, wm.SerialNr, wm.WMPosition, max_Pruefindex); } } else { log.WarnFormat("SIM: VT_ZAEHLER_PD inserted or updated, PcbNr={0}, pos={1}, maxPruefix={2}", wm.SerialNr, wm.WMPosition, max_Pruefindex); } if (dbCfg.DebugLevel == DebugMode.Normal) { 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_Producer }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = dbCfg.TestBenchGroupId + 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.DebugLevel == DebugMode.Normal) { 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_Producer }); /// :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.ErrorBC)) }); /// :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 /// /// Read a list of valid purchase orders. /// /// Oracle DB connection /// List of active purchase orders public IList ReadOrderNumbers() { OracleConnection connection = ProductionDB; /// Read a list of valid order numbers from Oracle IList orders = new List(); if (dbCfg.DebugLevel == DebugMode.Normal) { try { connection.Open(); foreach (string status in new string[] { "NEU", "AKTIV" }) { /// STATUS='NEU' OracleCommand cmd = new OracleCommand("SELECT auftragsnummer, variantencode, erste_zaehlernr, prefix, suffix, " + "zaehlwerk, erfasst_am, sollende, sollstueck, zusatztext, znrlaenge, modul_param " + "FROM vt_auftrag_pd " + "WHERE produktion_anbid=:1 AND status=:2 AND produktion_usestate=0", connection); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Anbid_Producer }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = status }); OracleDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { int i = 0; string auftragsnummer = dr.GetString(i++); string variantencode; try { variantencode = dr.GetString(i++); } catch { variantencode = string.Empty; } int erste_zaehlernr; try { erste_zaehlernr = dr.GetInt32(i++); } catch { erste_zaehlernr = 1; } string prefix; try { prefix = dr.GetString(i++); } catch { prefix = string.Empty; } string suffix; try { suffix = dr.GetString(i++); } catch { suffix = string.Empty; } int zaehlwerk; try { zaehlwerk = dr.GetInt32(i++); } catch { zaehlwerk = 0; } DateTime erfasst_am; try { erfasst_am = dr.GetDateTime(i++); } catch { erfasst_am = DateTime.Now; } DateTime sollende; try { sollende = dr.GetDateTime(i++); } catch { sollende = DateTime.Now; } int sollstueck = dr.GetInt32(i++); string zusatztext; try { zusatztext = dr.GetString (i++); } catch { zusatztext = string.Empty; } int znrlaenge = dr.GetInt32(i++); string modul_param; try { modul_param = dr.GetString(i++); } catch { modul_param = string.Empty; } orders.Add(new OrderDetails { AuftragsNummer = auftragsnummer, VariantenCode = variantencode, EsrsteZaehlerNr = erste_zaehlernr, Prefix = prefix, Suffix = suffix, Zaehlwerk = zaehlwerk, Created = erfasst_am, DueDate = sollende, TargetPcsCount = sollstueck, Remark = zusatztext, SNLength = znrlaenge, ModuleParameter = modul_param }); } dr.Close(); } log.InfoFormat("Oracle DB query SELECT auftragsnummer, sollstueck FROM vt_auftrag_pd WHERE ... successful. {0} order numbers read", orders.Count); } catch (Exception exc) { log.ErrorFormat("ERROR: Oracle DB query SELECT auftragsnummer, sollstueck FROM vt_auftrag_pd WHERE ... failed: {1}", exc.Message); } if (connection != null) connection.Close(); } else { orders = new List () { new OrderDetails { AuftragsNummer = "1234567", EsrsteZaehlerNr = 1, TargetPcsCount = 100, Prefix = "Pre", Suffix = "Suf", VariantenCode = "abeceda" }, new OrderDetails { AuftragsNummer = "2345678", EsrsteZaehlerNr = 1, TargetPcsCount = 200, Prefix = "Pfx", Suffix = "Sfx", VariantenCode = "zjedla_deda" }, }; } return orders; } /// /// Read a list of valid purchase orders. /// /// Oracle DB connection /// List of active purchase orders public bool ReadOrderDetails(ref OrderDetails auftrag) { if (dbCfg.DebugLevel == DebugMode.Normal) { OracleConnection connection = ProductionDB; try { connection.Open(); OracleCommand cmd = new OracleCommand("SELECT iststueck FROM vt_auftrag_pd WHERE auftragsnummer=:1 AND anbid=:2", connection); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = auftrag.AuftragsNummer }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Anbid_Producer }); OracleDataReader dr = cmd.ExecuteReader(); if (dr.Read()) { try { auftrag.CurrentPcsCount = dr.GetInt32(0); } catch { auftrag.CurrentPcsCount = 0; } } dr.Close(); cmd = new OracleCommand("SELECT erste_nummer, ltz_nummer, akt_nummer, erste_adresse, ltz_adresse," + " prefix_adresse, suffix_adresse, akt_adresse " + "FROM vt_auft_zaehlernr_pd " + "WHERE auftragsnummer=:1 AND anbid=:2", connection); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = auftrag.AuftragsNummer }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Anbid_Producer }); dr = cmd.ExecuteReader(); if (dr.Read()) { int i = 0; auftrag.FirstSerialNr = dr.GetInt32(i++); auftrag.LastSerialNr = dr.GetInt32(i++); auftrag.CurrentSerialNr = dr.GetInt32(i++); auftrag.FirstRadioAddress = dr.GetInt32(i++); auftrag.LastRadioAddress = dr.GetInt32(i++); try { auftrag.RadioAddressPrefix = dr.GetString(i++); } catch { auftrag.RadioAddressPrefix = string.Empty; } try { auftrag.RadioAddressSuffix = dr.GetString(i++); } catch { auftrag.RadioAddressSuffix = string.Empty; } auftrag.CurrentRadioAddress = dr.GetInt32(i++); } dr.Close(); connection.Close(); return true; } catch (Exception exc) { log.ErrorFormat("ERROR: Oracle DB query SELECT ... FROM vt_auft_zaehlernr_pd WHERE auftragsnummer={0} failed: {1}", auftrag.AuftragsNummer, exc.Message); if (connection != null) connection.Close(); return false; } } else { return false; } } /// /// Read a list of valid purchase orders. /// /// Oracle DB connection /// List of active purchase orders public int UpdateOrderDetails(OrderDetails auftrag) { if (dbCfg.DebugLevel == DebugMode.Normal) { OracleConnection connection = ProductionDB; try { connection.Open(); OracleCommand cmd = new OracleCommand("UPDATE vt_auftrag_pd SET iststueck=:1 WHERE auftragsnummer=:2 AND anbid=:3", connection); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = auftrag.CurrentPcsCount }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = auftrag.AuftragsNummer }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Anbid_Producer }); int updatedRows = cmd.ExecuteNonQuery(); cmd = new OracleCommand("UPDATE vt_auft_zaehlernr_pd SET akt_nummer=:1, akt_adresse=:2 " + "WHERE auftragsnummer=:3 AND anbid=:4", connection); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = auftrag.CurrentSerialNr }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = auftrag.CurrentRadioAddress }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = auftrag.AuftragsNummer }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Anbid_Producer }); updatedRows = Math.Min(cmd.ExecuteNonQuery(), updatedRows); connection.Close(); return updatedRows; } catch (Exception exc) { log.ErrorFormat("ERROR: Oracle DB query SELECT ... FROM vt_auft_zaehlernr_pd WHERE auftragsnummer={0} failed: {1}", auftrag.AuftragsNummer, exc.Message); if (connection != null) connection.Close(); return 0; } } else { return 0; } } } }