AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 12.02.2003, 16:56   #1  
edd is offline
edd
Участник
 
81 / 10 (1) +
Join Date: 20.01.2003
И опять DBF....
Не могу дотумкать, как удалять, добавлять, изменять, искать, фильтровать записи в DBF.
И как создать DBF с нужной структурой?
Old 12.02.2003, 19:47   #2  
Vladislav Yushakov is offline
Vladislav Yushakov
Участник
 
47 / 10 (1) +
Join Date: 10.01.2003
executeQuery('insert и т.д.'); не пробовал?
Old 13.02.2003, 07:44   #3  
edd is offline
edd
Участник
 
81 / 10 (1) +
Join Date: 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();
}
}
Old 13.02.2003, 07:49   #4  
edd is offline
edd
Участник
 
81 / 10 (1) +
Join Date: 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();
}
}
Old 13.02.2003, 09:09   #5  
Andrew Besedin is offline
Andrew Besedin
Участник
 
121 / 15 (1) ++
Join Date: 25.01.2002
2 edd
Ну и задачи у тебя, нужно признать!
Я понимаю, читать из dbf - это нормально.
Но писать мини-СУБД на Аксапта для создания записей, ТАБЛИЦ (!!!) и пр. - тебе не кажется, что это слишком? Может, FoxPro лучше для этого подойдет?
__________________
С уважением,
Андрей Беседин
Old 13.02.2003, 09:26   #6  
edd is offline
edd
Участник
 
81 / 10 (1) +
Join Date: 20.01.2003
2 Andrew Besedin

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

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

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

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

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

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

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

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

курсор = execQuery("select *")'
while (курсор.Next())
{
курсор.Поле1 = ...;
курсор.Поле2 = ...;
...
курсор.ПолеN = ...;
курсор.Update();
}
курсор.Close();
А оно и будет "что-то вроде этого".
Только для этого Recordset должен поддерживать Update.
Так, как ты написал, делать можно, можно даже не вызввать Update в конце - ADO его вызовет автоматом при переходе по записям.
Old 13.02.2003, 13:39   #13  
edd is offline
edd
Участник
 
81 / 10 (1) +
Join Date: 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();
}
}
Old 13.02.2003, 14:16   #14  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Join Date: 03.12.2001
Quote:
Пример использования 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


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

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

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

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

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

Similar Threads
Thread Thread Starter Forum Replies Last Post
Экспорт в 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

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 04:34.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.