|  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 | 
|  | 
| 
 |