diff --git a/eDosLocal/UpdateLocal.sql b/eDosLocal/UpdateLocal.sql index eaed41c..abf0940 100644 --- a/eDosLocal/UpdateLocal.sql +++ b/eDosLocal/UpdateLocal.sql @@ -18,6 +18,14 @@ ALTER TABLE [dbo].[Visit] ADD eDosRate10Warning BIT null; ALTER TABLE [dbo].[Visit] ADD eDosRate10Alarm BIT null; END GO +IF OBJECT_ID('dbo.PersonAlarms') IS NULL BEGIN + CREATE TABLE [dbo].[PersonAlarms] ([PersID] INT NOT NULL, + [VisitTime] DATETIME NOT NULL, + [ID_Station] INT NOT NULL, + [ID_Visit] INT NOT NULL, + PRIMARY KEY NONCLUSTERED([PersID], [VisitTime])); +END; +GO ALTER PROCEDURE [dbo].[VisitExit] @EPDVisitID INT, @HP07 FLOAT, @HP10 FLOAT, @@ -54,96 +62,111 @@ ALTER PROCEDURE [dbo].[VisitExit] @EPDVisitID INT, @eDosDose10Alarm BIT = NULL, @eDosRate10Warning BIT = NULL, @eDosRate10Alarm BIT = NULL -AS -DECLARE - @ID_Visit INT, - @ID_Station INT, - @ID_Station_Return INT; +AS BEGIN + DECLARE + @ID_Visit INT, + @ID_Station INT, + @ID_Station_Return INT; -SET @ID_Station = @EPDVisitID % 100; -SET @ID_Visit = @EPDVisitID / 100; + SET @ID_Station = @EPDVisitID % 100; + SET @ID_Visit = @EPDVisitID / 100; -IF @ID_Station_Return IS NULL - SELECT - @ID_Station_Return = [ID_Station] - FROM [dbo].[StationSettings] - WHERE [PCNr] = HOST_NAME(); + DECLARE @isAlarm BIT = CASE WHEN ISNULL(@alarmStatus, 0) <> 0 + OR ISNULL(@eDosDose07Alarm, 0) <> 0 + OR ISNULL(@eDosRate07Alarm, 0) <> 0 + OR ISNULL(@eDosDose10Alarm, 0) <> 0 + OR ISNULL(@eDosRate10Alarm, 0) <> 0 THEN 1 ELSE 0 END; + DECLARE @Now DATETIME = GETDATE(); -DECLARE @isComplete BIT = 1; + IF @ID_Station_Return IS NULL + SELECT + @ID_Station_Return = [ID_Station] + FROM [dbo].[StationSettings] + WHERE [PCNr] = HOST_NAME(); -IF NOT EXISTS (SELECT - * - FROM [dbo].[Visit] - WHERE [ID_Visit] = @ID_Visit - AND [ID_Station] = @ID_Station)BEGIN - SET @isComplete = 0; + DECLARE @isComplete BIT = 1; - INSERT [dbo].[Visit]([ID_Station], [ID_Visit], [Inst_CODE], [isManualExit], [isDeleted], [ID_Station_Return], [isComplete], [ENTRY_EPD_CLOCK], [PersID]) - VALUES(@ID_Station, @ID_Visit, 0, 0, 0, @ID_Station_Return, 0, @ENTRY_EPD_CLOCK, @PersID); -END; + IF NOT EXISTS (SELECT + * + FROM [dbo].[Visit] + WHERE [ID_Visit] = @ID_Visit + AND [ID_Station] = @ID_Station)BEGIN + SET @isComplete = 0; -UPDATE - [dbo].[Visit] -SET - [Hp07Dose] = @HP07, - [Hp10Dose] = @HP10, - [isComplete] = @isComplete, - [ReturnTime] = GETDATE(), - [Hp07Peak] = @HP07Peak, - [Hp10Peak] = @HP10Peak, - [Hp07Time] = @HP07PeakTime, - [Hp10Time] = @HP10PeakTime, - [Hp07Total] = @HP07Total, - [Hp10Total] = @HP10Total, - [K1] = @K1, - [K2] = @K2, - [K3] = @K3, - [K4] = @K4, - [K5] = @K5, - [K6] = @K6, - [SG] = @SG, - [BC] = @BC, - [FB] = @FB, - [HG] = @HG, - [QualityData] = @QualityData, - [alarmStatus] = @alarmStatus, - [otherAlarms] = @otherAlarms, - [errorStatus] = @errorStatus, - [operatingStatus] = @operatingStatus, - --[D1] = @D1, [D2] = @D2, [D3] = @D3, [D4] = @D4, - [isAlarm] = CASE WHEN ISNULL(@alarmStatus, 0) <> 0 THEN 1 ELSE 0 END, - [isManualExit] = 0, - [ID_Station_Return] = @ID_Station_Return, - [ENTRY_EPD_CLOCK] = @ENTRY_EPD_CLOCK, - [EXIT_EPD_CLOCK] = @EXIT_EPD_CLOCK, - [PersID] = CASE WHEN [PersID] IS NULL THEN @PersID ELSE [PersID] END, - [eDosBatteryWarning] = @eDosBatteryWarning, - [eDosDose07Warning] = @eDosDose07Warning, - [eDosDose07Alarm] = @eDosDose07Alarm, - [eDosRate07Warning] = @eDosRate07Warning, - [eDosRate07Alarm] = @eDosRate07Alarm, - [eDosDose10Warning] = @eDosDose10Warning, - [eDosDose10Alarm] = @eDosDose10Alarm, - [eDosRate10Warning] = @eDosRate10Warning, - [eDosRate10Alarm] = @eDosRate10Alarm -WHERE [ID_Visit] = @ID_Visit - AND [ID_Station] = @ID_Station; + INSERT [dbo].[Visit]([ID_Station], [ID_Visit], [Inst_CODE], [isManualExit], [isDeleted], [ID_Station_Return], [isComplete], [ENTRY_EPD_CLOCK], [PersID]) + VALUES(@ID_Station, @ID_Visit, 0, 0, 0, @ID_Station_Return, 0, @ENTRY_EPD_CLOCK, @PersID); + END; --- local- >PersonInfoSnapshot -IF ISNULL(@alarmStatus, 0) <> 0 - OR ISNULL(@eDosDose07Alarm, 0) <> 0 - OR ISNULL(@eDosRate07Alarm, 0) <> 0 - OR ISNULL(@eDosDose10Alarm, 0) <> 0 - OR ISNULL(@eDosRate10Alarm, 0) <> 0 BEGIN UPDATE - [dbo].[PersonInfoSnapshot] + [dbo].[Visit] SET - [VisitIDLocked] = @ID_Visit * 100 + @ID_Station - WHERE [PersID] = (SELECT - [PersID] - FROM [dbo].[Visit] - WHERE [ID_Visit] = @ID_Visit - AND @ID_Station = @ID_Station); + [Hp07Dose] = @HP07, + [Hp10Dose] = @HP10, + [isComplete] = @isComplete, + [ReturnTime] = @Now, + [Hp07Peak] = @HP07Peak, + [Hp10Peak] = @HP10Peak, + [Hp07Time] = @HP07PeakTime, + [Hp10Time] = @HP10PeakTime, + [Hp07Total] = @HP07Total, + [Hp10Total] = @HP10Total, + [K1] = @K1, + [K2] = @K2, + [K3] = @K3, + [K4] = @K4, + [K5] = @K5, + [K6] = @K6, + [SG] = @SG, + [BC] = @BC, + [FB] = @FB, + [HG] = @HG, + [QualityData] = @QualityData, + [alarmStatus] = @alarmStatus, + [otherAlarms] = @otherAlarms, + [errorStatus] = @errorStatus, + [operatingStatus] = @operatingStatus, + --[D1] = @D1, [D2] = @D2, [D3] = @D3, [D4] = @D4, + [isAlarm] = @isAlarm, + [isManualExit] = 0, + [ID_Station_Return] = @ID_Station_Return, + [ENTRY_EPD_CLOCK] = @ENTRY_EPD_CLOCK, + [EXIT_EPD_CLOCK] = @EXIT_EPD_CLOCK, + [PersID] = CASE WHEN [PersID] IS NULL THEN @PersID ELSE [PersID] END, + [eDosBatteryWarning] = @eDosBatteryWarning, + [eDosDose07Warning] = @eDosDose07Warning, + [eDosDose07Alarm] = @eDosDose07Alarm, + [eDosRate07Warning] = @eDosRate07Warning, + [eDosRate07Alarm] = @eDosRate07Alarm, + [eDosDose10Warning] = @eDosDose10Warning, + [eDosDose10Alarm] = @eDosDose10Alarm, + [eDosRate10Warning] = @eDosRate10Warning, + [eDosRate10Alarm] = @eDosRate10Alarm + WHERE [ID_Visit] = @ID_Visit + AND [ID_Station] = @ID_Station; + + -- local- >PersonInfoSnapshot + IF @isAlarm = 1 BEGIN + IF @PersID IS NULL + SELECT + @PersID = [PersID] + FROM [dbo].[Visit] + WHERE [ID_Visit] = @ID_Visit + AND [ID_Station] = @ID_Station; + + UPDATE + [dbo].[PersonInfoSnapshot] + SET + [VisitIDLocked] = @ID_Visit * 100 + @ID_Station + WHERE [PersID] = @PersID; + + IF NOT EXISTS (SELECT + * + FROM [dbo].[PersonAlarms] + WHERE [PersID] = @PersID + AND [VisitTime] = @Now) + INSERT [dbo].[PersonAlarms]([PersID], [VisitTime], [ID_Station], [ID_Visit]) + VALUES(@PersID, @Now, @ID_Station, @ID_Visit); + END; END; GO ALTER PROCEDURE [export].[VisitsSelect] diff --git a/eDosLocal/Updates.sql b/eDosLocal/Updates.sql index 4de6213..5158696 100644 --- a/eDosLocal/Updates.sql +++ b/eDosLocal/Updates.sql @@ -302,8 +302,8 @@ SET [EXIT_EPD_CLOCK] = [c].[EXIT_EPD_CLOCK], [eDosBatteryWarning] = CASE WHEN [v].[eDosBatteryWarning] IS NULL OR [c].[eDosBatteryWarning] = 1 THEN [c].[eDosBatteryWarning] ELSE [v].[eDosBatteryWarning] END, - [eDosDose07Warning ] = CASE WHEN [v].[eDosDose07Warning ] IS NULL - OR [c].[eDosDose07Warning ] = 1 THEN [c].[eDosDose07Warning ] ELSE [v].[eDosDose07Warning ] END, + [eDosDose07Warning] = CASE WHEN [v].[eDosDose07Warning] IS NULL + OR [c].[eDosDose07Warning] = 1 THEN [c].[eDosDose07Warning] ELSE [v].[eDosDose07Warning] END, [eDosDose07Alarm] = CASE WHEN [v].[eDosDose07Alarm] IS NULL OR [c].[eDosDose07Alarm] = 1 THEN [c].[eDosDose07Alarm] ELSE [v].[eDosDose07Alarm] END, [eDosRate07Warning] = CASE WHEN [v].[eDosRate07Warning] IS NULL diff --git a/eDosStation/DataInterface.cs b/eDosStation/DataInterface.cs index 76b39ca..0b9134b 100644 --- a/eDosStation/DataInterface.cs +++ b/eDosStation/DataInterface.cs @@ -186,7 +186,6 @@ namespace eDosStation checkCon(LeaveOpen); return localConnection; } - public System.Data.SqlClient.SqlConnection getConCentral(bool LeaveOpen) { checkConCentral(LeaveOpen); @@ -343,12 +342,10 @@ namespace eDosStation dt.Fill(dtCOE); } } - public DataSet1.CommentOnEventRow GetCommentOnEventRow(int id) { return dtCOE.FindByID_CommnentOnEvent(id); } - public void FillTaskInfo(User _User, DataSet1 dataSet1) { const string taskName = "FillTaskInfo"; diff --git a/syncEdosLocal/DataSet1.Designer.cs b/syncEdosLocal/DataSet1.Designer.cs index b4f56d5..978ba3e 100644 --- a/syncEdosLocal/DataSet1.Designer.cs +++ b/syncEdosLocal/DataSet1.Designer.cs @@ -1484,6 +1484,8 @@ namespace syncEdosLocal { private global::System.Data.DataColumn columnepdType; + private global::System.Data.DataColumn columnepdID; + private global::System.Data.DataColumn columneDosBatteryWarning; private global::System.Data.DataColumn columneDosDose07Warning; @@ -1502,8 +1504,6 @@ namespace syncEdosLocal { private global::System.Data.DataColumn columneDosRate10Alarm; - private global::System.Data.DataColumn columnepdID; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "16.0.0.0")] public CentralVisitsDataTable() { @@ -1897,6 +1897,14 @@ namespace syncEdosLocal { } } + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "16.0.0.0")] + public global::System.Data.DataColumn epdIDColumn { + get { + return this.columnepdID; + } + } + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "16.0.0.0")] public global::System.Data.DataColumn eDosBatteryWarningColumn { @@ -1969,14 +1977,6 @@ namespace syncEdosLocal { } } - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "16.0.0.0")] - public global::System.Data.DataColumn epdIDColumn { - get { - return this.columnepdID; - } - } - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "16.0.0.0")] [global::System.ComponentModel.Browsable(false)] @@ -2060,6 +2060,7 @@ namespace syncEdosLocal { bool syncedEntry, bool syncedExit, byte epdType, + int epdID, bool eDosBatteryWarning, bool eDosDose07Warning, bool eDosDose07Alarm, @@ -2068,8 +2069,7 @@ namespace syncEdosLocal { bool eDosDose10Warning, bool eDosDose10Alarm, bool eDosRate10Warning, - bool eDosRate10Alarm, - int epdID) { + bool eDosRate10Alarm) { CentralVisitsRow rowCentralVisitsRow = ((CentralVisitsRow)(this.NewRow())); object[] columnValuesArray = new object[] { ID_Station, @@ -2117,6 +2117,7 @@ namespace syncEdosLocal { syncedEntry, syncedExit, epdType, + epdID, eDosBatteryWarning, eDosDose07Warning, eDosDose07Alarm, @@ -2125,8 +2126,7 @@ namespace syncEdosLocal { eDosDose10Warning, eDosDose10Alarm, eDosRate10Warning, - eDosRate10Alarm, - epdID}; + eDosRate10Alarm}; rowCentralVisitsRow.ItemArray = columnValuesArray; this.Rows.Add(rowCentralVisitsRow); return rowCentralVisitsRow; @@ -2202,6 +2202,7 @@ namespace syncEdosLocal { this.columnsyncedEntry = base.Columns["syncedEntry"]; this.columnsyncedExit = base.Columns["syncedExit"]; this.columnepdType = base.Columns["epdType"]; + this.columnepdID = base.Columns["epdID"]; this.columneDosBatteryWarning = base.Columns["eDosBatteryWarning"]; this.columneDosDose07Warning = base.Columns["eDosDose07Warning"]; this.columneDosDose07Alarm = base.Columns["eDosDose07Alarm"]; @@ -2211,7 +2212,6 @@ namespace syncEdosLocal { this.columneDosDose10Alarm = base.Columns["eDosDose10Alarm"]; this.columneDosRate10Warning = base.Columns["eDosRate10Warning"]; this.columneDosRate10Alarm = base.Columns["eDosRate10Alarm"]; - this.columnepdID = base.Columns["epdID"]; } [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] @@ -2307,6 +2307,8 @@ namespace syncEdosLocal { base.Columns.Add(this.columnsyncedExit); this.columnepdType = new global::System.Data.DataColumn("epdType", typeof(byte), null, global::System.Data.MappingType.Element); base.Columns.Add(this.columnepdType); + this.columnepdID = new global::System.Data.DataColumn("epdID", typeof(int), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columnepdID); this.columneDosBatteryWarning = new global::System.Data.DataColumn("eDosBatteryWarning", typeof(bool), null, global::System.Data.MappingType.Element); base.Columns.Add(this.columneDosBatteryWarning); this.columneDosDose07Warning = new global::System.Data.DataColumn("eDosDose07Warning", typeof(bool), null, global::System.Data.MappingType.Element); @@ -2325,8 +2327,6 @@ namespace syncEdosLocal { base.Columns.Add(this.columneDosRate10Warning); this.columneDosRate10Alarm = new global::System.Data.DataColumn("eDosRate10Alarm", typeof(bool), null, global::System.Data.MappingType.Element); base.Columns.Add(this.columneDosRate10Alarm); - this.columnepdID = new global::System.Data.DataColumn("epdID", typeof(int), null, global::System.Data.MappingType.Element); - base.Columns.Add(this.columnepdID); this.Constraints.Add(new global::System.Data.UniqueConstraint("Constraint1", new global::System.Data.DataColumn[] { this.columnID_Station, this.columnID_Visit}, true)); @@ -4546,6 +4546,22 @@ namespace syncEdosLocal { } } + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "16.0.0.0")] + public int epdID { + get { + try { + return ((int)(this[this.tableCentralVisits.epdIDColumn])); + } + catch (global::System.InvalidCastException e) { + throw new global::System.Data.StrongTypingException("The value for column \'epdID\' in table \'CentralVisits\' is DBNull.", e); + } + } + set { + this[this.tableCentralVisits.epdIDColumn] = value; + } + } + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "16.0.0.0")] public bool eDosBatteryWarning { @@ -4690,22 +4706,6 @@ namespace syncEdosLocal { } } - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "16.0.0.0")] - public int epdID { - get { - try { - return ((int)(this[this.tableCentralVisits.epdIDColumn])); - } - catch (global::System.InvalidCastException e) { - throw new global::System.Data.StrongTypingException("The value for column \'epdID\' in table \'CentralVisits\' is DBNull.", e); - } - } - set { - this[this.tableCentralVisits.epdIDColumn] = value; - } - } - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "16.0.0.0")] public bool IsPersIDNull() { @@ -5150,6 +5150,18 @@ namespace syncEdosLocal { this[this.tableCentralVisits.epdTypeColumn] = global::System.Convert.DBNull; } + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "16.0.0.0")] + public bool IsepdIDNull() { + return this.IsNull(this.tableCentralVisits.epdIDColumn); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "16.0.0.0")] + public void SetepdIDNull() { + this[this.tableCentralVisits.epdIDColumn] = global::System.Convert.DBNull; + } + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "16.0.0.0")] public bool IseDosBatteryWarningNull() { @@ -5257,18 +5269,6 @@ namespace syncEdosLocal { public void SeteDosRate10AlarmNull() { this[this.tableCentralVisits.eDosRate10AlarmColumn] = global::System.Convert.DBNull; } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "16.0.0.0")] - public bool IsepdIDNull() { - return this.IsNull(this.tableCentralVisits.epdIDColumn); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "16.0.0.0")] - public void SetepdIDNull() { - this[this.tableCentralVisits.epdIDColumn] = global::System.Convert.DBNull; - } } /// diff --git a/syncEdosLocal/DataSet1.xsd b/syncEdosLocal/DataSet1.xsd index 383f9d5..eae6168 100644 --- a/syncEdosLocal/DataSet1.xsd +++ b/syncEdosLocal/DataSet1.xsd @@ -296,7 +296,7 @@ - + @@ -357,7 +357,7 @@ - + @@ -405,6 +405,7 @@ + @@ -414,7 +415,6 @@ - diff --git a/syncEdosLocal/DataSet1.xss b/syncEdosLocal/DataSet1.xss index 8745c90..364915f 100644 --- a/syncEdosLocal/DataSet1.xss +++ b/syncEdosLocal/DataSet1.xss @@ -6,8 +6,8 @@ --> - - + + \ No newline at end of file diff --git a/syncEdosLocal/Program.cs b/syncEdosLocal/Program.cs index 4d069f8..5313425 100644 --- a/syncEdosLocal/Program.cs +++ b/syncEdosLocal/Program.cs @@ -408,8 +408,10 @@ namespace syncEdosLocal spLog.KvAdd(spl.skeys.recordsAffected, ds.LocalVisits.Rows.Count); foreach (DataSet1.LocalVisitsRow lr in ds.LocalVisits.Rows) { - Result.CheckVisitID(lr.ID_Visit); - tc.Fill(ds.CentralVisits, lr.ID_Station, lr.ID_Visit); + Result.CheckVisitID(lr.ID_Visit); //min max + cr = ds.CentralVisits.FindByID_StationID_Visit(lr.ID_Station, lr.ID_Visit); + if (cr==null) + tc.Fill(ds.CentralVisits, lr.ID_Station, lr.ID_Visit); cr = ds.CentralVisits.FindByID_StationID_Visit(lr.ID_Station, lr.ID_Visit); if (cr == null) { @@ -434,8 +436,7 @@ namespace syncEdosLocal { error = true; Result.ErrorMessage = ex.Message; - spLog.setErrorException(ex); - spLog.WriteSplunkLog(sStep, spLog.splunkSeverity, null, spLog.splunkError); + spLog.WriteException(null, sStep, ex); } } private static void copyEntry(DataSet1.LocalVisitsRow lr, DataSet1.CentralVisitsRow cr) @@ -482,6 +483,15 @@ namespace syncEdosLocal cr["ENTRY_EPD_CLOCK"] = lr["ENTRY_EPD_CLOCK"]; cr["EXIT_EPD_CLOCK"] = lr["EXIT_EPD_CLOCK"]; cr["TIME_LOST"] = lr["TIME_LOST"]; + cr["eDosBatteryWarning"] = lr["eDosBatteryWarning"]; + cr["eDosDose07Warning"] = lr["eDosDose07Warning"]; + cr["eDosDose07Alarm"] = lr["eDosDose07Alarm"]; + cr["eDosRate07Warning"] = lr["eDosRate07Warning"]; + cr["eDosRate07Alarm"] = lr["eDosRate07Alarm"]; + cr["eDosDose10Warning"] = lr["eDosDose10Warning"]; + cr["eDosDose10Alarm"] = lr["eDosDose10Alarm"]; + cr["eDosRate10Warning"] = lr["eDosRate10Warning"]; + cr["eDosRate10Alarm"] = lr["eDosRate10Alarm"]; } private static DataSet1.CentralVisitsRow copyrow(DataSet1.LocalVisitsRow lr, DataSet1.CentralVisitsDataTable centralVisits) {