#include <stdio.h>
 
 
//4.문자열을 입력 받을 때 키 입력 횟수 제한하기
 
int GetMyString(char buffer[] , int limit){
 
    int i;
 
    for (i = 0; i < limit; i++) { //최대 개수만큼 반복
 
        buffer[i] = getchar();
 
        if (buffer[i] == '\n') {    //엔터 키가 체크되면 사용자 입력이 완료되었다는 뜻
            buffer[i] = 0;         // 0 을 담아준다.
            return 1;               // 정상적으로 입력이됨
        }
 
    }
    //반복 문을 빠져나왔다는 것은 입력 개수를 초과했다는 뜻
    buffer[i] = 0;
    rewind(stdin);
    return 0;
}
 
int main(int argc, const char * argv[]) {
 
 
     //1.
    //getchar 함수를 사용하여 키보드에서 문자 한개 입력받기
    int input_data;
    //표준 입출력 함수를 사용해서 문자를 한개 입력 받음
    input_data = getchar();
    //입력받은 문자를 출력
    printf("input : %c \n" , input_data);
 
 
 
    //2. getchar 함수를 사용하여 문자 한 개씩 두번 입력받기 - rewind 함수를 사용하여 표준 입력 버퍼 초기화하기
 
    int input_data;
 
    //표준 입출력 함수를 사용해서 문자를 한개 입력 받음
    input_data = getchar();
    rewind(stdin);// 표준입력 버퍼에 있는 모든 입력값을 제거함
    printf("첫번째 input : %c \n" , input_data);
    input_data = getchar();
    rewind(stdin);
    printf("두번째 input : %c \n" , input_data);
 
 
 
    //3. gets 함수로 문자열 입력받기
    //문자열은 마지막에 null 문자 0을 포함해야 하므로 최대 9개의 문자까지 저장 가능함.
    char input_string[10];
    //gets(input_string);
    fgets(input_string , 10 , stdin); //문자열을 입력받아 input_string에 저장함.
    printf("input : %s \n" ,input_string);
 
 
 
    //4.문자열을 입력 받을 때 키 입력 횟수 제한하기
 
    char temp [10];
    int state;
 
    //사용자에게 최대 9개 까지만 입력 받겠다고 제한함.
    state = GetMyString(temp, 9);
    if (state == 1) {
        printf("input : %s \n" , temp);             //정상 입력함
 
    }else{
         printf("input : %s -> out of range \n" , temp); //범위를 초과함
    }
 
 
    //5. 문자열 형식의 숫자를 정수로 변환하기
    //pos_num은 각 자릿수에 곱할 숫자, num은 정수로 변환될 숫자를 저장할 변수
    int post_num = 100, num = 0 , i, temp_num;
    //정수로 변환할 문자열
    char num_string[4] = "123";
 
    for (i = 0 ; i < 3; i++) {
 
        //배열의 각항목을 문자에서 정수로 변경함
        temp_num = num_string[i] - '0';
 
        //정수화된 숫자에 자릿수에 해당하는 숫자를 곱해서 합산함.
        num = num + (temp_num * post_num);
 
        post_num = post_num / 10;
 
    }
 
    //변환된 정수 값을 출력
    printf(" %s -> %d \n" , num_string , num);
 
 
 
  //6. 길이 제한 없이 문자열 형식의 숫자를 정수로 변환하기
 
    int num = 0, count = 0;
    char num_string[4] = "123";
 
    //문자열이 끝날때까지 반복함
    while (num_string[count] != 0) {
 
        num = num * 10 + (num_string[count] - '0'); //반복할때마다 이전값에 10을 곱해서 자릿수를 증가.
 
        count++;            //다음문자로 이동
    }
 
    printf(" %s -> %d \n" , num_string , num);
 
 
 
 
 
    //7.scanf 함수를 이용해서 나이 입력받기
 
    int num = 0;
    //정상적인 나이를 입력할때까지 무한반복을 사용
 
    while (1) {
        printf("input age : ");
 
 
 
        //scanf 함수는 실행에 실패하면 0을 반환
        if (scanf("%d" , &num) == 0) {
            rewind(stdin);
            printf("정확한 수를 입력하세요.");
        }else{
 
            //0보다 크고 130 이하인 숫자만 정상적인 나이로 인정
            if (num > 0 && num <= 130) {
                break; //정상적으로 입력이 되었기 때문에 반복문을 빠져나감.
            }else{
 
                //나이의 범위가 잘못되었다고 출력
                printf("incorrect age ! \n");
            }
 
        }
 
 
    }
 
    printf("your age : %d \n " , num);
 
 
    //-----------------배열---------------
 
 
    //배열 표기법의 한계
    int data[2] = {0x12345678 , 0x12345678};
    printf("%d \n" ,data[0]); //
    data[0] = 0x22;
    printf("%d \n" ,data[0]);
 
 
    //배열표기법 대신 포인터표기법 사용
 
    *(char *) (data +1) = 0x22; //일시적으로 int* 형을 char* 형으로 변환함.
 
    printf("%d \n" ,data[0]);
 
 
 
    int tips = 0x12345678, sum;
    char *p; //1바이트씩 접근하기위해 char* 형 포인터를 선언함
    p = (char *) &tips; // 형변환해서 char* 로 맞춤.
    sum = *(p +0) + *(p +1) + *(p +2) + *(p +3);
    printf("%d \n" , sum);
    return 0;
}
 

 

do it c 언어 참고

'ios 뽀개기 > C언어' 카테고리의 다른 글

표준입출력& 배열  (0) 2019.11.29
반복문 실습 - 별그리기  (0) 2019.11.19
비트연산  (0) 2019.11.18
자료형  (0) 2019.11.18
c언어 기초4  (1) 2019.05.22
c언어 기초 3  (0) 2019.05.21

1. Dataset에는 필터 기능이 있다. 
예를들어 1개의 변수를 받아 dadtaset의 칼럼과 비교해서 필터거는 문법은 아래와 같다.
this.ds_my_dataset.filter(" name =='" + name + "' || age == 10 "");
-> 나이가 10인 친구중에 이름이 변수 name 에 들어있는 값과 비교해서 있으면 dataset에 한 건이 필터된다.

 

2.Dataset 확인
dataset에 들어 있는 데이터는 saveXML() 함수로 확인 할 수 있다. 
예) this.ds_my_dadtaset.saveXML();

3.dataset filter 이슈
문제는 2번에서 필터된 dataset을 확인하고 싶었는데 dataset 전체가 계속나온다는 것이다. 참고로 dataset의 filter는 dataset의 내용을 지우거나 수정하는 함수가 아니라 말그대로 필터해서 보여주는 함수이다. 그래서 dataset의 saveXML()함수를 사용해도 다 보이는것이 맞다. filter된 dataset을 화면 그리드나 다른 엘리먼트에 뿌려보자. 그러면 filter된 dataset이 잘 나올 것이다. 

4.콤보박스와 dataset.
콤보박스에는 화면에서 보여줄 dataset과 콤보박스 내용을 저장할 innser dataset 두종류의 dataset 바인딩을 설정할 수 있다. 그래서 dataset을 필터하고 화면상의 콤보박스에 바로 필터된 dataset을 적용할려고 해도 적용되어지지 않는다. 필터된 dataset은 innerdataset에 바인딩되어 있기 때문이다. 그래서 콤보박스의 값을 바로 변경하려면 inner dataset이 아닌 일반 dataset을 적용한다.


//그리드 안의 콤보박스 아이템을 선택했을때
//e.row는 콤보박스에서 이벤트가 발생한 행번호.
//이 값으로 dataset안의 값과 화면에 보여줄 값을 셋팅할 수 있다. 

예) this.ds_my_dataset.setColumn(e.row,"name" , "");

넥사크로에서 post 방식으로 조회조건을 파라미터로 던지고, 스프링 부트에서 받아서 jpa로 데이터베이스에 접근해서 해당 데이터를 넘겨주는 시나리오다.

1.시나리오
게시판 생성 목록을 조회 할것이다. 게시판을 관리하는 화면에는 게시판 그룹이 있고, 게시판 대상이 있다. 게시판 그룹은 매니져, 팀장, 팀원 등이고, 게시판 대상은 매니져1년차, 매니져2년차 등 그룹을 더욱 세분화한 데이터다. 먼저 서버단 로직이다.

@Override
public List<?> selectBoard(VariableList variableList){
 
    //객체 데이터를 넣어줄 리스트 rows
    List <Map<String,Object>> resultObject = new ArrrayList<>();
 
    //게시판 그룹 - 넥사크로에서 post 방식으로 파라미터를 넘겨준값. 배열로 넘어온다.
    String boardGroup = (String)variableList.valueList().get(0);
 
    //게시판 대상
    String boardTarget = (String)variableList.valueList().get(1);
 
 
    //조회한 데이터를 담아줄 리스트
    List<BoardType>boardTypeList = null; //초기화
 
    //그룹이 전체이고 상세 데이터가 없을때
    if(boardGroup.equals("A") && boardTarget.isEmpty()){
 
        //그룹이 전체(enum 타입의 값들이다. )이고, 상세대상이 없을 경우
        String jpqlByTarget = "SELECT B "
                            + "FROM Board B "
                            + "WHERE boardGroup IS NOT NULL";
 
        //entityManager 객체에서 createQuery() 메서드를 호출하면 쿼리가 생성.
        //TypedQuery는 반환되는 엔티티가 정해져 있을 때 사용한다.
        TypedQuery<Board> query = em.createQuery(jpqlByTarget,Board.class);
 
        //반환값 리스트에 넣기
        boardTypeList = query.getResultList();
 
    //그룹이 전체이고 상세데이터가 존재할때
    }else if(boardGroup.equals("A") && !boardTarget.isEmpty()){
 
            //상세 데이터는 :targetValue로 셋팅
            String jpqlByTarget = "SELECT B "
            + "FROM Board B "
            + "WHERE boardGroup IS NOT NULL"
            + "AND BoardTarget = :targetValue";
 
            TypedQuery<Board> query = em.createQuery(jpqlByTarget,Board.class);
 
            //파라미터 넣기
            //enum타입으로 파라미터를 넣어줘야지, 클라이언트에서 넘어오는 string 값 형태로 적어주면 안된다!
            query.setParameter("targetValue", BoardTarget.valueOf(boardTarget));   
            //반환값 리스트에 넣기
            boardTypeList = query.getResultList(); 
 
    //그룹이 전체가 아니고 (특정값이 있고) , 대상이 존재할때 , 그룹+ 대상조회 조건        
    }else if(!boardGroup.equals("A") && !boardTarget.isEmpty()){
 
 
            String jpqlByGroupAndTarget = "SELECT B "
                                        + "FROM Board B "
                                        + "WHERE boardGroup = :boardGroup"
                                        + "AND BoardTarget = :targetValue";
 
            TypedQuery<Board> query = em.createQuery(jpqlByGroupAndTarget,Board.class);
 
            //파라미터 넣기
            //enum타입으로 파라미터를 넣어줘야지, 클라이언트에서 넘어오는 string 값 형태로 적어주면 안된다!
            query.setParameter("boardGroup", BoardTarget.valueOf(boardGroup));   
            query.setParameter("targetValue", BoardTarget.valueOf(boardTarget));   
            //반환값 리스트에 넣기
            boardTypeList = query.getResultList(); 
    }
 
    //리스트에 행 하나 하나의 객체(Map 타입)를 담아준다. 
    for (Object object : boardTypeList) {
        resultObject.add(Utils.convertObjectToFlattenedMap(object));
    }
 
    return resultObject;
 
 
}

Repository 쪽과 service 쪽은 생략한다. 바로 Contrller 은 아래와 같다. 설명은 주석을 참고하자.

 
//저장, 수정
 
@PostMapping("/board/select")
//variableList 객체로 넥사에서 넘어온 파라미터를 받는다.
//중요한 부분은 리턴값이 NexacroResult이다.
public NexacroResult selectBoard (VariableList variableList){
 
    //넥사에서 받아줄 데이터셋 이름 : 저장만 할거라서 필요는 없다. 참고로!
    String datasetName = "ds_board";
 
    //넥사크로 객체를 생성한다.
    NexacroResult nexacroResult = new NexacroResult();
 
    //서비스단 로직 호출 + 넥사에서 넘어온 파리미터 넘겨주기
    nexacroResult.addDataSet(datasetName,boardSelect(variableList));
 
 
    return nexacroResult;
}

 

마지막으로 넥사크로에서 어떤형태로 던져줄까?

this.fn_selectBoard = function(group, target){
 
    this.fn_transaction(
                "selectBoard"                       //콜백
                ,"절대경로"
                ,"/board/select"
                ,"송신데이터 셋"
                ,"수신할 데이터셋"
                ,"group="+group + " " + "target=" + target //파라미터
                ,true
                ,true
 
    )
 
}

+ Recent posts