Что нового

Получать данные по DDE

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Здравствуйте!
Имеется программа, которая передает внешним приложениям данные - таблицы с числами - по DDE. Может ли AutoIt напрямую получать эти данные для дальнейшей обработки?
По умолчанию принимать данные должен Excel, поэтому в настройках DDE-экспорта необходимо указывать имя DDE-сервера, книгу, лист и номера строк и столбцов.
Нашел пока такую тему - http://www.autoitscript.com/forum/index.php?showtopic=55994&hl=%60DDE&st=0
но, т.к. начал изучать AutoIt недавно, разобраться самостоятельно не могу.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
WSWR
не по идее можно. Если данные передаются в открытый лист Excel, то можно просто работать через объект самого Excel посредством ObjGet.
 
Автор
W

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Kaster
Да, через Excel можно, я даже набрел на ваши примеры http://forum.script-coding.info/viewtopic.php?id=4286 Но у меня они почему-то не работают - или не читают ячейку вообще, или выводят пустые значения
Кроме того, скорость перадачи данных может оказаться слишком маленькой.
Опишу, что я вообще хочу сделать:
Существует программа-торговый терминал Квик для торговли на фондовом рынке.
Основная работа происходит в специальной таблице - "стакане" (скриншот в приложенном файле)
Однако функционал Квика по работе со "стаканом" меня не устраивает, вот и хочу написать для этого специальное приложение, в идеале - свой собственный "стакан". Таких программ и так существует множество, но и они по разным причинам меня также не устраивают.
Квик может выводить данные, в том числе и стакан, по DDE и по ODBC (в базу данных), а приказы извне обрабатывает с помощью специальной DLL (на этом форуме также есть пример)или через текстовый файл.
При использовании AutoIt проблема как раз в оперативном получении данных, все остальное он сможет, и мне более-менее понятен. В общем, стоит ли разбираться по этому вопросу с AutoIt или лучше перейти на какой-нибудь другой язык?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
WSWR
Приведи пож-та код, каким образом у тебя
не читают ячейку вообще, или выводят пустые значения
по поводу
Кроме того, скорость перадачи данных может оказаться слишком маленькой.
скорость не ниже чем скорость работы самого Excel. По сути, если ты читал ту тему, то должен понимать, что ObjGet фактически передает скрипту объектную модель открытого Excel документа со всеми атрибутами, будь то значения ячеек и прочее.
Ну а по поводу деталей, "стаканов" и "Квиков", к сожалению они мне лично ни о чем не говорят, да и к делу отношения иметь не будут. От тебя потребуется лишь инфа, типа расположение файла, название нужных листов и координаты нужных ячеек.
Если все правильно, то AutoIt скрипт должен возвращать значения любых атрибутов, более того даже манипулировать ими, причем без надобности сохранения, т.к. AutoIt получает доступ ко всем объектам Excel, в котором хранится вся нужная информация.
 
Автор
W

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Kaster сказал(а):
WSWR
Приведи пож-та код, каким образом у тебя

Код:
HotKeySet('^+r', '_Read'); Данные показываются по Ctrl+Shift+R

While 1
    Sleep(100)
WEnd

Func _Read()
    $obj = ObjGet('d:\test.xlsx')
    MsgBox(0, '', $obj.WorkSheets("Sheet1").Cells(1, 1).Value)
    $obj = 0
EndFunc


В принципе, вариант с екселем меня бы устроил, если ничего удобнее нет
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
WSWR
1. Открыт ли нужный тебе Excel-файл в момент выполнения скрипта? (Если не открыт, то скрипт просто откроет его. Но логично предположить что он уже открыт и принимает данные)
2. Путь до нужного файла - d:\test.xlsx? (Особливо обрати внимание на расширение)
3. Лист с нужными тебе данными зовется Sheet1, а нужный интервал - (А1:А1)?

По идее, если ответы на все вышеуказанные вопросы положительные, то должно показывать.
 
Автор
W

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Kaster сказал(а):
WSWR
1. Открыт ли нужный тебе Excel-файл в момент выполнения скрипта? (Если не открыт, то скрипт просто откроет его. Но логично предположить что он уже открыт и принимает данные)
2. Путь до нужного файла - d:\test.xlsx? (Особливо обрати внимание на расширение)
3. Лист с нужными тебе данными зовется Sheet1, а нужный интервал - (А1:А1)?
Так, у моего файла расширение - xls, а не xlsx, подправил в скрипте - ноль реакции, скрипт просто висит в памяти, на нажатия клавиш не реагирует
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
WSWR
То есть по остальным вопросам все ок? Названия файла, листа и прочее?
И еще? Какая версия офиса?
Тестировалось на 2007-ом


Добавлено:
Сообщение автоматически объединено:

Только что проверил.
создал xlsx - файл. Обозвал его test.xlsx. Закинул его в корень диска D
В лист под названием Sheet1 в ячейку A1 ввел значение - Test и запустил скрипт.
Нажал Ctrl+Shift+R - скрипт выдал мсгбокс с текстом - Test
 
Автор
W

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Kaster сказал(а):
WSWR
То есть по остальным вопросам все ок? Названия файла, листа и прочее?
И еще? Какая версия офиса?
Тестировалось на 2007-ом
По остальному - все как надо
А вот версия 2003
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
У меня к сожалению под рукой нет этой версии офиса. Попробуй сделать вот что. Запиши какой нибудь макрос типа выделить ячейку, скопировать данные и перенести в другую ячейку и вставь сюда его код. Я еще не делал таких вещей когда у меня был 2003 офис. Возможно DOM у него отличается от нового
 
Автор
W

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Kaster сказал(а):
У меня к сожалению под рукой нет этой версии офиса. Попробуй сделать вот что. Запиши какой нибудь макрос типа выделить ячейку, скопировать данные и перенести в другую ячейку и вставь сюда его код. Я еще не делал таких вещей когда у меня был 2003 офис. Возможно DOM у него отличается от нового
У меня еще ноут есть, там вроде 2007, проверю, отпишусь, если не получиться, сделаю макрос
 
Автор
W

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
В обоих версиях - 2003, 2007 исходный скрипт не работает
Упростил:
Код:
$obj = ObjGet('d:\test.xlsx')
    MsgBox(0, '', $obj.WorkSheets("Sheet1").Cells(1, 1).Value)


работает, причем опять же и в 2003, и 2007 :blink:
Вообщем, остановлюсь на этом варианте, спасибо за помощь!
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
WSWR
то есть вся проблема была в установке горячей клавишы? :blink:
подозреваю, что дело в русской раскладке клавиатуры, установленной по умолчанию.
попробуй поменять на англ и запустить скрипт еще раз
 

ViktorSPB

Новичок
Сообщения
109
Репутация
0
Добрый день.
Скажите, пожалуйста, а открывать лист экзеля обязательно? Вы написали что скрипт сам его откроет. А можно без этого открытия? ну чтобы я его вообще не видел? Или он у себя в памяти его откроет и будет к нему обращаться?
 

ViktorSPB

Новичок
Сообщения
109
Репутация
0
К сожалению, не нашел где эта функция описывается. Скачал DDE сервер, который был выше указан в постах, там ни в одном из файлов поиском эту функцию не обнаружил. Но по логике понял, что можно задать режим без открытия, спасибо.
У меня еще вопрос есть, более концептуальный, что-ли... Имеет ли смысл через DDE сервер на AutoIt обрабатывать данные, например в секунду строк так... 300 максимум.. Хватит мощи это переработать несложным скриптом? В смысле, что преобразования по сути только сложения, простейшие операции..
Мне нужно через DDE получать данные, обрабатывать их и в массив закидывать, когда, например, пройдет минута, скинуть в файл, а в идеале чтобы пропускная способность была по мере поступления инфы... При этом, чтобы не было критических зависаний в процессе. Реально средствами AutoIt такое сделать?
На сколько я понимаю, кто то в экзель кидает, кто то распарсивает(надеюсь я правильно применил тут термин) самостоятельно и уже работает с полученными им данными... Но что по скорости обработки, мне пока не понятно.. И как несколько таких скриптов, например, одновременно будут работать, будут ли обеспечивать требуемую скорость или все дружно загрузят одно ядро с соответствующими последствиями... :-\
 
Автор
W

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Если речь о квике, то:

1. Скорее всего на Autoit можно написать DDE-сервер, но тем кто так хорошо разбирается в этом языке, DDE-сервер не нужен. К тому же скорость, надежность и т.д. будут невысокими. Этот вариант
абсолютно неперспективный, если речь идет о сотнях строк в секунду, суперскорость не является достоинством Autoit + будет немалая загрузка процессора.

2. Самый простой вариант - данные из квика слать в DDE-сервер Excel. Естественно, нужен установленный Excel, чем и плох этот вариант. Можно сделать чтобы окно было невидимо, но процесс Excel должен висеть в памяти. Сначала открывается "невидимый" документ, потом запускается DDE-экспорт в квике. Autoit может читать ячейки, простейший код приведен выше.
Код:
_ExcelBookOpen()
- это функция из библиотеки Excel.au, она в папке Include + примеры в папке AutoIt3\Examples\Helpfile
Скорость в этом варианте более-менее высокая, естественно, зависит от ПК. Даже сделать "стакан" можно. Но все равно на практике все это неудобно.
Можно и в Excel все делать.
3. Можно выводить из квика по ODBC в какую-нибудь базу данных, потом подключаться к ней с помощью Autoit. Само подключение базы - дело очень муторное, куча всяких программ, адаптеров, обновлений и т.д., а настройка получения данных в Autoit реал-тайм тоже сомнительное удовольствие.
4. Можно взять готовый DDE-сервер на другом языке, например, C++, C#, Дельфи т.д., и состыковать его с Autoit. Но, если разбираемся в каком-нибудь таком языке и нужна большая скорость, зачем Autoit?
 

ViktorSPB

Новичок
Сообщения
109
Репутация
0
Спасибо за развернутый ответ!
Да, вопрос про Квик.
С п.4. трудно не согласиться)))
Мне стакан не нужен, мне в данный момент нужно настроить экспорт в текстовик таблицы всех сделок, отсортированной по инструменту. Для этого средства Qpile не подходят, ибо сортировка не предусмотрена.. Остается вывод таблицы по DDE с последующей сборкой в нужный таймфрейм и допиской в файл. в нужное место. По ссылкам выше, конкретно сдесь
http://www.autoitscript.com/forum/index.php?app=downloads&module=display&section=download&do=confirm_download&id=174
есть какой-то DDE сервер, но проблема в том, что я никогда с ним не сталкивался и потому не знаю с какой стороны его вообще прикручивать? Как разобраться? не знаю.. гуглю вот весь день.
Вы через DDE ТВС выгружали через AutoIt? пробовали? Пока мне все нравится в AutoIt, уже много планов на него, вот, надеюсь, и в этом вопросе получить от него поддержку..

п2 может не пройти, ибо к концу дня кол-во строк перевалит за 800 000 и не будет мне щастья... Тут надо как-то в массив загонять данные, складывать, записывать в файл и заново гнать массив.. Я вижу это как-то так. По сути, мне нужно, чтбы мой скрипт получал через DDE доступ к данным в открытой в квике таблице и работал с ними. Можно ли такое сделать и как это вообще называется, не знаю.. :-\
меня пока не волнует наличие процесса в памяти, пока это устраивает, помогло бы..
п3. начитался, что ODBC более тормозной вариант, потому не стал его рассматривать.
 
Автор
W

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Там по ссылке не то, я тоже пару лет назад копался в этом направлении. Тот сервер сделан для связи скриптов Autoit друг с другом через DDE, а для квика нужно парсинг писать, возможно ли такое - вряд ли кто-то знает.

Да, самый нормальный вариант - Excel 2007 и выше, где на листе 1 млн. строк. С Excel Autoit работает хорошо. Я, правда, вообще никогда не работал с ТВС, даже не открывал, только стаканы.
Здесь кое-что на эту тему http://forum.script-coding.com/viewtopic.php?id=4286&p=1
 

ViktorSPB

Новичок
Сообщения
109
Репутация
0
Спасибо, буду разбираться. 2007 Экзель поставить проблем нет, вроде то, что по ссылке увидел похоже. А насчет парсинга, да, пишут люди на Дэлфи и работают с ним. Вот я задался вопросом, стоит ли вообще AutoIt копать в этом направлении, а то изобрету деревянный велосипед...

У меня вопрос к специалистам в AutoIt. Есть ли смысл прикручивать его к DDE? Через AutoIt разбирать и анализировать строки при условии, что в секунду в некоторые моменты надо будет обработать строк 300? Или парсить надо будет, не привлекая Exel. Что будет быстрее и надежнее, как по вашему?
 
Верх