/// <summary>
        /// returns a dataset with only necessary data
        /// depending on the parameter removeEmptyTables, the empty tables are not returned
        /// all rows that are not changed are not returned
        /// </summary>
        /// <returns>a new dataset with only modified data
        /// </returns>
        public virtual TTypedDataSet GetChangesTyped(Boolean removeEmptyTables)
        {
            TTypedDataSet ds = (TTypedDataSet)base.GetChanges();

            if (ds == null)
            {
                return(null);
            }

            ds.InitVars();
            ds.MapTables();

            ds.ThrowAwayAfterSubmitChanges     = ThrowAwayAfterSubmitChanges;
            ds.DontThrowAwayAfterSubmitChanges = DontThrowAwayAfterSubmitChanges;

            // need to copy over the enabled/disabled status of relations
            foreach (TTypedRelation relNew in ds.FRelations)
            {
                foreach (TTypedRelation relOrig in this.FRelations)
                {
                    if (relOrig.FName == relNew.FName)
                    {
                        relNew.FEnabled = relOrig.FEnabled;
                    }
                }
            }

            if (removeEmptyTables == true)
            {
                ds.RemoveEmptyTables();
            }

            // TODO: REMOVING OF EMPTY FIELDS NOT DONE BECAUSE WE CURRENTLY CAN'T HANDLE THIS PROPERLY ON THE SERVER SIDE...

            ds.EnableConstraints();
            ds.EnableRelations();
            ds.EnforceConstraints = true;
            return(ds);
        }
        /// <summary>
        /// Processes the result of a data submission to the Server where the result of that operation is
        /// <see cref="TSubmitChangesResult.scrOK" />. (Overload for Typed DataSets.)
        /// </summary>
        /// <param name="ACallingFormOrUserControl"></param>
        /// <param name="ALocalTDS"></param>
        /// <param name="ASubmitTDS"></param>
        /// <param name="APetraUtilsObject"></param>
        /// <param name="AVerificationResults"></param>
        /// <param name="ASetPrimaryKeyOnlyMethod"></param>
        /// <param name="AMasterDataTableSaveCall"></param>
        /// <param name="ACalledFromUserControl"></param>
        /// <param name="ACallAcceptChangesOnReturnedDataBeforeMerge"></param>
        public static void ProcessSubmitChangesResultOK(IFrmPetra ACallingFormOrUserControl, TTypedDataSet ALocalTDS,
            TTypedDataSet ASubmitTDS, TFrmPetraEditUtils APetraUtilsObject, TVerificationResultCollection AVerificationResults,
            Action <bool>ASetPrimaryKeyOnlyMethod, bool AMasterDataTableSaveCall, bool ACalledFromUserControl,
            bool ACallAcceptChangesOnReturnedDataBeforeMerge = false)
        {
            if (AMasterDataTableSaveCall)
            {
                // Call AcceptChanges to get rid now of any deleted columns before we Merge with the result from the Server
                ALocalTDS.AcceptChanges();

                // Merge back with data from the Server (eg. for getting Sequence values)
                if (ACallAcceptChangesOnReturnedDataBeforeMerge)
                {
                    ASubmitTDS.AcceptChanges();
                }

                ALocalTDS.Merge(ASubmitTDS, false);

                // Need to accept any new modification ID's
                ALocalTDS.AcceptChanges();

                if (ASetPrimaryKeyOnlyMethod != null)
                {
                    // Ensure the Primary-Key(s)-containing Controls are disabled to prevent further modification of Primary Key values
                    ASetPrimaryKeyOnlyMethod(true);
                }
            }

            CommonPostMergeOperations(ACallingFormOrUserControl, APetraUtilsObject,
                AVerificationResults, ACalledFromUserControl);
        }