2014-04-08 7 views
2

나는 동적으로 다음 코드를 사용하여 TDataSet의에 필드를 추가하고 :방지 중복 열 이름 추가

while not ibSQL.Eof do 
    fieldname := Trim(ibSql.FieldByName('columnnameofchange').AsString); 
    TDataSet.FieldDefs.Add(fieldname , ftString, 255); 
end 

문제는 내가 중복 화면하는 가장 쉬운 방법입니다 그래서 어떤 중복 된 이름을 얻을 수 있다는 것입니다 및 이미 추가 된 중복을 추가하지 마십시오.

각 열 추가에 대해 TDataSet.FieldDefList를 통과하지 않기를 바랄 때마다 모든 단일 열 추가가 지루할 수 있습니다. 그리고 많은 추가가있을 수 있습니다.

가능한 경우 다른 해결책을 제공해주십시오. 그렇지 않으면 FieldDefList 반복을 사용하여 붙어 있습니다.

또한 SQL 조회에서 중복을 선별하는 것은 옵션이지만 원하는 옵션이 아님을 추가합니다.

감사

답변

4

는 주어진 이름의 필드가 없을 때 -1을 반환하는 IndexOf 메서드를 가지고 있습니다.

+0

find 메소드를 시도했지만 "Field 'columnnameofchange'not Found"라고 표시된 첫 번째 find 시도에서 GUI 메시지가 표시되고 프로 시저가 해당 트랙에서 중지되고 SQL에서 더 이상 recordsin을 처리하지 않습니다. if fDataSet.FieldDefs.Find (fieldname) = nil then fDataSet.FieldDefs.Add (fieldname, ftString, 255); –

+0

당신이 옳습니다. TDefCollection의 상속 된 Find 메서드로 오도되었습니다. 이 경우 IndexOf를 시도하고 -1을 확인하십시오. –

+0

예, 그렇습니다. 감사 –

1

내가 그것을 작성을 마무리 어쨌든이 게시하지만, 명확하게 쿼리를 선별하고있어이 문제에 대한 내 취향이었다.

당신의 목표에 대해 이해하는 데 어려움을 겪고 있습니다. 귀하의 질문에 대답하지 않으면 저를 용서해주십시오. 또한 델파이를 정기적으로 사용한지 수년이 지났기 때문에 이것은 명확한 답변이 아닙니다.

사용중인 경우 TADOQuery 같은 것을 할 내 해결을 기대하게했다 (또는 무엇이든 TDataSet의 당신이 사용하고있는) : 자동으로 대신 AlternateName를 사용하는 점

//SQL 
SELECT 
    a.field1, 
    a.... , 
    a.fieldN, 
    b.field1 as "AlternateName" 
FROM 
    Table a INNER JOIN Table b 
WHERE ... 

로를 field1 (따라서 인덱스로 작업하거나 열의 이름을 바꾸는 충돌이 발생합니다.)

필자가 테이블을 열어 쓰는 것은 분명히 좋은 해결책은 아닙니다 .Delphi에 대한 저의 경험으로 볼 때 대부분의 어려움 간단한 SQL 트릭으로 제거 할 수 있습니다. 들판에서 노는 시간을 낭비 할 필요가 없었습니다.

기본적으로 이것은 목적지 대신 소스에서하고있는 일을 수행하는 것만으로도 쉽게 업데이트 할 수 있습니다.

+0

쿼리에서 열 이름을 조정하는 올바른 방법을 설명하지만이 질문에 설명 된 문제와는 아무런 관련이 없습니다.제공된 소스를 살펴보면 한 열의 내용에서 "필드 이름"을 가져온 결과 세트가 반복된다는 것을 알 수 있습니다. 사실 "필드 이름"은 검색된 데이터를 나타냅니다. –

+0

예, 문제와 관련이 없습니다. 충돌은 데이터에서 허용 가능하며 많은 수직 데이터 열을 한 개의 넓은 수평 행으로 바꾼다는 것을 눈치 챘을 때. 그것은 일반적으로 일어나는 일이지만 더 복잡합니다. –

2

정확하게 이해한다면 가장 쉬운 방법은 아마도 기존의 모든 필드 이름을 TStringList에 넣는 것입니다. 그런 다음 새 필드를 추가하기 전에 존재 여부를 확인할 수 있습니다, 당신이 그것을 추가하는 경우 당신은 단순히 목록에 이름을 추가 :

var 
    FldList: TStringList; 
    i: Integer; 
begin 
    FldList := TStringList.Create; 
    try 
    for i := 0 to DataSet.FieldCount - 1 do 
     FldList.Add(DataSet.Fields[i].FieldName); 

    while not ibSQL.Eof do 
    begin 
     fieldname := Trim(ibSql.FieldByName('columnnameofchange').AsString); 
     if FldList.IndexOf(fieldName) = -1 then 
     begin 
     FldList.Add(fieldName); 
     DataSet.FieldDefs.Add(fieldname , ftString, 255); 
     end; 
     ibSQL.Next; 
    end; 
    finally 
    FldList.Free; 
    end; 
end; 
0

것은 내가 할 거라고하는 것은 TStringListSorted := trueDuplicates := dupError 설정을 유지합니다. 각 필드에 대해 try 블록 안에 myStringList.Add(UpperCase(FieldName));을 입력하고 예외가 발생하면 해당 블록이 중복 된 것입니다.

TStringList은 실제로 매우 다양한 클래스입니다. 그것은 항상 당신이 그것을 찾을 수있는 모든 용도에 놀랍습니다 ...

+0

예외를 잡는 대신'TStrings.IndexOf'로 확인해야합니다. –

+1

필요한 필드 이름 만 있으면 dupIgnore로 Stringlist Duplicates를 설정하고 루프 다음에 StringList를 반복하는 FieldDefs를 만들면됩니다. BTW, CaseSensitive를 true로 설정하지 않으면 대문자가 필요하지 않습니다. –