Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / forms 6i, OLE2, Excel, Range.Find и проверка на 'Nothing' / 11 сообщений из 11, страница 1 из 1
30.07.2010, 12:04
    #36768143
OmegaMale
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
forms 6i, OLE2, Excel, Range.Find и проверка на 'Nothing'
Всем привет.

Сейчас делаю с помощью OLE2 поиск в документе EXCEL. Так вот, при использовании Range.Find возвращается либо объект Range, либо Nothing.

кто-то может подсказать способ проверки значения на Nothing? или просто-напросто поставить перехватчик исключения на попытку получения значения из найденного / релиза и не заморачиваться?

Например,
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
DECLARE
   -- ...
   rangeFound OLE2.OBJ_TYPE;
BEGIN
   -- 
   OLE2.ADD_ARG(arg,'text to find');
   rangeFound := OLE2.INVOKE_OBJ(srcRangeHandle,'Find',arg);
   
   -- проверки на NULL не помогают, например, в случае, если будет Nothing, то
   -- RELEASE не работает.
   IF rangeFound IS NULL THEN
      Message('Текст не был найден');
   ELSE
      Message('Текст найден!');
      OLE2.RELEASE_OBJ(rangeFound);
   END IF;
END;
...
Рейтинг: 0 / 0
30.07.2010, 14:06
    #36768527
OmegaMale
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
forms 6i, OLE2, Excel, Range.Find и проверка на 'Nothing'
Да, и что-то уже пару часов не могу заставить работать метод FindNext - если передаю ячейку, от которой искать, то исключение летит... Конечно, можно построчно пройтись по диапазону ячеек и каждую проверить, но это просто безумие.
...
Рейтинг: 0 / 0
30.07.2010, 15:06
    #36768710
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
forms 6i, OLE2, Excel, Range.Find и проверка на 'Nothing'
OmegaMale,

1. Судя по всему, засада.
Nothing не объект OLE Automation, т.е. через OLE2 package с ним работать (корректно проверить) не получиться. Тут два варианта - или работать не корректно, по принципу, если метод вернул хрень, то значит Nothing.

Если у тебя Client-Server only, то можно совместно с OLE2 package использовать еще ActiveX build-ins. Старые примеры в данном форуме быть должны. Хотя код станет значительно менее читаемым и явно unsupported by Oracle )))

2. Не знаю. Подводных камней с ходу не видно.

Возможно проблема не с "от которой искать", а с регионом поиска. Сужу по google, вылезал подобный вопрос.
http://www.rsdn.ru/forum/vb/2884960.1.aspx
Метод лечения не знаю. Возможно проблема надуманная. Не верю я в настолько явные "баги" у M$.

Если нужно, и то и другое _заставить_ работать можно. Но я OLE2 и Excel не занимаюсь уже более 6-7 лет. Т.ч. даже Forms 6 на компе нет.
...
Рейтинг: 0 / 0
30.07.2010, 15:55
    #36768831
OmegaMale
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
forms 6i, OLE2, Excel, Range.Find и проверка на 'Nothing'
Leonid Kudryavtsev,

Спасибо за ответ.
по поводу Nothing - черт с ним, сделал так, что после поиска идёт получение значения ячейки, если исключение, то ничего не найдено, и хорошо, если нормально, то результат есть, тоже хорошо.

С Регионом поиска всё в порядке, т.к. он является всеми ячейками, даже адрес проверял, пишет = $1:$65536. Просто странно, что находит первое значение, а дальше искать не хочет в том же диапазоне, причём такое ощущение, что передаваемую ячейку в FindNext Excel не понимает и потому исключение бросает. Я уже всё перепробовал туда совать: и предыдущий результат поиска, и получение из него Item(1,1), и получение ячейки из Worksheet.Cells(prevresultRowindex,prevResultColIndex) и получение prevResult.Range(prevResult.Adress)...

Кстати, ActiveX почему-то не импортируется для Excel, при импорте не показывает ничего доступного, классы есть, а методов и свойств нету... до этого Shell.Explorer.2 нормально импортировался.

Буду дальше париться, скорее всего, сам где-то накосячил, потом отпишусь, если решу проблему.
...
Рейтинг: 0 / 0
30.07.2010, 16:13
    #36768874
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
forms 6i, OLE2, Excel, Range.Find и проверка на 'Nothing'
To OmegaMale.

1.
"идёт получение значения ячейки, если исключение, то ничего не найдено, и хорошо, если нормально, то результат есть, тоже хорошо."
+1
"если метод вернул хрень, то значит Nothing."
Я думал в том же направлении )))

2.
Посмотри. Мне тоже кажется, что где-то должен быть "косяк". При этом на видном (и соответственно не заметном) месте.

Если не получится, напиши. Я постараюсь посмотреть.
...
Рейтинг: 0 / 0
30.07.2010, 16:39
    #36768928
OmegaMale
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
forms 6i, OLE2, Excel, Range.Find и проверка на 'Nothing'
Leonid Kudryavtsev,

OLE2.LAST_EXCEPTION возвращает код 2147614725, поискал в сети, это вот такая константа WIN32 API:
Код: plaintext
1.
DISP_E_TYPEMISMATCH =  2147614725 

То есть, когда я вызываю FindNext, параметр EXCEL'ю не нравится, хм.
--------------------------------------------------------------------------------------
Excel Developer Reference
Range.FindNext Method
Continues a search that was begun with the Find method. Finds the next cell that matches those same conditions and returns a Range object that represents that cell. Doesn’t affect the selection or the active cell.
Syntax

expression.FindNext(After)

expression A variable that represents a Range object.

Parameters

Name After
Required/Optional Optional
Data Type Variant
Description The cell after which you want to search. This corresponds to the position of the active cell when a search is done from the user interface. Note that After must be a single cell in the range. Remember that the search begins after this cell; the specified cell isn’t searched until the method wraps back around to this cell. If this argument isn’t specified, the search starts after the cell in the upper-left corner of the range.
--------------------------------------------------------------------------

Я пытаюсь использовать так эту функцию (привожу без кода зачистки):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
arg := ['some text'];
rangeFound := OLE2.INVOKE_OBJ(srcRange,'Find',arg);

<проверка результата - найдено или нет>

arg := [rangeFound];
rangeFound := OLE2.INVOKE_OBJ(srcRange,'FindNext',arg); --> Исключение

Не пойму что не так...
...
Рейтинг: 0 / 0
30.07.2010, 16:47
    #36768938
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
forms 6i, OLE2, Excel, Range.Find и проверка на 'Nothing'
Если не тяжело, можешь привести полный текст запускабельного тест кейса. Включая создания Excel.Application, загрузки документа и т.д.
...
Рейтинг: 0 / 0
30.07.2010, 17:29
    #36769021
OmegaMale
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
forms 6i, OLE2, Excel, Range.Find и проверка на 'Nothing'
Leonid Kudryavtsev,

примерно, вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
/*
With Worksheets(1).Range("a1:a500")
    Set c = .Find(2, lookin:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            c.Value = 5
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
End With

*/  
DECLARE
    textToFind   CONSTANT VARCHAR2( 100 ) := 'TABLE';
    srcFileName  CONSTANT VARCHAR2( 100 ) := 'c:\1.xls';
    
    app          OLE2.obj_type;    -- Excel.Application
    wbs          OLE2.obj_type;    -- Application.Workbooks
    wb           OLE2.obj_type;    -- Workbooks.Open result
    wss          OLE2.obj_type;    -- Worksheets
    arg          OLE2.list_type;    -- method arguments  
    sheet        OLE2.OBJ_TYPE;
    cells        OLE2.OBJ_TYPE;
    rangeFound   OLE2.OBJ_TYPE;
    rangeFound2  OLE2.OBJ_TYPE;

    firstAddress VARCHAR2( 100 );
    sheetCount   PLS_INTEGER;            
    oleError     NUMBER;
    oleErrorT    VARCHAR2( 32767 );    
BEGIN

    app := OLE2.Create_Obj ('Excel.Application');  
    OLE2.Set_Property(app,'Visible',true);
    
    wbs := OLE2.Get_Obj_Property(app, 'Workbooks');    
    
    arg := OLE2.Create_Arglist;     -- Parameters to open document:
    OLE2.add_arg(arg,srcFileName);    -- FileName   
        
    wb := OLE2.Invoke_Obj(wbs,'Open',arg);
    OLE2.DESTROY_ARGLIST(arg);
        
    wss := OLE2.GET_OBJ_PROPERTY(wb,'Worksheets');

    sheetCount := OLE2.GET_NUM_PROPERTY(wss,'Count',NULL);
  
    FOR i IN  1 ..SheetCount LOOP
        --
        --  Выбор i-го листа в книге
        --
        arg := OLE2.CREATE_ARGLIST;
        OLE2.ADD_ARG(arg,i);
        sheet := OLE2.GET_OBJ_PROPERTY(wss,'Item',arg);
        OLE2.DESTROY_ARGLIST(arg);
                        
        --
        -- Получение диапазона всех ячеек листа
        --
        cells := OLE2.GET_OBJ_PROPERTY(sheet,'Cells',NULL);
    
        --
        -- Выполнение первого поиска
        --
        arg := OLE2.CREATE_ARGLIST;
        OLE2.ADD_ARG(arg, textToFind);                
        rangeFound := OLE2.INVOKE_OBJ(cells,'Find',arg);
        OLE2.DESTROY_ARGLIST(arg);
        
        BEGIN
            firstAddress := OLE2.GET_CHAR_PROPERTY(rangeFound,'Address');
            
            LOOP
                --
                -- проверка найден ли результат
                --
                
                message( OLE2.GET_CHAR_PROPERTY(rangeFound,'Value'));
                SYNCHRONIZE;
                PAUSE;
                
                rangeFound2 := rangeFound;            
                        
                arg := OLE2.CREATE_ARGLIST;
                OLE2.ADD_ARG_OBJ(arg,rangeFound);        
                rangeFound  := OLE2.INVOKE_OBJ(cells,'FindNext',arg);        
                OLE2.DESTROY_ARGLIST(arg);
                
                OLE2.RELEASE_OBJ(rangeFound2);
                
                EXIT WHEN OLE2.GET_CHAR_PROPERTY(rangeFound,'Address') = firstAddress;
                      
            END LOOP;    
        EXCEPTION WHEN OTHERS THEN
          oleError := OLE2.LAST_EXCEPTION(oleErrorT);
          Message(TO_CHAR(OleError) || ' : ' || oleErrorT);
        END;    
    END LOOP;
    
    OLE2.RELEASE_OBJ(cells);
    OLE2.RELEASE_OBJ(sheet);
    OLE2.RELEASE_OBJ(wss);
    OLE2.RELEASE_OBJ(wb);
    OLE2.RELEASE_OBJ(wbs);
    OLE2.INVOKE(app,'Quit');
    OLE2.RELEASE_OBJ(app); 
    
END;
...
Рейтинг: 0 / 0
30.07.2010, 17:34
    #36769029
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
forms 6i, OLE2, Excel, Range.Find и проверка на 'Nothing'
В выходные посмотрю, во вторник постараюсь ответить.

p.s.
дома Инета нет по принципиальным соображениям, что бы не было соблазна дома за компом сидеть )))
...
Рейтинг: 0 / 0
30.07.2010, 17:42
    #36769044
OmegaMale
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
forms 6i, OLE2, Excel, Range.Find и проверка на 'Nothing'
Leonid Kudryavtsev,

Интернето-диета :) Спасибо за участие. Но я пока не сдаюсь, буду бодаться с проблемой своими рогами.
...
Рейтинг: 0 / 0
02.08.2010, 10:49
    #36770578
OmegaMale
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
forms 6i, OLE2, Excel, Range.Find и проверка на 'Nothing'
Leonid Kudryavtsev,

Думаю, не стоит заморачиваться с FindNext, очевидно, что OLE2.ADD_ARG_OBJ как-то некорректно работает. Буду делать поиск вот так: искать от активной ячейки методом Find.

Спасибо )
...
Рейтинг: 0 / 0
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / forms 6i, OLE2, Excel, Range.Find и проверка на 'Nothing' / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]