AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen Alle Foren als gelesen markieren

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Экспорт в 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
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 13:59 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.