Q&A

  • SQL의 DELETE나 UPDATE시
저의 질문의 3가지 입니다.



첫번째로...

InterBase와 ISQL을 이용해서 프로그램 하구있구여.

IBDataBase, IBTransaction컴퍼넌트를 이용해 서버의 데이타베이스에 접속하고,

DBGrid에 DataSource와 IBDataSet을 연결해서 데이타의 모습을

화면에 계속 보여주는 상탭니다..



그런데 제가 앞선 질문에서 말했듯이, Primary Key를 사용하지 않고

데이터를 선택적으로(즉, DBGrid상에서 레코드를 선택해서 선택한) 레코드를 삭제, 혹은

갱신 작업을 하고 싶습니다.



ex> Name Phone

홍길동 123-4567

홍서범 234-6789 <---- 동명이인인 이 데이터만을 수정, 삭제

김길동 234-3498

홍서범 767-0009



결과적으로 저는 TTable 컴퍼넌트 처럼 자유로운 레코드 이동과 논리적으로 이동된

레코드에서의 작업을 하고 싶은겁니다.



델파이를 애용하시는 여러분의 고귀한 말씀을 기다립니다.



두번째는...



Refresh에 관한 질문입니다.



예를 들어 두개의 테이블을 Join을 통해서 연계시켜 Grid에 보여주는 상태에서,

한쪽의 테이블을 수정했을 경우에, Grid에 Refresh 시켜주는 작업을 이제까지는

SQL컴퍼넌트를 CLOSE, OPEN시켜 주는 작업을 했었거든여...



그런데 그게 다시원래의 커서 위치도 찾아줘야 하구여...좀 귀찮아서여...다른 좋은

방법을 혹시 알고계시다면 좀 일러주시면 감사하겠습니다.



세번째는여...

Query컴퍼넌트의 SQL프로퍼티에 기입할때인데요...대부분의 경우는 Param을



SELECT aaa, bbb from ccc

WHERE aaa = :aaa <---- 이렇게 사용하는데여...



만일 Join한 문장에서는 어떻게 써야할지 모르겠네여...



ex> SELECT A.aaa, A.bbb, B.aaa, B.bbb From AAA A

LEFT OUTER JOIN BBB B On A.aaa = B.aaa

WHERE A.aaa = :A.aaa <-----이건 에러가 생기네여...ㅠ.ㅠ



질문이 넘 많은건지 모르겠네여...고귀한 답변 기다립니다





3  COMMENTS
  • Profile
    허춘 2000.08.16 09:46
    김계성 wrote:

    > 저의 질문의 2가지 입니다.

    >

    > 첫번째로...

    > InterBase와 ISQL을 이용해서 프로그램 하구있구여.

    > IBDataBase, IBTransaction컴퍼넌트를 이용해 서버의 데이타베이스에 접속하고,

    > DBGrid에 DataSource와 IBDataSet을 연결해서 데이타의 모습을

    > 화면에 계속 보여주는 상탭니다..

    >

    > 그런데 제가 앞선 질문에서 말했듯이, Primary Key를 사용하지 않고

    > 데이터를 선택적으로(즉, DBGrid상에서 레코드를 선택해서 선택한) 레코드를 삭제, 혹은

    > 갱신 작업을 하고 싶습니다.

    >

    > ex> Name Phone

    > 홍길동 123-4567

    > 홍서범 234-6789 <---- 동명이인인 이 데이터만을 수정, 삭제

    > 김길동 234-3498

    > 홍서범 767-0009

    >

    > 결과적으로 저는 TTable 컴퍼넌트 처럼 자유로운 레코드 이동과 논리적으로 이동된

    > 레코드에서의 작업을 하고 싶은겁니다.

    >

    > 델파이를 애용하시는 여러분의 고귀한 말씀을 기다립니다.



    인터베이스 구조상 rdb$db_key 라는 히든 필드가 있는데..

    프라이머리 키가 없을땐.. 이것이 그역활을 합니다.

    델파이 기본 인터베이스 컴포넌트가없어서 테스트를 못해보겠는데..

    위의 작업을 하실수있읍니다.





    >

    > 두번째는...

    >

    > Refresh에 관한 질문입니다.

    >

    > 예를 들어 두개의 테이블을 Join을 통해서 연계시켜 Grid에 보여주는 상태에서,

    > 한쪽의 테이블을 수정했을 경우에, Grid에 Refresh 시켜주는 작업을 이제까지는

    > SQL컴퍼넌트를 CLOSE, OPEN시켜 주는 작업을 했었거든여...

    >

    > 그런데 그게 다시원래의 커서 위치도 찾아줘야 하구여...좀 귀찮아서여...다른 좋은

    > 방법을 혹시 알고계시다면 좀 일러주시면 감사하겠습니다.



    DataSet.Refresh 가..안먹습니까 ?



  • Profile
    김계성 2000.08.16 11:00
    > > Refresh에 관한 질문입니다.

    > >

    > > 예를 들어 두개의 테이블을 Join을 통해서 연계시켜 Grid에 보여주는 상태에서,

    > > 한쪽의 테이블을 수정했을 경우에, Grid에 Refresh 시켜주는 작업을 이제까지는

    > > SQL컴퍼넌트를 CLOSE, OPEN시켜 주는 작업을 했었거든여...

    > >

    > > 그런데 그게 다시원래의 커서 위치도 찾아줘야 하구여...좀 귀찮아서여...다른 좋은

    > > 방법을 혹시 알고계시다면 좀 일러주시면 감사하겠습니다.

    >

    > DataSet.Refresh 가..안먹습니까 ?

    >



    제가 SQL에는 좀 서툴러서요...자세히는 모르겠지만 테스트해본 결과로

    Dataset.Refresh는 먹는데요...Refresh기능이 원래 Recordd의 칼럼 Refresh인거 같더군여...

    그럼 결과적으로 SQL Statement로 Refresh시키는 명령에서 Refresh할 칼럼을

    알려 줘야하는데...저는 그 인자를 Param을 사용하거든여...그럼 SQL문장 내부에



    .....

    WHERE aaa = :aaa



    이런 식으로 Param을 지정해 주고 있구여...위의 경우 한 칼럼(데이터)의 refresh는

    가능하지만, 두개 이상의 Table을 연계시킬경우 서로 다른 Table에 같은 Field명이

    존재하기때문에 SQL 문장내에서 Table명에 단일 문자를 할당하는 경우가 문제가

    되더군여



    SELECT P.aaa, A.ppp From Part P

    LEFT OUTER JOIN Apart A ON P.aaa = A.ppp

    WHERE P.aaa = :P.aaa <-----이렇게는 안되서여.....(SQL Dynamic Error...)



    답변 고맙구여...새로운 답변 또 기다립니다....





  • Profile
    허춘 2000.08.16 11:33
    > 제가 SQL에는 좀 서툴러서요...자세히는 모르겠지만 테스트해본 결과로

    > Dataset.Refresh는 먹는데요...Refresh기능이 원래 Recordd의 칼럼 Refresh인거 같더군여...

    > 그럼 결과적으로 SQL Statement로 Refresh시키는 명령에서 Refresh할 칼럼을

    > 알려 줘야하는데...저는 그 인자를 Param을 사용하거든여...그럼 SQL문장 내부에

    >

    > .....

    > WHERE aaa = :aaa

    >

    > 이런 식으로 Param을 지정해 주고 있구여...위의 경우 한 칼럼(데이터)의 refresh는

    > 가능하지만, 두개 이상의 Table을 연계시킬경우 서로 다른 Table에 같은 Field명이

    > 존재하기때문에 SQL 문장내에서 Table명에 단일 문자를 할당하는 경우가 문제가

    > 되더군여

    >

    > SELECT P.aaa, A.ppp From Part P

    > LEFT OUTER JOIN Apart A ON P.aaa = A.ppp

    > WHERE P.aaa = :P.aaa <-----이렇게는 안되서여.....(SQL Dynamic Error...)



    일단 쿠어리 컴포넌트의 리프레쉬는 보통 리패취시켜줍다... 먼가를 바꾸고 리프레쉬를

    해도 업데잇이안돼는건.. 체인지후에 커밋을 안시켜줘서 그럴겁니다.

    그리고 where 문에서 안된다는 부분은.. 패러미터 이름을..다른걸로정해서

    해보시죠.. isql 에선..되는 스테이트입니다.

    ex) :P.aaa --> :aaa

    그리고 open 하시기전에 Query.ParamByName('aaa').asString := aaa값 넣어주시고요.