DDEREAD в Excel

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Помогите чайнику. Excel файлы создаю давно, а вот прочитать не получилось.
Канал с Excel и нужным файлом открыт, а как использовать значения получаемые командой DDEREAD в цикле???????
Хотелось бы что-то такое
Loop I# = 1 to 1000
DDEREAD(ExcelServer,DDE:auto,'R' & i# & 'C2',DDEReadVal)
! что здесь должно быть ???
! я перепробовал много чего, но без результата, поэтому свои варианты не привожу
! кстати, ошибку DDEREAD тоже не выдает

Message(DDEReadVal)
.
Гость

Сообщение Гость »

Ты бы хотя почитал про принцип работы DDE-механизма!
Не хочешь читать - посмотри примеры. Есть в примерах небольшой проектик организации простейшего DDE-интерфейса.

А твой код работать и не должен!
Общие принципы DDE-механизма:
- находишь DDE-сервер
- устанавливаешь с ним канал связи
- посылаешь запрос "хочу получить вот это"
- крутишься в ACCEPT-цикле в ожидании ответа от DDE-сервера, который инициирует событие EVENT:DDEData
- используешь данные, которые вернул сервер

Т.е. твой код надо написать приблизительно так:

Код: Выделить всё

DDEReadVal  REAL
SendRequest BYTE
Row         LONG

  SendRequest = True
  Row = 0
  ACCEPT
  if SendRequest
     Row += 1
     if Row > 1000 then Break.
     DEEREAD(ExcelServer,DDE:auto,'R' & Row & 'C2',DDEReadVal)
     SendRequest = False
  .
  CASE Event()
  OF EVENT:DDEData
     Message(DDEReadVal)
     SendRequest = True
  .
  END
=============================
С уважением, Олег А. Руденко.
Oleg_Rudenko@mail.ru
Oleg_Rudenko@mail333.com
Библиотека DynaLib
http://dynalib.narod.ru
Написал: ClaList(2)
Гость

Сообщение Гость »

-
Написал: ClaList(2)
Гость

Сообщение Гость »

Ты бы хотя почитал про принцип работы DDE-механизма!
Не хочешь читать - посмотри примеры. Есть в примерах небольшой проектик организации простейшего DDE-интерфейса.
А твой код работать и не должен!
Спасибо Олег!!!
Теорию я читал, а вот примерчиков не смог найти.
С ACCEPTами и EVENTами я экспериментировал
Большое спасибо скажу за ссылочки, т.к. твой пример не помог
Гость

Сообщение Гость »

Вот куски кода из старой разработки
Надо было по-быстрому вытащить из оборотки 1С, выгруженной в excel, данные и сравнить с параллельными данными в программе на кларионе.
Код не оптимизировался, но работал. Как видно из текста, часть его надергана из хелпа.
Читалось в очередь, а далее - не помню

Код: Выделить всё

openExcel   routine
   fname = clip(ExName)
 DDECHANNEL = DDECLIENT('Excel',CLIP(FNAME))
 IF NOT DDECHANNEL
    DDECHANNEL = DDECLIENT('EXCEL','SYSTEM')
    IF NOT DDECHANNEL
        RUN('"C:\Program Files\Microsoft Office\Office\EXCEL.EXE"',0)
    ELSE
        DDEEXECUTE(DDECHANNEL,'[FILECLOSEALL(2)]')
    END
    IF NOT DDECHANNEL AND ERRORCODE()
        Message('Excel Could Not Be Located Or Executed','Warning',ICON:Exclamation,BUTTON:No,BUTTON:No,1)
        Exit
    END
    DDECHANNEL = DDECLIENT('Excel','System')
    if error() then message(error()).
    DDEEXECUTE(DDECHANNEL,'[OPEN("' & Clip(FNAME) & '")]')
    DDECHANNEL = DDECLIENT('Excel',CLIP(FNAME))
    if error() then message(error()).
 else
  Unhide(?button5)
 .
ReadXl  routine
 do$=0;co$=0
 loop i$= row1 to rowlast
   pos='R' & i$ & 'C' & Col1; DDEREAD( DDECHANNEL,DDE:manual, clip(pos),q:date);if error() then message(error()).
   pos='R' & i$ & 'C' & col2; DDEREAD( DDECHANNEL,DDE:manual, clip(pos),do");   if error() then message(error()).
   !q:do1C=deformat(sub(clip(do"),1,len(clip(do"))-2),@n14`_2)/100
   do ClipDO
   pos='R' & i$ & 'C' & Col3; DDEREAD( DDECHANNEL,DDE:manual, clip(pos),Co");   if error() then message(error()).
   do ClipCO
   !q:Co1C=deformat(sub(clip(Co"),1,len(clip(Co"))-2),@n14`_2)/100
   if clip(q:date)='' or clip(q:date)='<13>'&'<10>' or isalpha(sub(q:date,1,1))= true then break.
   add(q1)
 .
ClipDO   routine
   q:do1C=''
    loop nn#=1 to len(do")
        if sub(do",nn#,1)=','
           q:do1C=clip(q:do1C)&'.'
        else
           q:do1C=clip(q:do1C)&sub(do",nn#,1)
        .
     .
ClipCO   routine
   q:Co1C=''
    loop nn#=1 to len(Co")
        if sub(Co",nn#,1)=','
           q:Co1C=clip(q:Co1C)&'.'
        else
           q:Co1C=clip(q:Co1C)&sub(Co",nn#,1)
        .
     .
--
Best regards,
gorky mailto:gorky@sv3.net.ua

Написал: ClaList(2)
Гость

Сообщение Гость »

2 gorky
ФАНТАСТИКА, а как же
- посылаешь запрос "хочу получить вот это"
- крутишься в ACCEPT-цикле в ожидании ответа от DDE-сервера, который инициирует событие EVENT:DDEData
- используешь данные, которые вернул сервер
а в этом примере DDEREAD в цикле просто шарит по ячейкам без всяких ACCEPT- ов и EVENT-ов
может все дело в куске кода откуда вызывается эта роутинка ReadXl ?????
а может собака еще порылась в DDE:manual ????
ЛЮДИ дайте ссылочку на работающие примеры
Гость

Сообщение Гость »

Ей-богу, не вру. Сейчас все повторил.Даже скриншоты приготовил, но гнать для всех - чужих денег жалко. давайте адрес - сброшу.
Три кнопки: одна - файлдиалог, вторая - открыть excel и файл, третья - выбрать из таблицы, как раз она и есть ReadXl. А вот в DDE:manual может быть причина. Все это на локальной машине, где никто не держит excel. А если будет что-то вклиниваться, то dde-сервер может и пропустить мимо ушей ваш призыв, потому для надежности и рекомендовали вам крутиться в цикле, дожидаясь от него ответа. Хотите - сбросьте кусок вашего апп на мой адрес. Завтра буду на работе, может помогу.

--
Best regards,
gorky
Написал: ClaList(2)
Гость

Сообщение Гость »

Сорри, ввел коллегу в заблуждение!
DDERead сам по себе ждет ответа от сервера.
И возвращает управление программе или при получении ответа или в случае таймаута.
А параметр DDE:xxx задает режим обработки:
DDE:manual - получить ответ от сервера и вернуться в программу.
DDE:auto - оставить серверу ссылку на переменную, и при изменении значения запрошенного параметра сервер будет обновлять эту переменную и посылать в программу событие DDEData. Именно для этого случая и нужен ACCEPT-цикл.
DDE:remove - отключить режим автооповещения, включенный предыдущей опцией.

Т.е., если ты сам собираешься опрашивать ячейки таблицы, то используй именно DDE:auto.
ЛЮДИ дайте ссылочку на работающие примеры
В каталоге Clarion55 - Examples\SRC\DDE - простенький пример организации связи между DDE-сервером и клиентом.
Да и хелпе по DDE много чего написано.

=============================
С уважением, Олег А. Руденко
Написал: ClaList(2)
Ответить