03.02.2003, 18:20 | #21 |
Lean Six Sigma
|
to edd. А какой синтаксис использовался?
|
|
03.02.2003, 18:33 | #22 |
Участник
|
Если мне не изменяет память, то любое поле, в .т.ч и целое можно взять как string и далее делать с ним что хочешь
|
|
04.02.2003, 07:24 | #23 |
Участник
|
Что касается синтаксиса, то вот...
Структура dbf: W:\Balans_N\OB23.DBF Количество записей: 4547 N Имя поля Тип Длина --------------------------------- 1 MES Date 8 2 PACH Numeric 3 3 INV_N Numeric 5 4 VIDOB Numeric 1 5 CEX_KR Numeric 2 6 SH_KR Numeric 2 7 AN_KR Numeric 8 8 CEX_OS Numeric 2 9 SH_OS Numeric 2 10 AN_OS Numeric 8 11 SUMMA Numeric 18.2 12 KOLI Numeric 14 13 KPOTR Numeric 10 14 SUM_PL Numeric 15.2 15 VP Numeric 2 16 CHM_N Numeric 2 17 NAME_S Character 45 --------------------------------- Всего: 148 На одной кнопке: void clicked() { CCADOConnection cn = new CCADOConnection(); CCADOCommand command = new CCADOCommand(); CCADORecordset rs = new CCADORecordset(); str _str = ""; str filename; int pos; FileNameFilter filter; ; super(); filter = ['DBF files','ob23*.dbf']; filename = Winapi::getOpenFileName(element.hWnd(),filter,'','', '',''); pos = StrScan(StrUpr(filename),"OB23",1,255); _str = SubStr(StrUpr(filename),1,pos-1); cn = new CCADOConnection(); cn.open("Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq="+_str+";"); command.activeConnection(cn); _str = "select * from "+SubStr(StrUpr(filename),pos,StrLen(StrUpr(filename))); command.commandText("select * from "+SubStr(StrUpr(filename),pos,StrLen(StrUpr(filename)))); if (cn) { rs = command.execute(); while (!rs.EOF()) { OB23.PACH = rs.fields().itemname("PACH").value(); OB23.INV_N = rs.fields().itemname("INV_N").value(); OB23.MES = rs.fields().itemname("MES").value(); OB23.CEX_KR = rs.fields().itemname("CEX_KR").value(); OB23.VIDOB = rs.fields().itemname("VIDOB").value(); OB23.SH_KR = rs.fields().itemname("SH_KR").value(); OB23.NAME_S = rs.fields().itemname("NAME_S").value(); OB23.CHM_N = rs.fields().itemname("CHM_N").value(); OB23.VP = rs.fields().itemname("VP").value(); OB23.SUM_PL = rs.fields().itemname("SUM_PL").value(); OB23.KPOTR = rs.fields().itemname("KPOTR").value(); OB23.KOLI = rs.fields().itemname("KOLI").value(); OB23.SUMMA = rs.fields().itemname("SUMMA").value(); OB23.AN_OS = rs.fields().itemname("AN_OS").value(); OB23.AN_OS = substr('0000000'+OB23.AN_OS,strlen(OB23.AN_OS),8); OB23.CEX_OS = rs.fields().itemname("CEX_OS").value(); OB23.SH_OS = rs.fields().itemname("SH_OS").value(); OB23.AN_KR = rs.fields().itemname("AN_KR").value(); OB23.AN_KR = substr('0000000'+OB23.AN_KR,strlen(OB23.AN_KR),8); OB23.insert(); rs.moveNext(); } rs.close(); OB23_DS.executeQuery(); } } На другой: void clicked() { OdbcConnection connection; LoginProperty LP = new LoginProperty(); Statement stm; ResultSet res; str stmTxt = "select * from ob23.dbf"; ; super(); LP.setDSN("DBF"); connection = new OdbcConnection(LP); stm = connection.createStatement(); res = stm.executeQuery(stmTxt); while (res.next()) { OB23.MES = res.getDate(1); OB23.PACH = res.getInt(2); OB23.INV_N = res.getInt(3); OB23.VIDOB = res.getInt(4); OB23.CEX_KR = res.getInt(5); OB23.SH_KR = res.getInt(6); OB23.AN_KR = int2str(res.getInt(7)); OB23.CEX_OS = res.getInt(8); OB23.SH_OS = res.getInt(9); OB23.AN_OS = int2str(res.getInt(10)); OB23.SUMMA = res.getReal(11); OB23.KOLI = res.getInt(12); OB23.KPOTR = Num2Str(res.getReal(13),10,0,1,0); OB23.SUM_PL = res.getReal(14); OB23.VP = res.getInt(15); OB23.CHM_N = res.getInt(16); OB23.NAME_S = res.getString(17); OB23.insert(); } res.close(); OB23_DS.executeQuery(); } |
|
04.02.2003, 13:34 | #24 |
Коллективное бессознательn ое
|
По поводу скорости - ADO использует те же ODBC-драйвера (он и указывается в ConnectionString) и поэтому катастрофической разницы в скоростях не будет, скорее всего это влияние "внешних" факторов.
Кстати, в предложениях SELECT все названия полей и таблий лучше всегда брать в апострофы - `Field1`, либо квадратные скобки [Field1]. Иначе, если попадется файл с пробелами, то вывалится исключение типа "не найден объект". Из опыта могу добавить, что файлы, содержащие в названии точки фолят всегда. Кстати, ADO-классы я сделал свои, т.к. в Аксапте они реализованы процентов на 5. Например, совершенно невозможно выводить сведения об ошибках, т.к. ADODB.Error не реализован по-человечески аксаптовым классом, а возвращается, как COM-объект. Вот. Будут вопросы - отвечу, если смогу. Строго не судите - я аналитик, а не разработчик, хотя иногда балуюсь. |
|
04.02.2003, 13:50 | #25 |
Участник
|
2 KSS
Я привел два примера (выше), при использовании ADO скорость было >1 мин, а при ODBC ~10 сек. Как их уровнять, т.е. где подкрутить? И как достать из поля в DBF значение ~9999999999? Исправляюсь... большие числа указанными примерами достаються. |
|
04.02.2003, 14:28 | #26 |
Коллективное бессознательn ое
|
Максимальное целое в АКСАПТЕ (впрочем, как и в любой 32х разрядной операционной системе) равняется 2 147 483 647 (1 << 31, или 2 в 32 степени - 1).
Вам, сэр, нужна 64 разрядная система! ) Шутю. Если серьезно, то если цифры такого порядка, то можно использовать FLOAT (REAL в АКСАПТЕ). А чтобы не выводились нолики в конце, просто их откидывать. С ADO все не так однозначно. Хотя... Файл лежит на сети? Я бы, для чистоты эксперимента попробовал бы запустить сначала АДО, потом перезапустить АКСАПТУ и запустить через ODBCConnection. Так же попробуйте запустить в другом порядке: ODBCConnection, ADO. Думаю, что какие-то данные кешируются, либо ADO обломал сетевой траффик. Только что я пробовал на 297 000 строк запрос с аггрегацией по 1 полю через ADO (CSV файл на сети, 150 мегабайт). Запрос длился примерно минуту. Попробуй и скажи, чего получилось, будем дальше думать. |
|
05.02.2003, 07:09 | #27 |
Участник
|
2 KSS
Цитата:
Если серьезно, то если цифры такого порядка, то можно использовать FLOAT (REAL в АКСАПТЕ). А чтобы не выводились нолики в конце, просто их откидывать.
Цитата:
С ADO все не так однозначно. Хотя... Файл лежит на сети?
Цитата:
Я бы, для чистоты эксперимента попробовал бы запустить сначала АДО, потом перезапустить АКСАПТУ и запустить через ODBCConnection. Так же попробуйте запустить в другом порядке: ODBCConnection, ADO. Думаю, что какие-то данные кешируются, либо ADO обломал сетевой траффик. Только что я пробовал на 297 000 строк запрос с аггрегацией по 1 полю через ADO (CSV файл на сети, 150 мегабайт). Запрос длился примерно минуту. Попробуй и скажи, чего получилось, будем дальше думать.
2. Попробовал на разных машинах - результат аналогичный. (AOS не перезапускал). |
|
05.02.2003, 14:05 | #28 |
Коллективное бессознательn ое
|
Для ADO (ну и ODBC, разумеется) не важно, какой клиент, т.к. они все делают через WinAPI и АКСАПТА практически не задействуется. Я бы рекомендовал тебе выкинуть из описаных тобою примеров итерацию по Recordset и выполнение метода на DataSource и замерить время непосредственно на выполнении запрса:
int TimeStamp; ........................... PHP код:
int TimeStamp; ............................ PHP код:
|
|
06.02.2003, 07:48 | #29 |
Участник
|
2 KSS
Нижеследующий код дает такие результаты: Сообщение (09:45:02) Время выполнения операции: 00:00:00 Время выполнения операции: 00:00:04 Т.е. ADO работает достаточно быстро, а медленно работает извлечение данных :-( Как это побороть?!!! void clicked() { CCADOConnection cn = new CCADOConnection() ; CCADOCommand command = new CCADOCommand() ; CCADORecordset rs = new CCADORecordset() ; str _str = "" ; str filename ; int pos ; int timeStamp ; FileNameFilter filter ; ; super(); filter = ['DBF files','ob23*.dbf']; filename = Winapi::getOpenFileName(element.hWnd(),filter,'','', '',''); pos = StrScan(StrUpr(filename),"OB23",1,255); _str = SubStr(StrUpr(filename),1,pos-1); cn = new CCADOConnection(); cn.open("Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq="+_str+";"); command.activeConnection(cn); _str = "select * from "+SubStr(StrUpr(filename),pos,StrLen(StrUpr(filename))); timeStamp = timeNow(); command.commandText("select * from "+SubStr(StrUpr(filename),pos,StrLen(StrUpr(filename)))); info(strFmt('Время выполнения операции: %1', time2str(timeNow() - timeStamp,1,1))); if (cn) { rs = command.execute(); while (!rs.EOF()) { rs.moveNext(); } rs.close(); info(strFmt('Время выполнения операции: %1', time2str(timeNow() - timeStamp,1,1))); OB23_DS.executeQuery(); } } |
|
06.02.2003, 21:01 | #30 |
Коллективное бессознательn ое
|
Первое время будет всегда ноль - ты же меряешь время операции присвоения строки (оно, кстати, надо?). А 4 секунды на то, чтобы выполнить запрос и пройтись по курсору, я считаю, нормально. Курсор, как ты понимаешь, хранится на локале и поэтому скорость, очевидно, будет сильно зависеть от объема памяти, её скорости, скорости процессора и.т.д. У меня на рабочей станции (512 + Пентиум4) 150 мегабайтный файл читается минуту, а на рабочей станции какого-нибудь коммерсанта, например, где компьютер на порядок слабее, выборка может и пол-часа занять...
Так что попробуй запустить этот тест на разных по мощности машинах - разница должна проявиться. |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Как обновить форму, если добавление через кнопку? | 5 | |||
Бинарные данные в Axapta | 4 | |||
Вытащить данные на форму | 25 | |||
Можно ли редактировать форму, если на нее наложен addRange? | 10 | |||
почти DBF | 3 |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|