넥사크로 transaction 사용법을 정리했어요. 조회 버튼 눌렀는데 그리드가 비어 있거나, 건수가 0으로 찍힌 적 있으시죠?
대부분 파라미터 방향이나 콜백 처리 문제예요.
📌 결론부터
보낼 데이터셋은 "서버이름=화면이름", 받을 데이터셋은 "화면이름=서버이름"이에요.
조회 결과를 쓰는 코드는 transaction 다음 줄이 아니라 콜백 함수 안에 넣어요.
this.transaction("selectEmp", "svc::selectEmp.do",
"", // 보낼 것: 서버ID=화면ID
"ds_emp=out_emp", // 받을 것: 화면ID=서버ID
"deptCd=D01", // 인자: 공백으로 구분
"fn_callback");
this.fn_callback = function(svcId, errorCode, errorMsg) {
if (errorCode < 0) { this.alert(errorMsg); return; }
trace(this.ds_emp.rowcount + "건 조회");
};
제가 실제로 헤맸던 순서대로 보여드릴게요.
1. transaction 파라미터 한눈에 보기
앞의 6개는 꼭 넣어야 하고, 뒤의 3개는 생략할 수 있어요.
빈 값이어도 자리는 ""로 채워야 해요.
this.transaction(
strSvcID, // 구분용 ID (콜백에서 그대로 돌아옴)
strURL, // "서비스prefix::주소" 형태
strInDatasets, // 서버로 보낼 데이터셋 "서버ID=화면ID:U"
strOutDatasets, // 서버에서 받을 데이터셋 "화면ID=서버ID"
strArgument, // 변수 "a=1 b=2" (공백 구분)
strCallbackFunc, // 콜백 함수 이름 (문자열)
bAsync, // 생략 시 true (비동기)
nDataType, // 생략 시 0 (XML)
bCompress // 생략 시 false
);
URL의 svc:: 부분은 TypeDefinition의 Services에 등록한 prefix예요.
등록 안 한 prefix를 쓰면 통신 자체가 안 돼요.
2. 조회했는데 그리드가 비어 있을 때
처음 짠 코드는 이랬어요.
서버 로그엔 조회가 잘 찍히는데, 화면 그리드는 텅 비어 있었어요.
// 실패: 받을 데이터셋 방향을 반대로 씀
this.transaction("selectEmp", "svc::selectEmp.do",
"", "out_emp=ds_emp", "", "fn_callback");
이유는 방향이에요. strOutDatasets는 "화면ID=서버ID" 순서예요.
반대로 쓰면 화면에 없는 out_emp를 찾다가 아무것도 안 채워요.
해결은 화면 데이터셋 이름을 왼쪽에 두는 거예요.
// 성공: 받을 때는 화면ID=서버ID
this.transaction("selectEmp", "svc::selectEmp.do",
"", "ds_emp=out_emp", "", "fn_callback");
// 참고: 보낼 때는 반대로 서버ID=화면ID
this.transaction("saveEmp", "svc::saveEmp.do",
"in_emp=ds_emp:U", "", "", "fn_callback");
💡 팁
외우기 쉽게 "등호 왼쪽이 받는 쪽"이라고 기억하세요. 보낼 땐 서버가 받고, 받을 땐 화면이 받아요.
3. 건수가 0으로 찍힐 때 (비동기)
방향을 고쳤더니 그리드는 나오는데, 건수 표시가 계속 0이었어요.
// 실패: transaction 바로 다음 줄에서 결과를 읽음
this.transaction("selectEmp", "svc::selectEmp.do",
"", "ds_emp=out_emp", "", "fn_callback");
this.st_count.set_text(this.ds_emp.rowcount + "건"); // 항상 0건
이유는 transaction이 기본 비동기라서예요.
요청만 보내고 바로 다음 줄로 넘어가서, 그 순간엔 데이터가 아직 안 와 있어요.
해결은 결과를 쓰는 코드를 콜백으로 옮기는 거예요.
this.fn_callback = function(svcId, errorCode, errorMsg)
{
if (errorCode < 0) {
this.alert("[" + errorCode + "] " + errorMsg);
return;
}
switch (svcId) {
case "selectEmp":
this.st_count.set_text(this.ds_emp.rowcount + "건");
break;
case "saveEmp":
this.alert("저장했습니다.");
this.fn_search(); // 저장 후 다시 조회
break;
}
};
⚠️ 주의
bAsync를 false(동기)로 바꾸면 다음 줄에서 바로 읽을 수는 있지만, 응답이 올 때까지 화면이 멈춰요. 콜백으로 처리하는 쪽을 권해요.
4. 인자에 공백이 들어갈 때
strArgument는 공백으로 변수를 나눠요.
그래서 값 안에 공백이 있으면 값이 잘려서 넘어가요.
var sName = this.edt_name.value; // "홍 길동"
// 실패: name=홍 까지만 넘어감
var sArg1 = "name=" + sName;
// 성공: wrapQuote로 감싸기
var sArg2 = "name=" + nexacro.wrapQuote(sName) + " deptCd=D01";
this.transaction("selectEmp", "svc::selectEmp.do",
"", "ds_emp=out_emp", sArg2, "fn_callback");
5. 저장할 때 :U, :A, :N 옵션
보낼 데이터셋 뒤에 붙이는 옵션으로 보낼 행을 고를 수 있어요.
"in_emp=ds_emp:U" // 추가·수정·삭제된 행만
"in_emp=ds_emp:A" // 전체 행 (삭제된 행 포함)
"in_emp=ds_emp:N" // 삭제된 행을 뺀 전체
// 여러 개는 공백으로 구분
"in_emp=ds_emp:U in_dept=ds_dept:U"
일반적인 그리드 저장은 :U가 제일 많이 쓰여요.
바뀐 행만 가니까 데이터가 많아도 가벼워요.
6. 자주 막히는 상황 정리
| 증상 | 원인 | 해결 |
| 서버는 조회되는데 그리드가 빔 | out 방향 반대 | "화면ID=서버ID" |
| 건수가 항상 0 | 비동기라 데이터 도착 전 | 콜백에서 처리 |
| 검색어가 잘려서 감 | 인자 공백 구분 | nexacro.wrapQuote |
| 저장 시 데이터가 너무 많음 | :A로 전체 전송 | :U로 변경분만 |
| 통신 자체가 안 됨 | prefix 미등록 | TypeDefinition Services 확인 |
❓ 자주 묻는 질문
Q. 콜백 함수 파라미터 이름을 바꿔도 되나요?
A. 네. 이름은 자유고 순서만 지키면 돼요. 서비스ID, 에러코드, 에러메시지 순서로 3개가 넘어와요.
Q. errorCode는 언제 음수가 되나요?
A. 서버에서 ErrorCode 변수에 음수를 넣어 보내면 실패로 와요. 보통 0이면 성공, 0보다 작으면 실패로 처리해요.
Q. 조회 두 개를 연달아 해야 하면요?
A. 첫 번째 콜백의 case 안에서 두 번째 transaction을 호출하면 순서가 보장돼요.
transaction은 방향과 비동기, 이 두 가지만 기억하면 대부분 풀려요.
콜백 함수 하나에 svcId로 나눠 처리하는 패턴을 템플릿으로 써 보세요.
함께 보면 좋은 글
'개발 LOG > 넥사크로' 카테고리의 다른 글
| 넥사크로 그리드 엑셀 내보내기, ExcelExportObject 사용법과 안 될 때 (0) | 2026.10.17 |
|---|---|
| 넥사크로 데이터셋 filter와 keystring, 조건 검색과 정렬 방법 (0) | 2026.10.16 |
| 넥사크로 그리드 체크박스 전체선택, 헤드 클릭으로 일괄 체크하는 방법 (0) | 2026.10.13 |
| 넥사크로 데이터셋이란? 그리드 연동 기초 사용법 정리 (1) | 2026.10.07 |
| 넥사크로 그리드 컬럼 인덱스 가져오기, getBindCellIndex와 컬럼명 가져오기 (0) | 2023.06.07 |
댓글