티스토리 뷰

Occurs는 COBOL이라는 프로그램언어에서 나온 단어로 일련의 데이터가 반복해서 나오는 구조를 이야기 한다. xingAPI에서 Occurs의 의미는 시간대별 화면의 그리드처럼 일련의 데이터가 반복해서 나오는 경우는 의미한다. 프로그램언어에서의 배열(Array)와 같은 의미라고 볼 수 있다.

 

TR이 반복 데이터인지 확인하는 방법

DevCenter의 TR Layout에서 Occurs여부 속성으로 확인 할 수 있다. 예로 들어 t1301OutBlock1을 선택하면 TR 속성창에 Occurs여부 속성이 ○로 되어 있으니, t1301OutBlock1은 반복데이터임을 알 수 있다.

 

반복 데이터 조회

이 예제는 "단일 데이터 조회"를 이어서 프로그래밍한다.

 

1. 디자인 연역에 아래와 같이 버튼을 추가한다.

 

2. "t1301Occurs"버튼을 더블클릭하여 클릭이벤트 코드를 생성한다.

 

3. 아래와 같이 코드를 수정한다.

using System;
using System.Windows.Forms;
using XA_SESSIONLib;
using XA_DATASETLib;

namespace XingAPI
{
    public partial class Form1 : Form
    {
        XASessionClass session;
        XAQueryClass t1101;
        XAQueryClass t1301Occurs;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            session = new XASessionClass();
            session._IXASessionEvents_Event_Login += XASession_Login;

            t1101 = new XAQueryClass();
            t1101.ResFileName = @"C:\eBEST\xingAPI\Header\t1101.res";
            t1101.ReceiveData += t1101ReceiveData;

            t1301Occurs = new XAQueryClass();
            t1301Occurs.ResFileName = @"C:\eBEST\xingAPI\Header\t1301.res";
            t1301Occurs.ReceiveData += t1301ReceiveData;

            severTypeComboBox.SelectedIndex = 0;
        }

        private void t1101ReceiveData(string trCode)
        {
            var name = t1101.GetFieldData("t1101OutBlock", "hname", 0);
            listBox.Items.Add(name);
            var price = t1101.GetFieldData("t1101OutBlock", "price", 0);
            listBox.Items.Add(price);
        }

        private void t1301ReceiveData(string trCode)
        {
            var count = t1301Occurs.GetBlockCount("t1301OutBlock1");

            string str;
            for (int index = 0; index < count; ++index)
            {
                str = "";
                str += t1301Occurs.GetFieldData("t1301OutBlock1", "chetime", index);
                str += " ";
                str += t1301Occurs.GetFieldData("t1301OutBlock1", "price", index);
                str += " ";
                str += t1301Occurs.GetFieldData("t1301OutBlock1", "volume", index);
                listBox.Items.Add(str);
            }
        }

        private void XASession_Login(string code, string msg)
        {
            if (code == "0000")
            {
                listBox.Items.Add("로그인 성공");
                loginButton.Enabled = false;
                t1101Button.Enabled = true;
            }
            else
            {
                MessageBox.Show("로그인 실패[" + code + "]: " + msg);
            }
        }

        private void loginButton_Click(object sender, EventArgs e)
        {
            string serverType;
            if (severTypeComboBox.SelectedIndex == 0)
            {
                // 실서버
                serverType = "hts.ebestsec.co.kr";
            }
            else
            {
                // 모의투자
                serverType = "demo.ebestsec.co.kr";
            }

            bool connectResult;
            connectResult = session.ConnectServer(serverType, 20001);
            if (connectResult)
            {
                listBox.Items.Add(serverType);
                listBox.Items.Add("서버 접속 성공");
            }
            else
            {
                var errCode = session.GetLastError();
                var errMsg = session.GetErrorMessage(errCode);
                MessageBox.Show(errMsg);
                return;
            }

            var id = idTextBox.Text;
            var pwd = pwdTextBox.Text;
            var certPwd = certPwdTextBox.Text;

            bool loginResult;
            loginResult = session.Login(id, pwd, certPwd, 0, false);
            if (!loginResult)
            {
                MessageBox.Show("로그인 서버전송 실패");
                return;
            }
        }

        private void t1101Button_Click(object sender, EventArgs e)
        {
            var shcode = shcodeTextBox.Text;
            t1101.SetFieldData("t1101InBlock", "shcode", 0, shcode);

            var result = t1101.Request(false);

            if (result < 0)
            {
                listBox.Items.Add("- t1101 조회 요청 실패");
            }
        }

        private void t1301OccursButton_Click(object sender, EventArgs e)
        {
            var shcode = shcodeTextBox.Text;
            t1301Occurs.SetFieldData("t1301InBlock", "shcode", 0, shcode);

            var result = t1301Occurs.Request(false);

            if (result < 0)
            {
                listBox.Items.Add("- t1301Occurs 조회 요청 실패");
            }
        }
    }
}

4. F5를 눌러서 프로그램을 실행시키고, 로그인한 후 t1301Occurs버튼을 눌러서 동작을 확인해보자.

 

 

코드 설명

namespace XingAPI
{
    public partial class Form1 : Form
    {
        XASessionClass session;
        XAQueryClass t1101;
        XAQueryClass t1301Occurs;

TR마다 하나의 XAQueryClass 객체가 필요하므로 t1301Occurs를 멤버변수로 추가한다.

        private void Form1_Load(object sender, EventArgs e)
        {
            session = new XASessionClass();
            session._IXASessionEvents_Event_Login += XASession_Login;

            t1101 = new XAQueryClass();
            t1101.ResFileName = @"C:\eBEST\xingAPI\Header\t1101.res";
            t1101.ReceiveData += t1101ReceiveData;

            t1301Occurs = new XAQueryClass();
            t1301Occurs.ResFileName = @"C:\eBEST\xingAPI\Header\t1301.res";
            t1301Occurs.ReceiveData += t1301ReceiveData;

            severTypeComboBox.SelectedIndex = 0;
        } 

Form1의 로드이벤트시 t1301Occurs객체를 초기화한다. RES파일을 추가하고 서버로 호출될 ReceiveData 콜백 메서드를 추가한다.

        private void t1301OccursButton_Click(object sender, EventArgs e)
        {
            var shcode = shcodeTextBox.Text;
            t1301Occurs.SetFieldData("t1301InBlock", "shcode", 0, shcode);

            var result = t1301Occurs.Request(false);

            if (result < 0)
            {
                listBox.Items.Add("- t1301Occurs 조회 요청 실패");
            }
        }

 

"t1301 반복 데이터 조회"버튼을 클릭시 실행될 코드를 추가한다. t1301InBlock에 사용되는 입력값이 여러개 있지만, shcode는 필수값이고 나머지 값들은 옵션값이므로 여기서는 shcode만 입력시킨다. 그리고 서버로 조회를 요청한다.

private void t1301ReceiveData(string trCode)
        {
            var count = t1301Occurs.GetBlockCount("t1301OutBlock1");

            string str;
            for (int index = 0; index < count; ++index)
            {
                str = "";
                str += t1301Occurs.GetFieldData("t1301OutBlock1", "chetime", index);
                str += " ";
                str += t1301Occurs.GetFieldData("t1301OutBlock1", "price", index);
                str += " ";
                str += t1301Occurs.GetFieldData("t1301OutBlock1", "volume", index);
                listBox.Items.Add(str);
            }
        }

조회가 성공하면 서버로부터 t1301ReceiveData()메서드가 호출된다. 지금까지의 진행과정은 단일데이터 조회와 동일하다. 하지만 t1301OutBlock1은 Occurs이므로 반복데이터를 가진다. GetBlockCount()메서드로 반복 가능한 갯수를 알아내고, for()과 같은 반복제어문으로 GetFieldData의 세번째인자에 값을 얻을 index값을 전달하여 출력값을 얻을 수 있다.

 

 

'XingAPI > 개발가이드' 카테고리의 다른 글

실시간 데이터 조회  (2) 2018.03.18
연속 데이터 조회  (0) 2018.03.18
단일 데이터 조회  (0) 2018.03.15
로그인하기  (0) 2018.03.15
서버 접속하기  (0) 2018.03.15
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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
글 보관함