Q&A

  • [긴급]쿼리를이용한 db write.
안녕하십니까..

.

다름이 아니라

쿼리를 사용하여 다른 두테이블의 필요한 컬럼을 선택하여서 다른 또하나의 테이블에 썰려고 합니다.

이때 잘 몰라 가지고 테이블도 세개나 쓰고 쿼리도 두개나 쓰고 하였습니다. 고수님들의 조언을 듣고저 이렇게 소스와 같이 올리니..

보시고 방법을 갈켜 주시면 감사 하겠습니다.

현재는 다른 또하나의 테이블에 연결만 된상태입니다.

[소스]



procedure Tfrmjoin.Button3Click(Sender: TObject);

var wk_cd:string;

var qk_cd:string;

var a_id:string;

var a_uname:string;

var a_acnumber:string;

var a_dept:string;

var a_acktime:string;



begin

wk_cd:=Table1CARDNUM.FieldName;

qk_cd:=table2cardid.fieldname;



WITH Query1 do BEGIN

CLOSE;

SQL.Clear;

SQL.ADD('SELECT *');

sql.add(' FROM cardid, alarm, test_bms');

Sql.Add(' WHERE :qkcd = :wkcd');

parambyname('wkcd').asstring := wk_cd;

parambyname('qkcd').asstring := qk_cd;

OPEN;

FIRST;

END;



with frmjoin.Query1 do begin

Sql.Clear;

Sql.Add('INSERT INTO test_bms ( id, uname, acnumber, dept, acktime)');

Sql.Add(' VALUES (:a_id, :a_uname, :A_acnumber, :A_dept, :A_acktime)');

// Param Data

ParamByName('A_id').asstring := Table2CARDID.text;

ParamByName('A_uname' ).asstring := Table2NAME.text;

ParamByName('A_acnumber' ).asstring := Table2ANUMBER.text;

ParamByName('A_dept' ).asstring := Table2DEPT.text;

ParamByName('A_acktime' ).asstring := Table1ATIME.text;



ExecSQL;

end;



end;



procedure Tfrmjoin.Button2Click(Sender: TObject);

begin

frmjoin.close;

end;



procedure Tfrmjoin.FormClose(Sender: TObject; var Action: TCloseAction);



begin

ACTION:=caFree;

end;



end.



3  COMMENTS
  • Profile
    하기 2001.08.30 20:53
    지금방법대로라면...

    WITH Query1 do BEGIN

    ...

    FIRST;

    END;

    이렇게 하셨으니까... Insert도 마지막까지 하셔야 할것 같군요...

    while not Query1.Eof do

    begin

    with frmjoin.Query1 do

    begin

    ...

    Sql.Add('INSERT INTO test_bms ( id, uname, acnumber, dept, acktime)');

    ...

    ExecSQL;

    end;

    Query1.Next;

    end;

    이런식으로요...







    병아리 wrote:

    > 안녕하십니까..

    > .

    > 다름이 아니라

    > 쿼리를 사용하여 다른 두테이블의 필요한 컬럼을 선택하여서 다른 또하나의 테이블에 썰려고 합니다.

    > 이때 잘 몰라 가지고 테이블도 세개나 쓰고 쿼리도 두개나 쓰고 하였습니다. 고수님들의 조언을 듣고저 이렇게 소스와 같이 올리니..

    > 보시고 방법을 갈켜 주시면 감사 하겠습니다.

    > 현재는 다른 또하나의 테이블에 연결만 된상태입니다.

    > [소스]

    >

    > procedure Tfrmjoin.Button3Click(Sender: TObject);

    > var wk_cd:string;

    > var qk_cd:string;

    > var a_id:string;

    > var a_uname:string;

    > var a_acnumber:string;

    > var a_dept:string;

    > var a_acktime:string;

    >

    > begin

    > wk_cd:=Table1CARDNUM.FieldName;

    > qk_cd:=table2cardid.fieldname;

    >

    > WITH Query1 do BEGIN

    > CLOSE;

    > SQL.Clear;

    > SQL.ADD('SELECT *');

    > sql.add(' FROM cardid, alarm, test_bms');

    > Sql.Add(' WHERE :qkcd = :wkcd');

    > parambyname('wkcd').asstring := wk_cd;

    > parambyname('qkcd').asstring := qk_cd;

    > OPEN;

    > FIRST;

    > END;

    >

    > with frmjoin.Query1 do begin

    > Sql.Clear;

    > Sql.Add('INSERT INTO test_bms ( id, uname, acnumber, dept, acktime)');

    > Sql.Add(' VALUES (:a_id, :a_uname, :A_acnumber, :A_dept, :A_acktime)');

    > // Param Data

    > ParamByName('A_id').asstring := Table2CARDID.text;

    > ParamByName('A_uname' ).asstring := Table2NAME.text;

    > ParamByName('A_acnumber' ).asstring := Table2ANUMBER.text;

    > ParamByName('A_dept' ).asstring := Table2DEPT.text;

    > ParamByName('A_acktime' ).asstring := Table1ATIME.text;

    >

    > ExecSQL;

    > end;

    >

    > end;

    >

    > procedure Tfrmjoin.Button2Click(Sender: TObject);

    > begin

    > frmjoin.close;

    > end;

    >

    > procedure Tfrmjoin.FormClose(Sender: TObject; var Action: TCloseAction);

    >

    > begin

    > ACTION:=caFree;

    > end;

    >

    > end.

    >

  • Profile
    병아리 2001.08.30 23:08
    그래도 안되는데요...





    하기 wrote:

    > 지금방법대로라면...

    > WITH Query1 do BEGIN

    > ...

    > FIRST;

    > END;

    > 이렇게 하셨으니까... Insert도 마지막까지 하셔야 할것 같군요...

    > while not Query1.Eof do

    > begin

    > with frmjoin.Query1 do

    > begin

    > ...

    > Sql.Add('INSERT INTO test_bms ( id, uname, acnumber, dept, acktime)');

    > ...

    > ExecSQL;

    > end;

    > Query1.Next;

    > end;

    > 이런식으로요...

    >

    >

    그래도 안되는데요...

  • Profile
    하기 2001.08.31 00:49
    이런식으로 해보세요...

    while문의 Parameter 가...

    frmjoin.Query1와 위의 Query1은 다른 Query 이여야 하고요...

    그래도 안되면 일단 SQL Explorer로 위의 Query1부분을 실행해 보시고요...

    결과가 나타나면 거기서 Insert해 줄 Field를 기억해 두셨다가...

    While문안의 Parameter부분과 비교해 보세요...

    맨처음 Table의 FieldName대입부분은 없에 버렸습니다 ^^;



    WITH Query1 do BEGIN

    CLOSE;

    SQL.Clear;

    SQL.ADD('SELECT * FROM cardid A, alarm B');

    Sql.Add(' WHERE A.CardNum = B.Cardid ');

    OPEN;

    FIRST;

    END;

    while Not Query1.Eof do

    begin

    with frmjoin.Query1 do begin

    Sql.Clear;

    Sql.Add('INSERT INTO test_bms ( id, uname, acnumber, dept, acktime)');

    Sql.Add(' VALUES (:a_id, :a_uname, :A_acnumber, :A_dept, :A_acktime)');

    ParamByName('A_id').asstring := Query1.FieldByName('Cardid').AsString;

    ParamByName('A_uname' ).asstring := Query1.FieldByName('Name').AsString;

    ParamByName('A_acnumber' ).asstring := Query1.FieldByName('ANUMBER').AsString;

    ParamByName('A_dept' ).asstring := Query1.FieldByName('DEPT').AsString;

    ParamByName('A_acktime' ).asstring := Query1.FieldByName('ATIME').AsString;

    ExecSQL;

    end;

    Query1.Next;

    end;



    Insert일때는 Key가 중복되었나를 Check해 주셔야 합니다.

    위의 While문은 추가하려는 DB에 같은 Data가 한건도 없다는 가정하에 하시는것이고요

    대충 틀린부분은 한번 수정해 보세요...

    답이 어렵지요... 어쨌든 안되는 부분은...

    맨위의 Query의 Select가 제대로 되었는가 하는것이고요...

    두번째는 Insert하는 Parameter값이 Query한 Query1의 값을 넣어줘야 한다는것이거든요.

    제가 설명을 잘 못해서리... 그럼 열심히~~ ^^;