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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.02.2003, 16:56   #1  
edd is offline
edd
Участник
 
81 / 10 (1) +
Регистрация: 20.01.2003
И опять DBF....
Не могу дотумкать, как удалять, добавлять, изменять, искать, фильтровать записи в DBF.
И как создать DBF с нужной структурой?
Старый 12.02.2003, 19:47   #2  
Vladislav Yushakov is offline
Vladislav Yushakov
Участник
 
47 / 10 (1) +
Регистрация: 10.01.2003
executeQuery('insert и т.д.'); не пробовал?
Старый 13.02.2003, 07:44   #3  
edd is offline
edd
Участник
 
81 / 10 (1) +
Регистрация: 20.01.2003
немного стало получаться
но есть проблема - если я удаляю или добавляю, то при закрытии курсора вылетает ошибка, но записи удаляются и добавляются (т.е. при модификации ошибка во время закрытия), а если прсто просматриваю, то нет ошибки при закрытии.

void clicked()
{
CCADOConnection cn = new CCADOConnection() ;
CCADOCommand command = new CCADOCommand() ;
CCADORecordset rs = new CCADORecordset() ;
COM RecordSet ;
str _str = "" ;
str filename ;
int pos ;
FileNameFilter filter ;
int i ;
;
super();

filter = ['DBF files','*.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(_str);

if (cn)
{
rs = command.execute();
_str = "delete from "+SubStr(StrUpr(filename),pos,StrLen(StrUpr(filename)));
command.commandText(_str);
rs = command.execute();
i = 0;
while (i < 10)
{
_str = "insert into "+SubStr(StrUpr(filename),pos,StrLen(StrUpr(filename)))+" (pach) values ("+int2str(i)+")";
command.commandText(_str);
rs = command.execute();
i++;
}
rs.close();
}
}
Старый 13.02.2003, 07:49   #4  
edd is offline
edd
Участник
 
81 / 10 (1) +
Регистрация: 20.01.2003
сам допер
видимо курсор возвращается только при селекте, а при Insert, Delete нет, вот версия без ошибок

void clicked()
{
CCADOConnection cn = new CCADOConnection() ;
CCADOCommand command = new CCADOCommand() ;
CCADORecordset rs = new CCADORecordset() ;
COM RecordSet ;
str _str = "" ;
str filename ;
int pos ;
FileNameFilter filter ;
int i ;
;
super();

filter = ['DBF files','*.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(_str);

if (cn)
{
rs = command.execute();


_str = "delete from "+SubStr(StrUpr(filename),pos,StrLen(StrUpr(filename)));
command.commandText(_str);
command.execute();
i = 0;
while (i < 10)
{
_str = "insert into "+SubStr(StrUpr(filename),pos,StrLen(StrUpr(filename)))+" (pach) values ("+int2str(i)+")";
command.commandText(_str);
command.execute();
i++;
}

_str = "select * from "+SubStr(StrUpr(filename),pos,StrLen(StrUpr(filename)));
command.commandText(_str);
command.execute();

while (!rs.EOF())
{
RecordSet = rs.recordSet();
rs.moveNext();
}
rs.close();
}
}
Старый 13.02.2003, 09:09   #5  
Andrew Besedin is offline
Andrew Besedin
Участник
 
121 / 15 (1) ++
Регистрация: 25.01.2002
2 edd
Ну и задачи у тебя, нужно признать!
Я понимаю, читать из dbf - это нормально.
Но писать мини-СУБД на Аксапта для создания записей, ТАБЛИЦ (!!!) и пр. - тебе не кажется, что это слишком? Может, FoxPro лучше для этого подойдет?
__________________
С уважением,
Андрей Беседин
Старый 13.02.2003, 09:26   #6  
edd is offline
edd
Участник
 
81 / 10 (1) +
Регистрация: 20.01.2003
2 Andrew Besedin

Ты однозначно прав, но задача в следующем (как я ее вижу в итоге):
некий модуль для сверки/импорта/экспорта данных Аксапты и другой системы (которая может быть основана в том чиле и на DBF).

Проблема в том, что я новичок в этом, а делать надо.

PS
Может мои изыскания кому то облегчат потом работу.
Старый 13.02.2003, 11:09   #7  
Andrew Besedin is offline
Andrew Besedin
Участник
 
121 / 15 (1) ++
Регистрация: 25.01.2002
Если "другая система" знает, что такое COM (не порт, а технология ) то куда как проще использовать это знание.
Кстати, Axapta COM Connector намного лучше работает, чем СОМ-компонента от 1эС. Поэтому мы, например, для стыковки этих программ используем Axapta COM Connector, обращаясь к нему из 1С.
__________________
С уважением,
Андрей Беседин
Старый 13.02.2003, 11:17   #8  
edd is offline
edd
Участник
 
81 / 10 (1) +
Регистрация: 20.01.2003
2 Andrew Besedin

А можно фрагмент кода, для примера, а то пока разберешься...
Т.е. можно написать на VisualFox эту задачу?
Старый 13.02.2003, 12:07   #9  
KSS is offline
KSS
Коллективное бессознательn ое
 
116 / 10 (1) +
Регистрация: 09.12.2002
Адрес: Москва
Не знаю, надо ли заморачиваться с COM-connector...
Ответ на первый вопрос однозначный - курсор на операции типа Update, Delete, разумеется, не возвращается. По сути там возвращать-то нечего.
Старый 13.02.2003, 12:12   #10  
edd is offline
edd
Участник
 
81 / 10 (1) +
Регистрация: 20.01.2003
2 KSS

Это я понял, просто думал, что будет что вроде этого...

курсор = execQuery("select *")'
while (курсор.Next())
{
курсор.Поле1 = ...;
курсор.Поле2 = ...;
...
курсор.ПолеN = ...;
курсор.Update();
}
курсор.Close();
Старый 13.02.2003, 12:16   #11  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Если "другая система" знает, что такое COM (не порт, а технология ) то куда как проще использовать это знание. Кстати, Axapta COM Connector намного лучше работает.....
В принципе тут даже без COM Connector'a можно обойтись. Даже если это VisualFoxPro. VFP знает что такое COM (как и любое детище MS), VFP позволяет писать как COM-клиентов, так и COM-сервисы. Почему бы ни написать COM серсер на том же VFP (если уж о нем речь зашла) и из Аксапты уже юзать этот COM сервер.
Впрочем VFP вполне можно заменить тем, что тебе более знакомо - Delphi/VC/СВuilder - лишь бы они позволяли писать COM сервера.

Цитата:
А можно фрагмент кода, для примера, а то пока разберешься...
Кусок какого кода тебе нужен ? Как написать на FoxPro COM сервер ? Или как использовать в Акспте COM объекты ?
Старый 13.02.2003, 12:29   #12  
KSS is offline
KSS
Коллективное бессознательn ое
 
116 / 10 (1) +
Регистрация: 09.12.2002
Адрес: Москва
Цитата:
2 KSS

Это я понял, просто думал, что будет что вроде этого...

курсор = execQuery("select *")'
while (курсор.Next())
{
курсор.Поле1 = ...;
курсор.Поле2 = ...;
...
курсор.ПолеN = ...;
курсор.Update();
}
курсор.Close();
А оно и будет "что-то вроде этого".
Только для этого Recordset должен поддерживать Update.
Так, как ты написал, делать можно, можно даже не вызввать Update в конце - ADO его вызовет автоматом при переходе по записям.
Старый 13.02.2003, 13:39   #13  
edd is offline
edd
Участник
 
81 / 10 (1) +
Регистрация: 20.01.2003
2 Андре

Пример использования COM Axapta из другого приложения (например Fox, Delphi, C++).

2 KSS

На данный момент у меня два варианта и они мне не нравятся, т.к. сильно не похожи на то, что я себе представлял..
/*
курсор = execQuery("select *")'
while (курсор.Next())
{
курсор.Поле1 = ...;
курсор.Поле2 = ...;
...
курсор.ПолеN = ...;
курсор.Update();
}
курсор.Close();
*/

Вот они...
Вариант 1
void clicked()
{
CCADOConnection cn = new CCADOConnection() ;
CCADOCommand command = new CCADOCommand() ;
CCADORecordset rs = new CCADORecordset() ;
str _str = "" ;
str filename ;
int pos ;
FileNameFilter filter ;
int i ;
int timeStamp ;
;
super();

filter = ['DBF files','*.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);
if (cn)
{
_str = "delete from "+SubStr(StrUpr(filename),pos,StrLen(StrUpr(filename)));
command.commandText(_str);
command.execute();
i = 0;
timeStamp = timeNow();
while (i < 1000)
{
_str = "insert into "+SubStr(StrUpr(filename),pos,StrLen(StrUpr(filename)))+" (pach) values ("+int2str(i)+")";
command.commandText(_str);
command.execute();
i++;
}
info(strFmt('Время выполнения операции insert: %1', time2str(timeNow() - timeStamp,1,1)));
timeStamp = timeNow();

i = 0;
while (i < 1000)
{
_str = "update "+SubStr(StrUpr(filename),pos,StrLen(StrUpr(filename)))+" set an_kr = "+int2str(i)+"0 where pach = "+int2str(i);
command.commandText(_str);
command.execute();
i++;
}
info(strFmt('Время выполнения операции update: %1', time2str(timeNow() - timeStamp,1,1)));
timeStamp = timeNow();
rs.close();
}
}

Вариант 2
void clicked()
{
OdbcConnection connection ;
LoginProperty LP = new LoginProperty() ;
Statement stm ;
ResultSet res ;
str stmTxt ;
int timeStamp ;
int i ;

;
super();
LP.setDSN("DBF");
connection = new OdbcConnection(LP);
stm = connection.createStatement();
if (connection)
{
stmTxt = "delete from ob23.dbf";
stm.executeUpdate(stmTxt);
i = 0;
timeStamp = timeNow();
while (i < 1000)
{
stmTxt = "insert into ob23.dbf (pach) values ("+int2str(i)+")";
stm.executeUpdate(stmTxt);
i++;
}
info(strFmt('Время выполнения операции insert: %1', time2str(timeNow() - timeStamp,1,1)));
timeStamp = timeNow();

i = 0;
while (i < 1000)
{
stmTxt = "update ob23.dbf set an_kr = "+int2str(i)+"0 where pach = "+int2str(i);
stm.executeUpdate(stmTxt);
i++;
}
info(strFmt('Время выполнения операции update: %1', time2str(timeNow() - timeStamp,1,1)));
timeStamp = timeNow();
}
}
Старый 13.02.2003, 14:16   #14  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Пример использования COM Axapta из другого приложения (например Fox, Delphi, C++).

То есть, как я понял, Аксапта является COM сервисом, а наше приложение COM клиентом. В этом случае понадобится COM Connector и соответственно лицензии на COM пользователей.
Я же имел в виду несколько иную ситуацию - наша прога - COM-сервер, Аксапта - COM клиент. В этом случае мы экономим на лицензии на COM-пользователя.

Это так, отступление. Теперь отвечаю на Ваш вопрос -

Под рукой нашлись исходники только на VB, но думаю разберетесь:

Пример 1 - Вызов методов какого либо Аксаптовского класса из нашей прог-мы:


' Коннектимся к Аксапте
Set axapta = New AxaptaCOMConnector.axapta
axapta.Logon "Admin", "", "", ""

Dim AxaptaQuery As AxaptaCOMConnector.IAxaptaObject
Dim AxaptaDataSource As AxaptaCOMConnector.IAxaptaObject
Dim AxaptaRange As AxaptaCOMConnector.IAxaptaObject
Dim CustTableBuffer As AxaptaCOMConnector.IAxaptaRecord
Dim s As String

' Создаю экземпляр класса
Set AxaptaQuery = axapta.CreateObject("myClass")

' Вызываю метод класса
AxaptaQuery.Call ("say")



Пример 2 - получение данных из Аксапты:

' Коннектимся к Аксапте
Set axapta = New AxaptaCOMConnector.axapta
axapta.Logon "Admin", "", "", ""

Dim AxaptaQuery As AxaptaCOMConnector.IAxaptaObject
Dim AxaptaDataSource As AxaptaCOMConnector.IAxaptaObject
Dim AxaptaRange As AxaptaCOMConnector.IAxaptaObject
Dim CustTableBuffer As AxaptaCOMConnector.IAxaptaRecord
Dim s As String

' Это то самое ID - свойство
CustTable = 77
CustTable_Name = 2

Set AxaptaQuery = axapta.CreateObject("Query")
Set AxaptaDataSource = AxaptaQuery.Call("AddDataSource", CustTable)
Set AxaptaRange = AxaptaDataSource.Call("AddRange", CustTable_Name)

AxaptaRange.Call "Value", "*"
Set AxaptaQueryRun = axapta.CreateObject("QueryRun", AxaptaQuery)

i = 1

While (AxaptaQueryRun.Call("Next"))
s = ""
Set CustTableBuffer = AxaptaQueryRun.Call("GetNo", 1)
s = s + Str(i) + " - " + CustTableBuffer.field("AccountNum")
s = s + " " + CustTableBuffer.field("Name")
s = s + " " + CustTableBuffer.field("Address")
s = s + " " + CustTableBuffer.field("Phone")
s = s + " " + CustTableBuffer.field("Telefax")

ListView.AddItem (s)

i = i + 1
Wend

Axapta.Logoff
Set Axapta = Nothing


А вообще, про это хорошо написано в руководстве разработчика
Старый 13.02.2003, 16:07   #15  
KSS is offline
KSS
Коллективное бессознательn ое
 
116 / 10 (1) +
Регистрация: 09.12.2002
Адрес: Москва
2 edd

Ну ты не то совсем написал. Надо получить Recordset SELECT'а, а потом цикл, в котором что-то типа Recordset.Fields(i).Value(NewVal). Вот и все. Не надо прямых UPDATE'ов.
Старый 15.02.2003, 07:47   #16  
edd is offline
edd
Участник
 
81 / 10 (1) +
Регистрация: 20.01.2003
2 KSS

Цитата:
Ну ты не то совсем написал. Надо получить Recordset SELECT'а, а потом цикл, в котором что-то типа Recordset.Fields(i).Value(NewVal). Вот и все. Не надо прямых UPDATE'ов.
А можно пример с Recordset.Fields(i).Value(NewVal) ? У меня не получилось.
И как реализовать добавление записей?
Старый 17.02.2003, 10:21   #17  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
CCADOConnection cn = new CCADOConnection() ;
CCADOConnection - это что ? У меня такого нет. Почему ? Что это за модуль ?
Старый 17.02.2003, 11:34   #18  
edd is offline
edd
Участник
 
81 / 10 (1) +
Регистрация: 20.01.2003
2 Андре
Посмотри тут
Старый 17.02.2003, 11:56   #19  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Посмотри тут
Ты про код ?

Вопрос в другом - у меня нет в Аксапте класса CCADOConnection. Axapta 2.5 SP5.

Как я понимаю этот класс реализован в каком-то отдельном модуле, которого у меня нет. В каком ?
Старый 17.02.2003, 13:10   #20  
KSS is offline
KSS
Коллективное бессознательn ое
 
116 / 10 (1) +
Регистрация: 09.12.2002
Адрес: Москва
Видимо, у тебя нет GLS-слоя.
Поставь себе SP3 международный - и все будет.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Экспорт в DBF количество символов. Himan DAX: Программирование 1 16.11.2006 18:14
почти DBF Gorlum DAX: Программирование 3 17.03.2006 12:52
Как создать DBF...? velk DAX: Программирование 11 10.03.2005 17:11
Импорт из DBF : кириллица Mechanizm DAX: Программирование 8 29.09.2004 18:31
Достать данные из DBF в форму edd DAX: Программирование 29 06.02.2003 21:01

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

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

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