안녕하세요
DDE 와 관련해서 확인을 부탁드립니다.
1. DDE 객체의 속성을 코드 상에서 설정이 불가능한 것 같습니다
스크립트 속성 화면에서 설정하는 것은 적용이 되지만,
아래처럼 코드 상에서 직접 속성값을 설정하면 적용되지 않습니다.
(Read 만 가능하고 Write 는 불가능)
DDE1.service = "DDEServ";
DDE1.topic = "Data";
코드 상으로는 속성 변경이 안되는지 궁금합니다.
2. DDE 객체의 OnRcvItem 함수가 동작이 안되는 것 같습니다.
검증을 위해, 예스스팟 이외에 별도의 DDE 클라이언트를 함께 사용해서 테스트를 해봤습니다.
1. Excel 테스트
A1 셀의 값을 가져오기 위해
그림 1 처럼 DDE1 객체 속성에서 Service 를 EXCEL, Topic 을 지정한 후
DDE1.Request("R1C1") 를 실행했지만, 그림 1 의 디버깅 화면처럼,
DDE 객체의 OnRcvItem 함수가 실행되지 않았습니다.
(Topic 설정은 "C:Test.xls" 과 "[Test.xls]sheet1" 두 가지를 해봤습니다)
엑셀 파일은 문제가 없었는데,
그림 2 처럼 다른 DDE Client 프로그램을 이용해서 테스트했을 때는 정상적으로 값이 조회되었기 때문입니다.
2. DDE 서버를 이용한 테스트
원인을 찾기 위해, 그림 3 처럼 별도의 DDE 서버 프로그램을 가지고 확인한 결과
예스스팟에서 보낸 Request 가 정상적으로 수신되었고,
이에 대한 응답으로 Item 데이타를 전송하는 것까지는 확인했습니다.
하지만 DDE 객체의 OnRcvItem 함수는 마찬가지로 실행되지 않았는데,
(그림 3 처럼, DDE 클라이언트를 가지고 확인했을 때는 정상적으로 값이 조회되었습니다)
DDE 서버쪽에서 정상적으로 데이타를 전송해서,
OnRcvItem 함수가 실행이 안되는 것 같은데, 확인을 부탁드립니다.
3. 참고로 2 번 테스트에 사용한 코드를 보입니다.
var Count;
function GetCurrentTime()
{
d = new Date();
return d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds();
}
function Main_OnStart()
{
Main.MessageLog("시작 - " + GetCurrentTime());
// 1 초마다 DDE Request 요청
Count = 0;
Main.SetTimer(1, 1000);
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
Main.MessageLog("타이머 - " + GetCurrentTime());
// String1 아이템 요청 (정상적인 리턴값은 "123" 의 문자열)
DDE1.Request("String1");
if (++Count >= 3)
{
Main.KillTimer(1);
}
}
}
function DDE1_OnRcvItem(sItem, sData)
{
Main.MessageLog("OnRcvItem");
}
답변 5
예스스탁
예스스탁 답변
2015-11-11 14:03:33
> 날빛2 님이 쓴 글입니다.
> 제목 : DDE 와 관련해서 확인을 부탁드립니다
>
안녕하세요
DDE 와 관련해서 확인을 부탁드립니다.
1. DDE 객체의 속성을 코드 상에서 설정이 불가능한 것 같습니다
스크립트 속성 화면에서 설정하는 것은 적용이 되지만,
아래처럼 코드 상에서 직접 속성값을 설정하면 적용되지 않습니다.
(Read 만 가능하고 Write 는 불가능)
DDE1.service = "DDEServ";
DDE1.topic = "Data";
코드 상으로는 속성 변경이 안되는지 궁금합니다.
2. DDE 객체의 OnRcvItem 함수가 동작이 안되는 것 같습니다.
검증을 위해, 예스스팟 이외에 별도의 DDE 클라이언트를 함께 사용해서 테스트를 해봤습니다.
1. Excel 테스트
A1 셀의 값을 가져오기 위해
그림 1 처럼 DDE1 객체 속성에서 Service 를 EXCEL, Topic 을 지정한 후
DDE1.Request("R1C1") 를 실행했지만, 그림 1 의 디버깅 화면처럼,
DDE 객체의 OnRcvItem 함수가 실행되지 않았습니다.
(Topic 설정은 "C:Test.xls" 과 "[Test.xls]sheet1" 두 가지를 해봤습니다)
엑셀 파일은 문제가 없었는데,
그림 2 처럼 다른 DDE Client 프로그램을 이용해서 테스트했을 때는 정상적으로 값이 조회되었기 때문입니다.
2. DDE 서버를 이용한 테스트
원인을 찾기 위해, 그림 3 처럼 별도의 DDE 서버 프로그램을 가지고 확인한 결과
예스스팟에서 보낸 Request 가 정상적으로 수신되었고,
이에 대한 응답으로 Item 데이타를 전송하는 것까지는 확인했습니다.
하지만 DDE 객체의 OnRcvItem 함수는 마찬가지로 실행되지 않았는데,
(그림 3 처럼, DDE 클라이언트를 가지고 확인했을 때는 정상적으로 값이 조회되었습니다)
DDE 서버쪽에서 정상적으로 데이타를 전송해서,
OnRcvItem 함수가 실행이 안되는 것 같은데, 확인을 부탁드립니다.
3. 참고로 2 번 테스트에 사용한 코드를 보입니다.
var Count;
function GetCurrentTime()
{
d = new Date();
return d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds();
}
function Main_OnStart()
{
Main.MessageLog("시작 - " + GetCurrentTime());
// 1 초마다 DDE Request 요청
Count = 0;
Main.SetTimer(1, 1000);
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
Main.MessageLog("타이머 - " + GetCurrentTime());
// String1 아이템 요청 (정상적인 리턴값은 "123" 의 문자열)
DDE1.Request("String1");
if (++Count >= 3)
{
Main.KillTimer(1);
}
}
}
function DDE1_OnRcvItem(sItem, sData)
{
Main.MessageLog("OnRcvItem");
}
그림 1 처럼, 알려주신 대로 Item1에 값을 넣어서 해봤으나, 여전히 Receive 함수는 실행되지 않았습니다.
추가로 여러 가지 테스트를 한 결과, OnRevItem 함수가 실행되는 조건을 찾을 수 있었습니다.
Advise 가 전송되었을 때인데, 그림 2처럼 OnRevItem 함수가 실행되는 것을 확인할 수 있었습니다.
테스트 결과를 보면,
OnRevItem 함수는 Request 에 대한 리턴값을 받았을 때는 실행이 안되고, Advise 가 되었을 때만 실행되는 것으로 보입니다.
만일 이 이야기가 맞다면,
시세처럼 계속해서 데이타가 바뀔 때만 OnRevItem 함수가 실행되기 때문에, 장중에 거래가 없는 시간이 길거나, 또는 엑셀처럼 데이타가 고정된 경우는 데이타를 받지 못하는 문제가 생기게 됩니다.
Request 에 대한 리턴값을 처리하지 못한다면,
반쪽짜리 DDE 기능이 제공된다는 의미이기 때문에, 개선이 필요할 것으로 생각됩니다.
예스스탁
예스스탁 답변
2015-11-12 09:10:24
안녕하세요
예스스탁입니다.
올려주신 개선사항은 개발팀에 전달하도록 하겠습니다.
현재는
OnRevItem 이벤트는 데이터 변동이 있을때만 이벤트가 동작합니다.
Request는 특정 item에 대한 값을 호출할때 사용합니다.
value = DDE1.Request("R1C1");
과 같이 값을 호출하여 저장해서 사용되는 함수입니다.
즐거운 하루되세요
> 날빛2 님이 쓴 글입니다.
> 제목 : 원인을 찾은 것 같습니다
>
그림 1 처럼, 알려주신 대로 Item1에 값을 넣어서 해봤으나, 여전히 Receive 함수는 실행되지 않았습니다.
추가로 여러 가지 테스트를 한 결과, OnRevItem 함수가 실행되는 조건을 찾을 수 있었습니다.
Advise 가 전송되었을 때인데, 그림 2처럼 OnRevItem 함수가 실행되는 것을 확인할 수 있었습니다.
테스트 결과를 보면,
OnRevItem 함수는 Request 에 대한 리턴값을 받았을 때는 실행이 안되고, Advise 가 되었을 때만 실행되는 것으로 보입니다.
만일 이 이야기가 맞다면,
시세처럼 계속해서 데이타가 바뀔 때만 OnRevItem 함수가 실행되기 때문에, 장중에 거래가 없는 시간이 길거나, 또는 엑셀처럼 데이타가 고정된 경우는 데이타를 받지 못하는 문제가 생기게 됩니다.
Request 에 대한 리턴값을 처리하지 못한다면,
반쪽짜리 DDE 기능이 제공된다는 의미이기 때문에, 개선이 필요할 것으로 생각됩니다.
답장 감사드립니다.
답변하신 내용을 보니까, 제가 잘못 알고 있었던 것 같습니다.
Request 를 했을 때, 리턴값이 OnRevItem 쪽으로 넘어오는 줄 알았었는데,
"value = DDE1.Request("R1C1")" 와 같이, 직접 값을 받을 수 있나 보군요.
DDE1.Request 함수의 리턴값을 고려하지 않았던 이유는,
아래처럼 YesSpotHelp.doc 문서상에서는 반환값이 없다고 나와 있어서 였습니다.
**********************************************
8) DDE 객체
- Request(sItem)
설 명 : 지정된 아이템의 데이터를 요청합니다.
반 환 값 : 없음
매개변수 : sItem – 아이템이름
**********************************************
그렇다면 DDE 를 사용하는데에는 아무 문제가 없으며, 따로 개선하실 필요는 없을 것 같습니다.
다만 문서는 수정될 필요가 있겠네요.
친절한 답변 고맙습니다.
> 안녕하세요
> 예스스탁입니다.
>
> 올려주신 개선사항은 개발팀에 전달하도록 하겠습니다.
>
> 현재는
> OnRevItem 이벤트는 데이터 변동이 있을때만 이벤트가 동작합니다.
> Request는 특정 item에 대한 값을 호출할때 사용합니다.
> value = DDE1.Request("R1C1");
> 과 같이 값을 호출하여 저장해서 사용되는 함수입니다.
>
>
> 즐거운 하루되세요