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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.02.2003, 18:20   #21  
Ned is offline
Ned
Lean Six Sigma
 
680 / 99 (5) ++++
Регистрация: 29.12.2002
Адрес: самолёт
to edd. А какой синтаксис использовался?
Старый 03.02.2003, 18:33   #22  
Vladislav Yushakov is offline
Vladislav Yushakov
Участник
 
47 / 10 (1) +
Регистрация: 10.01.2003
Если мне не изменяет память, то любое поле, в .т.ч и целое можно взять как string и далее делать с ним что хочешь
Старый 04.02.2003, 07:24   #23  
edd is offline
edd
Участник
 
81 / 10 (1) +
Регистрация: 20.01.2003
Что касается синтаксиса, то вот...

Структура 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  
KSS is offline
KSS
Коллективное бессознательn ое
 
116 / 10 (1) +
Регистрация: 09.12.2002
Адрес: Москва
По поводу скорости - ADO использует те же ODBC-драйвера (он и указывается в ConnectionString) и поэтому катастрофической разницы в скоростях не будет, скорее всего это влияние "внешних" факторов.
Кстати, в предложениях SELECT все названия полей и таблий лучше всегда брать в апострофы - `Field1`, либо квадратные скобки [Field1]. Иначе, если попадется файл с пробелами, то вывалится исключение типа "не найден объект". Из опыта могу добавить, что файлы, содержащие в названии точки фолят всегда.
Кстати, ADO-классы я сделал свои, т.к. в Аксапте они реализованы процентов на 5. Например, совершенно невозможно выводить сведения об ошибках, т.к. ADODB.Error не реализован по-человечески аксаптовым классом, а возвращается, как COM-объект.

Вот. Будут вопросы - отвечу, если смогу. Строго не судите - я аналитик, а не разработчик, хотя иногда балуюсь.
Старый 04.02.2003, 13:50   #25  
edd is offline
edd
Участник
 
81 / 10 (1) +
Регистрация: 20.01.2003
2 KSS

Я привел два примера (выше), при использовании ADO скорость было >1 мин, а при ODBC ~10 сек.
Как их уровнять, т.е. где подкрутить?

И как достать из поля в DBF значение ~9999999999?
Исправляюсь... большие числа указанными примерами достаються.
Старый 04.02.2003, 14:28   #26  
KSS is offline
KSS
Коллективное бессознательn ое
 
116 / 10 (1) +
Регистрация: 09.12.2002
Адрес: Москва
Максимальное целое в АКСАПТЕ (впрочем, как и в любой 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  
edd is offline
edd
Участник
 
81 / 10 (1) +
Регистрация: 20.01.2003
2 KSS

Цитата:
Если серьезно, то если цифры такого порядка, то можно использовать FLOAT (REAL в АКСАПТЕ). А чтобы не выводились нолики в конце, просто их откидывать.
Я так и делаю, тут разобрался.
Цитата:
С ADO все не так однозначно. Хотя... Файл лежит на сети?
Файл на сети.

Цитата:
Я бы, для чистоты эксперимента попробовал бы запустить сначала АДО, потом перезапустить АКСАПТУ и запустить через ODBCConnection. Так же попробуйте запустить в другом порядке: ODBCConnection, ADO. Думаю, что какие-то данные кешируются, либо ADO обломал сетевой траффик. Только что я пробовал на 297 000 строк запрос с аггрегацией по 1 полю через ADO (CSV файл на сети, 150 мегабайт). Запрос длился примерно минуту. Попробуй и скажи, чего получилось, будем дальше думать.
1. Работа идет через трехуровневую модель.
2. Попробовал на разных машинах - результат аналогичный. (AOS не перезапускал).
Старый 05.02.2003, 14:05   #28  
KSS is offline
KSS
Коллективное бессознательn ое
 
116 / 10 (1) +
Регистрация: 09.12.2002
Адрес: Москва
Для ADO (ну и ODBC, разумеется) не важно, какой клиент, т.к. они все делают через WinAPI и АКСАПТА практически не задействуется. Я бы рекомендовал тебе выкинуть из описаных тобою примеров итерацию по Recordset и выполнение метода на DataSource и замерить время непосредственно на выполнении запрса:

int TimeStamp;
...........................
PHP код:
timeStamp timeNow();
res stm.executeQuery(stmTxt);
info(strFmt('Время выполнения операции: %1'time2str(timeNow() - timeStamp))); 
ну и в АДО-примере:
int TimeStamp;
............................
PHP код:
timeStamp timeNow();
rs command.execute();
info(strFmt('Время выполнения операции: %1'time2str(timeNow() - timeStamp))); 
Таким образом мы уберем из рассмотрения возможные тормоза АКСАПТОВСКИХ функций и итерации по уже готовому курсору.
Старый 06.02.2003, 07:48   #29  
edd is offline
edd
Участник
 
81 / 10 (1) +
Регистрация: 20.01.2003
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  
KSS is offline
KSS
Коллективное бессознательn ое
 
116 / 10 (1) +
Регистрация: 09.12.2002
Адрес: Москва
Первое время будет всегда ноль - ты же меряешь время операции присвоения строки (оно, кстати, надо?). А 4 секунды на то, чтобы выполнить запрос и пройтись по курсору, я считаю, нормально. Курсор, как ты понимаешь, хранится на локале и поэтому скорость, очевидно, будет сильно зависеть от объема памяти, её скорости, скорости процессора и.т.д. У меня на рабочей станции (512 + Пентиум4) 150 мегабайтный файл читается минуту, а на рабочей станции какого-нибудь коммерсанта, например, где компьютер на порядок слабее, выборка может и пол-часа занять...
Так что попробуй запустить этот тест на разных по мощности машинах - разница должна проявиться.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как обновить форму, если добавление через кнопку? Arahnid DAX: Программирование 5 21.05.2007 11:18
Бинарные данные в Axapta Lucky13 DAX: Программирование 4 07.04.2007 11:51
Вытащить данные на форму Protey DAX: Программирование 25 19.03.2007 16:28
Можно ли редактировать форму, если на нее наложен addRange? Hans DAX: Программирование 10 22.05.2006 16:35
почти DBF Gorlum DAX: Программирование 3 17.03.2006 12:52
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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