Форум: "Базы";
Текущий архив: 2007.06.03;
Скачать: [xml.tar.bz2];
Внизкак в Delphi использовать VBA-функцию Access? Найти похожие ветки
← →
DSKalugin © (2007-03-14 11:51) [0]В Access-е 2003 написал VBA-функцию clear_num(х), для использования ее в запросах. В самой среде Access-а эти запросы работают, а при вызове этих запросов из Делфи через АДО - нет.
Сделал запрос "ClearNumbers", который содержит код:
UPDATE europeans SET cat_number = clear_num(cat_number)
WHERE id_marka=6;
Вызываю 2мя способами
ADOCommand.CommandText:="ClearNumbers";
ADOCommand.CommandType:=cmdStoredProc;
ADOCommand.Execute;
Сообщение: "Неопределенная функция clear_num в выражении"
Если текст запроса передавать из Делфи -аналогично
ADOCommand.CommandText:="UPDATE europeans SET cat_number = clear_num(cat_number) WHERE id_marka=6";
ADOCommand.CommandType:=cmdText;
ADOCommand.Execute;
Сообщение: "Неопределенная функция clear_num в выражении"
← →
Jan (2007-03-14 11:56) [1]никак
← →
DSKalugin © (2007-03-14 12:27) [2]нашёл кое что
http://citforum.ru/programming/windows/excel_faq/part2.shtml#2.24
Как создать макрос из Delphi? Как выполнить макрос, имеющийся в книге?
Вам не удастся создать макрос программно, т.к. по умолчанию в Excel VBA Project отключен доступ к VBA из программ. Как включить эту возможность, читайте "PRB: Programmatic Access to Office XP VBA Project Is Denied"
http://support.microsoft.com/kb/282830
For any Automation client to be able to access the VBA object model programmatically, the user running the code must explicitly grant access. To turn on access, the user must follow these steps.
Office 2003 and Office XP1.
Open the Office 2003 or Office XP application in question. On the Tools menu, click Macro, and then click Security to open the Macro Security dialog box.
2. On the Trusted Sources tab, click to select the Trust access to Visual Basic Project check box to turn on access.
3. Click OK to apply the setting. You may need to restart the application for the code to run properly if you automate from a Component Object Model (COM) add-in or template.
Но у меня этот чекбокс в Акцессе неактивен ...
← →
Jan (2007-03-14 12:34) [3]только макрос и выполнение запросов через провайдера(в даном случае Jet) - разные весщи...
← →
Сергей М. © (2007-03-14 12:51) [4]
> DSKalugin © (14.03.07 11:51)
VBAAccess-макросы может исполнять только сам MSAccess.
ADO-компоненты не имееют к ПО MSAccess прямого отношения - MSAccess может быть и не инсталлирован, и при этом ADO-компоненты вполне работоспособны, ибо MSAccess для их работы совршенно не нужен.
← →
Mike Kouzmine © (2007-03-14 16:40) [5]А если создать запрос, в нем вызвать эту фунцию. А запрос вызвать как хранимую процедуру.
← →
DSKalugin © (2007-03-14 19:41) [6]2 Mike Kouzmine ©
пробовал уже, см. первый вариант вызова
Спасибо, понятно. Буду вызывать руками в самом Акцессе или реализовывать эту функцию в клиентской программе. Только беда в том что
перебjh 3 млн. записей навигационным методомзаймет сутки если не больше :-))
Edit;
FieldByName("cat_number").AsString:= clear_num(FieldByName("cat_number").AsString);
Post;
Next;
"Закат солнца вручную" (ручной вызов в Акцессе) занял 40минут на Пениуме 3 / 750Мгц
попробую еще проход с запросами на обновление
← →
sniknik © (2007-03-14 19:50) [7]> займет сутки если не больше :-))
если еще больше постараешься то можеш и до трех суток довести... (судя по приведенному куску в этом цель)
чудо функцию clear_num в запросе нельзя реализовать? в смысле написать прямо там все что она делает?
← →
Jan (2007-03-14 19:50) [8]
> clear_num
а чего она делает?
← →
DSKalugin © (2007-03-15 13:33) [9]
> а чего она делает?
Вычищает ненужные символы в строке
Function clear_num(num)
Dim num_char As String
Dim i, j As Integer
clear_num = ""
j = Len(num)
For i = 1 To j
num_char = UCase(Mid(num, i, 1))
If (num_char >= "0" And num_char <= "9") Or (num_char >= "A" And num_char <= "Z") Then clear_num = clear_num + num_char
Next
End Function
на паскале
function CreateClearCod(vsCod: AnsiString):AnsiString;
const ClearChars:set of Char=["0".."9","A".."Z"];
var ns:AnsiString;
i,j:Byte;
begin
Result:="";
ns:=AnsiUpperCase(vsCod);
j:=Length(ns);
for i:=1 to j do
if (ns[i] in ClearChars)
then Result:=Result+ns[i];
end
← →
Jan (2007-03-15 13:51) [10]если это едино разово, а база большая можно перегнать в MS SQL там сделать все на T-SQL а потом вернуть в Access.
← →
Val © (2007-03-15 14:25) [11]функции replace нет в sql access"a?
← →
Jan (2007-03-15 14:31) [12]
> функции replace нет в sql access"a?
есть но что она даст?
← →
Val © (2007-03-15 14:46) [13]в оракле, она, при неуказанном заменяющем элементе
>Вычищает ненужные символы в строке
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2007.06.03;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.043 c