Table1, Table2 가 있다.
Table1 의 자료를 Table2 로 이동하려고 한다.

각 단계는
1. Table1 의 자료를 Table2 에 기록
2. Table1 의 자료 삭제
로 이루어진다.

이때, 1단계와 2단계 사이에 Table1 에 대한 INSERT 작업이 이루어지면
2단계에서 후에 기록된 자료까지 삭제가 된다.
Transaction 을 적용하더라도 그렇게 된다.

그러므로 이동시에는 전체 자료에 대한 표현을 쓰지말고 특정 데이타를 명시적으로 표시하여야 한다.

예제 코드)
procedure Button1Click( Sender: TObject);
var
  nCount : Integer;
begin
  try
    Conn1.BeginTrans;

    Conn1.Execute( 'INSERT INTO Table2(fDesc) SELECT fDesc FROM Table1', nCount );

    Conn2.Execute( 'INSERT INTO Table1(fDesc) VALUES(''TEST'')', nCount );

    Conn1.Execute( 'DELETE FROM Table1', nCount );

    Conn1.CommitTrans;
  except
    Conn1.RollbackTrans;
  end;
end;

'Windows > Database' 카테고리의 다른 글

[SQL] FOREIGN KEY 제약조건  (0) 2007.08.22
[SQL] UNION  (0) 2007.05.19

기존 integer 값 검증 함수다.
bool __fastcall IsInteger( const AnsiString &Value )
{
    try
    {
        StrToInt( Value );
        return true;
    }
    catch ( ... )
    {
        return false;
    }
}
사용예
AnsiString Value = "10000";
int VInt = 0;
if ( IsInteger( Value ) == true )
{
    VInt = StrToInt( Value );
}
숫자 변환함수를 호출하고 true 를 리턴한다.
에러가 발생하면 false 를 리턴한다.
이 방법은 exception 발생에 의한 방법이라 디버깅이 귀찮아 지게 된다.

다음은 검증/변환을 해주는 각종 VCL 함수다.
extern PACKAGE bool __fastcall TryStrToFloat(const AnsiString S, Extended &Value);
extern PACKAGE bool __fastcall TryStrToFloat(const AnsiString S, double &Value);
extern PACKAGE bool __fastcall TryStrToFloat(const AnsiString S, float &Value);
extern PACKAGE bool __fastcall TryStrToInt(const AnsiString S, int &Value);
extern PACKAGE bool __fastcall TryStrToDateTime(const AnsiString S, System::TDateTime &Value);
같은 이름 유형으로 함수가 더 있다.
이 함수들은 서로 다른 델파이 함수를 포장해 논 것이다.
이 외에서 StrToIntDef 등의 변환 오류시 기본값으로 반환하는 함수도 있다.

사용예
AnsiString Value = "1000";
int VInt = 0;
if ( TryStrToInt( Value, VInt ) == true )
{
}

추출값 : 금시세

//---------------------------------------------------------------------------
// 인터페이스를 사용하기 위한 헤더파일
#include <mshtml.h>
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    Caption = "시세추출중";

    // 웹 페이지 로드
    CppWebBrowser1->Navigate( L"사이트주소은폐ㅋㅋ" );
}
//---------------------------------------------------------------------------
AnsiString __fastcall ExtractMoney( AnsiString Value )
{
    // 문자열 파싱

    // 시세 문자열에서 금액 숫자값만 추출, [xx시세00,000원등락수치]
    int begin = Value.Pos( "세" ) + 2;

    // 시세 숫자에서 Comma, Space 제거
    return StringReplace(
        // '세' 와 '원' 사이의 Money 문자열 추출
        Value.SubString( begin, Value.Pos( "원" ) - begin ),
        ",",
        "",
        TReplaceFlags() << rfReplaceAll
    ).Trim();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CppWebBrowser1DocumentComplete(TObject *Sender,
      LPDISPATCH pDisp, Variant *URL)
{
    WideString Value;

    // CppWebBrowser 의 Document 참조
    IDispatch *Document = CppWebBrowser1->Document;
    IHTMLElement *HTMLElement;
    IHTMLDocument2 *pHTMLDocument;

    // CppWebBrowser->Document 소스 가져오기, Text 형식

    // Document 에서 IHTMLDocument2 인터페이스 가져오기
    if ( Document->QueryInterface( IID_IHTMLDocument2, ( PVOID* )( &pHTMLDocument ) ) == S_OK )
    {
        // IHTMLDocument2 에서 Body 부를 IHTMLElement 인터페이스로 가져오기
        if ( pHTMLDocument->get_body( &HTMLElement ) == S_OK )
        {
            // IHTMLElement (Body) 의 Text 값 추출
            HTMLElement->get_innerText( &Value );

            // IHTMLElement 인터페이스 해제
            HTMLElement->Release();
        }
        // IHTMLDocument2 인터페이스 해제
        pHTMLDocument->Release();
    }

    // TMemo 를 이용하여 시세부분 TStrings 변환, 라인별로 24K,18K,14K 순
    Memo1->Lines->Clear();

    // '순금시세' 부터 '순금매입가' 까지가 금시세다.
    int begin = Value.Pos( "순금시세" );
    Memo1->Lines->Add( Value.SubString( begin, Value.Pos( "순금매입가" ) - begin ) );

    // 각 시세 값을 TEdit 에 대입
    Edit1->Text = ExtractMoney( Memo1->Lines->Strings[0] );
    Edit2->Text = ExtractMoney( Memo1->Lines->Strings[1] );
    Edit3->Text = ExtractMoney( Memo1->Lines->Strings[2] );

    Caption = "시세추출완료";
}
//---------------------------------------------------------------------------

'Windows > RAD Studio' 카테고리의 다른 글

[CB] KeyPad Virtual Key Value  (0) 2007.06.09
[DEL] Deprecated Lists  (0) 2007.06.02
[CB] 문자열 변환/검증  (0) 2007.05.30
[CB] TQuickRep 출력순서  (1) 2007.05.13
[CB] 쓰레드끼리는 마구 침범할 수 없다.  (0) 2007.04.15
//    FOCUS_LIST_INDEX( PREFIX##ListView1, -1 ); \
#define FAST_FIND( PREFIX ) \

위와 같은 경우 에러가 난다.
// 뒤는 모두 주석으로 생각을 했는데 에러가 발생했다.
주석문에 \ 가 들어갔다는...

저 문자는 define 에서와 같이 주석문을 여러줄로 하는 것이 아니고 에러만 나므로 피해야한다.

'Windows > 문제해결' 카테고리의 다른 글

[INI] 값 저장/참조에 있어 주의점  (0) 2007.06.04
[WIN32] SetWindowLong 이용시 객체 접근  (0) 2007.06.04
[C++] 매크로 ##  (0) 2007.05.04
[SQL] View 의 유용성  (0) 2007.04.27
[IMG] RAW 이미지 변환  (0) 2007.04.15

두개의 테이블을 UNION 할 때 필드의 순서가 같아야한다.

같은 내용의 테이블이 두개 있는데,
필드의 순서가 달라서 UNION 을 적용하니 VARCHAR 에러가 난 것이다.
결국 필드명을 순서대로 명시 해 줘야 UNION 이 가능한 경우이다.

'Windows > Database' 카테고리의 다른 글

[SQL] FOREIGN KEY 제약조건  (0) 2007.08.22
[SQL] 테이블간 자료 이동간 데이터 명시  (0) 2007.06.01

퀵리포트에서 다른 컨트롤의 OnPrint 에서 QRImage 의 그림을 불러오면
다음번 출력에 그 내용이 적용이되고,
Detail 에 컨트롤이 올려진 순서대로 컨트롤의 출력이 이루어진다.
즉 어떤 컨트롤의 값에 의해 그림을 출력하고자 하면 그 컨트롤을 먼저 올려놓고,
QRImage 를 올려놓던가 아니면 올려진 QRImage 를 잘라내기 후 다시 붙여넣기 하여,
출력 순서를 뒤로 미뤄야한다.
그렇지 않으면 그림이 한 Detail 씩 밀려서 출력이 된다.


아래는 실제 사례다.

퀵리포트를 이용한 제품목록 출력중이다.
TQRImage 1개, TQRDBText 1개 를 올려놓고
TQRDBText 의 OnPrint 를 작성한다.

void __fastcall TFrmPrintCataList::QRDBText1Print(TObject *sender,
      AnsiString &Value)
{
    SET_IMAGE( QRImage1, Value.Trim() )
}

SET_IMAGE 는 QRImage1->Picture->LoadFromFile( FilePath + Value + ".JPG" ) 의 처리를
오류 처리화 함께 한 매크로 함수다.

위의 코드는 QRDBText 를 출력할 때 그 값에 해당하는 이미지를 불러와 출력하는 것이다.

잘 동작을 하여 모든 출력 양식에 적용을 하였다.
갑자기 하나씩 밀려 출력되는 것이다.
Prepare() 함수를 적용하여 그런가 생각해 봤지만 갑자기 드는 의문에
QRImage1 을 잘라냈다가 다시 붙여넣었다.
그랬더니 잘 출력되는 것이다.

기억하자!

매크로 문자열 병합 지시자 ##

문자열 병합에 있어 다른 define 된 문자열을 가리킬 때
그 이름이 잘못된 경우 에러가 명확히 발생하지 않고 다른에러가 난다.

#define VIEW_FITEMIN  "JMFITEMIN"
#define SQL_FTRANS   "CREATE VIEW " ## VIEW_FTRANS ## " AS \
( \
 SELECT I.fExtern, I.fDate, I.fIn, O.fOut FROM " ## TBL_FITEMIN ## \

이부분에서 TBL_FITEMIN 이 없다고 나와야 정확할 텐데
잘못된 함수호출로 에러가 떳다.
조심하자.

'Windows > 문제해결' 카테고리의 다른 글

[INI] 값 저장/참조에 있어 주의점  (0) 2007.06.04
[WIN32] SetWindowLong 이용시 객체 접근  (0) 2007.06.04
[CB] 주석문 \ 에러  (0) 2007.05.25
[SQL] View 의 유용성  (0) 2007.04.27
[IMG] RAW 이미지 변환  (0) 2007.04.15

난 여태 View 를 임시 Table 정도로 사용해왔다.
예를 들면 자주 이용되는 검색에서 식이 좀 복잡하면 View를 만들어 참조하고
새 검색시 새로 만드는... ㅡㅡ;
View 를 사용하지를 못한 바람에 SQL 기술이 상승한 것도 있지만...

오늘 중복 데이터에 대한 처리를 하며 웬만큼 복잡한 SQL 로 해결이 안되는게 있었다.
이전에도 있었지만 프로그램으로 처리를 했었다.
더 나은 쿼리를 알 수 있겠지 하며 무식하게했는데, 없다는 걸 느끼고
오늘은 시간을 단축하고자 View 를 3개정도 사용을 했다.

중복데이터를 뽑아와서 EXISTS 를 이용해 처리를 하고, 삭제를 하려고 했다.
삭제 직접 갑자기 이상한 느낌이 들어 View 를 열어 보았더니
자료들이 없어진 것이다.

오늘의 이 사건으로 View 에 관한 내 기억의 중요한 봉인이 하나 풀린셈이다.
학습은 되었었지만, 실제로 해보지 않아 엄청 강하게 봉인되었던...

앞으로의 SQL 프로그래밍은 좀 편해질 것이다.

여기서 드는 의문점! View 에 대해 INSERT/UPDATE/DELETE 시 어떻게 동작을 할까.
복합적으로 작성된 View 는 안되는걸로 알고있는데, 간단하게 필터링만 해서 보여준 VIew 는?
흠, 복합적인 View 에서 삽입/수정이 안된다는 오류 메세지가 있다는건,
단지 테이블 하나에서 참조한 View 는 삽입 수정이 된다는 뜻일텐데...
그렇다면 엄청편해지겠다 ㅡㅜ

역시 사람은 알고봐야한다.

'Windows > 문제해결' 카테고리의 다른 글

[INI] 값 저장/참조에 있어 주의점  (0) 2007.06.04
[WIN32] SetWindowLong 이용시 객체 접근  (0) 2007.06.04
[CB] 주석문 \ 에러  (0) 2007.05.25
[C++] 매크로 ##  (0) 2007.05.04
[IMG] RAW 이미지 변환  (0) 2007.04.15
RAW 이미지는 파일 확장자에 의해 결정되는 것이 아니라.
원 이미지에 사용된 색상에 의해 결정된다.

확장자를 아무리 .PGM 으로 하고 저장을 해도 결과는 P6 형식이었는데,
그림판에서 256비트로 저장하고 변환을 하니 P5 형식으로 나왔다.

내 사진 스캔을 한 이미지를 변환하였는데,
Borland 의 ImageEditor 의 변환이 더 깔끔했다.

P1 - 2비트 ASCII
P2 - 256비트 ASCII
P3 - 24비트 ASCII
P4 - 2비트 RAW
P5 - 256비트 RAW
P6 - 24비트 RAW

'Windows > 문제해결' 카테고리의 다른 글

[INI] 값 저장/참조에 있어 주의점  (0) 2007.06.04
[WIN32] SetWindowLong 이용시 객체 접근  (0) 2007.06.04
[CB] 주석문 \ 에러  (0) 2007.05.25
[C++] 매크로 ##  (0) 2007.05.04
[SQL] View 의 유용성  (0) 2007.04.27

어플리케이션에서 쓰레드를 하나 생성을 했다.
이 쓰레드는 메인폼에 접근을 하는 작업을 한다.

이럴 경우, 보통의 코드처럼 작성할 경우 에러를 유발한다.
런타임에러이고, 랜덤적으로 발생하여 알기 어렵다.

이때에는 Synchronize 함수를 이용하여 다른 쓰레드(메인 쓰레드)에 접근한다.
이는 쓰레드 자신이 필요한 작업이지만, 다른 쓰레드의 역할은 그 쓰레드가 하게 하는 함수이다.

'Windows > RAD Studio' 카테고리의 다른 글

[CB] KeyPad Virtual Key Value  (0) 2007.06.09
[DEL] Deprecated Lists  (0) 2007.06.02
[CB] 문자열 변환/검증  (0) 2007.05.30
[CB] TCppWebBrowser 를 이용한 웹페이지 값 추출  (0) 2007.05.25
[CB] TQuickRep 출력순서  (1) 2007.05.13

+ Recent posts