/// /// Copyright (c) 2015-2018 Sensus Metering Systems /// using System; using System.Collections.Generic; using System.IO; using System.Linq; using log4net; using Oracle.DataAccess.Client; // ODP.NET Oracle managed provider using Config; using Config.Entities; namespace TBF.BenchControl.Output.DB.SensusOracle { public enum Retv { OK, Error, } public class Database : ComponentBase, IOperation, GenericDevices.IResultsWriter, GenericDevices.IStartInfoReader, Generic.IDevice { private static readonly ILog log = LogManager.GetLogger(typeof(Database)); public override string ToString() { return string.Format("Sensus-Oracle-Database({0})", Cfg.ToString(1)); } const int Anbid_StaraTura = 4; public DatabaseCfg dbCfg; enum CurrentOp { None, CheckBarcodeScanning, WriteResults, ReadStartInfo, } CurrentOp currentOp; bool opCompleted; bool anyError; /// /// iPerls to verify /// GenericDevices.IRegisterReader[] iperlHeads; /// /// Start info is read into WaterMeter objects referenced by this array /// Results.Entities.WaterMeter[] waterMeters; /// /// Results to print /// Results.Entities.Batch batch; OracleConnection connection; /// Oracle database connection /// /// The following 3 variables are always update together /// int id_WZTyp; int rev_WZTyp; SensusTestInfo[] completeTestInfos; /// Contains (1) range (90-100/100-110), (2) TBF test name, (3) string form of the flowId ... /// ... in addition to incomplete test info from Oracle public Database() {} public Database(Generic.IComponentCfg cfg) : base(cfg) { dbCfg = cfg as DatabaseCfg; currentOp = CurrentOp.None; log.Debug(this.ToString()); } /// /// IDevice interface implementation /// public void Initialize() { switch (dbCfg.DBUsed) { case DBUsed.Production: connection = new OracleConnection("Data Source=STARA01.WORLD;User Id=deltachef;Password=deltachef;"); break; case DBUsed.Quality: connection = new OracleConnection("Data Source=STARA01.WORLD;User Id=deltaqual;Password=test;"); break; case DBUsed.Test: connection = new OracleConnection("Data Source=STARA_TEST.WORLD;User Id=deltachef;Password=deltachef;"); break; default: connection = null; break; } if (dbCfg.DebugLevel == DebugMode.Simulate) return; /// /// Do something with the database to see if the connection works well /// if (connection != null) { connection.Open(); string rslt = "none"; OracleCommand cmd = new OracleCommand("select Standort from ANBIETER_SD where ANBID = 4", connection); OracleDataReader dr = cmd.ExecuteReader(); if (dr.Read()) rslt = dr.GetString(0); dr.Close(); connection.Close(); } } /// public void RunDeviceBefore() {} public void RunDeviceAfter() {} /// public void StopDevice() { if (connection != null) connection.Dispose(); } public void StopDevice2() { } /// /// Get a complete information about tests given water meter type Id and revision /// /// An open Oracle DB connection /// Water meter type Id /// Water meter type revision /// SensusTestInfos array SensusTestInfo[] GetMatchingTestInfo(OracleConnection conn, int wmTypeId, int wmTypeRevision) { /// /// Read 'incomplete' TestInfo from Oracle database containing only flowId-s ad qBezeichnung-s /// IList oraDbTinfos = new List(); OracleCommand cmd = new OracleCommand("SELECT PruefungsNr, PosFehlerKalt, QBezeichnung FROM VT_PRUEFPUNKT_SOLL_SD WHERE ANBID=4 AND ID_WZTyp=:1 AND Rev_WZTyp=:2", conn); cmd.Parameters.Add(new OracleParameter { ParameterName = "1", OracleDbType = OracleDbType.Int32, Value = wmTypeId }); ///:1 cmd.Parameters.Add(new OracleParameter { ParameterName = "2", OracleDbType = OracleDbType.Int32, Value = wmTypeRevision }); ///:2 /// OracleDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { int pruefungsNr = dr.GetInt32(0); double errLimHi = dr.GetDouble(1); string qBezeichnung = dr.GetString(2); oraDbTinfos.Add(new SensusTestInfo(pruefungsNr, string.Empty, qBezeichnung, Range.R100_110, errLimHi.ToString())); } dr.Close(); if (oraDbTinfos.Count == 0) return null; /// No 'incomplete' TestInfo in Oracle DN for this 'wmTypeId' and 'wmTypeRevision' /// /// Find a matching complete test info /// SensusTestInfo[] cmpltTinfos = null; oraDbTinfos = oraDbTinfos.OrderBy(x => x.PruefungsNr).ToList(); for (LogType lt = 0; lt < LogType.Count; lt++) { SensusTestInfo[] myTinfos = SensusTestInfo.GetTestInfos(lt); if (SensusTestInfo.AreCompatible(oraDbTinfos, myTinfos)) { cmpltTinfos = myTinfos; break; } } foreach (var ti in oraDbTinfos) { log.WarnFormat("VT_PRUEFPUNKT_SOLL_SD info : ID_WZTyp={0} Rev_WZTyp={1} PruefungsNr={2} PosFehlerKalt={3} QBezeichnung={4}", wmTypeId, wmTypeRevision, ti.PruefungsNr, ti.TestName, ti.QBezeichnung); } if (cmpltTinfos != null) { foreach (var ti in cmpltTinfos) { log.WarnFormat("Selected test info : ID_WZTyp={0} Rev_WZTyp={1} PruefungsNr={2} Str={3} QBezeichnung={4} Range={5} Test={6}", wmTypeId, wmTypeRevision, ti.PruefungsNr, ti.PruefungsNrStr, ti.QBezeichnung, ti.Range, ti.TestName); } } return cmpltTinfos; } /// /// Reads information on start of a cycle, Events: Event.InfoRead /// /// Results of water meters /// Reference to the operation public IOperation ReadStartInfoOp(Results.Entities.WaterMeter[] waterMeters) { if (!dbCfg.ReadStartInfo) { return null; } else if (currentOp != CurrentOp.None) { throw new Exception("Sequence error"); } else { currentOp = CurrentOp.ReadStartInfo; this.waterMeters = waterMeters; return this; } } /// /// Writes the test cycle results into a file, Events: Event.ResultsWritten /// /// Batch results /// Reference to the operation public IOperation WriteResultsOp(Results.Entities.Batch batch) { if (!dbCfg.SaveResults) { return null; } else if (currentOp != CurrentOp.None) { throw new Exception("Sequence error"); } else { currentOp = CurrentOp.WriteResults; this.batch = batch; return this; } } public IOperation CheckBarcodeScanningOp(GenericDevices.IRegisterReader[] iperlHeads) { if (currentOp != CurrentOp.None) { throw new Exception("Sequence error"); } currentOp = CurrentOp.CheckBarcodeScanning; this.iperlHeads = iperlHeads; return this; } /// Start this operation public void Start() { opCompleted = false; anyError = false; } /// Run this operation /// Event.ResultsWritten or Event.Error public Event Run() { if (currentOp == CurrentOp.ReadStartInfo) { if (!opCompleted) { if ( waterMeters.Length == 0) return Event.ResultsWritten; #if ORACLE_DB if ((dbCfg.DebugLevel == DebugMode.Normal) && (connection != null)) { if (ReadStartInfoFromDB(connection) == Retv.Error) anyError = true; } #endif opCompleted = true; } return anyError ? Event.InfoNotRead : Event.InfoRead; } else if (currentOp == CurrentOp.WriteResults) { if (!opCompleted) { if (batch.WaterMeters.Count == 0) return Event.ResultsWritten; #if ORACLE_DB if ((dbCfg.DebugLevel == DebugMode.Normal) && (connection != null)) { if (WriteResultsToDB(connection, batch, false) == Retv.Error) anyError = true; } #endif opCompleted = true; } return anyError ? Event.ResultsNotWritten : Event.ResultsWritten; } else if (currentOp == CurrentOp.CheckBarcodeScanning) { if (!opCompleted) { #if ORACLE_DB if ((dbCfg.DebugLevel == DebugMode.Normal) && (connection != null)) { if (CheckBarcodeScanning(connection, iperlHeads) == Retv.Error) anyError = true; ; } #endif opCompleted = true; } return anyError ? Event.CheckNotDone : Event.CheckDone; } else { return Event.None; } } /// Stop this operation public void Stop() { currentOp = CurrentOp.None; } #if ORACLE_DB public Retv CheckBarcodeScanning(OracleConnection conn, GenericDevices.IRegisterReader[] iPerlHeads) { try { conn.Open(); /// Open the Oracle database foreach (var rr in iPerlHeads) { //WaterMeters.iPerl.WaterMeter iPerlHead = rr as WaterMeters.iPerl.WaterMeter; //if (iPerlHead != null) //{ // OracleCommand cmd = new OracleCommand("select * from IP_ENDTEST_PD where PCBNUMBER = :1 and TESTSTATIONNAME = :2", conn); // OracleParameter param; // param = new OracleParameter("PCBNUMBER", OracleDbType.Varchar2); param.Value = iPerlHead.SerialNr; cmd.Parameters.Add(param); // param = new OracleParameter("TESTSTATIONNAME", OracleDbType.Varchar2); param.Value = "STAWL001"; cmd.Parameters.Add(param); // bool exists = false; /// true = RF_Power record exists // OracleDataReader dr1 = cmd.ExecuteReader(); // if (dr1.Read()) { exists = true; } // dr1.Close(); // if (!exists) // { // iPerlHead.CommFailed = true; // } //} } } catch (Exception exc) { log.ErrorFormat("Barcode scanning records were not checked: {1}", exc.Message); conn.Close(); return Retv.Error; } conn.Close(); return Retv.OK; } 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 /// /// 0-based water meter number /// Sorted list of results to update 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 { if (completeTestInfos == null || (id_WZTyp != wm.WaterMeterData.WMTypeId) || (rev_WZTyp != wm.WaterMeterData.WMTypeRev)) { SensusTestInfo[] ti = GetMatchingTestInfo(conn, wm.WaterMeterData.WMTypeId, wm.WaterMeterData.WMTypeRev); if (ti != null) { completeTestInfos = ti; id_WZTyp = wm.WaterMeterData.WMTypeId; rev_WZTyp = wm.WaterMeterData.WMTypeRev; } else { return Retv.Error; } } OracleCommand cmd; OracleDataReader dr; // SELECT * FROM VT_ZAEHLER_PD WHERE VT_Fernum = :1 AND ANBID = 4 int maxPruefindex = 0; string purchaseOrder = string.Empty; int assignedSerialNr = 0; int paletteNr = 0; int umkartonNr = 0; string completeSerialNr = string.Empty; string radioAddress = string.Empty; int testBenchID = 0; int pruefreiheID = 0; int wmPosition = 0; bool passed = false; int resultCode = 0; int userId = 0; int q2CorrectionRL = 0; int q2CorrectionLR = 0; double q2ErrorBeforeCorrection = 0; /// /// Read data from VT_ZAEHLER_PD /// cmd = new OracleCommand("select MAX_PRUEFINDEX, AUFTRAGSNUMMER, ZAEHLERNUMMER, PALETTE_NR, UMKARTON_NR, Z_NR_KOMPLETT, VT_MODUL_SNR from VT_ZAEHLER_PD where VT_FERNUM = :1 AND ANBID = 4", conn); /// 100*benchId+MPix, purchase_order, assigned_s/n, palette_nr, box_nr., complete_s/n, radio_address cmd.Parameters.Add(new OracleParameter { ParameterName = "1", OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNr }); dr = cmd.ExecuteReader(); if (dr.Read()) { int i = 0; int benchId_x_100_plus_MaxPruefindex = dr.GetInt32(i++); maxPruefindex = benchId_x_100_plus_MaxPruefindex % 100; testBenchID = benchId_x_100_plus_MaxPruefindex / 100; try { purchaseOrder = dr.GetString(i++); } catch { purchaseOrder = string.Empty; } try { assignedSerialNr = dr.GetInt32(i++); } catch { assignedSerialNr = 0; } try { paletteNr = dr.GetInt32(i++); } catch { paletteNr = 0; } try { umkartonNr = dr.GetInt32(i++); } catch { umkartonNr = 0; } try { completeSerialNr = dr.GetString(i++); } catch { completeSerialNr = string.Empty; } try { radioAddress = dr.GetString(i++); } catch { radioAddress = string.Empty; } } else { /// /// Water meter with given PCB number was not found in ORACLE /// log.ErrorFormat("Water meter {0} was not found in ORACLE database.", wm.SerialNr); dr.Close(); return Retv.Error; } dr.Close(); /// /// Read data from VT_ZAEHLER_PINDEX_PD /// cmd = new OracleCommand("select PRUEFINDEX, ID_WZPRUEFREIHE, WT_PLATZ_NR, WZGUT, ID_BENUTZER from VT_ZAEHLER_PINDEX_PD where VT_FERNUM = :1 AND ANBID = 4", conn); /// test_bench_ID, line_ID, WM_position, result, user_ID cmd.Parameters.Add(new OracleParameter { ParameterName = "1", OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNr }); dr = cmd.ExecuteReader(); while (dr.Read()) { int i = 0; int prfix = (dr.GetInt32(i++) % 100); if (prfix == maxPruefindex) { pruefreiheID = dr.GetInt32(i++); wmPosition = dr.GetInt32(i++); passed = (dr.GetInt32(i++) != 0); userId = dr.GetInt32(i++); } } dr.Close(); /// /// Read data from VT_IP_ZAEHLER_PINDEX_PD /// cmd = new OracleCommand("select PRUEFINDEX, Q2CORRECTIONLEFT, Q2CORRECTIONRIGHT, ERRQ2 from VT_IP_ZAEHLER_PINDEX_PD where VT_FERNUM = :1 AND ANBID = 4", conn); /// pruefindex, Q2_correction_RL, Q2_correction_LR, Q2_error_before_correction cmd.Parameters.Add(new OracleParameter { ParameterName = "1", OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNr }); dr = cmd.ExecuteReader(); while (dr.Read()) { int i = 0; int prfix = (dr.GetInt32(i++) % 100); if (prfix == maxPruefindex) { q2CorrectionRL = dr.GetInt32(i++); q2CorrectionLR = dr.GetInt32(i++); q2ErrorBeforeCorrection = dr.GetDouble(i++); } } dr.Close(); /// /// Read data from VT_PRUEFREIHE_IST_PD /// /// testID, flow, rel.err., passed cmd = new OracleCommand("select PRUEFUNGSNR, Q_WZ, Q_FEHLER, Q_BEST from VT_PRUEFREIHE_IST_PD where VT_FERNUM = :1 AND PRUEFINDEX = :2 AND ANBID = 4", conn); cmd.Parameters.Add(new OracleParameter { ParameterName = "1", OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNr }); cmd.Parameters.Add(new OracleParameter { ParameterName = "2", OracleDbType = OracleDbType.Int32, Value = 100 * testBenchID + maxPruefindex }); dr = cmd.ExecuteReader(); while (dr.Read()) { int i = 0; int testId = dr.GetInt32(i++); double flow = dr.GetDouble(i++); double error = dr.GetDouble(i++); bool testPassed = (dr.GetInt32(i++) != 0); string testName = null; foreach (var ti in completeTestInfos) { if (ti.PruefungsNr == testId) { testName = ti.TestName; break; } } if (!string.IsNullOrEmpty(testName)) { 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 == testName) { mtr.LastError = error; } } } } dr.Close(); /// /// Copy acquired data to WaterMeter object /// wm.Pruefindex = maxPruefindex; 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.InfoFormat("Data of water meter {0} successfully read from ORACLE database.", wm.SerialNr); log.DebugFormat(" MaxPruefindex = {0}", wm.Pruefindex); 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); return Retv.OK; } catch (Exception exc) { log.ErrorFormat("Error reading data of water meter {0} from ORACLE database: {1}", wm.SerialNr, exc.Message); return Retv.Error; } } public Retv WriteResultsToDB(OracleConnection conn, Results.Entities.Batch batch, bool safeMode) { OracleTransaction transaction = null; try { conn.Open(); /// Open the Oracle database transaction = conn.BeginTransaction(); SaveBatchData(conn, batch); foreach (var wMtr in batch.WaterMeters) { SaveSingleWM2DB(conn, wMtr, safeMode); } transaction.Commit(); } catch (Exception exc) { if (transaction != null) transaction.Rollback(); log.ErrorFormat("Results of batch {0} not written to ORACLE database: {1}", batch.BatchNr, exc.Message); conn.Close(); return Retv.Error; } conn.Close(); return Retv.OK; } /// /// Write one meter results into the database /// /// 0-based water meter number /// Sorted list of results to save void SaveSingleWM2DB(OracleConnection conn, Results.Entities.WaterMeter wm, bool safeMode) { if (safeMode && !wm.Passed) return; if (string.IsNullOrEmpty(wm.SerialNr)) return; /// No database activity possible w/o PCB number int maxpruefindexLowPart = ReadMaxPruefindex(conn, wm); int MAX_Pruefindex = 100 * dbCfg.TestBenchId + maxpruefindexLowPart + 1; int Hydr_Pruefung; if (wm.Passed) { /// Passed if (maxpruefindexLowPart == 0) Hydr_Pruefung = 96; else Hydr_Pruefung = 224; } else { /// Failed Hydr_Pruefung = 97; /// Hydr. test failed, Pressure test passed } wm.Pruefindex = MAX_Pruefindex; wm.HydrPruefung = Hydr_Pruefung; SaveOrUpdateWM(conn, wm, MAX_Pruefindex, Hydr_Pruefung); } /// /// /// /// /// /// int ReadMaxPruefindex(OracleConnection conn, Results.Entities.WaterMeter wm) { /// Create a list of all prufindexes for a given PCB Number (the list is initially empty) IList pruefindexes = new List(); string purchaseOrder; string assignedSerialNr; string radioAddress; { OracleParameter parm = new OracleParameter(); parm.OracleDbType = OracleDbType.Varchar2; parm.Value = wm.SerialNr; OracleCommand cmd1 = new OracleCommand("SELECT Pruefindex FROM VT_ZAEHLER_PINDEX_PD WHERE VT_Fernum = :1 AND ANBID = 4", conn); cmd1.Parameters.Add(parm); OracleDataReader dr = cmd1.ExecuteReader(); while (dr.Read()) { pruefindexes.Add(dr.GetInt32(0)); } dr.Close(); } { OracleParameter parm = new OracleParameter(); parm.OracleDbType = OracleDbType.Varchar2; parm.Value = wm.SerialNr; OracleCommand cmd1 = new OracleCommand("SELECT Max_Pruefindex, Auftragsnummer, Z_Nr_Komplett, VT_Modul_Snr FROM VT_ZAEHLER_PD WHERE VT_Fernum = :1 AND ANBID = 4", conn); /// purchase order assigned s/n radio address PCB number Producer ID cmd1.Parameters.Add(parm); OracleDataReader dr = cmd1.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) { if ((completeTestInfos == null) || (id_WZTyp != b.WaterMeters[0].WaterMeterData.WMTypeId) || (rev_WZTyp != b.WaterMeters[0].WaterMeterData.WMTypeRev)) { SensusTestInfo[] ti = GetMatchingTestInfo(conn, b.WaterMeters[0].WaterMeterData.WMTypeId, b.WaterMeters[0].WaterMeterData.WMTypeRev); if (ti != null) { completeTestInfos = ti; id_WZTyp = b.WaterMeters[0].WaterMeterData.WMTypeId; rev_WZTyp = b.WaterMeters[0].WaterMeterData.WMTypeRev; } else { throw new Exception("No matching test infos found"); } } 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 { ParameterName = "1", OracleDbType = OracleDbType.Int32, Value = Anbid_StaraTura }); cmd.Parameters.Add(new OracleParameter { ParameterName = "2", OracleDbType = OracleDbType.Int32, Value = 18000 + b.TestBenchId }); cmd.Parameters.Add(new OracleParameter { ParameterName = "3", OracleDbType = OracleDbType.Int32, Value = b.BatchNr }); cmd.Parameters.Add(new OracleParameter { ParameterName = "4", OracleDbType = OracleDbType.Int32, Value = b.WaterMeters[0].WaterMeterData.WMTypeId }); cmd.Parameters.Add(new OracleParameter { ParameterName = "5", OracleDbType = OracleDbType.Int32, Value = b.WaterMeters[0].WaterMeterData.WMTypeRev }); cmd.Parameters.Add(new OracleParameter { ParameterName = "6", OracleDbType = OracleDbType.Int32, Value = 1 }); cmd.Parameters.Add(new OracleParameter { ParameterName = "7", OracleDbType = OracleDbType.TimeStamp, Value = b.StartTime }); cmd.Parameters.Add(new OracleParameter { ParameterName = "8", OracleDbType = OracleDbType.TimeStamp, Value = b.EndTime }); cmd.Parameters.Add(new OracleParameter { ParameterName = "9", OracleDbType = OracleDbType.Varchar2, Value = string.Empty }); cmd.Parameters.Add(new OracleParameter { ParameterName = "10", OracleDbType = OracleDbType.Double, Value = 0 }); cmd.Parameters.Add(new OracleParameter { ParameterName = "11", OracleDbType = OracleDbType.Double, Value = 0 }); cmd.Parameters.Add(new OracleParameter { ParameterName = "12", OracleDbType = OracleDbType.Double, Value = 0 }); cmd.Parameters.Add(new OracleParameter { ParameterName = "13", OracleDbType = OracleDbType.Double, Value = 0 }); cmd.Parameters.Add(new OracleParameter { ParameterName = "14", OracleDbType = OracleDbType.Double, Value = 0 }); /// TODO: DruckBeiAbpressen cmd.Parameters.Add(new OracleParameter { ParameterName = "15", OracleDbType = OracleDbType.Double, Value = 0 }); cmd.Parameters.Add(new OracleParameter { ParameterName = "16", OracleDbType = OracleDbType.Double, Value = 0 }); /// TODO: SpuelDurchflussIst cmd.Parameters.Add(new OracleParameter { ParameterName = "17", OracleDbType = OracleDbType.Varchar2, Value = string.Format("TBF v.{0}", b.ProgramVersion) }); cmd.ExecuteNonQuery(); /// Returns nr. of updated rows foreach (var testInfo in completeTestInfos) { 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; 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 { ParameterName = "1", OracleDbType = OracleDbType.Int32, Value = Anbid_StaraTura }); cmd.Parameters.Add(new OracleParameter { ParameterName = "2", OracleDbType = OracleDbType.Int32, Value = 18000 + b.TestBenchId }); cmd.Parameters.Add(new OracleParameter { ParameterName = "3", OracleDbType = OracleDbType.Int32, Value = b.BatchNr }); cmd.Parameters.Add(new OracleParameter { ParameterName = "4", OracleDbType = OracleDbType.Int32, Value = testInfo.PruefungsNr }); cmd.Parameters.Add(new OracleParameter { ParameterName = "5", OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.l, tr.VolumeCTV) }); cmd.Parameters.Add(new OracleParameter { ParameterName = "6", OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.kg, tr.MassEnd-tr.MassStart) }); cmd.Parameters.Add(new OracleParameter { ParameterName = "7", OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.lph, tr.FlowMin) }); cmd.Parameters.Add(new OracleParameter { ParameterName = "8", OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.lph, tr.FlowMax) }); cmd.Parameters.Add(new OracleParameter { ParameterName = "9", OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.lph, Q_ist) }); cmd.Parameters.Add(new OracleParameter { ParameterName = "10", OracleDbType = OracleDbType.Double, Value = tr.ConstMaster }); cmd.Parameters.Add(new OracleParameter { ParameterName = "11", OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.lph, tr.FlowVolume) }); cmd.Parameters.Add(new OracleParameter { ParameterName = "12", OracleDbType = OracleDbType.Double, Value = tr.ErrorMaster }); cmd.Parameters.Add(new OracleParameter { ParameterName = "13", OracleDbType = OracleDbType.Double, Value = (double)tr.FlowSetTime }); cmd.Parameters.Add(new OracleParameter { ParameterName = "14", OracleDbType = OracleDbType.Int32, Value = 0 }); /// TODO cmd.Parameters.Add(new OracleParameter { ParameterName = "15", OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.bar, tr.PressUpStart) }); cmd.Parameters.Add(new OracleParameter { ParameterName = "16", OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.bar, tr.PressDownStart) }); cmd.Parameters.Add(new OracleParameter { ParameterName = "17", OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.bar, tr.PressUpEnd) }); cmd.Parameters.Add(new OracleParameter { ParameterName = "18", OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.bar, tr.PressDownEnd) }); cmd.Parameters.Add(new OracleParameter { ParameterName = "19", OracleDbType = OracleDbType.Double, Value = tr.TestTime }); cmd.Parameters.Add(new OracleParameter { ParameterName = "20", OracleDbType = OracleDbType.Int32, Value = tr.PulsesMaster }); cmd.Parameters.Add(new OracleParameter { ParameterName = "21", OracleDbType = OracleDbType.Int32, Value = 0 }); /// TODO cmd.Parameters.Add(new OracleParameter { ParameterName = "22", OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.kg, tr.MassStart) }); cmd.Parameters.Add(new OracleParameter { ParameterName = "23", OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.kg, tr.MassEnd) }); cmd2.ExecuteNonQuery(); /// Returns nr. of updated rows } log.InfoFormat("Batch data saved, batchNr={0}", b.BatchNr); } void SaveOrUpdateWM(OracleConnection conn, Results.Entities.WaterMeter wm, int max_Pruefindex, int hydr_Pruefung) { int sekundaere_Adr = wm.Passed ? 1 : 0; int idBenutzer = 6; // = wm.Batch.UserNumber; if (max_Pruefindex % 100 == 1) { OracleCommand cmd = new OracleCommand("INSERT INTO VT_ZAEHLER_PD(Auftragsnummer, VT_Identnummer, VT_Fernum, Max_Pruefindex, Zaehlernummer, Sekundaere_Adr, Hydr_Pruefung, ID_Benutzer, ANBID, Baujahr) VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10)", conn); OracleParameter parm; parm = new OracleParameter("Auftragsnummer", OracleDbType.Varchar2); parm.Value = wm.PurchaseOrder; cmd.Parameters.Add(parm); parm = new OracleParameter("VT_Identnummer", OracleDbType.Varchar2); parm.Value = "IPBATMXX"; cmd.Parameters.Add(parm); parm = new OracleParameter("VT_Fernum", OracleDbType.Varchar2); parm.Value = wm.SerialNr; cmd.Parameters.Add(parm); parm = new OracleParameter("Max_Pruefindex", OracleDbType.Int32); parm.Value = max_Pruefindex; cmd.Parameters.Add(parm); parm = new OracleParameter("Zaehlernummer", OracleDbType.Int32); parm.Value = -1; cmd.Parameters.Add(parm); parm = new OracleParameter("Sekundaere_Adr", OracleDbType.Int32); parm.Value = sekundaere_Adr; cmd.Parameters.Add(parm); parm = new OracleParameter("Hydr_Pruefung", OracleDbType.Int32); parm.Value = hydr_Pruefung; cmd.Parameters.Add(parm); parm = new OracleParameter("ID_Benutzer", OracleDbType.Int32); parm.Value = idBenutzer; cmd.Parameters.Add(parm); parm = new OracleParameter("ANBID", OracleDbType.Int32); parm.Value = Anbid_StaraTura; cmd.Parameters.Add(parm); parm = new OracleParameter("Baujahr", OracleDbType.Int32); parm.Value = dbCfg.Baujahr; cmd.Parameters.Add(parm); cmd.ExecuteNonQuery(); log.InfoFormat("VT_ZAEHLER_PD inserted, PcbNr={0}, pos={1}, maxPruefix={2}", wm.SerialNr, wm.WMPosition, max_Pruefindex); } else { 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); OracleParameter parm; parm = new OracleParameter("Auftragsnummer", OracleDbType.Varchar2); parm.Value = wm.PurchaseOrder; cmd.Parameters.Add(parm); parm = new OracleParameter("VT_Identnummer", OracleDbType.Varchar2); parm.Value = "IPBATMXX"; cmd.Parameters.Add(parm); parm = new OracleParameter("Max_Pruefindex", OracleDbType.Int32); parm.Value = max_Pruefindex; cmd.Parameters.Add(parm); parm = new OracleParameter("Hydr_Pruefung", OracleDbType.Int32); parm.Value = hydr_Pruefung; cmd.Parameters.Add(parm); parm = new OracleParameter("ID_Benutzer", OracleDbType.Int32); parm.Value = idBenutzer; cmd.Parameters.Add(parm); parm = new OracleParameter("Baujahr", OracleDbType.Int32); parm.Value = dbCfg.Baujahr; cmd.Parameters.Add(parm); parm = new OracleParameter("VT_Fernum", OracleDbType.Varchar2); parm.Value = wm.SerialNr; cmd.Parameters.Add(parm); parm = new OracleParameter("ANBID", OracleDbType.Int32); parm.Value = Anbid_StaraTura; cmd.Parameters.Add(parm); cmd.ExecuteNonQuery(); log.InfoFormat("VT_ZAEHLER_PD updated, PcbNr={0}, pos={1}, maxPruefix={2}", wm.SerialNr, wm.WMPosition, max_Pruefindex); } { 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); OracleParameter parm; parm = new OracleParameter("VT_Fernum", OracleDbType.Varchar2); parm.Value = wm.SerialNr; cmd.Parameters.Add(parm); parm = new OracleParameter("Pruefindex", OracleDbType.Int32); parm.Value = max_Pruefindex; cmd.Parameters.Add(parm); parm = new OracleParameter("ANBID", OracleDbType.Int32); parm.Value = Anbid_StaraTura; cmd.Parameters.Add(parm); parm = new OracleParameter("ID_Pruefstand", OracleDbType.Int32); parm.Value = 18000 + wm.Batch.TestBenchId; cmd.Parameters.Add(parm); parm = new OracleParameter("ID_WzPruefreihe", OracleDbType.Int32); parm.Value = wm.Batch.BatchNr; cmd.Parameters.Add(parm); parm = new OracleParameter("Hydr_Pruefung", OracleDbType.Int32); parm.Value = hydr_Pruefung; cmd.Parameters.Add(parm); // ReedKontakt // ReedKontaktOK // ReedKontaktZeit parm = new OracleParameter("KorrImprate", OracleDbType.Double); parm.Value = wm.OrigCalibFactor; cmd.Parameters.Add(parm); // FestWertWZ parm = new OracleParameter("PtestOK", OracleDbType.Int32); parm.Value = 0;/*TODO*/ cmd.Parameters.Add(parm); // Zaehlerstand parm = new OracleParameter("WT_Platz_NR", OracleDbType.Int32); parm.Value = wm.WMPosition; cmd.Parameters.Add(parm); parm = new OracleParameter("WZgut", OracleDbType.Int32); parm.Value = wm.Passed ? 1 : 0; cmd.Parameters.Add(parm); parm = new OracleParameter("ID_Benutzer", OracleDbType.Int32); parm.Value = idBenutzer; cmd.Parameters.Add(parm); parm = new OracleParameter("AnzahlPruefungen", OracleDbType.Int32); parm.Value = 3; cmd.Parameters.Add(parm); cmd.ExecuteNonQuery(); log.InfoFormat("VT_ZAEHLER_PINDEX_PD inserted, PcbNr={0}, pos={1}, pruefix={2}", wm.SerialNr, wm.WMPosition, max_Pruefindex % 100); } foreach (var testInfo in completeTestInfos) { 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.PruefungsNr, max_Pruefindex); } { 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); OracleParameter parm; parm = new OracleParameter("VT_Fernum", OracleDbType.Varchar2); parm.Value = wm.SerialNr; cmd.Parameters.Add(parm); ///:1 parm = new OracleParameter("Pruefindex", OracleDbType.Int32); parm.Value = max_Pruefindex; cmd.Parameters.Add(parm); ///:2 parm = new OracleParameter("ANBID", OracleDbType.Int32); parm.Value = Anbid_StaraTura; cmd.Parameters.Add(parm); ///:3 parm = new OracleParameter("WITHCORRECTION2HZ", OracleDbType.Int32); parm.Value = wm.Hz2CorrectionDone ? 1 : 0; cmd.Parameters.Add(parm); ///:4 parm = new OracleParameter("CORRECTION2HZ", OracleDbType.Double); parm.Value = wm.Hz2Correction; cmd.Parameters.Add(parm); ///:5 parm = new OracleParameter("DIFF2HZ8HZ", OracleDbType.Double); parm.Value = Math.Min(99.0, Math.Max(-99.0, wm.Diff2Hz8Hz));cmd.Parameters.Add(parm); ///:6 parm = new OracleParameter("WITHQ2CORRECTION", OracleDbType.Int32); parm.Value = wm.Q2CorrectionDone ? 1 : 0; cmd.Parameters.Add(parm); ///:7 parm = new OracleParameter("Q2CORRECTIONRIGHT", OracleDbType.Int32); parm.Value = wm.Q2CorrLR; cmd.Parameters.Add(parm); ///:8 parm = new OracleParameter("ERRQ2", OracleDbType.Double); parm.Value = q2ErrWOCorrection; cmd.Parameters.Add(parm); ///:9 parm = new OracleParameter("Q2CORRECTIONFLOWRIGHT", OracleDbType.Int32);parm.Value = wm.Q2CorrFlowRight; /* 1 = R->L */ cmd.Parameters.Add(parm); ///:10 parm = new OracleParameter("Q2CORRECTIONLEFT", OracleDbType.Int32); parm.Value = wm.Q2CorrRL; cmd.Parameters.Add(parm); ///:11 int rowsUpdated = cmd.ExecuteNonQuery(); log.InfoFormat("VT_IP_ZAEHLER_PINDEX_PD inserted, PcbNr={0}, pruefix={1}", wm.SerialNr, max_Pruefindex); } } /// /// Saves a water meter result of a single test /// /// q = 0, 1, 2 or 3 (Adj., Q1, Q2, Q3) /// Nr. of rows updated int SaveMeterTestResult(OracleConnection conn, Results.Entities.MeterTestRslt mtr, int pruefungsNr, int max_Pruefindex) /// { double Q_wm = 3600.0 * mtr.VolumeMeter / mtr.TestTime; /// in [l/hour] double Q_wm_with_upper_bound = Math.Min(2 * 1000 * mtr.TestRslt.FlowVolume, Math.Max(0.0, Q_wm)); 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); OracleParameter parm; parm = new OracleParameter("VT_Fernum", OracleDbType.Varchar2); parm.Value = mtr.WaterMeter.SerialNr; cmd.Parameters.Add(parm); ///:1 parm = new OracleParameter("Pruefindex", OracleDbType.Int32); parm.Value = max_Pruefindex; cmd.Parameters.Add(parm); ///:2 parm = new OracleParameter("PruefungsNr", OracleDbType.Int32); parm.Value = pruefungsNr; cmd.Parameters.Add(parm); ///:3 parm = new OracleParameter("ANBID", OracleDbType.Int32); parm.Value = Anbid_StaraTura; cmd.Parameters.Add(parm); ///:4 parm = new OracleParameter("ID_WZTyp", OracleDbType.Int32); parm.Value = mtr.WaterMeter.WaterMeterData.WMTypeId; cmd.Parameters.Add(parm); ///:5 parm = new OracleParameter("Rev_WZTyp", OracleDbType.Int32); parm.Value = mtr.WaterMeter.WaterMeterData.WMTypeRev; cmd.Parameters.Add(parm); ///:6 parm = new OracleParameter("Rev_WZPruefpunkt", OracleDbType.Int32); parm.Value = 1; cmd.Parameters.Add(parm); ///:7 parm = new OracleParameter("Q_WZ", OracleDbType.Double); parm.Value = Q_wm_with_upper_bound; cmd.Parameters.Add(parm); ///:8 parm = new OracleParameter("Q_Fehler", OracleDbType.Double); parm.Value = Math.Min(100.0, Math.Max(-100.0, mtr.Error)); cmd.Parameters.Add(parm); ///:9 parm = new OracleParameter("Q_Best", OracleDbType.Int32); parm.Value = mtr.Passed ? 1 : 0; cmd.Parameters.Add(parm); ///:10 parm = new OracleParameter("NIZ", OracleDbType.Int32); parm.Value = 0; cmd.Parameters.Add(parm); ///:11 parm = new OracleParameter("AnfangZStand", OracleDbType.Double); parm.Value = mtr.VolumeStart; cmd.Parameters.Add(parm); ///:12 parm = new OracleParameter("EndZStand", OracleDbType.Double); parm.Value = mtr.VolumeEnd; cmd.Parameters.Add(parm); ///:13 /// KorrErrQok bool true = Q2 within limits, 'passed' in case of Q1, Q3, Q4 parm = new OracleParameter("KorrErrQ", OracleDbType.Double); parm.Value = Math.Min(100.0, Math.Max(-100.0, mtr.KorrErrQ)); cmd.Parameters.Add(parm); ///:14 /// KorrErrQ double 'Q2 error before correction' when correction done or 'Q2 error' when correction not done /// = q2.WaterMeter.Q2CorrectionDone ? q2.WaterMeter.Q2ErrWOCorrection.ToString(Program.AltCulture) : q2.Error.ToString(Program.AltCulture))); /// KorrQWz double parm = new OracleParameter("TIZ", OracleDbType.Double); parm.Value = Math.Min(100000, mtr.TestTime); cmd.Parameters.Add(parm); ///:15 /// Vol_WZ_US /// TempMittel_US 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; } #endif } }