示例#1
0
        private static void AddExtraRelationships(IDataTableFinder TableFinder, VirtualDataTable aData, TRelationshipList Relations, TBand band, TMasterDetailLinkList MasterDetailLinkList)
        {
            foreach (TRelationship tr in Relations)
            {
                TDataSourceInfo dParent = TableFinder.TryGetDataTable(tr.ParentTable);
                if (dParent == null || dParent.Table == null)
                {
                    FlxMessages.ThrowException(FlxErr.ErrInvalidManualRelationshipDatasetNull, tr.ParentTable);
                }

                TDataSourceInfo dChild = TableFinder.TryGetDataTable(tr.ChildTable);
                if (dChild == null || dChild.Table == null)
                {
                    FlxMessages.ThrowException(FlxErr.ErrInvalidManualRelationshipDatasetNull, tr.ChildTable);
                }

                if (SameTable(dChild.Table, aData) && SameTable(dParent.Table, band.DataSource.Data))
                {
                    GetColIndexes(dParent.Table, tr.ParentColumns, true); //we do it here so it checks all columns exist in the parent. They might not exist in our table, and that is ok if our table is a distinct for example)
                    GetColIndexes(dChild.Table, tr.ChildColumns, true);
                    int[] ChildCols  = GetColIndexes(aData, tr.ChildColumns, false);
                    int[] ParentCols = GetColIndexes(band.DataSource.Data, tr.ParentColumns, false);

                    if (ChildCols != null && ParentCols != null)
                    {
                        MasterDetailLinkList.AddRelation(band.DataSource.DataState,
                                                         new TRelation(band.DataSource.Data, aData, ParentCols,
                                                                       ChildCols));
                    }
                }
            }
        }
示例#2
0
 public TAdoDotNetDataTable(string aTableName, VirtualDataTable aCreatedBy, DataTable aData, bool aDataNeedsDispose, DataTable aOriginalTable) : base(aTableName, aCreatedBy)
 {
     Data             = aData;
     DataNeedsDispose = aDataNeedsDispose;
     LookupDataViews  = new TLookupCacheList();
     OriginalTable    = aOriginalTable;
 }
示例#3
0
 public TEFDataTableState(VirtualDataTable aTableData, IQueryable <T> aData, PropertyInfo[] aFields,
                          TFieldExpressions <T> aFieldExpressions, Dictionary <string, int> aFieldsByName,
                          string[] aFilters,
                          string sort, TMasterDetailLink[] masterDetailLinks, TSplitLink splitLink)
     : base(aTableData, aData, aFields, aFieldExpressions, aFieldsByName, aFilters, sort, masterDetailLinks, splitLink)
 {
 }
示例#4
0
 /// <summary>
 /// Creates a new relation with the given values.
 /// </summary>
 /// <param name="aParentTable">See <see cref="ParentTable"/></param>
 /// <param name="aChildTable">See <see cref="ChildTable"/></param>
 /// <param name="aParentColumns">See <see cref="ParentColumns"/></param>
 /// <param name="aChildColumns">See <see cref="ChildColumns"/></param>
 public TRelation(VirtualDataTable aParentTable, VirtualDataTable aChildTable, int[] aParentColumns, int[] aChildColumns)
 {
     FParentTable   = aParentTable;
     FChildTable    = aChildTable;
     FParentColumns = aParentColumns;
     FChildColumns  = aChildColumns;
 }
示例#5
0
 /// <summary>
 /// Call this method ONLY if the collection owns the objects.
 /// As this is not always the case, we cannot follow a more common Dispose pattern.
 /// </summary>
 public void DestroyTables()
 {
     if (FTable != null && FDisposeVirtualTable)
     {
         FTable.Dispose();
     }
     FTable = null;
 }
示例#6
0
 internal TDataSourceInfo(string aName, VirtualDataTable aTable, string aRowFilter, string aSort, bool aDisposeVirtualTable, bool aTempTable, IDataTableFinder aTableFinder)
 {
     Filter(ref aTable, aRowFilter, ref aDisposeVirtualTable, aName);
     FTable = aTable;
     FSort  = aSort;
     FDisposeVirtualTable = aDisposeVirtualTable;
     FTempTable           = aTempTable;
     TableFinder          = aTableFinder;
 }
示例#7
0
 public TColumnsDataTable(string aTableName, VirtualDataTable aCreatedBy, VirtualDataTable MasterTable)
     : base(aTableName, aCreatedBy)
 {
     Columns = new TPositionAndName[MasterTable.ColumnCount];
     for (int i = 0; i < Columns.Length; i++)
     {
         Columns[i] = new TPositionAndName(i, MasterTable.GetColumnName(i));
     }
 }
示例#8
0
        private static void Filter(ref VirtualDataTable aTable, string RowFilter, ref bool TableNeedsDispose, string aName)
        {
            RowFilter = RowFilter.Trim();
            if (string.IsNullOrEmpty(RowFilter))
            {
                if (aTable.TableName != aName)
                {
                    VirtualDataTable nTable = aTable.FilterData(aName, null);
                    if (aTable != null && TableNeedsDispose)
                    {
                        aTable.Dispose();
                    }
                    aTable            = nTable;
                    TableNeedsDispose = true;
                }
                return;
            }

            int fPos = RowFilter.IndexOf(ReportTag.StrOpenParen);

            if (fPos > 2)
            {
                if (String.Equals(RowFilter.Substring(0, fPos).Trim(), ReportTag.ConfigTag(ConfigTagEnum.Distinct), StringComparison.InvariantCultureIgnoreCase))
                {
                    if (RowFilter[RowFilter.Length - 1] != ReportTag.StrCloseParen)
                    {
                        FlxMessages.ThrowException(FlxErr.ErrInvalidFilterParen, RowFilter);
                    }

                    VirtualDataTable bTable = aTable.GetDistinct(aName, GetColumnsForDistinct(aTable, RowFilter.Substring(fPos + 1, RowFilter.Length - fPos - 2)));
                    if (aTable != null && TableNeedsDispose)
                    {
                        aTable.Dispose();
                    }
                    aTable = bTable;

                    TableNeedsDispose = true;
                    return;
                }
            }

            VirtualDataTable cTable = aTable.FilterData(aName, RowFilter);

            if (aTable != null && TableNeedsDispose)
            {
                aTable.Dispose();
            }
            aTable            = cTable;
            TableNeedsDispose = true;
        }
示例#9
0
 private static bool SameTable(VirtualDataTable relatedData, VirtualDataTable data)
 {
     if (data == null)
     {
         return(relatedData == null);
     }
     if (relatedData == null)
     {
         return(false);
     }
     if (relatedData.TableName == data.TableName)
     {
         return(true);
     }
     return(SameTable(relatedData, data.CreatedBy));
 }
示例#10
0
        public TAdoDotNetDataTableState(VirtualDataTable aTableData, DataTable Data, string sort, TMasterDetailLink[] masterDetailLinks, TSplitLink splitLink) : base(aTableData)
        {
            if (masterDetailLinks.Length > 0 || splitLink != null)
            {
                SourceForFilteredData    = new DataView(Data, String.Empty, GetSortColumns(masterDetailLinks), DataViewRowState.CurrentRows);
                FilteredData             = Data.Clone(); //we will have to fill this table each time.
                FilteredDataNeedsDispose = true;
            }
            else
            {
                FilteredData = Data;  //The table is the same as the original.
            }

            SortedFilteredData      = new DataView(FilteredData);
            SortedFilteredData.Sort = sort;
        }
示例#11
0
        public override TRelation GetRelationWith(VirtualDataTable aDetail)
        {
            TAdoDotNetDataTable AdoDetail = aDetail as TAdoDotNetDataTable; //DataRelationships only happen between DataTables.

            if (AdoDetail != null && OriginalTable.ChildRelations != null)
            {
                foreach (DataRelation dr in OriginalTable.ChildRelations)
                {
                    if (dr.ChildTable == AdoDetail.OriginalTable)
                    {
                        return(new TRelation(this, AdoDetail, GetColumnOrdinals(dr.ParentColumns, this), GetColumnOrdinals(dr.ChildColumns, AdoDetail)));
                    }
                }
            }

            return(null);
        }
示例#12
0
        private static int[] GetColumnsForDistinct(VirtualDataTable aTable, string SortString)
        {
            if (SortString.Trim().Length == 0)
            {
                FlxMessages.ThrowException(FlxErr.ErrInvalidDistinctParams);
            }

            int start = 0;
            int count = 0;

            do
            {
                start = SortString.IndexOf(ReportTag.ParamDelim, start);
                if (start > 0)
                {
                    count++;
                    start++;
                }
            }while (start > 0);

            start = 0;
            int oldStart = 0;

            int[] Result = new int[count + 1];
            for (int i = 0; i < count; i++)
            {
                start     = SortString.IndexOf(ReportTag.ParamDelim, oldStart);
                Result[i] = aTable.GetColumn(SortString.Substring(oldStart, start - oldStart).Trim());
                if (Result[i] < 0)
                {
                    FlxMessages.ThrowException(FlxErr.ErrColumNotFound, SortString.Substring(oldStart, start - oldStart).Trim(), aTable.TableName);
                }
                if (i < count)
                {
                    oldStart = start + 1;
                }
            }

            Result[count] = aTable.GetColumn(SortString.Substring(oldStart).Trim());
            if (Result[count] < 0)
            {
                FlxMessages.ThrowException(FlxErr.ErrColumNotFound, SortString.Substring(oldStart).Trim(), aTable.TableName);
            }

            return(Result);
        }
示例#13
0
        public TFlexCelDataSource(string dtName, VirtualDataTable aData, TRelationshipList ExtraRelations, TRelationshipList StaticRelations,
                                  TBand MasterBand, string Sort, IDataTableFinder TableFinder)
        {
            SplitLink = null;

            TBand band = MasterBand;
            TMasterDetailLinkList MasterDetailLinkList = new TMasterDetailLinkList();

            while (band != null)
            {
                if (band.DataSource != null)
                {
                    TRelation RelToMaster = band.DataSource.Data.GetRelationWith(aData);
                    if (RelToMaster != null)
                    {
                        MasterDetailLinkList.AddRelation(band.DataSource.DataState, RelToMaster);
                    }

                    //Create the splitlink.
                    TMasterSplitDataTableState SplitMaster = band.DataSource.DataState as TMasterSplitDataTableState;
                    if (SplitMaster != null && String.Equals(SplitMaster.DetailName, dtName, StringComparison.CurrentCultureIgnoreCase))
                    {
                        if (SplitLink != null)
                        {
                            FlxMessages.ThrowException(FlxErr.ErrSplitNeedsOnlyOneMaster, dtName, SplitMaster.TableName, SplitLink.ParentDataSource.TableName);
                        }
                        SplitLink = new TSplitLink(SplitMaster, SplitMaster.SplitCount);
                    }

                    AddExtraRelationships(TableFinder, aData, ExtraRelations, band, MasterDetailLinkList);
                    AddExtraRelationships(TableFinder, aData, StaticRelations, band, MasterDetailLinkList);
                }
                band = band.MasterBand;
            }

            MasterDetailLinks = MasterDetailLinkList.ToArray();

            Data                 = aData;
            DataState            = aData.CreateState(Sort, MasterDetailLinks, SplitLink);
            DataState.FTableName = dtName;
            FName                = dtName;
        }
示例#14
0
        internal static VirtualDataTable FindLinkedTable(TBand MasterBand, string Name, VirtualDataTable Table)
        {
            TBand band = MasterBand;

            while (band != null)
            {
                if (band.DataSource != null)
                {
                    VirtualDataTable vt = band.DataSource.GetDetail(Name, Table);
                    {
                        if (vt != null)
                        {
                            return(vt);
                        }
                    }
                }
                band = band.MasterBand;
            }
            return(Table);
        }
示例#15
0
        private static int[] GetColIndexes(VirtualDataTable Table, string[] ColNames, bool ThrowExceptions)
        {
            int[] ColIdx = new int[ColNames.Length];

            for (int i = 0; i < ColIdx.Length; i++)
            {
                int cs = Table.GetColumn(ColNames[i]);
                if (cs < 0)
                {
                    if (ThrowExceptions)
                    {
                        FlxMessages.ThrowException(FlxErr.ErrColumNotFound, ColNames[i], Table.TableName);
                    }
                    else
                    {
                        return(null);
                    }
                }

                ColIdx[i] = cs;
            }

            return(ColIdx);
        }
示例#16
0
 public TTopDataTableState(VirtualDataTable aTableData, int aTopCount, VirtualDataTableState aActualDataState) : base(aTableData)
 {
     ActualDataState = aActualDataState;
     TopCount        = aTopCount;
 }
示例#17
0
        internal DataTable OriginalTable; //Data relations are bound to this one.

        #endregion

        #region Constructors
        public TAdoDotNetDataTable(string aTableName, VirtualDataTable aCreatedBy, DataTable aData, bool aDataNeedsDispose) : this(aTableName, aCreatedBy, aData, aDataNeedsDispose, aData)
        {
        }
示例#18
0
 public TMasterSplitDataTableState(VirtualDataTable aTableData) : base(aTableData)
 {
     LastPosition = -1;
 }
示例#19
0
 public TColumnsDataTableState(VirtualDataTable aTableData, TPositionAndName[] aColumns)
     : base(aTableData)
 {
     Columns = aColumns;
 }
示例#20
0
 public TColumnsDataTable(string aTableName, VirtualDataTable aCreatedBy, TPositionAndName[] aColumns)
     : base(aTableName, aCreatedBy)
 {
     Columns = aColumns;
 }
示例#21
0
 internal VirtualDataTable GetDetail(string DataTableName, VirtualDataTable DataTable)
 {
     return(Data.GetDetail(DataTableName, DataTable));
 }
示例#22
0
 public TNRowsDataTableState(VirtualDataTable aTableData, int aRecordCount)
     : base(aTableData)
 {
     RecordCount = aRecordCount;
 }
示例#23
0
 internal void Add(string dtName, VirtualDataTable dt, bool VirtualTableNeedsDispose)
 {
     DestroyItem(dtName);
     FList[dtName] = new TDataSourceInfo(dtName, dt, "", "", VirtualTableNeedsDispose, VirtualTableNeedsDispose, TableFinder);
 }
示例#24
0
 public TMasterSplitDataTable(string aTableName, VirtualDataTable aCreatedBy, string aDetailName, int aSplitCount) : base(aTableName, aCreatedBy)
 {
     DetailName = aDetailName;
     SplitCount = aSplitCount;
 }
示例#25
0
 public TTopDataTable(string aTableName, VirtualDataTable aCreatedBy, VirtualDataTable aActualData, int aTopCount)
     : base(aTableName, aCreatedBy)
 {
     ActualData = aActualData;
     TopCount   = aTopCount;
 }
示例#26
0
        internal TFlexCelDataSource CreateDataSource(TBand MasterBand, TRelationshipList ExtraRelations, TRelationshipList StaticRelations)
        {
            VirtualDataTable LinkedTable = FindLinkedTable(MasterBand, Name, FTable);

            return(new TFlexCelDataSource(LinkedTable.TableName, LinkedTable, ExtraRelations, StaticRelations, MasterBand, FSort, TableFinder));
        }
示例#27
0
 public TEFDataTable(string aTableName, VirtualDataTable aCreatedBy, IQueryable <T> aData, TLinqDataTable <T> aOrigTable, string[] aFilters) :
     base(aTableName, aCreatedBy, aData, aOrigTable, aFilters)
 {
 }
示例#28
0
 public TEFDataTable(string aTableName, VirtualDataTable aCreatedBy, IQueryable <T> aData)
     : base(aTableName, aCreatedBy, aData)
 {
 }
示例#29
0
 protected override VirtualDataTable CreateNewDataTable(string aTableName, VirtualDataTable aCreatedBy, IQueryable <T> aData, TLinqDataTable <T> aOrigTable, string[] aFilters)
 {
     return(new TEFDataTable <T>(aTableName, aCreatedBy, aData, aOrigTable, aFilters));
 }
示例#30
0
 public TNRowsDataTable(string aTableName, VirtualDataTable aCreatedBy, int aRecordCount)
     : base(aTableName, aCreatedBy)
 {
     RecordCount = aRecordCount;
 }