Q&A

  • [질문]파라독스에서되던것이 파이어버드에서 왜 안될까요?


안녕하십니까? 전봉수입니다.
파라독스로 프로그램 에서 파이어버드 인터베이스 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.
8  COMMENTS
  • Profile
    최용일 2010.06.08 03:28
    안되도록 코딩하셨으니 안되겠죠...

    Access Violation... 님 정도 실력이면 이 정도 에러는 셀 수도없이 보았을텐데요... 해결을 못하시는 것이 참으로 이상하군요...

    Q1 := TIBQUERY.Create(Application); // IBQuery Q1생성
    Q1.DATABASE:=IBDatabase; <- 1차 에러
    Q1.Sql.Clear; // Q1 초기화

    1차에러라고 쓰인부분에서 IBDatabase는 선언만 하고 생성은 하지 않으셨군요. 에러날 수 밖에 없는 상황이지 않나요?
    IBDatabase 생성하고 디비관련설정을 해주세요.
  • Profile
    전봉수 2010.06.08 04:25
    최용일님 답변 고맙습니다.
    매번 신세를 지는군요
    델파이를 체계적으로 못배원서 대입하거나 응용하는것은 잘 모릅니다. 그저 제가하는 프로그램에서 무었을 어떻게 해야하는데않되면 질답란에 문의하여 답변을 주신분들의 답변 내용을 뜻도 모르면서 적용하다보니 저도 한심한 생각이 듭니다. 그러나 답변주신 내용을 시간이 지나면 다는 모르지만 조금은이하여 가면서 프로그램을 배우고 있습니다.
    아래에 제나름대로 IBdatabase 생성을 한다고 버벅대다가 도저히 저의 실력으로는 감당할수없어 디시한번 부탁드립니다. 좀더 자세한답변 부탁드립니다.

    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생성
    IBDatabase := TIBDatabase.Create(Application); // IBDatabase Q1생성 <- 새로 생성한 부분
    //Q1 := TIBDatabase.Create(Application); // IBDatabase Q1생성
    Q1.DataBase := IBdatabase; // Q1의 DataBaseName 정의
    Q1.Sql.Clear; // Q1 초기화
    Case PType of
    0: sSql := 'Select '+ sField + ' from '+TName;//Parametar가 없을시
    1: begin //Parametar가 있을시
    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;
  • Profile
    최용일 2010.06.08 05:41
    모르시겠으면 델파이 3대 사이트에서 검색을 하세요.
  • Profile
    전봉수 2010.06.08 07:50
    3대 사이트에서 몇칠 밤낮으로 찾아봤으나 이것저것 비슷한게 있어서 적용을 해봤으나 않되니까 답변을 들을려고 하는것인데 좀 아시면 가르처주십시요.
    델파이 프로그램을 한다면 이정도는 알아야하는데 아직 초보를 벗어나지 못한것 같습니다. 죄종합니다.
  • Profile
    최용일 2010.06.08 17:03
    델마당에 올리신 질문을 보면 에러코드가 D:\Project\Equip\Equip.FDB <--이 파일을 찾을 수 없다고 나오는데요...
    저 패스에 파일이 있는지 확인해보세요.
    저 파일이 있다면 IBConsole같은 파이어버드 유틸리티를 이용해서 접속이 되는가 확인해보세요.
  • Profile
    전봉수 2010.06.08 18:21
    최용일님 답번 감사합니다.
    님의 말씀대로 IBconsole_1.1.0.27버전을 밭아서 열어보니까 접속이 잘 됩니다. 그리고 폼이 있는 프로그램에서는 이상없이 잘 돌아 갑니다.
    그리고 서버에서 리모트로 클라이언트도 이상없이 접속이 잘됩니다. 파라독스에서는 거의 이 유틸리티에 의존하여 프로그램을 하였습니다.
    네트워크 접속 문제만 없으면 차라리 파라독스로 다시 돌아가고싶은 심정입니다.
  • Profile
    최용일 2010.06.08 19:13
    로컬이라면 아래 세가지로 테스트해보세요.
    D:\Project\Equip\Equip.FDB
    :D:\Project\Equip\Equip.FDB
    127.0.0.1D:\Project\Equip\Equip.FDB

    폼이 있는 프로그램에서는 잘 돌아간다면 폼이 있는 프로그램에서의 설정을 생성한 TIBDatabas에 넣으세요.
  • Profile
    김현학 2010.06.09 01:23
    좋은자료인것같습니다.
    저도 인터베이스도 잘 모르지만