Q&A

  • [재질문]최해룡님 한번더 봐주세요(조인문제..)
님이 말한대로 하니 건물명이 나오더군요...

설명이 모자란거 같아서 다시 설명해볼께요.. 귀찮아도 읽어주세요 (__)



일단... gun_me와 code1이라는BD화일이 각각 하나씩 있습니다..

헷갈릴까봐 약간 수정했구요.. ^^*



gun_me의 필드에는

s_no(번호),s_sp1(대분류),s_sp2(중분류),s_sp3(소분류), s_name(건물이름),

s_siid(시코드), s_guid(구코드), s_doid(동코드), s_bungi(번지), s_bungi1(번지1), s_phone(전화번호), s_x(위치x), s_y(위치y)

이렇게 있습니다.



code1의 필드에는

siid, guid, dogid, t_name

(시코드)(구코드)(동코드)(시,군,동명)

이렇게 있어요..



여기서 gun_me의(s_siid, s_guid, s_doid)와 code1(siid, guid, dogid)의 코드를 조인시켜 결과값을 따져서 code1의 시나 구,동의 이름(t_name)을 화면에 뿌리고 싶었거든요



그래서 쿼리(Qry_Coord)의 SQL란에는

Select B.t_name as si_name, A.s_siid,

C.t_name as gu_name, A.s_guid,

D.t_name as dong_name, A.s_doid

From gun_me A, code1 B, code1 C, code1 D

Where (A.s_siid = B.siid and B.guid = '00' and B.dogid = '00') and

(A.s_guid = C.guid and A.s_siid = C.siid and C.dogid = '00') and

(A.s_siid = D.siid and A.s_guid = D.guid and A.s_doid = D.dogid)

이렇게 조인문을 선언했어요



------------------------------------

siid guid dogid t_name

------------------------------------

13 00 00 대구광역시

13 11 00 남구

13 11 01 대명동



예를들어 gun_me의 s_siid, s_guid, s_doid가 각각 13, 11, 01이라면

조건식으로 따져서

시코드 13이고 구,동코드가 00이면 대구광역시..

시코드 13이고 구11이고 동이00이면 남구

시코드 13이고 구11이고 동이01이면 대명동



이렇게 뒤에 이름을 나타내고 싶어서 si_name, gu_name, dong_name로

나타냈습니다.



그래서 코딩한 내용이....

//========================================================

// 정보를 select한다

//========================================================

Procedure TCoordFrm.Selectinfo;

begin



with Qry_Coord do begin

Close;

SQL.Clear;



SQL.Add('Select s_no, s_sp1, s_sp2, s_sp3, s_name, s_siid,

SQL.Add(' s_guid, s_doid, s_bungi, ');

SQL.Add(' s_bungi1, s_phone,s_x, s_y ');

SQL.Add(' from gun_me ');



Open;

end; // with..

end;



*********> 위에서는 gun_me의 필드에서 값을 가져오게끔 했습니다.



//========================================================

// 바뀔때마다 데이터값을 화면에 보여준다...

//========================================================

procedure TCoordFrm.DataSource1DataChange(Sender: TObject; Field: TField);

begin

with Qry_Coord do begin

edt_me.text := FieldByName('s_no').AsString;

edt_name.text := FieldByName('s_name').AsString;

edt_gubncode1.text := FieldByName('s_sp1').AsString;

edt_gubncode2.text := FieldByName('s_sp2').AsString;

edt_gubncode3.text := FieldByName('s_sp3').AsString;

edt_sido.Text := FieldByName('si_name').AsString;

edt_gubn.Text := FieldByName('gu_name').AsString;

edt_dong.Text := FieldByName('dong_name').AsString;

edt_sidocode.text := FieldByName('s_siid').AsString;

edt_gubncode.text := FieldByName('s_guid').AsString;

edt_dongcode.text := FieldByName('s_doid').AsString;

edt_bungi1.text := FieldByName('s_bungi').AsString;

edt_bungi2.text := FieldByName('s_bungi1').AsString;

edt_phone.text := FieldByName('s_phone').AsString;

edt_coordX.text := InttoStr(FieldByName('s_x').AsInteger);

edt_coordY.text := InttoStr(FieldByName('s_y').AsInteger);

end;

end;



***********> 여기선 gun_me와 code1의 쿼리문(조인식)으로 인해

si_name, gu_name, dong_name이라고 적어줬습니다. edt_sidocode, gubncode, dongcode엔 원래의 코크값이 들어가게 했습니다.



님이 말한대로 s_name라고 적어서 실행시키니깐 edt_name의 란과 같은 값이 화면에 나타나네요.. edt_name란이 s_name라서 그런가 봐요...



어떻게 해야할지... 하루하루 막막하기만 하네요..



4  COMMENTS
  • Profile
    최혜룡 2001.05.22 20:51
    gun_me 테이블에 있는 시,구,동코드를

    code1 테이블과 연결한 후

    해당 시,구,동명을 얻고자 한다는것같군요

    근데, Selectinfo에는 조인을 하지않고 gun_me만 읽고 있네요

    님이 기술한 조인쿼리를 Qry_Coord에 기술하시고

    Qry_Coord 컴포넌트를 더블클릭하면 필드를 추가하는 창이 나타납니다

    필드를 모두 추가하세요

    그럼 Qry_CoordT_Name, .. 이런식으로 필드가 생성될겁니다

    참고로 쿼리콤포이름은 M_ 이런식으로 명명하면

    M_TName ,, 이런 필드들이 되겠죠

    그럼 DataSource1DataChange이벤트에서

    edtDongName.Text := M_Dong_Name.Value;

    등으로 코딩하시고...

    규모가 크질수록 칼럼을 등록해서 작업하는게 여러모로 편리합니다.





    허접초보 wrote:

    > 님이 말한대로 하니 건물명이 나오더군요...

    > 설명이 모자란거 같아서 다시 설명해볼께요.. 귀찮아도 읽어주세요 (__)

    >

    > 일단... gun_me와 code1이라는BD화일이 각각 하나씩 있습니다..

    > 헷갈릴까봐 약간 수정했구요.. ^^*

    >

    > gun_me의 필드에는

    > s_no(번호),s_sp1(대분류),s_sp2(중분류),s_sp3(소분류), s_name(건물이름),

    > s_siid(시코드), s_guid(구코드), s_doid(동코드), s_bungi(번지), s_bungi1(번지1), s_phone(전화번호), s_x(위치x), s_y(위치y)

    > 이렇게 있습니다.

    >

    > code1의 필드에는

    > siid, guid, dogid, t_name

    > (시코드)(구코드)(동코드)(시,군,동명)

    > 이렇게 있어요..

    >

    > 여기서 gun_me의(s_siid, s_guid, s_doid)와 code1(siid, guid, dogid)의 코드를 조인시켜 결과값을 따져서 code1의 시나 구,동의 이름(t_name)을 화면에 뿌리고 싶었거든요

    >

    > 그래서 쿼리(Qry_Coord)의 SQL란에는

    > Select B.t_name as si_name, A.s_siid,

    > C.t_name as gu_name, A.s_guid,

    > D.t_name as dong_name, A.s_doid

    > From gun_me A, code1 B, code1 C, code1 D

    > Where (A.s_siid = B.siid and B.guid = '00' and B.dogid = '00') and

    > (A.s_guid = C.guid and A.s_siid = C.siid and C.dogid = '00') and

    > (A.s_siid = D.siid and A.s_guid = D.guid and A.s_doid = D.dogid)

    > 이렇게 조인문을 선언했어요

    >

    > ------------------------------------

    > siid guid dogid t_name

    > ------------------------------------

    > 13 00 00 대구광역시

    > 13 11 00 남구

    > 13 11 01 대명동

    >

    > 예를들어 gun_me의 s_siid, s_guid, s_doid가 각각 13, 11, 01이라면

    > 조건식으로 따져서

    > 시코드 13이고 구,동코드가 00이면 대구광역시..

    > 시코드 13이고 구11이고 동이00이면 남구

    > 시코드 13이고 구11이고 동이01이면 대명동

    >

    > 이렇게 뒤에 이름을 나타내고 싶어서 si_name, gu_name, dong_name로

    > 나타냈습니다.

    >

    > 그래서 코딩한 내용이....

    > //========================================================

    > // 정보를 select한다

    > //========================================================

    > Procedure TCoordFrm.Selectinfo;

    > begin

    >

    > with Qry_Coord do begin

    > Close;

    > SQL.Clear;

    >

    > SQL.Add('Select s_no, s_sp1, s_sp2, s_sp3, s_name, s_siid,

    > SQL.Add(' s_guid, s_doid, s_bungi, ');

    > SQL.Add(' s_bungi1, s_phone,s_x, s_y ');

    > SQL.Add(' from gun_me ');

    >

    > Open;

    > end; // with..

    > end;

    >

    > *********> 위에서는 gun_me의 필드에서 값을 가져오게끔 했습니다.

    >

    > //========================================================

    > // 바뀔때마다 데이터값을 화면에 보여준다...

    > //========================================================

    > procedure TCoordFrm.DataSource1DataChange(Sender: TObject; Field: TField);

    > begin

    > with Qry_Coord do begin

    > edt_me.text := FieldByName('s_no').AsString;

    > edt_name.text := FieldByName('s_name').AsString;

    > edt_gubncode1.text := FieldByName('s_sp1').AsString;

    > edt_gubncode2.text := FieldByName('s_sp2').AsString;

    > edt_gubncode3.text := FieldByName('s_sp3').AsString;

    > edt_sido.Text := FieldByName('si_name').AsString;

    > edt_gubn.Text := FieldByName('gu_name').AsString;

    > edt_dong.Text := FieldByName('dong_name').AsString;

    > edt_sidocode.text := FieldByName('s_siid').AsString;

    > edt_gubncode.text := FieldByName('s_guid').AsString;

    > edt_dongcode.text := FieldByName('s_doid').AsString;

    > edt_bungi1.text := FieldByName('s_bungi').AsString;

    > edt_bungi2.text := FieldByName('s_bungi1').AsString;

    > edt_phone.text := FieldByName('s_phone').AsString;

    > edt_coordX.text := InttoStr(FieldByName('s_x').AsInteger);

    > edt_coordY.text := InttoStr(FieldByName('s_y').AsInteger);

    > end;

    > end;

    >

    > ***********> 여기선 gun_me와 code1의 쿼리문(조인식)으로 인해

    > si_name, gu_name, dong_name이라고 적어줬습니다. edt_sidocode, gubncode, dongcode엔 원래의 코크값이 들어가게 했습니다.

    >

    > 님이 말한대로 s_name라고 적어서 실행시키니깐 edt_name의 란과 같은 값이 화면에 나타나네요.. edt_name란이 s_name라서 그런가 봐요...

    >

    > 어떻게 해야할지... 하루하루 막막하기만 하네요..

    >

  • Profile
    허접초보 2001.05.22 23:32
    또다시 귀찮게 해서 죄송합니다... 근데 아직도 무언가가 문제가 있는듯 합니다

    님이 말씀하신대로 조인쿼리를 Qry_coord에 기술했구요 (왼쪽 propetise의 SQL클릭해서

    집어 넣는거 맞죠?)

    더블클릭해서 필드를 추가하는 창에 추가하니깐..

    si_name, gu_name, dong_name, s_siid, s_guid, s_doid이렇게6개가 생겼습니다.

    각각의 name은

    Qry_Coordsi_name, Qry_Coordgu_name, Qry_Coorddong_name, Qry_Coords_siid,

    Qry_Coords_guid, Qry_Coords_doid라고 나오더군요..



    Qry_CoordT_name라는것이 안보여서 전 그냥

    Qry_Coordsi_name, Qry_Coordgu_name, Qry_Coorddong_name이것들을

    M_si_name, M_gu_name, M_dong_name라고 바꾸고

    DataSource1DataChange이벤트에서



    edt_me.text := FieldByName('s_no').AsString;

    edt_name.text := FieldByName('s_name').AsString;

    edt_gubncode1.text := FieldByName('s_sp1').AsString;

    edt_gubncode2.text := FieldByName('s_sp2').AsString;

    edt_gubncode3.text := FieldByName('s_sp3').AsString;



    edt_sido.Text := FieldByName('si_name').AsString;

    edt_gubn.Text := FieldByName('gu_name').AsString;

    edt_dong.Text := FieldByName('dong_name').AsString;



    edt_sidocode.text := FieldByName('s_siid').AsString;

    edt_gubncode.text := FieldByName('s_guid').AsString;

    edt_dongcode.text := FieldByName('s_doid').AsString;

    edt_bungi1.text := FieldByName('s_bungi').AsString;

    edt_bungi2.text := FieldByName('s_bungi1').AsString;

    edt_phone.text := FieldByName('s_phone').AsString;

    edt_coordX.text := InttoStr(FieldByName('s_x').AsInteger);

    edt_coordY.text := InttoStr(FieldByName('s_y').AsInteger);



    이것을



    edt_me.text := FieldByName('s_no').AsString;

    edt_name.text := FieldByName('s_name').AsString;

    edt_gubncode1.text := FieldByName('s_sp1').AsString;

    edt_gubncode2.text := FieldByName('s_sp2').AsString;

    edt_gubncode3.text := FieldByName('s_sp3').AsString;



    edt_sido.Text := M_si_name.Value;

    edt_gubn.Text := M_gu_name.Value;

    edt_dong.Text := M_dong_name.Value;



    edt_sidocode.text := FieldByName('s_siid').AsString;

    edt_gubncode.text := FieldByName('s_guid').AsString;

    edt_dongcode.text := FieldByName('s_doid').AsString;

    edt_bungi1.text := FieldByName('s_bungi').AsString;

    edt_bungi2.text := FieldByName('s_bungi1').AsString;

    edt_phone.text := FieldByName('s_phone').AsString;

    edt_coordX.text := InttoStr(FieldByName('s_x').AsInteger);

    edt_coordY.text := InttoStr(FieldByName('s_y').AsInteger);

    이렇게 바꿨습니다...



    근데 결과는 역시 Qry_Coord:Field 'si_name'not found라고 나오네요..

    제가 한것에 무슨 문제가 있는걸까요?

    M_si_name의 fieldName은 si_name라고 나오구요

    DisplayLabel도 si_name라고 나오네요..

    필드 네임을 다른걸로 바꿔도 (B.T_name, code1.T_name 등등을 해도)

    못찾는다는 에러가...

    계속 귀찮게 해서 죄송합니다..



    아차 그리고 마음대로 이름을 바꿔적어서 죄송합니다 최혜룡님 (__)



    최혜룡 wrote:

    > gun_me 테이블에 있는 시,구,동코드를

    > code1 테이블과 연결한 후

    > 해당 시,구,동명을 얻고자 한다는것같군요

    > 근데, Selectinfo에는 조인을 하지않고 gun_me만 읽고 있네요

    > 님이 기술한 조인쿼리를 Qry_Coord에 기술하시고

    > Qry_Coord 컴포넌트를 더블클릭하면 필드를 추가하는 창이 나타납니다

    > 필드를 모두 추가하세요

    > 그럼 Qry_CoordT_Name, .. 이런식으로 필드가 생성될겁니다

    > 참고로 쿼리콤포이름은 M_ 이런식으로 명명하면

    > M_TName ,, 이런 필드들이 되겠죠

    > 그럼 DataSource1DataChange이벤트에서

    > edtDongName.Text := M_Dong_Name.Value;

    > 등으로 코딩하시고...

    > 규모가 크질수록 칼럼을 등록해서 작업하는게 여러모로 편리합니다.

    >

    >

    > 허접초보 wrote:

    > > 님이 말한대로 하니 건물명이 나오더군요...

    > > 설명이 모자란거 같아서 다시 설명해볼께요.. 귀찮아도 읽어주세요 (__)

    > >

    > > 일단... gun_me와 code1이라는BD화일이 각각 하나씩 있습니다..

    > > 헷갈릴까봐 약간 수정했구요.. ^^*

    > >

    > > gun_me의 필드에는

    > > s_no(번호),s_sp1(대분류),s_sp2(중분류),s_sp3(소분류), s_name(건물이름),

    > > s_siid(시코드), s_guid(구코드), s_doid(동코드), s_bungi(번지), s_bungi1(번지1), s_phone(전화번호), s_x(위치x), s_y(위치y)

    > > 이렇게 있습니다.

    > >

    > > code1의 필드에는

    > > siid, guid, dogid, t_name

    > > (시코드)(구코드)(동코드)(시,군,동명)

    > > 이렇게 있어요..

    > >

    > > 여기서 gun_me의(s_siid, s_guid, s_doid)와 code1(siid, guid, dogid)의 코드를 조인시켜 결과값을 따져서 code1의 시나 구,동의 이름(t_name)을 화면에 뿌리고 싶었거든요

    > >

    > > 그래서 쿼리(Qry_Coord)의 SQL란에는

    > > Select B.t_name as si_name, A.s_siid,

    > > C.t_name as gu_name, A.s_guid,

    > > D.t_name as dong_name, A.s_doid

    > > From gun_me A, code1 B, code1 C, code1 D

    > > Where (A.s_siid = B.siid and B.guid = '00' and B.dogid = '00') and

    > > (A.s_guid = C.guid and A.s_siid = C.siid and C.dogid = '00') and

    > > (A.s_siid = D.siid and A.s_guid = D.guid and A.s_doid = D.dogid)

    > > 이렇게 조인문을 선언했어요

    > >

    > > ------------------------------------

    > > siid guid dogid t_name

    > > ------------------------------------

    > > 13 00 00 대구광역시

    > > 13 11 00 남구

    > > 13 11 01 대명동

    > >

    > > 예를들어 gun_me의 s_siid, s_guid, s_doid가 각각 13, 11, 01이라면

    > > 조건식으로 따져서

    > > 시코드 13이고 구,동코드가 00이면 대구광역시..

    > > 시코드 13이고 구11이고 동이00이면 남구

    > > 시코드 13이고 구11이고 동이01이면 대명동

    > >

    > > 이렇게 뒤에 이름을 나타내고 싶어서 si_name, gu_name, dong_name로

    > > 나타냈습니다.

    > >

    > > 그래서 코딩한 내용이....

    > > //========================================================

    > > // 정보를 select한다

    > > //========================================================

    > > Procedure TCoordFrm.Selectinfo;

    > > begin

    > >

    > > with Qry_Coord do begin

    > > Close;

    > > SQL.Clear;

    > >

    > > SQL.Add('Select s_no, s_sp1, s_sp2, s_sp3, s_name, s_siid,

    > > SQL.Add(' s_guid, s_doid, s_bungi, ');

    > > SQL.Add(' s_bungi1, s_phone,s_x, s_y ');

    > > SQL.Add(' from gun_me ');

    > >

    > > Open;

    > > end; // with..

    > > end;

    > >

    > > *********> 위에서는 gun_me의 필드에서 값을 가져오게끔 했습니다.

    > >

    > > //========================================================

    > > // 바뀔때마다 데이터값을 화면에 보여준다...

    > > //========================================================

    > > procedure TCoordFrm.DataSource1DataChange(Sender: TObject; Field: TField);

    > > begin

    > > with Qry_Coord do begin

    > > edt_me.text := FieldByName('s_no').AsString;

    > > edt_name.text := FieldByName('s_name').AsString;

    > > edt_gubncode1.text := FieldByName('s_sp1').AsString;

    > > edt_gubncode2.text := FieldByName('s_sp2').AsString;

    > > edt_gubncode3.text := FieldByName('s_sp3').AsString;

    > > edt_sido.Text := FieldByName('si_name').AsString;

    > > edt_gubn.Text := FieldByName('gu_name').AsString;

    > > edt_dong.Text := FieldByName('dong_name').AsString;

    > > edt_sidocode.text := FieldByName('s_siid').AsString;

    > > edt_gubncode.text := FieldByName('s_guid').AsString;

    > > edt_dongcode.text := FieldByName('s_doid').AsString;

    > > edt_bungi1.text := FieldByName('s_bungi').AsString;

    > > edt_bungi2.text := FieldByName('s_bungi1').AsString;

    > > edt_phone.text := FieldByName('s_phone').AsString;

    > > edt_coordX.text := InttoStr(FieldByName('s_x').AsInteger);

    > > edt_coordY.text := InttoStr(FieldByName('s_y').AsInteger);

    > > end;

    > > end;

    > >

    > > ***********> 여기선 gun_me와 code1의 쿼리문(조인식)으로 인해

    > > si_name, gu_name, dong_name이라고 적어줬습니다. edt_sidocode, gubncode, dongcode엔 원래의 코크값이 들어가게 했습니다.

    > >

    > > 님이 말한대로 s_name라고 적어서 실행시키니깐 edt_name의 란과 같은 값이 화면에 나타나네요.. edt_name란이 s_name라서 그런가 봐요...

    > >

    > > 어떻게 해야할지... 하루하루 막막하기만 하네요..

    > >

  • Profile
    최혜룡 2001.05.23 05:39
    M_ 라는 쿼리콤포 추가 후

    아래의 쿼리를 SQL에 넣습니다

    Select A.*,

    B.T_NAME SINAME,

    C.T_NAME GUNAME,

    D.T_NAME DONGNAME

    From gun_me A, code1 B, code1 C, code1 D

    Where (A.s_siid = B.siid and B.guid = '00' and B.dogid = '00') and

    (A.s_guid = C.guid and A.s_siid = C.siid and C.dogid = '00') and

    (A.s_siid = D.siid and A.s_guid = D.guid and A.s_doid = D.dogid)

    M_콤포를 더블클릭하여 필드모두를 추가합니다

    (GUN_ME테이블에 있는 모든 필드와 시,구,동명필드가 생기겠죠)



    그리고 M_와 연결된 DataSource가 srcM이라고 가정한 후,

    procedure TCoordFrm.srcMDataChange(Sender: TObject; Field: TField);

    begin

    edt_me.text := M_S_NO.Value;

    edt_sido.Text := M_SiName.Value;

    edt_gubn.Text := M_GuName.Value;

    edt_dong.Text := M_DongName.Value;

    edt_sidocode.text := M_SiId.Value;

    edt_gubncode.text := M_DongId.Value;

    edt_coordX.text := M_S_X.AsString;

    edt_coordY.text := M_S_Y.AsString;

    . . . . 기타등등

    end;



    성공하시길..

  • Profile
    허접초보 2001.05.24 20:50
    안녕하세요..

    왜 안됐는지 알았어요 저의 부주의 였습니다...

    시구동의 코드가 탐조하지 않는테이블에선

    13, 1311, 131102 이런식으로 되어 있더군요.. ㅡ.ㅡ;

    당연히 안되게끔....



    님한테까지 폐를 끼쳤군요...

    답변 감사드립니다.