반응형

지난 글에 이어서 실제 C# 으로 SOAP API를 호출 해 보는 소스를 작성 해 보겠습니다.

일반적으로 웹 서비스 제공업체에서 제공해 주는 기술문서를 참고로 해서 사용되는 함수 및 자료형을 확인해야 합니다.
여기서는 용마라는 택배업체에서 제공되는 문서를 바탕으로 작성 되었습니다.

[참고] 용마 반품 연동가이드 문서 일부

또한 처리방법만을 남길 목적인 테스트용 코드 이므로, 예외 처리등은 하지 않았습니다.
실제 환경에서는 반드시 리턴값 확인 및 예외 처리를 해야 합니다.

(1) define

1. 해당하는 클래스가 정의된 Reference.cs의 namespace 및 Linq를 using에 추가 합니다.

using WindowsFormsApplication1.kr.co.yongmalogis.www;
using System.Xml.Linq;

2. 호출될 메소드를 가지고 있는 객체를 전역변수로 선언 합니다.

TestBPService testBPService;

3. 나중에 사용할 List를 전역변수로 생성 합니다.

List<Dictionary<string, string>> array = new List<Dictionary<string, string>>();

 

(2) 등록번호 추출

간단히 getEDINum() 메소드를 호출하면 string 으로 리턴 됩니다.

private void btngetEDINum_Click(object sender, EventArgs e)
{
    txtgetEDINum.Text = testBPService.getEDINum();
}

 

(3) 반품정보 등록

주어진 기술문서를 참조하여 Key, Value 쌍을 Dictonary에 추가하고, 이를 다시 List에 추가 합니다.

Dictionary<string, string> dic = new Dictionary<string, string>();

dic.Add("regno", txtgetEDINum.Text);
dic.Add("ymd", "20190624");
dic.Add("Cons", "XXXXXX");
dic.Add("Seq", "1");
dic.Add("Ordno", "");
dic.Add("Vencode", "");
dic.Add("Venname", "왕내과");
dic.Add("Zip1", "123");
dic.Add("Zip2", "45");
dic.Add("Addr1", "울릉도 동남쪽 뱃길따라 2백리");
dic.Add("Addr2", "");
dic.Add("Contact", "이사부");
dic.Add("Phone1", "011-123-4567");
dic.Add("Phone2", "");
dic.Add("Descry", "");
dic.Add("Itemcode", "");
dic.Add("Itemname", "");
dic.Add("Qty", "1");
dic.Add("Memo1", "");
dic.Add("Sname", "");
dic.Add("sphone", "");

array.Add(dic);

기술문서에 파라미터 데이터 타입이 XML 문자열로 되어 있어서, List 데이터 전체를 ediInsert() 메소드의 인자로 넘길 XML 문자열로 변환 합니다.

XElement xmlElements = new XElement("TEBLE", array.Select(i => new XElement("item",
                    i.Select(j => new XElement(j.Key, j.Value))
                    )));

실제 SOAP API를 호출 합니다. 

string result = testBPService.ediInsert(xmlElements.ToString());
MessageBox.Show(result);

나머지 반품 확정 및 삭제는 등록번호 추출과 유사한 형태라 생략 합니다.

이 글이 도움이 되셨으면 좋아요 눌러 주시거나 댓글을 남겨 주세요.

반응형
반응형

최근 사내 ERP에서 택배사로 반품정보를 SOAP API로 전송을 해야할 일이 생겨서
C#에서 웹서비스 호출처리를 했는데, 유사한 경우에 도움이 될까해서 이를 정리 합니다.

우선 Visual Studio 에서 새로운 프로젝트를 시작하고, 솔루션 탐색기에서 서비스참조 추가를 합니다.

하단의 『고급』 버튼을 눌러서 서비스 참조 설정 창이 뜨면 다시 『웹 참조 추가』 버튼을 누릅니다.

 

웹 참조 추가 창이 나타나면, 업체에서 (매뉴얼상에) 알려준 asmx URL을 입력하고 우측의 작은 화살표를 클릭 하면
자동으로 제공되는 메소드 목록들이 나타 납니다.
확인 후 『참조추가』 버튼을 누르면 해당 메소드를 호출 할 수 있는 프록시 클래스가 생성 됩니다.

 

위의 웹 참조 이름을 더블클릭 하면 개체 브라우저를 통해 제공되는 메소드와 데이터타입 등을 확인 할 수 있습니다.

실제 소스는 '웹 참조 이름'과 동일 폴더 안에 Reference.cs 라는 파일로 생성 됩니다.

다음 글에서는 실제 API 호출을 하는 소스를 c# 으로 작성 하도록 하겠습니다.

반응형
반응형

연말정산 때문에 가족관계증명서 발급을 위해 법원 사이트에 갔다.

그런데 이만큼을 설치 해야 한단다.

고작 프린트 한장 하는데 뭔 놈의 잡다한 프로그램을 이렇게나 많이 깔라는 건지....

이게 IT 강국이라는 대한민국 정부 사이트의 슬픈 현실이다.

울며겨자먹기로 꾸역꾸역 설치 한 후, 증명서를 인쇄 하고 난 다음

다시 주민등록등본 발급을 위해 민원24 사이트로 갔다.

그런데 또 설치를 하란다.

아 진짜.. 짜증.

정부 사이트 간에는 좀 표준화를 해서 한번만 설치할 수 있게 하든지 해야지

사이트 마다 재각각 이면 어쩌겠다는 건지... 




반응형
반응형

SQL 서버에서 서로 다른 데이터 타입간에 연산을 하게 되면
연산 전에 데이터 형식을 묵시적으로 형변환하게 되며,
이는 최종 결과 값의 데이터 형식이 된다.
그런데 여기에는 우선순위가 있기 때문에 때때로 연산결과 값에서 소수점이 사라지거나 오차가 발생 할 수 있으므로 주의해야 한다.

우선순위는 다음과 같다 (참조: https://docs.microsoft.com/ko-kr/sql/t-sql/data-types/data-type-precedence-transact-sql?view=sql-server-2017)

  1. 사용자 정의 데이터 형식(가장 높음)
  2. sql_variant
  3. xml
  4. datetimeoffset
  5. datetime2
  6. datetime
  7. smalldatetime
  8. date
  9. time
  10. float
  11. real
  12. decimal
  13. money
  14. smallmoney
  15. bigint
  16. int
  17. smallint
  18. tinyint
  19. bit
  20. ntext
  21. text
  22. image
  23. timestamp
  24. uniqueidentifier
  25. nvarchar(nvarchar(max) 포함)
  26. nchar
  27. varchar (varchar(max) 포함)
  28. char
  29. varbinary (varbinary(max) 포함)
  30. binary(가장 낮음)

그리고 피연산자에 숫자 상수값이 들어가는 경우 상수의 표현 방식에 따라 데이터형이 결정 되므로 역시 주의 해야 한다.

  1. 이진상수 : 0x 접미사 (16진수)
  2. integer 상수: 소수점 없는 정수
  3. 10진수(decimal, numeric) 상수: 숫자에 소수점이 포함
  4. float 및 real 상수: 과학 표기법 (예: 0.5E-1)

함수의 결과 값도 원래 컬럼의 데이터타입과 다른 경우가 있으므로 주의 해야 한다.
  1. SUM() :  decimal에 대한 계산 결과는 무조건 decimal(38, s) 가 된다.
                 s는 원래 decimal 타입 값의 소수점이하 자리 수.
                 전체 자리수가 무조건 38이 되므로 주의!
  2. CEILING(), FLOOR() : decimal에 대한 결과는 decimal(p, 0)이 된다.
                                p는 원래 decimal 타입 값의 전체 자리 수.

decimal 타입간의 연산 결과는 두 decimal 타입 중 더 넓은 범위의 값을 저장할 수 있는 타입이 우선순위를 가지는 것으로 보인다.
예를 들어 decimal(38, 5) 와 decimal(38, 2) 의 결과는 decimal(38, 2)로 된다.
소수점 이하 정밀도 보다는 정수 부분이 더 큰/작은 넓은 범위의 숫자를 저장할 수 있는 타입에 우선순위가 있는  것 같다.
특히 decimal에 대한 SUM()의 결과는 무조건 decimal(38, s)이 되고 CEILING()은 decimal(p, 0)이 되므로
만약 SUM()에 의하여 decimal(38, 5)가 되고, CEILING()에 의해 decimal(38, 0)이 된 경우 그 결과는 decimal(38, 0)이 되어
데이터에서 소수점이하 값이 사라질 수 있으므로 주의 해야 한다.

SELECT * 
INTO   #c 
FROM   (SELECT Sum(CONVERT(DECIMAL(38, 5), 123.45)) AS x 
        UNION 
        SELECT Ceiling(CONVERT(DECIMAL(38, 5), 456.78)) AS x) a 
go 

SELECT * 
FROM   #c 



반응형

+ Recent posts