31.01.2003, 12:29 | #1 |
Участник
|
Достать данные из DBF в форму
Не могу вытащить данные из dbf в форму, помогите разобраться.
Сообщение (14:28:28) Невозможно выбрать запись в таблице '' ('') База данных SQL обнаружила ошибку. Описание ошибки SQL: [Microsoft][ODBC dBase Driver] Объект 'OB23' не найден ядром базы данных Microsoft Jet. Проверьте существование объекта и правильность имени и пути. SQL запрос: select * from OB23 Где ошибка? Как правильно сделать? void clicked() { LoginProperty LP; Connection con; Statement stmt; Resultset rs; str filename; FileNameFilter filter; ; super(); filter = ['DBF files','*.dbf']; filename = Winapi::getOpenFileName(element.hWnd(),filter,'','', '',''); LP = new LoginProperty(); LP.setDSN("dBASE Files"); //стандартный DSN LP.setDatabase(filename); Con = new OdbcConnection(LP); stmt = con.createStatement(); rs = stmt.executeQuery('select * from OB23'); // именно с таким именем файл я выбирал в диалоге while (rs.next()) // ОШИБКА ВОЗНИКАЕТ ТУТ { print rs.getstring(1); } rs.close(); element.close(); } |
|
31.01.2003, 13:02 | #2 |
Модератор
|
Цитата:
LP.setDSN("dBASE Files"); //стандартный DSN
А "Файлы DBase" вместо "dBASE Files" пробовал? |
|
31.01.2003, 13:09 | #3 |
Участник
|
у меня заработало только после того, как в настройке ODBC я указал напрямую папку, где лежат файл и сказал об этом Аксапте, да и драйвер у меня указан другой:
static void Job1(Args _args) { LoginProperty LP; OdbcConnection C; Statement S; ResultSet R; LP = new LoginProperty(); LP.setDSN("DBASE"); LP.setDatabase("D:\\"); LP.setOther("D:\\"); C = new OdbcConnection(LP); if (C) { S = C.createStatement(); R = S.executeQuery("SELECT * FROM [TEST]"); while (R.next()) print R.getString(1); } else error("Failed to log on to the database."); } |
|
31.01.2003, 13:47 | #4 |
Участник
|
Создал специальный DSN, в нем указал путь w:\balans, переделал код, результат тот же.
Проверил в Excel новый DSN, он работает, т.е. выбираю Данные\Внешние данные\Создать запрос, далее выбираю DBF (так назвал DSN) и вижу список таблиц для запроса. Дайте рабочий кусок кода, пожалуйста. void clicked() { LoginProperty LP; Connection con; Statement stmt; Resultset rs; str filename; FileNameFilter filter; ; super(); LP = new LoginProperty(); LP.setDSN("DBF"); LP.setDatabase("w:\\balans\\"); LP.setOther("w:\\balans\\"); Con = new OdbcConnection(LP); if (Con) { stmt = con.createStatement(); rs = stmt.executeQuery('select * from OB23_1'); while (rs.next()) { print rs.getstring(1); } rs.close(); } element.close(); } |
|
31.01.2003, 14:04 | #5 |
Участник
|
Кажется, понял в чем дело.
Покажи картинку с настройками ODBC (DBF). Там директория указана? |
|
31.01.2003, 15:28 | #6 |
Модератор
|
Ничего, если через ado?
static void Job99(Args _args) { LoginProperty LP; OdbcConnection C; Statement S; ResultSet R; CCADOConnection cn = new CCADOConnection(); CCADOCommand command = new CCADOCommand(); CCADORecordset rs = new CCADORecordset(); cn = new CCADOConnection(); cn.open("Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=c:\\;"); command.activeConnection(cn); command.commandText("select * from mydbf.dbf"); rs = command.execute(); while (!rs.eof()) { print "fetch"; rs.moveNext(); } pause; } |
|
31.01.2003, 16:18 | #7 |
Участник
|
C ODBC есть еще одни грабли, на которые мне приходилось наступать:
в одном цикле функции rs.getString(1) для одного поля можно вызывать только один раз так if(rs.getString(1) == "") str = rs.getString(1); приведет к ошибке а tmp = rs.getString(1); if(tmp == "") str = tmp; работает нормально. |
|
31.01.2003, 16:29 | #8 |
Участник
|
2 Михаил Андреев
Картинка вот, но в итоге, я бы хотел сам выбирать файл. Ууупсссс.... Не понял как прикрепить картинку, ну в DBF (ODBC) указан каталог W:\BALANS PS. А отправка картинки как делается? |
|
31.01.2003, 16:51 | #9 |
Участник
|
В тексте вставь строчку FIG1 в квадратных скобках... (а как его простым текстом оставить?)
внизу укажи, какой файл надо вставлять в этот элемент |
|
31.01.2003, 16:53 | #10 |
Участник
|
2 Vadik
А как получать значения полей DBF курсора? |
|
31.01.2003, 16:56 | #11 |
Участник
|
Спасибо mazzy за подсказку.
|
|
31.01.2003, 17:18 | #12 |
Модератор
|
while (!rs.eof())
{ print "fetch"; print rs.fields().itemname("a1").value(); rs.moveNext(); } |
|
31.01.2003, 17:26 | #13 |
Участник
|
2 Vadik
Спасибо! Кажется работает!!! А через ODBC у кого нибудь есть рабочий вариант? Вот если использовать базу Access, то работает, а с DBF не получается? |
|
31.01.2003, 17:30 | #14 |
Участник
|
Должно и с DBF работать
|
|
03.02.2003, 11:58 | #15 |
Участник
|
Хочу еще раз поднять вопрос.
Через ADO так медленно, что нет слов... ПОМОГИТЕ через ODBC, дайте рабочий пример!!! |
|
03.02.2003, 12:04 | #16 |
Moderator
|
Вот здесь я создал ODBC источник данных - Test, положил туда файл (rab.dbf).
PHP код:
|
|
03.02.2003, 12:32 | #17 |
Участник
|
2 Андре
А можно посмотреть настройки DSN? И можно ли пользоваться одним DSN для разных DBF файлов, лежащих в разных местах? |
|
03.02.2003, 12:48 | #18 |
Moderator
|
Цитата:
А можно посмотреть настройки DSN?
Панель управления->Администрирование->Источники данных ODBC->System DSN-> Add-> Microsoft DBase driver (*.dbf) -> Имя источника данных - устанавливаем Test-> Версия dBASE IV-> Выбор каталога -> Указываем каталог в котором лежат dbf-ки. Цитата:
И можно ли пользоваться одним DSN для разных DBF файлов, лежащих в разных местах?
Можно пользоваться одним DSN для разных файлов в одной директории. Я так и сделал - свалил все dbf-ки в одну директорию, пользователь выбирал dbf-ку (но только из данного каталога), и динамически формировал строку запроса. |
|
03.02.2003, 15:55 | #19 |
Lean Six Sigma
|
еще вариант по поводу ADO
Более короткий вариант АДО:
void clicked() { CCADOConnection cn = new CCADOConnection(); CCADORecordset rs = new CCADORecordset(); cn.open("Driver=Microsoft dBASE Driver (*.dbf);Dbq=c:\\;"); rs.open("select * from ZN1", cn); while (!rs.eof()) { print rs.fields().itemidx(1).value()+":"+ rs.fields().itemname("name").value(); rs.moveNext(); } } |
|
03.02.2003, 16:53 | #20 |
Участник
|
Сделал два варианта, один ADO, другой ODBC.
Из базы с 4500 записями через ODBC данные берутся за 10 сек, а через ADO за 1 мин 10 сек. По ходу возник вопрос, как из DBF взять поле типа N 10, в которм есть число 9999999999? А то Аксапта что то плохо работает с большим int. |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Как обновить форму, если добавление через кнопку? | 5 | |||
Бинарные данные в Axapta | 4 | |||
Вытащить данные на форму | 25 | |||
Можно ли редактировать форму, если на нее наложен addRange? | 10 | |||
почти DBF | 3 |
|