AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.09.2010, 17:32   #1  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
? Проверить в файле DBF наличие поля?
Как проверить в файле DBF если ли поле вообще, при этом имя поля мы знаем?
__________________

This posting is provided "AS IS" with no warranties, and confers no rights.
Старый 30.09.2010, 18:24   #2  
kornix is offline
kornix
MCP
MCBMSS
Злыдни
Ex AND Project
 
414 / 146 (5) +++++
Регистрация: 24.02.2009
Адрес: Санкт-Петербург
Можно попробовать через класс CCADOField (код изначально не мой, переделал с помощью примера GBH ):


X++:
static server void dbfField()
{
    CCADOConnection         adoConnection;
    CCADOCommand           adoCommand;
    CCADORecordSet          adoRecordSet;
    CCADOFields                adoFields;
    ;

    adoConnection       = new CCADOConnection();

    // инициализация строки подключения ...

    adoConnection.open();
    adoCommand          = new CCADOCommand();
    adoCommand.activeConnection(adoConnection);

    adoCommand.commandType(1);   
    adoCommand.commandText("Select * from base.dbf");
    adoRecordSet     = adoCommand.execute();
    adoFields        = adoRecordSet.fields();
    if(adoFields.itemIdx(1))
    {
        // поле существует
    }
    else
    {
        // не существует
    }
            
    
    adoConnection.close();
    
}
За это сообщение автора поблагодарили: Poleax (2), aidsua (2).
Старый 30.09.2010, 19:00   #3  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,319 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Также для получения информации о структуре таблиц существует объект ADOX. (классы CCADOX).
__________________
Возможно сделать все. Вопрос времени
Старый 01.10.2010, 14:34   #4  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
:)
Спасибо за ваши рекомендации. Вопрос решен через перебор имен полей.

X++:
void ado_FieldCheck() 
{
    #CCADO
    #define.GUID("GUID")
    //Classes
    CCAdoConnection         adoConnection = new CCAdoConnection();
    CCAdoCommand            adoCommand;
    CCAdoRecordSet          adoRecordSet;
    CCAdoFields             adoFields;
    
    //Variables
    int                     i;
    str 100                 connectionString  = strfmt('DSN=%1;',CustParameters::find().DsnImport); 
// DsnImport  преднастроенный DSN. На подобии как в форме импорта КЛАДР
    boolean                 ret = false;
    ;

    adoConnection.open(connectionString);
    adoCommand          = new CCADOCommand();
    adoCommand.activeConnection(adoConnection);

    adoCommand.commandType(#adCmdText);
    adoCommand.commandText("SELECT TOP 1 * FROM TEST.DBF");
    adoRecordSet     = adoCommand.execute();
    adoFields        = adoRecordSet.fields();

    for(i=0; i< adoFields.count(); i++)
    {
        if(adoFields.itemIdx(i).name() == #GUID)
        {
            ret = true;
            break;
        }
    }

    adoConnection.close();
    
    if(ret)
        info(strfmt('Поле %1 найдено.', #GUID));
    else
        info(strfmt('Поле %1 НЕ найдено.', #GUID));
}
Использовал информацию:
DSN для dbf файла
Connecting to Databases through X++
__________________

This posting is provided "AS IS" with no warranties, and confers no rights.

Последний раз редактировалось Poleax; 01.10.2010 в 15:03.
За это сообщение автора поблагодарили: aidsua (2).
Старый 01.10.2010, 15:12   #5  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,319 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Такой перебор плох тем, что для перебора нужно осуществить выборку из DBF. Т.е. если вдруг файл очень большой - то может уйти большое время для такого перебора.
Выкладываю (для потомков уже) пример работы с ADOX (слизано с класса CCADOCommandBuild). Код написан для 2009 RU5. В 4.0 можно было еще не пользоваться объектом COM - были нужные классы

X++:
static void Job1(Args _args)
{
    CCADOConnection   ccADOConnection;
    COM               ccADOXCatalog;   // Эх, а в 4.0 этот класс был...
    COM               ccADOXTables;    // А это семейство было в классе CCADOXCatalog от 4.0
    COM               ccADOXTable;     // Эх, а в 4.0 этот класс тоже был...
    COM               ccADOXColumns;   // А это семейство было в классе CCADOXTable от 4.0
    CCAdoxColumn      ccAdoxColumn;
    int               i;
    #define.myConnectionString('MyConnectionString')
    #define.myTableName('myTableName')
   ;
    ccADOConnection = new CCADOConnection();
    ccADOConnection.open(#myConnectionString);
    ccADOXCatalog = new COM('ADOX.Catalog');
    if (!ccADOXCatalog)
    {
        throw error("@SYS32731");
    }
    ccADOXCatalog.activeConnection(ccADOConnection.connection());
    ccADOXTables  = ccADOXCatalog.tables();
    ccADOXTable   = ccADOXCatalog.item(#myTableName);
    ccADOXColumns = ccADOXTable.columns();
    for (i = 0; i < ccADOXColumns.count(); i++)
    {
        ccAdoxColumn = new CCAdoxColumn(ccADOXColumns.item(i));
        info(strfmt("%1 %2", ccAdoxColumn.name(), ccAdoxColumn.xppType()));
    }
}
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: aidsua (2).
Старый 02.10.2010, 12:59   #6  
player is offline
player
Участник
 
107 / 69 (3) ++++
Регистрация: 25.08.2007
То есть "select TOP 1.." все равно на dbf вызовет загрузку всей таблицы?
Старый 02.10.2010, 14:37   #7  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,319 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от player Посмотреть сообщение
То есть "select TOP 1.." все равно на dbf вызовет загрузку всей таблицы?
Нет конечно.... В изначальной версии примера TOP 1 не было - поэтому на окончательную версию примера я и не взглянул. Извиняюсь.
Т.е. с TOP 1 все будет ок.
__________________
Возможно сделать все. Вопрос времени
Теги
ax2009, dbf

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как проверить наличие хотя бы одной записи в подчиненной таблице. demon46 DAX: Программирование 5 07.03.2008 09:41
Поля 255 символов при экспорте в DBF Beast-L DAX: Программирование 5 25.07.2007 14:22
Denis Fedotenko: Новые поля в складских проводках Blog bot DAX: База знаний и проекты 10 24.05.2007 11:57
Получение из поля Map кода поля реальной таблицы, к ней привязанной (Mappings) vey DAX: Функционал 5 16.03.2005 11:16
Получить значение поля таблицы по номеру (Id) поля Anais DAX: Программирование 2 15.04.2004 13:00

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 22:27.