안녕하십니까? 전봉수입니다.
파라독스로 프로그램 에서 파이어버드 인터베이스 IBQUERY 전환하여 프로그램을 배우면서 전에 파라독스 QUWRY 로 만들었던 프로그램을 파이어버드 인터베이스 IBQUERY 로 다시 프로그램을 하던중 문제가 생겼습니다. 아래 유틸리티는 파라독스에서는 링크가 잘되어 무리없이 사용했는데요 파이어버드 인터베이스 IBQUERY 프로그램에서는 입력창에 문자를 입력하면 예러가 3번씩이나 납니다. 좀 황당한 질문이겠지만 제가 프로그램하면서 자재 입/출고 나 현재고 DB에서 연산되는 일들을 거의 아래 유틸에서 링크하여 사용하다보니 막막합니다. 2.3차 에러는 종료후에 납니다.
에러메세지도 첨부하오니 골치아프시다고 그냥 지니치지 마시고 꼭 문제를 풀어주셨으면 고맙겠습니다.
운영체제 WINXP 델파이 7.0 파이어버드 2.1을 사용하고 있습니다.
// 공종코드가 입력되면 공종명이 자동으로 입력창으로 이동
procedure TFEM5012_F.Ed_QJOB_CODEChange(Sender: TObject);
begin
IF SENDER = ED_QJOB_CODE THEN
Begin
// 공종명
ED_QJOB_TY.Text:= // 링크될 공종명
// 유틸 링크 명령
GET_CODE_DESC('TF_JOB_TY',1,[1],['JOB_CODE'],[TRIM(ED_QJOB_CODE.TEXT)],'JOB_TY');
End;
end;
설명 : Ed_QJOB_CODE 에디터에 공종코드가 입력되면 ED_QJOB_TY.Text에 공종명이 자동으로 링크되는
명령입니다. DB명 : TF_JOB 공종코드 : JOB-CODE 공종명 : JOB_TY
= 유틸 소스 =
unit GOCOMU;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, DBGrids, StdCtrls, ExtCtrls,Grids ,
Db, DBTables, IBDatabase, IBCustomDataSet, IBQuery;
//------------------------------------------------------------------------------
// 해당 테이블에서 지정한 필드의 값을 리턴
// TName : Table Name
// PType : 파라메타 유무 -> 0: 없음, 1:있음
// aPType : 파라메타가 있을 경우 해당 파라메타 타입->1:문자,2->숫자,3->날짜
// aWField : Where 조건에 사용될 필드명.
// aWValue : Where 조건에 사용될 파라메타 값.
// SField : Select 할 필드 이름.
// 결과는 1개의 필드로 문자열로 리턴한다.
// 아직 숫자 및 날짜 타입은 정확히 작동하는지 점검되지 않았으므로 추후 수정될수도 있음.
//------------------------------------------------------------------------------
Function Get_Code_Desc(TName:string;
PType:Byte;
aPType:array of Byte;
aWField,aWValue:array of String;
sField :string):string;
//------------------------------------------------------------------------------
implementation
Function Get_Code_Desc(TName:string;
PType:Byte;
aPType:array of Byte;
aWField,aWValue:array of String;
sField :string):string;
var Q1:TIBQUERY;
IBDatabase: TIBDatabase;
iCount:Byte;
sSql,sValue:string;
wYear,wMonth,wDay:Word;
begin
//Parametar가 있다고 했는데 첫번째 Parametar가 없는경우
if (PType = 1) and ((Trim(aWField[0])='') or (Trim(aWValue[0])='')) then
begin
Result := '';
Exit;
end;
Q1 := TIBQUERY.Create(Application); // IBQuery Q1생성
Q1.DATABASE:=IBDatabase; <- 1차 에러
Q1.Sql.Clear; // Q1 초기화
Case PType of
0: sSql := 'Select '+ sField + ' from '+TName;//Parametar가 없을시
1: //Parametar가 있을시
begin
sSql := 'Select '+ sField + ' from '+TName;
sValue := ' Where ';
for iCount := Low(aWField) to High(aWField) do
begin
Case aPType[iCount] of
1: sValue := sValue + Format('%s = ''%s'' ',[aWField[iCount],aWValue[iCount]]);
2: sValue := sValue + Format('%s = %s ',[aWField[iCount],aWValue[iCount]]);
3: begin
DecodeDate(StrToDate(aWValue[iCount]),wYear,wMonth,wDay);
sValue := sValue +' ((Extract (Year From '+aWField[iCount]+') = '+IntToStr(wYear)+')'+
' and (Extract (Month From '+aWField[iCount]+') ='+IntToStr(wMonth)+')'+
' and (Extract (Day From '+aWField[iCount]+') ='+IntToStr(wDay)+')) ';
end;
end;
sValue := sValue + ' and ';
end;
if Length(Trim(sValue)) = 5 then sValue := ' '
else
if Length(Trim(sValue)) > 5 then sValue := Copy(Trim(sValue),1,Length(Trim(sValue))-3);
sSql := sSql + ' '+sValue;
end;
end;
// Showmessage(sSql);
Q1.Sql.Add(sSql);
Q1.Open;
Result := Q1.Fields[0].asstring;
Q1.Close;
Q1.Free;
end;
end.
Access Violation... 님 정도 실력이면 이 정도 에러는 셀 수도없이 보았을텐데요... 해결을 못하시는 것이 참으로 이상하군요...
Q1 := TIBQUERY.Create(Application); // IBQuery Q1생성
Q1.DATABASE:=IBDatabase; <- 1차 에러
Q1.Sql.Clear; // Q1 초기화
1차에러라고 쓰인부분에서 IBDatabase는 선언만 하고 생성은 하지 않으셨군요. 에러날 수 밖에 없는 상황이지 않나요?
IBDatabase 생성하고 디비관련설정을 해주세요.