Показать сообщение отдельно
Старый 07.08.2009, 14:48   #9  
SHiSHok is offline
SHiSHok
Участник
Аватар для SHiSHok
Дети Юза
 
219 / 103 (4) +++++
Регистрация: 28.07.2005
Адрес: Донецк
решил так
каличный метод. у меня mssql2k, сделал следующее:

создал табличку (в ax)
CREATE TABLE [dbo].[TABLE2] (
[FSTR] [varchar] (10) COLLATE SQL_Ukrainian_CP1251_CI_AS NOT NULL ,
[FINT] [int] NOT NULL ,
[FREAL] [numeric](28, 12) NOT NULL ,
[FDATE] [datetime] NOT NULL ,
[FTIME] [int] NOT NULL ,
[FENUM] [int] NOT NULL ,
[FCON] [image] NULL ,
[DATAAREAID] [varchar] (3) COLLATE SQL_Ukrainian_CP1251_CI_AS NOT NULL ,
[RECID] [int] NOT NULL
)

+ пофиксил метод SysDictField.fieldSize() (по перекрестным ссылках используется только в отчетах о размере базы/компании):
X++:
int fieldSize()
{
    int size;
    switch (this.baseType())
    {
        case Types::DATETIME:
        case Types::DATE:
            size = 8;
            break;
//        case Types::DATE:
//        case Types::DATETIME:
        case Types::INTEGER:
            size = 4;
            break;
        case Types::BLOB:
        case Types::CONTAINER:
        case Types::VARSTRING:
            size = 2048; // 8192 div 4 (assumption: One out of 4 has data)
            break;
        case Types::REAL:
            size = 13; //20;
            break;
        case Types::ENUM:
            size = 4; //1;
            break;
        case Types::STRING:
        case Types::RSTRING:
            size = this.stringLen();
            break;
    }
    return size*this.arraySize();
}
дык оно просчитало вот такие поля:
X++:
TableId
RecId
sequenceNum
dataAreaId
createdTransactionId
createdBy
createdTime
createdDate
modifiedTransactionId
modifiedBy
modifiedTime
modifiedDate
fCon
fEnum
fTime
fDate
fReal
fInt
fStr
думаю для более реалистичной картины надо пофиксить sysDictTable.recordSize(). предлагаю так:
X++:
int recordSize()
{
    int size;
    int i;
    SysDictField sysDictField;

    for (i=this.fieldCnt(); i; i--)
    {
        SysDictField = new SysDictField(this.id(), this.fieldCnt2Id(i));
        if ( SysDictField.isSql() )
            size += SysDictField.fieldSize();
    }
    return size;
}
посчитало поля:
X++:
RecId
dataAreaId
fCon
fEnum
fTime
fDate
fReal
fInt
fStr
непонимаю только зачем "большие" поля типа container считать как 1/4 страницы.
__________________
--- SHiSHok

Последний раз редактировалось SHiSHok; 07.08.2009 в 14:54. Причина: дополнил