![]() |
#1 |
Участник
|
И опять DBF....
Не могу дотумкать, как удалять, добавлять, изменять, искать, фильтровать записи в DBF.
И как создать DBF с нужной структурой? |
|
![]() |
#2 |
Участник
|
executeQuery('insert и т.д.'); не пробовал?
|
|
![]() |
#3 |
Участник
|
немного стало получаться
но есть проблема - если я удаляю или добавляю, то при закрытии курсора вылетает ошибка, но записи удаляются и добавляются (т.е. при модификации ошибка во время закрытия), а если прсто просматриваю, то нет ошибки при закрытии.
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(); } } |
|
![]() |
#4 |
Участник
|
сам допер
видимо курсор возвращается только при селекте, а при 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(); } } |
|
![]() |
#5 |
Участник
|
2 edd
Ну и задачи у тебя, нужно признать! Я понимаю, читать из dbf - это нормально. Но писать мини-СУБД на Аксапта для создания записей, ТАБЛИЦ (!!!) и пр. - тебе не кажется, что это слишком? Может, FoxPro лучше для этого подойдет? ![]()
__________________
Успехов! Андрей Беседин |
|
![]() |
#6 |
Участник
|
2 Andrew Besedin
Ты однозначно прав, но задача в следующем (как я ее вижу в итоге): некий модуль для сверки/импорта/экспорта данных Аксапты и другой системы (которая может быть основана в том чиле и на DBF). Проблема в том, что я новичок в этом, а делать надо. PS Может мои изыскания кому то облегчат потом работу. |
|
![]() |
#7 |
Участник
|
Если "другая система" знает, что такое COM (не порт, а технология
![]() Кстати, Axapta COM Connector намного лучше работает, чем СОМ-компонента от 1эС. Поэтому мы, например, для стыковки этих программ используем Axapta COM Connector, обращаясь к нему из 1С.
__________________
Успехов! Андрей Беседин |
|
![]() |
#8 |
Участник
|
2 Andrew Besedin
А можно фрагмент кода, для примера, а то пока разберешься... Т.е. можно написать на VisualFox эту задачу? |
|
![]() |
#9 |
Коллективное бессознательn ое
|
Не знаю, надо ли заморачиваться с COM-connector...
Ответ на первый вопрос однозначный - курсор на операции типа Update, Delete, разумеется, не возвращается. По сути там возвращать-то нечего. ![]() |
|
![]() |
#10 |
Участник
|
2 KSS
Это я понял, просто думал, что будет что вроде этого... курсор = execQuery("select *")' while (курсор.Next()) { курсор.Поле1 = ...; курсор.Поле2 = ...; ... курсор.ПолеN = ...; курсор.Update(); } курсор.Close(); |
|
![]() |
#11 |
Moderator
|
Цитата:
Если "другая система" знает, что такое COM (не порт, а технология ) то куда как проще использовать это знание. Кстати, Axapta COM Connector намного лучше работает.....
Впрочем VFP вполне можно заменить тем, что тебе более знакомо - Delphi/VC/СВuilder - лишь бы они позволяли писать COM сервера. Цитата:
А можно фрагмент кода, для примера, а то пока разберешься...
|
|
![]() |
#12 |
Коллективное бессознательn ое
|
Цитата:
2 KSS
Это я понял, просто думал, что будет что вроде этого... курсор = execQuery("select *")' while (курсор.Next()) { курсор.Поле1 = ...; курсор.Поле2 = ...; ... курсор.ПолеN = ...; курсор.Update(); } курсор.Close(); Только для этого Recordset должен поддерживать Update. Так, как ты написал, делать можно, можно даже не вызввать Update в конце - ADO его вызовет автоматом при переходе по записям. |
|
![]() |
#13 |
Участник
|
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(); } } |
|
![]() |
#14 |
Moderator
|
Цитата:
Пример использования 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 А вообще, про это хорошо написано в руководстве разработчика ![]() |
|
![]() |
#15 |
Коллективное бессознательn ое
|
2 edd
Ну ты не то совсем написал. Надо получить Recordset SELECT'а, а потом цикл, в котором что-то типа Recordset.Fields(i).Value(NewVal). Вот и все. Не надо прямых UPDATE'ов. |
|
![]() |
#16 |
Участник
|
2 KSS
Цитата:
Ну ты не то совсем написал. Надо получить Recordset SELECT'а, а потом цикл, в котором что-то типа Recordset.Fields(i).Value(NewVal). Вот и все. Не надо прямых UPDATE'ов.
И как реализовать добавление записей? |
|
![]() |
#17 |
Moderator
|
Цитата:
CCADOConnection cn = new CCADOConnection() ;
|
|
![]() |
#18 |
Участник
|
2 Андре
Посмотри тут |
|
![]() |
#19 |
Moderator
|
Цитата:
Посмотри тут
Вопрос в другом - у меня нет в Аксапте класса CCADOConnection. Axapta 2.5 SP5. Как я понимаю этот класс реализован в каком-то отдельном модуле, которого у меня нет. В каком ? |
|
![]() |
#20 |
Коллективное бессознательn ое
|
Видимо, у тебя нет GLS-слоя.
Поставь себе SP3 международный - и все будет. |
|
|
![]() |
||||
Тема | Ответов | |||
Экспорт в DBF количество символов. | 1 | |||
почти DBF | 3 | |||
Как создать DBF...? | 11 | |||
Импорт из DBF : кириллица | 8 | |||
Достать данные из DBF в форму | 29 |
|