C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[45144] Re:Re:Re:Re:Re:Re:Re:도와주세용~~
장성호 [nasilso] 807 읽음    2006-05-29 20:39
sql 문에서
order by를 REG_SEQ로 하면

한번 지나가 REG_SEQ값은 다시 나오지 않습니다.

그리니까 

a) 1,2,2,3,3,3,3,4,4,5,6,7,7,7,7,..... 이런식으로 되지
b) 1,2,3,3,2,2,4,4,4,2,4,5,3,5,5,6,,2,4,5,6,  이렇게 뒤죽박죽 으로 QUERY되지 않습니다.

그러므로 

query결과  REG_SEQ값이 a)와 같이나온다고 가정하고

REG_SEQ값이 같은것의 LINK_ID를 다모아서 저장하는 코딩함 해보겠습니다.


아래 예문은 Rocord 하나 가져온뒤 바로 저장하지 않고
그다음 Record를 가져와서 비교해보고 저장합니다.
비교해서 똑같으면 LINK_ID만 String에 계속 add하고
실제 Save함수는 호출하지 않고  그다음 rocord를 가져옵니다.

다름 record에서 만약 다른 REG_SEQ가 나오면 이전 record의 REG_SEQ와 그동안 ",'(콤마)로 구분해서
String에 모아두었던 LINK_ID를 모두 저장합니다.       


  String sRegSeq0,sRegSeq1;
  String sLink0,sLink1;
 
  for(i = 0; i < itCount; i++)
  {    
          sRegSeq1 = m_DAO->t_DBA->GetField("REG_SEQ");    //시퀀스 값
          sLink1       = m_DAO->t_DBA->GetField("LINK_ID1");      // ID 값
 
          if(sRegSeq1==sRegSeq0 )  //1. 이전 REG_SEQ 와 같은 경우
           {
                sLink0=sLink0+","+sLink1;  //","로 구분함 : :
          }
         else
         {
                  Save(Link0);//그동안 다른값을 모두 저장
                  Fonction( sRegSeq0);
                  sRegSeq0=sRegSeq1;
                  sLink0=sLink1;
         }
          m_DAO->t_DBA->MoveRec(i);
  }
  Save(Link0);//for문이 끝이 난후에 마지막에껏을 저장해야 함
  Fonction( sRegSeq0);
 

만약 LINK_ID가 ","(콤마)로 구분해서  저장하지 못하는것이라면(LINK_ID 에 ","가 포함될수 있는경우)
다른 unique한 ASCII로 하면 될것이구요
그것도 안되면  list를 쓰거나 new를 해야겠네요

이번에는 님이 원하는 대답이 맞기를 기대합니다.



kurt 님이 쓰신 글 :
: 매번 친절한 답변 고맙습니다...
: 바로 그 의문사항이 문제입니다.
: 동일한 REG_SEQ값이 두개이상 존재합니다.
: 그러기에 동일한 REG_SEQ값 전의 LINK_ID와 후의 LINK_ID 값을 뽑아가며 돌리기가 난감하다는...
: 돌면서 유일한 REG_SEQ값도 있고...
: 매번 감사합니다... 달리 생각을 해야하는건지..
:
:
: 장성호 님이 쓰신 글 :
: : 제가 제대로 이해했는지 모르겠는데요
: :
: : 그러니까  "REG_SEQ" 만 이전값과 같은지 비교하고
: :   if  같으면  :  이전 LinkID와 현재 LinkID를 같이 저장한다구요?
: :
: : 의문사항 있습니다.
: : 만약 "REG_SEQ"가 2개이상  똑같은것이 있는경우는 어떻게 하죠?
: :
: : 아래 제가 이해한데로 샘플 코딩해봅니다.
: :
: : 이 코드는 DB에서 REG_SEQ 로 order by 해서 query한경우입니다
: : 만약 db에서 order by도 지원하지 않는다면
: : STL의 vector 나 list 같은것을 이용해서 sorting한뒤에
: : 아래와 같은 로직으로 돌리면 되겠네요
: :
: :
: :  String sRegSeq0,sRegSeq1;
: :  String sLink0,sLink1;
: : 
: :  for(i = 0; i < itCount; i++)
: :  {    
: :          sRegSeq1 = m_DAO->t_DBA->GetField("REG_SEQ");    //시퀀스 값
: :          sLink1       = m_DAO->t_DBA->GetField("LINK_ID1");      // ID 값
: : 
: :          if(sRegSeq1==sRegSeq0 )  //1. 이전 REG_SEQ 와 같은 경우
: :           {
: :               //A)  (이전에 똑같은 REG_SEQ에 해당하는 모든 LINK_ID가 저장됨)
: :                sLink0=sLink0+","+sLink1;  //","로 구분함
: :                Save(  sLink0 );               
: :                Function1();//2)  해당함수 호출            
: :             
: :               //B) 만약 REG_SEQ 가 똑같은 경우 바로앞에 하나만 LINK_ID를 저장한다면
: :               Save(sLink0,sLink1);
: :               sLink0=sLink1;
: :                Function1();   //2)  해당함수 호출            
: :
: :          }
: :         else
: :         {
: :              sRegSeq0=sRegSeq1;
: :              sLink0=sLink1;
: :               Save(sLink0);//1)  save   sLink0            //---> 현재 LinkID만 저장됨
: :               Function2(); //2)  해당함수 호출            
: :         }
: :          m_DAO->t_DBA->MoveRec(i);
: :  }
: :
: :
: :
: : kurt 님이 쓰신 글 :
: : : 장성호 님이 쓰신 글 :
: : : : DB가 GroupBy가 안된다고요?
: : : : 그럼 join도 기대하지 말아야 겠네요
: : : :
: : : : 그냥 query결과를 가지고 해야한다면
: : : :
: : : : 그냥 변수하나 만들어두고 이전 Record값과 계속 비교하는 로직이 가장 이해하기 쉽겠네요
: : : :
: : : :
: : : : [방법1]
: : : :
: : : : 1. select 할때 order by REG_SEQ로 하세요
: : : :        sql="select * from table_name order by REG_SEQ";
: : : :
: : : : 2.  이전 Record값을 저장할 변수를 하나 두고 계속 비교하는 방법입니다.
: : : :
: : : : String sRegSeq0,sRegSeq1;
: : : : String sLink0,sLink1;
: : : :
: : : : for(i = 0; i < itCount; i++)
: : : : {    
: : : :         sRegSeq1 = m_DAO->t_DBA->GetField("REG_SEQ");    //시퀀스 값
: : : :         sLink1       = m_DAO->t_DBA->GetField("LINK_ID1");      // ID 값
: : : :
: : : :         if((sRegSeq1!=sRegSeq0 ) && (sLink1!=sLink0)) //unique한경우를 찾는 비교문 ..
: : : :        {
: : : :             sRegSeq0=sRegSeq1;
: : : :             sLink0=sLink1;
: : : :             // REG_SEQ값이 다음 REG_SEQ값과 같은지 다른지 체크하여 각각 LINK_ID1을 저장해야 하는데??
: : : :        }
: : : :
: : : :         m_DAO->t_DBA->MoveRec(i);
: : : : }
: : : : 
: : : :
: : : : //....
: : : : if 구문이 님의 의도와 맞는지  잘모르겠습니다만 ..
: : : : 위와같이 하는 방법이 일단 이해하기 쉽고 심플할 것 같네요
: : : : 그런데 이정도는 님께서도 충분히 생각하실수 있으실것 같은데..
: : : : 제 답이 엉뚱하다면  좀더 명확하게 질문 부탁드립니다.
: : :
: : : 제 질문이 모자랐나봅니다.
: : : 루프문을 돌면서 REG_SEQ 값이 이전 값과 동일하다면 이전 REG_SEQ의 LINK_ID 값과 현재의 LINK_ID 값을 저장하여
: : : 해당 함수를 호출/처리하고, 계속 루프를 돌면서 이전 REG_SEQ값과 현재의 REG_SEQ값이 틀리다면 현재의 REG_SEQ값에 해당하는 LINK_ID 를 저장하여 해당 함수를 호출/처리하는 로직입니다. 머리가 돌이 되어버린 느낌...ㅠㅠ

+ -

관련 글 리스트
45131 도와주세용~~ kurt 870 2006/05/29
45134     Re:도와주세용~~ 장성호 742 2006/05/29
45135         Re:Re:도와주세용~~ kurt 778 2006/05/29
45136             Re:Re:Re:도와주세용~~ 장성호 770 2006/05/29
45138                 Re:Re:Re:Re:도와주세용~~ kurt 771 2006/05/29
45141                     Re:Re:Re:Re:Re:도와주세용~~ 장성호 813 2006/05/29
45142                         Re:Re:Re:Re:Re:Re:도와주세용~~ kurt 716 2006/05/29
45144                             Re:Re:Re:Re:Re:Re:Re:도와주세용~~ 장성호 807 2006/05/29
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.