DDEREAD в Excel
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Помогите чайнику. Excel файлы создаю давно, а вот прочитать не получилось.
Канал с Excel и нужным файлом открыт, а как использовать значения получаемые командой DDEREAD в цикле???????
Хотелось бы что-то такое
Loop I# = 1 to 1000
DDEREAD(ExcelServer,DDE:auto,'R' & i# & 'C2',DDEReadVal)
! что здесь должно быть ???
! я перепробовал много чего, но без результата, поэтому свои варианты не привожу
! кстати, ошибку DDEREAD тоже не выдает
Message(DDEReadVal)
.
Канал с 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
- используешь данные, которые вернул сервер
Т.е. твой код надо написать приблизительно так:
=============================
С уважением, Олег А. Руденко.
Oleg_Rudenko@mail.ru
Oleg_Rudenko@mail333.com
Библиотека DynaLib
http://dynalib.narod.ru
Написал: ClaList(2)
Не хочешь читать - посмотри примеры. Есть в примерах небольшой проектик организации простейшего 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)
Спасибо Олег!!!Ты бы хотя почитал про принцип работы DDE-механизма!
Не хочешь читать - посмотри примеры. Есть в примерах небольшой проектик организации простейшего DDE-интерфейса.
А твой код работать и не должен!
Теорию я читал, а вот примерчиков не смог найти.
С ACCEPTами и EVENTами я экспериментировал
Большое спасибо скажу за ссылочки, т.к. твой пример не помог
Вот куски кода из старой разработки
Надо было по-быстрому вытащить из оборотки 1С, выгруженной в excel, данные и сравнить с параллельными данными в программе на кларионе.
Код не оптимизировался, но работал. Как видно из текста, часть его надергана из хелпа.
Читалось в очередь, а далее - не помню
--
Best regards,
gorky mailto:gorky@sv3.net.ua
Написал: ClaList(2)
Надо было по-быстрому вытащить из оборотки 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
ФАНТАСТИКА, а как же
может все дело в куске кода откуда вызывается эта роутинка ReadXl ?????
а может собака еще порылась в DDE:manual ????
ЛЮДИ дайте ссылочку на работающие примеры
ФАНТАСТИКА, а как же
а в этом примере DDEREAD в цикле просто шарит по ячейкам без всяких ACCEPT- ов и EVENT-ов- посылаешь запрос "хочу получить вот это"
- крутишься в ACCEPT-цикле в ожидании ответа от DDE-сервера, который инициирует событие EVENT:DDEData
- используешь данные, которые вернул сервер
может все дело в куске кода откуда вызывается эта роутинка ReadXl ?????
а может собака еще порылась в DDE:manual ????
ЛЮДИ дайте ссылочку на работающие примеры
Ей-богу, не вру. Сейчас все повторил.Даже скриншоты приготовил, но гнать для всех - чужих денег жалко. давайте адрес - сброшу.
Три кнопки: одна - файлдиалог, вторая - открыть excel и файл, третья - выбрать из таблицы, как раз она и есть ReadXl. А вот в DDE:manual может быть причина. Все это на локальной машине, где никто не держит excel. А если будет что-то вклиниваться, то dde-сервер может и пропустить мимо ушей ваш призыв, потому для надежности и рекомендовали вам крутиться в цикле, дожидаясь от него ответа. Хотите - сбросьте кусок вашего апп на мой адрес. Завтра буду на работе, может помогу.
--
Best regards,
gorky
Написал: ClaList(2)
Три кнопки: одна - файлдиалог, вторая - открыть excel и файл, третья - выбрать из таблицы, как раз она и есть ReadXl. А вот в DDE:manual может быть причина. Все это на локальной машине, где никто не держит excel. А если будет что-то вклиниваться, то dde-сервер может и пропустить мимо ушей ваш призыв, потому для надежности и рекомендовали вам крутиться в цикле, дожидаясь от него ответа. Хотите - сбросьте кусок вашего апп на мой адрес. Завтра буду на работе, может помогу.
--
Best regards,
gorky
Написал: ClaList(2)
Сорри, ввел коллегу в заблуждение!
DDERead сам по себе ждет ответа от сервера.
И возвращает управление программе или при получении ответа или в случае таймаута.
А параметр DDE:xxx задает режим обработки:
DDE:manual - получить ответ от сервера и вернуться в программу.
DDE:auto - оставить серверу ссылку на переменную, и при изменении значения запрошенного параметра сервер будет обновлять эту переменную и посылать в программу событие DDEData. Именно для этого случая и нужен ACCEPT-цикл.
DDE:remove - отключить режим автооповещения, включенный предыдущей опцией.
Т.е., если ты сам собираешься опрашивать ячейки таблицы, то используй именно DDE:auto.
Да и хелпе по DDE много чего написано.
=============================
С уважением, Олег А. Руденко
Написал: ClaList(2)
DDERead сам по себе ждет ответа от сервера.
И возвращает управление программе или при получении ответа или в случае таймаута.
А параметр DDE:xxx задает режим обработки:
DDE:manual - получить ответ от сервера и вернуться в программу.
DDE:auto - оставить серверу ссылку на переменную, и при изменении значения запрошенного параметра сервер будет обновлять эту переменную и посылать в программу событие DDEData. Именно для этого случая и нужен ACCEPT-цикл.
DDE:remove - отключить режим автооповещения, включенный предыдущей опцией.
Т.е., если ты сам собираешься опрашивать ячейки таблицы, то используй именно DDE:auto.
В каталоге Clarion55 - Examples\SRC\DDE - простенький пример организации связи между DDE-сервером и клиентом.ЛЮДИ дайте ссылочку на работающие примеры
Да и хелпе по DDE много чего написано.
=============================
С уважением, Олег А. Руденко
Написал: ClaList(2)