| 
			
			 | 
		#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 | |||
		
  |