30.09.2010, 17:32 | #1 |
Модератор
|
Проверить в файле DBF наличие поля?
Как проверить в файле DBF если ли поле вообще, при этом имя поля мы знаем?
__________________
This posting is provided "AS IS" with no warranties, and confers no rights. |
|
30.09.2010, 18:24 | #2 |
MCP
|
Можно попробовать через класс 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 |
Administrator
|
Также для получения информации о структуре таблиц существует объект ADOX. (классы CCADOX).
__________________
Возможно сделать все. Вопрос времени |
|
01.10.2010, 14:34 | #4 |
Модератор
|
Спасибо за ваши рекомендации. Вопрос решен через перебор имен полей.
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 |
Administrator
|
Такой перебор плох тем, что для перебора нужно осуществить выборку из 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 |
Участник
|
То есть "select TOP 1.." все равно на dbf вызовет загрузку всей таблицы?
|
|
02.10.2010, 14:37 | #7 |
Administrator
|
Цитата:
Т.е. с TOP 1 все будет ок.
__________________
Возможно сделать все. Вопрос времени |
|
Теги |
ax2009, dbf |
|
|