2012-12-28 3 views
1

하나의 마스터 데이터베이스에서 여러 데이터베이스로 데이터를 푸시 할 수있는 데이터 변환 유틸리티를 개발 중입니다. 이 유틸리티는 데이터가 대상 (테이블 구조)에 유지되는 방법을 알지 못하지만 다중 조인 문을 사용하여 복잡한 SQL 쿼리를 사용하여 대상에서 데이터를 반환하는 SQL 문을 작성하고자합니다. 데이터가 ADO 쿼리에서 필드 이름을 인식 할 수있는 표준화 된 형식으로되어있는 한.ADO - 여러 조인 문을 사용하여 복잡한 쿼리의 결과를 편집 할 수 있습니까?

이 ADO 쿼리에서 라이브 데이터를 수정하고 싶습니다. 그러나 여러 조인 문이 있기 때문에 가능한지 확실하지 않습니다. 적어도 BDE (나는 BDE를 한번도 사용하지 못했습니다)를 알고 있습니다. 매우 엄격했으며 모든 필드 (*)를 반환해야했습니다. 내가 아는 ADO는 더 융통성이 있지만,이 경우 얼마나 유연한 지 잘 모릅니다.

다른 테이블의 필드가 결과에 포함될 때 TADOQuery의 데이터를 이러한 방식으로 수정할 수 있습니까? 그리고 그래도 끝까지 새 레코드를 추가하려고한다고 가정하십시오 (TADOQuery.Append). 그것은 두 개의 다른 테이블에 추가할까요?

내가 선택한 기본 테이블에는 동일한 기본 키 필드로 결합 된 보완 테이블이 있으며, 하나는 "작은"테이블 (간단한 정보)이고 다른 하나는 "상세 정보"테이블입니다 (추가 정보 작은 테이블의 각 레코드에 대해). 따라서, 일반적인 문은 다음과 같은 것을 포함 할 것이다 : 다른는 다른 테이블의 레코드에 조인 한 곳입니다

select ts.record_uid, ts.SomeField, td.SomeOtherField from table_small ts 
join table_detail td on td.record_uid = ts.record_uid 

,하지만 나는 그 사람에게 추가에 대해 걱정하지 않아요. 나는 "Small"테이블과 "Detail"테이블에 동시에 추가하는 것에 대해서만 걱정하고 있습니다.

ADO 쿼리에서 그런 일이 가능합니까? 나는 이것을 가능하게하는 데 필요한 어떤 방법 으로든 SQL 문을 수정하고 수정하려고합니다. 나는 그것이 가능하지 않지만 나쁜 감정이 있습니다.

호환성 : 조인에 영향이없는이 필드를 편집

  1. SQL 서버 2000 2008 R2
  2. 델파이 XE2
+2

모든 것을 SQL 저장 프로 시저로 작성한 다음 ADO를 통해 Delphi 프로그램에서 실행할 수 있습니다. –

+0

어쨌든 함께 어울리는 두 테이블을 사용하여 어느 정도는 가능할 것으로 보입니다. 다른 룩업 테이블을 소개 할 때, 그것은 지저분 해지기 시작하고 그 값을 설정할 수 없습니다. 아직도이 데이터를 수정할 수있는 범위를 파악하려고합니다. –

+0

그런 다음 기본 키 필드 (ID 사양)가 완벽하게 일치하는지 확인해야합니다. 둘 중 하나에 쓰기로 결정하면 두 테이블에 추가해야합니다. –

답변

0

라이브 ADO 쿼리 업데이트의 원래 아이디어를 버렸습니다. 머리가 감싸는 것보다 훨씬 복잡해졌습니다.데이터 푸시 프로젝트의 범위가 변경되었으므로 더 이상 문제가되지 않지만 여전히 흥미로운 주제입니다.

응용 프로그램의 새로운 구조는 원래 데이터 집합의 다양한 필드에 여러 "필드 링크"를 연결하는 것으로 구성됩니다. 이러한 각 링크는 원래 필드 이름과 해당 필드를 가져올 때 실행될 SQL 문을 참조합니다. 하나의 필드에 여러 필드 링크가있을 수 있으므로 여러 개의 문을 실행하고 다양한 테이블에 값을 배치 할 수 있습니다. 최종 목표는 원래의 데이터 소스에서 다른 외부 소스로 공통 데이터 세트를 쉽고 반복적으로 내보낼 수있는 앱입니다. 다른 데이터 구조, 응용 프로그램을 다시 컴파일하지 않고도.

그러나 캐싱 된 업데이트의 개념은 나에게 호소력이 없었습니다. RBA의 답변에서 알 수있는 사실은 단순히 데이터베이스에서 데이터를 변경할 수 있다는 것입니다. 그래서 나는 대신 커스터마이징 가능한 데이터 푸시 방법을 통합 할 것입니다.

+0

감각을 알고 :) – RBA

+0

내가 가진 문제의 핵심은 StackOverflow에서 너무 주관적인이 가져 오기 프로세스를 처리하는 가장 이상적인 방법이었습니다. 나는이 질문에 대해 가장 가능성이 높은 경우로 좁혔다. 그러나 나는 그것이 얼마나 어려웠는지보고 난 후에 길을 옮겼습니다. 내 새로운 구조는 잘 진행되고 있으며 내 상황에 이상적입니다. –

6

은 일반적으로 문제가되지 않습니다. 추가하면

procedure TForm.ADSBeforePost(DataSet: TDataSet); 
begin 
    inherited; 
    TCustomADODataSet(DataSet).Properties['Unique Table'].Value := 'table_small'; 
end; 

하여 테이블 중 하나에 추가]를 제한 할 수 있지만 다시 쿼리없이 훨씬 더받지 않습니다 ...입니다. 더 좋은 방법은 절차 별 값을 설정하는 것입니다. BeforePost, Requery 및 Abort에서.

보기 당신이 INSTEAD OF Triggers

2

제리를 사용할 수있을 것입니다 지속 될 경우,

나는 파이어 버드에서 같은 문제가 발생하고, 경험에서 나는 그것이까지 (할 수 있음을 알 수 있습니다 작은 복잡도)를 CachedUpdates을 사용합니다. 아주 좋은 자료는 http://podgoretsky.com/ftp/Docs/Delphi/D5/dg/11_cache.html입니다. 이 기사에는 모든 질문에 대한 답변이 나와 있습니다.

+0

캐싱 된 업데이트에 'BDE'를 사용하지 말고, 'TClientDataSet'으로 제한하십시오. –

+0

@ JeroenWiertPluimers - 좀 더 자세한 답변을 제공해 주시겠습니까? 비슷한 문제가있는 두통도있었습니다. – RBA

+0

Cary Jensen은 캐시 된 업데이트를 포함하여 'TClientDataSet'사용에 관한 훌륭한 책을 저술했습니다. http://www.jensendatasystems.com/cdsbook/ –