/// /// Copyright (c) 2015-2023 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; using Results; 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 } 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; } } 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) LUTestData[] completeTestInfo; /// Complete test info obtained from the procedure 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) { /// /// 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; OracleCommand cmd = new OracleCommand("SELECT rev_wztyp, wztyp, metrolklasse, zulasszeichen, materialnr, qmax, aenderungsdatum " + "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); } 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=:1 AND id_wztyp=:2 AND rev_wztyp=:3", conn); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Anbid_Producer }); ///:1 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = wmTypeId }); ///:2 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = wmTypeRevision }); ///:3 /// dr = cmd.ExecuteReader(); while (dr.Read()) { int pruefungsNr = dr.GetInt32(0); double flow = Common.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 } 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 (TBF.DB.EventsDBSessionFactory != null && anyError) { NHibernate.ISession session = null; try { session = TBF.DB.EventsDBSessionFactory.OpenSession(); 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); } finally { if (session != null && session.IsOpen) session.Close(); } } return anyError ? Event.ErrorProcessingResults : Event.ResultsWritten; } else { return Event.None; } } /// Stop this operation public void Stop() { currentOpState = OpState.None; } #if ORACLE_DB void GetTestInofFromProcedure(string logCaption) { /// /// Select or create appropriate test infos /// IList testsToSave = new List(); int maxPruefungsNr = 0; foreach (var td in Sequences.ProcessData.BatchRslts.Batch.Tests) { for (int repNr = 1; repNr <= td.Repeats; repNr++) { int testId = td.OraId + (td.Repeats - repNr) * td.OraIdRepetMulti; if (testId != 0) { testsToSave.Add(new LUTestData(td, repNr)); if (Math.Abs(testId) > maxPruefungsNr) maxPruefungsNr = Math.Abs(testId); } } } LUTestData[] testsToSaveArr = testsToSave.ToArray(); Array.Sort(testsToSaveArr, new LUTestDataComparer()); completeTestInfo = testsToSaveArr; log.WarnFormat("{0} selected test infos:", logCaption); foreach (var cti in completeTestInfo) { log.WarnFormat(" ID={0} Rev={1} Test={2} PrfNrDB={3} QBzDB={4}", wmTypeId, wmTypeRevision, cti.TestName, cti.Id, cti.Designation); } } public Retv ReadStartInfoFromDB(OracleConnection conn) { GetTestInofFromProcedure("ReadStartInfoFromDB"); /// Create appropriate test infos 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 StartInfo from ORACLE DB failed, error={é}", 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 { 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 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 /// dr.Close(); wm.Pruefindex = 1; log.ErrorFormat("Water meter {0} was not found in ORACLE database.", wm.SerialNr); 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(); #if TURA_SPECIAL /// TODO: Check after modifications in completeTestInfo due to OraId, OraDesignation, etc. /// /// 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.Id == 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(); #endif /// /// Copy acquired data to WaterMeter object /// wm.Pruefindex = Math.Max(1, 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 = 0; 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 bat, WMKind wmKind, bool safeMode) { OracleTransaction transaction; bool savedOK = false; 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}", bat.BatchNr, exc.Message); conn.Close(); return Retv.Error; } try { SaveBatchData(conn, bat); foreach (var wMtr in bat.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(); savedOK = true; conn.Close(); log.ErrorFormat("Results of batch {0} correctly written to ORACLE DB", bat.BatchNr); return Retv.OK; } catch (Exception exc) { savedOK = false; log.ErrorFormat("Results of batch {0} not written to ORACLE DB: {1}", bat.BatchNr, exc.Message); } if (!savedOK) { try { transaction.Rollback(); conn.Close(); } catch (Exception exc) { log.ErrorFormat("Even transaction.Rollback() failed: {0}", exc.Message); } return Retv.Error; } return Retv.OK; } /// /// /// /// /// /// 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 bat) { StringBuilder procedureSignatureSB = new StringBuilder(); foreach (var tr in bat.RegularTestRslts()) { if (tr.Evaluate()) { procedureSignatureSB.Append(tr.Name()); procedureSignatureSB.Append("~"); } } if ((oracleTestInfo == null) || (wmTypeId != bat.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; IList ti = GetOracleTestInfo(conn, bat.WaterMeters[0].WaterMeterData.WMTypeId, out wmTR, out wzTypStr, out metroKlasse, out zulasszeichen, out materialNr, out q3, out timeStamp); if (ti != null) { /// All 5 updated together wmTypeId = bat.WaterMeters[0].WaterMeterData.WMTypeId; wmTypeRevision = wmTR; procedureSignature = procedureSignatureSB.ToString(); oracleTestInfo = ti; } else { throw new Exception(string.Format("Cannot save batch {0} to Oracle, missing entry in VT_WZTYP_SD", bat.BatchNr)); } } if (oracleTestInfo == null || wmTypeId == 0 || wmTypeRevision == 0) { throw new Exception(string.Format("Cannot save batch {0} to Oracle, missing entry in VT_WZTYP_SD", bat.BatchNr)); } GetTestInofFromProcedure("SaveBatchData"); /// Create appropriate test infos 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 + bat.TestBenchId }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = bat.BatchNr }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = bat.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 = bat.StartTime }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.TimeStamp, Value = bat.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}", bat.ProgramVersion) }); cmd.ExecuteNonQuery(); /// Returns nr. of updated rows log.InfoFormat("VT_PRUEFREIHE_PD inserted, BatchNr={0}, TypeId={1}, TypeRev={2}, Start={3}", bat.BatchNr, bat.WaterMeters[0].WaterMeterData.WMTypeId, wmTypeRevision, bat.StartTime); } else { log.WarnFormat("SIM: VT_PRUEFREIHE_PD inserted, BatchNr={0}, TypeId={1}, TypeRev={2}, Start={3}", bat.BatchNr, bat.WaterMeters[0].WaterMeterData.WMTypeId, wmTypeRevision, bat.StartTime); } foreach (var testInfo in completeTestInfo) { if ((testInfo.Id != 0) && (-20 <= testInfo.Id) && (testInfo.Id <= 20)) /// LU PruefungsNr-s are between -20 and 20 { Results.Entities.TestRslt tr = bat.GetTestRslt(testInfo.TestName, 0); if (tr == null) tr = bat.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 + bat.TestBenchId; cmd2.Parameters.Add(parm); ///:2 parm = new OracleParameter("ID_WzPruefreihe", OracleDbType.Int32); parm.Value = bat.BatchNr; cmd2.Parameters.Add(parm); ///:3 parm = new OracleParameter("PruefungsNr", OracleDbType.Int32); parm.Value = testInfo.Id; 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 + bat.TestBenchId, bat.BatchNr, testInfo.Id, Q_ist); #endif } else { log.WarnFormat("SIM: VT_PRUEFDURCHFLUSS_PD inserted ({0}, {1}, {2}, {3}, {4} ...)", Anbid_Producer, dbCfg.TestBenchGroupId + bat.TestBenchId, bat.BatchNr, testInfo.Id, Q_ist); } } } log.InfoFormat("Batch data saved, batchNr={0}", bat.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 = (Anbid_Producer == 4) ? 6 : (Anbid_Producer == 8) ? 365 : 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.Id != 0) && (-20 <= testInfo.Id) && (testInfo.Id <= 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.Id, 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 = (Anbid_Producer == 4) ? 6 : (Anbid_Producer == 8) ? 365 : 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=:1, vt_identnummer=:2, auftragsnummer=:3, vt_baugruppen_nr=:4, mbus_adr=:5, liegenschafts_nr=:6," + " sekundaere_adr=:7, hydr_pruefung=:8, mark_date=:9, baujahr=:10, eich_jahr=:11, umkarton_nr=:12," + " palette_nr=:13, zaehlernummer=:14, prefix=:15, suffix=:16, z_nr_komplett=:17, id_benutzer=:18," + " albatrosid=:19, vt_modul_snr=:20 " + "WHERE vt_fernum = :21 AND anbid = :22", conn); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = max_Pruefindex }); /// 1 max_pruefindex cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = vt_identnummer }); /// 2 vt_identnummer cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.PurchaseOrder }); /// 3 auftragsnummer cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNrAux }); /// 4 vt_baugruppen_nr = PCB number of 640 meter 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 = wm.AssignedSerialNr }); /// 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 = idBenutzer }); /// 18 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.OriRadioAddress }); /// 19 albatrosid = original radio address cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.RadioAddress }); /// 20 vt_modul_snr = new radio address cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNr }); /// 21 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Anbid_Producer }); /// 22 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.Id != 0) && (-20 <= testInfo.Id) && (testInfo.Id <= 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.Id, 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; } } } }