private PartnerEditTDSFamilyMembersTable GetFamilyMembersInternal(Int64 AFamilyPartnerKey,
            String AWorkWithSpecialType,
            out Int32 ACount,
            Boolean ACountOnly)
        {
            TDBTransaction ReadTransaction;

            OdbcParameter[] ParametersArray;
            Boolean NewTransaction = false;
            PartnerEditTDSFamilyMembersTable PartnerTypeFamilyMembersDT;
            PPersonTable FamilyPersonsDT;
            PPartnerTypeTable PartnerTypesDT;
            DataRow[] PartnerTypesFoundRows;
            PartnerEditTDSFamilyMembersRow NewRow;
            StringCollection RequiredColumns;
            int Counter;
            Boolean TypeCodePresent;
            DataSet TmpDS;


            PartnerTypeFamilyMembersDT = new PartnerEditTDSFamilyMembersTable();

            try
            {
                ReadTransaction = DBAccess.GDBAccessObj.GetNewOrExistingTransaction(IsolationLevel.RepeatableRead,
                    TEnforceIsolationLevel.eilMinimum, out NewTransaction);

                ParametersArray = new OdbcParameter[1];
                ParametersArray[0] = new OdbcParameter("", OdbcType.Decimal, 10);
                ParametersArray[0].Value = (System.Object)AFamilyPartnerKey;

                if (ACountOnly)
                {
                    ACount = Convert.ToInt32(DBAccess.GDBAccessObj.ExecuteScalar(
                            "SELECT COUNT(*) " +
                            "FROM PUB_" + PPersonTable.GetTableDBName() +
                            " INNER JOIN " + "PUB_" + PPartnerTable.GetTableDBName() +
                            " ON " + "PUB_" + PPersonTable.GetTableDBName() + '.' +
                            PPartnerTable.GetPartnerKeyDBName() + " = " +
                            "PUB_" + PPartnerTable.GetTableDBName() + '.' +
                            PPartnerTable.GetPartnerKeyDBName() + ' ' +
                            "WHERE " + PPersonTable.GetFamilyKeyDBName() + " = ? " +
                            "AND " + PPartnerTable.GetStatusCodeDBName() + " <> '" +
                            SharedTypes.StdPartnerStatusCodeEnumToString(TStdPartnerStatusCode.spscMERGED) + "'", ReadTransaction,
                            ParametersArray));

                    // Make sure we don't count MERGED Partners (shouldn't have a p_family_key_n, but just in case.)
                }
                else
                {
                    // Find all Persons that belong to the Family
//                  TLogging.LogAtLevel(7, "TPartnerEditUIConnector.GetFamilyMembersInternal: loading Persons for Family " + AFamilyPartnerKey.ToString() + "...");

                    TmpDS = new DataSet();
                    FamilyPersonsDT = new PPersonTable();
                    TmpDS.Tables.Add(FamilyPersonsDT);
                    DBAccess.GDBAccessObj.Select(TmpDS,
                        "SELECT " + "PUB_" + PPartnerTable.GetTableDBName() + '.' +
                        PPartnerTable.GetPartnerKeyDBName() + ", " +
                        PPersonTable.GetFamilyNameDBName() + ", " +
                        PPersonTable.GetTitleDBName() + ", " +
                        PPersonTable.GetFirstNameDBName() + ", " +
                        PPersonTable.GetMiddleName1DBName() + ", " +
                        PPersonTable.GetFamilyIdDBName() + ", " +
                        PPersonTable.GetGenderDBName() + ", " +
                        PPersonTable.GetDateOfBirthDBName() + ' ' +
                        "FROM PUB_" + PPersonTable.GetTableDBName() +
                        " INNER JOIN " + "PUB_" + PPartnerTable.GetTableDBName() + " ON " +
                        "PUB_" + PPersonTable.GetTableDBName() + '.' +
                        PPartnerTable.GetPartnerKeyDBName() + " = " +
                        "PUB_" + PPartnerTable.GetTableDBName() + '.' +
                        PPartnerTable.GetPartnerKeyDBName() + ' ' +
                        "WHERE " + PPersonTable.GetFamilyKeyDBName() + " = ? " +
                        "AND " + PPartnerTable.GetStatusCodeDBName() + " <> '" +
                        SharedTypes.StdPartnerStatusCodeEnumToString(TStdPartnerStatusCode.spscMERGED) + "'",    // Make sure we don't load MERGED Partners (shouldn't have a p_family_key_n, but just in case.)
                        PPersonTable.GetTableName(), ReadTransaction, ParametersArray, 0, 0);

                    ACount = FamilyPersonsDT.Rows.Count;

                    RequiredColumns = new StringCollection();
                    RequiredColumns.Add(PPartnerTypeTable.GetTypeCodeDBName());

                    TypeCodePresent = false;

                    // Add Persons to Table
                    for (Counter = 0; Counter <= FamilyPersonsDT.Rows.Count - 1; Counter += 1)
                    {
                        // Load a Person's SpecialTypes if requested
                        if (AWorkWithSpecialType != "")
                        {
                            PartnerTypesDT = PPartnerTypeAccess.LoadViaPPartner(
                                FamilyPersonsDT[Counter].PartnerKey,
                                RequiredColumns,
                                ReadTransaction,
                                null,
                                0,
                                0);

                            if (PartnerTypesDT.Rows.Count != 0)
                            {
                                // check if the searched for Special Type is present
                                PartnerTypesFoundRows = PartnerTypesDT.Select(
                                    PPartnerTypeTable.GetTypeCodeDBName() + " = '" + AWorkWithSpecialType + "'");

                                if ((PartnerTypesFoundRows != null) && (PartnerTypesFoundRows.Length > 0))
                                {
                                    TypeCodePresent = true;
                                }
                                else
                                {
                                    TypeCodePresent = false;
                                }
                            }
                            else
                            {
                                TypeCodePresent = false;
                            }
                        }

                        NewRow = PartnerTypeFamilyMembersDT.NewRowTyped(false);
                        NewRow.PartnerKey = FamilyPersonsDT[Counter].PartnerKey;
                        NewRow.PartnerShortName =
                            Calculations.DeterminePartnerShortName(TSaveConvert.StringColumnToString(FamilyPersonsDT.ColumnFamilyName,
                                    FamilyPersonsDT[Counter]), TSaveConvert.StringColumnToString(FamilyPersonsDT.ColumnTitle,
                                    FamilyPersonsDT[Counter]), TSaveConvert.StringColumnToString(FamilyPersonsDT.ColumnFirstName,
                                    FamilyPersonsDT[Counter]),
                                TSaveConvert.StringColumnToString(FamilyPersonsDT.ColumnMiddleName1, FamilyPersonsDT[Counter]));
                        NewRow.FamilyId = FamilyPersonsDT[Counter].FamilyId;

                        if (AWorkWithSpecialType != "")
                        {
                            NewRow.TypeCodePresent = TypeCodePresent;
                            NewRow.TypeCodeModify = false;

                            // TODO 2 oChristianK cSpecial Types / Family Members : Add all other Special Types of each Person
                            NewRow.OtherTypeCodes = "#NOT YET RETRIEVED FROM DB!#";
                        }

                        NewRow.Gender = FamilyPersonsDT[Counter].Gender;

                        try
                        {
                            NewRow.DateOfBirth = FamilyPersonsDT[Counter].DateOfBirth;
                        }
                        catch (System.Data.StrongTypingException)
                        {
                            NewRow.DateOfBirth = System.DateTime.MinValue;
                        }

                        PartnerTypeFamilyMembersDT.Rows.Add(NewRow);
                    }
                }
            }
            finally
            {
                if (NewTransaction)
                {
                    DBAccess.GDBAccessObj.CommitTransaction();
                    TLogging.LogAtLevel(7, "TPartnerEditUIConnector.GetFamilyMembersInternal: committed own transaction.");
                }
            }
            return PartnerTypeFamilyMembersDT;
        }