Q&A

  • Access Violation Error... 해결할 방법을 찾습니다.
안녕하세요. 까마귀입니다.
매출 입력폼을 만들고 있는데요.
마스터를 입력하고 저장한 후, 디테일 데이터를 입력하면 한건 입력후 어떤 동작을 하던지 간에 프로그램이 그냥 종료되어 버립니다.
Access Violation Error 가 걸리는데요.
잘못된 메모리를 참조하는것 같은데, 이유를 알수가 없어요.
어디가 잘못된 것인지 좀 알려주시면 무척 감사하겠습니다.

에러 메세지는요.
Access Violation at 0x4da2ef6d: Read of Address 0xe8da0fe8
혹시나 싶어서 그림으로 저장한 것도 올립니다.
아래는 소스고요.
문제점을 잡아 주실분이 계시면 감사하겠습니다.



                                      위대한 단군혼이 살아있는 나라.... 대한민국.

소스입니다.

unit Sale;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, InHerit1, ToolEdit, StdCtrls, Mask, CurrEdit, Pan3D, ExtCtrls,
  DB, DBTables, Menus, ActnList, Grids, DBGrids, RXDBCtrl, ComCtrls, Buttons;

type
  TFRM_Sale = class(TFRM_InHerit1)
    Bevel2: TBevel;
    Panel1: TPanel;
    PAN_Detail: TPanel;
    Panel3: TPanel;
    E_Country_Id: TEdit;
    E_Country_Name: TEdit;
    DE_Sale_Date: TDateEdit;
    E_Member_Name: TEdit;
    E_Member_Id: TEdit;
    E_Sale_Id: TEdit;
    SpeedButton1: TSpeedButton;
    Pan3D3: TPan3D;
    E_Remark: TEdit;
    Pan3D13: TPan3D;
    Pan3D14: TPan3D;
    Pan3D15: TPan3D;
    Pan3D17: TPan3D;
    Pan3D18: TPan3D;
    Pan3D19: TPan3D;
    Pan3D20: TPan3D;
    Pan3D21: TPan3D;
    CBB_CDivision: TComboBox;
    CBB_RDivision: TComboBox;
    E_Credit_Name: TEdit;
    E_Credit_No: TEdit;
    E_COwner: TEdit;
    E_RName: TEdit;
    E_RTel: TEdit;
    E_RPost: TEdit;
    E_RAddr1: TEdit;
    E_RAddr2: TEdit;
    Pan3D5: TPan3D;
    Pan3D2: TPan3D;
    Pan3D6: TPan3D;
    Pan3D7: TPan3D;
    Pan3D8: TPan3D;
    Pan3D10: TPan3D;
    Pan3D11: TPan3D;
    Pan3D4: TPan3D;
    CE_Sale_Su: TCurrencyEdit;
    CE_Sale_Amt: TCurrencyEdit;
    E_Jepum_Name: TEdit;
    E_Jepum_Id: TEdit;
    E_WareHouse_Name: TEdit;
    E_WareHouse_Id: TEdit;
    CE_SDetail_Id: TCurrencyEdit;
    CE_Sale_Dan: TCurrencyEdit;
    CE_Sale_PV: TCurrencyEdit;
    CE_PV_Amt: TCurrencyEdit;
    Bevel1: TBevel;
    Bevel3: TBevel;
    E_Credit_Id: TEdit;
    SBT_Insert: TSpeedButton;
    SBT_Update: TSpeedButton;
    SBT_Delete: TSpeedButton;
    SBT_View: TSpeedButton;
    SBT_Save: TSpeedButton;
    E_Division: TEdit;
    CE_TotalAmt: TCurrencyEdit;
    E_Center_Id: TEdit;
    E_Center_Name: TEdit;
    CE_TotalPV: TCurrencyEdit;
    DSE_Detail: TDataSource;
    Pan3D12: TPan3D;
    Pan3D1: TPan3D;
    Pan3D16: TPan3D;
    Pan3D23: TPan3D;
    Pan3D24: TPan3D;
    Pan3D9: TPan3D;
    Q_Detail: TQuery;
    procedure FormShow(Sender: TObject);
    procedure DBGDrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure DE_Sale_DateKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure E_Country_NameKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure E_WareHouse_NameKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure E_Jepum_NameKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure E_Member_NameKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure CE_Sale_SuChange(Sender: TObject);
    procedure E_Member_NameChange(Sender: TObject);
    procedure A_SearchExecute(Sender: TObject);
    procedure E_Credit_NameKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure DE_Sale_DateEnter(Sender: TObject);
    procedure E_RAddr2KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure A_InsertExecute(Sender: TObject);
    procedure A_ViewExecute(Sender: TObject);
    procedure SBT_InsertClick(Sender: TObject);
    procedure SBT_UpdateClick(Sender: TObject);
    procedure SBT_DeleteClick(Sender: TObject);
    procedure SBT_ViewClick(Sender: TObject);
    procedure SBT_SaveClick(Sender: TObject);
    procedure CE_Sale_AmtKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure DBGDblClick(Sender: TObject);
    procedure DBGEnter(Sender: TObject);
    procedure DBGKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure E_Center_NameKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure E_RPostKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
    LDataMode : Word;
    procedure Open_Query(); override;
    procedure Open_DQuery();
    procedure Transaction(); override;
    procedure DTransaction();
  public
    { Public declarations }
  end;

var
  FRM_Sale: TFRM_Sale;

implementation

uses Commons, DM, ZipSch;

{$R *.dfm}

//------------------------------------------------------------------------------
// Master Query Open.
//------------------------------------------------------------------------------
procedure TFRM_Sale.Open_Query();
begin
  With Q_Display do
  begin
    DisableControls;
    Close;
    SQL.Clear;
    SQL.Add('Select  S.Sale_Id,         S.Country_Id,         S.CDivision,      ');
    SQL.Add('        S.Credit_Id,       S.Credit_No,          S.Sale_Date,      ');
    SQL.Add('        S.COwner,          S.RDivision,          S.RName,          ');
    SQL.Add('        S.RTel,            R.Credit_Name,        S.Remark,         ');
    SQL.Add('        S.Member_Id,       M.Member_Name,        S.RPost,          ');
    SQL.Add('        C.Country_Name,    S.RAddr1,             S.RAddr2,         ');
    SQL.Add('        S.Center_Id,       C2.Center_Name                          ');
    SQL.Add('From    Sale   S                                                   ');
    SQL.Add('                           INNER JOIN            Country     C     ');
    SQL.Add('                       On (C.Country_Id     =    S.Country_Id)     ');
    SQL.Add('                           INNER JOIN            Member      M     ');
    SQL.Add('                       On (M.Member_Id      =    S.Member_Id)      ');
    SQL.Add('                           INNER JOIN            Center      C2    ');
    SQL.Add('                       On (C2.Country_Id    =    S.Country_Id  and ');
    SQL.Add('                           C2.Center_Id     =    S.Center_Id)      ');
    SQL.Add('                           LEFT  JOIN            Credit      R     ');
    SQL.Add('                       On (R.Country_Id     =    S.Country_Id  and ');
    SQL.Add('                           R.Credit_Id      =    S.Credit_Id)      ');
    SQL.Add('                                                                   ');
    SQL.Add('Where   S.Sale_Id = :Sale_Id                                       ');
    ParamByName('Sale_Id').AsString := E_Sale_Id.Text;
    Prepare;
    Open;
    
    if IsEmpty then  Exit;
    E_Sale_Id.Text          := FieldByName('Sale_Id').AsString;
    E_Member_Id.Text        := FieldByName('Member_Id').AsString;
    E_Member_Name.Text      := FieldByName('Member_Name').AsString;
    E_Country_Id.Text       := FieldByName('Country_Id').AsString;
    E_Country_Name.Text     := FieldByName('Country_Name').AsString;
    E_Center_Id.Text        := FieldByName('Center_Id').AsString;
    E_Center_Name.Text      := FieldByName('Center_Name').AsString;
    E_Credit_Id.Text        := FieldByName('Credit_Id').AsString;
    E_Credit_Name.Text      := FieldByName('Credit_Name').AsString;
    E_Credit_No.Text        := FieldByName('Credit_No').AsString;
    E_COwner.Text           := FieldByName('COwner').AsString;
    CBB_CDivision.ItemIndex := CBB_CDivision.Items.IndexOf(FieldByName('CDivision').AsString);
    CBB_RDivision.ItemIndex := CBB_RDivision.Items.IndexOf(FieldByName('RDivision').AsString);
    E_RName.Text            := FieldByName('RName').AsString;
    E_RTel.Text             := FieldByName('RTel').AsString;
    E_RPost.Text            := FieldByName('RPost').AsString;
    E_RAddr1.Text           := FieldByName('RAddr1').AsString;
    E_RAddr2.Text           := FieldByName('RAddr2').AsString;
    DE_Sale_Date.Text       := FieldByName('Sale_Date').AsString;
    E_Remark.Text           := FieldByName('Remark').AsString;
    EnableControls;
  end;
  Open_DQuery();
end;

//------------------------------------------------------------------------------
// Detail Query Open.
//------------------------------------------------------------------------------
procedure TFRM_Sale.Open_DQuery();
begin
  With Q_Detail do
  begin
    DisableControls;
    Close;
    SQL.Clear;
    SQL.Add('Select  S.Sale_Id,         S.Country_Id,         S.WareHouse_Id,   ');
    SQL.Add('        S.Jepum_Id,        S.Division,                             ');
    SQL.Add('        S.Sale_Su,         S.PV_Amt,             S.Sale_PV,        ');
    SQL.Add('        S.Sale_Dan,        S.Sale_Amt,                             ');
    SQL.Add('        S.SDetail_Id,      W.WareHouse_Name,     J.Jepum_Name      ');
    SQL.Add('From    Sale_Detail  S                                             ');
    SQL.Add('                           INNER JOIN            Country     C     ');
    SQL.Add('                       On (C.Country_Id     =    S.Country_Id)     ');
    SQL.Add('                           INNER JOIN            WareHouse   W     ');
    SQL.Add('                       On (W.Country_Id     =    S.Country_Id      ');
    SQL.Add('                and        W.WareHouse_Id   =    S.WareHouse_Id)   ');
    SQL.Add('                           INNER JOIN            Jepum       J     ');
    SQL.Add('                       On (J.Jepum_Id       =    S.Jepum_Id)       ');
    SQL.Add('                                                                   ');
    SQL.Add('Where   S.Sale_Id = :Sale_Id                                       ');
    ParamByName('Sale_Id').AsString := E_Sale_Id.Text;
    Prepare;
    Open;
    EnableControls;
  end;
  With DMF.Q do
  begin
    DisableControls;
    Close;
    SQL.Clear;
    SQL.Add('Select  sum(Sale_Amt)      TotalAmt,     sum(PV_Amt)   TotalPV     ');
    SQL.Add('From    Sale_Detail                                                ');
    SQL.Add('Where   Sale_Id = :Sale_Id                                         ');
    SQL.Add('                                                                   ');
    ParamByName('Sale_Id').AsString := E_Sale_Id.Text;
    Open;
    CE_TotalAmt.Value := FieldByName('TotalAmt').AsInteger;
    CE_TotalPV.Value  := FieldByName('TotalPV').AsInteger;
    Close;
    EnableControls;
  end;
end;

//------------------------------------------------------------------------------
// Master 데이터 갱신 처리.
//------------------------------------------------------------------------------
procedure TFRM_Sale.Transaction();
begin
  if DataMode = mVIEW then Exit;
  With DMF.STP do
  begin
    Close;
    Params.Clear;
    StoredProcName := 'Sale_SP';
    Params.CreateParam(ftString,'@Sale_Id',ptInput).AsString      := E_Sale_Id.Text;
    Params.CreateParam(ftString,'@Country_Id',ptInput).AsString   := E_Country_Id.Text;
    Params.CreateParam(ftString,'@Center_Id',ptInput).AsString    := E_Center_Id.Text;
    Params.CreateParam(ftString,'@Member_Id',ptInput).AsString    := E_Member_Id.Text;
    Params.CreateParam(ftString,'@Sale_Date',ptInput).AsString    := DE_Sale_Date.Text;
    Params.CreateParam(ftString,'@CDivision',ptInput).AsString    := CBB_CDivision.Text;
    Params.CreateParam(ftString,'@Credit_Id',ptInput).AsString    := E_Credit_Id.Text;
    Params.CreateParam(ftString,'@Credit_No',ptInput).AsString    := E_Credit_No.Text;
    Params.CreateParam(ftString,'@COwner',ptInput).AsString       := E_COwner.Text;
    Params.CreateParam(ftString,'@RDivision',ptInput).AsString    := CBB_RDivision.Text;
    Params.CreateParam(ftString,'@RName',ptInput).AsString        := E_RName.Text;
    Params.CreateParam(ftString,'@RTel',ptInput).AsString         := E_RTel.Text;
    Params.CreateParam(ftString,'@RPost',ptInput).AsString        := E_RPost.Text;
    Params.CreateParam(ftString,'@RAddr1',ptInput).AsString       := E_RAddr1.Text;
    Params.CreateParam(ftString,'@RAddr2',ptInput).AsString       := E_RAddr2.Text;
    Params.CreateParam(ftString,'@Remark',ptInput).AsString       := E_Remark.Text;
    Params.CreateParam(ftString,'@Classify',ptInput).AsString     := IntToStr(DataMode);
    Prepare;
    ExecProc;
  end;
//  Open_Query();                       // 변경된 데이터 보이기.
  case DataMode of
    mINSERT ,
    mUPDATE : A_ViewExecute(nil);      // 데이터 모드를 '자료대기'로 변경.
    mDELETE : begin
                ClearComponent(Self);  // Form Clear.
                A_ViewExecute(nil);    // 데이터 모드를 '자료대기'로 변경.
//                Open_DQuery();
              end;
  end;
end;

//------------------------------------------------------------------------------
// Detail 데이터 갱신 처리.
//------------------------------------------------------------------------------
procedure TFRM_Sale.DTransaction();
begin
  if LDataMode = mVIEW then Exit;
  With DMF.STP do
  begin
    Close;
    Params.Clear;
    StoredProcName := 'Sale_Detail_SP';
    Params.CreateParam(ftInteger,'@SDetail_Id',ptInput).AsFloat   := CE_SDetail_Id.Value;
    Params.CreateParam(ftString,'@Sale_Id',ptInput).AsString      := E_Sale_Id.Text;
    Params.CreateParam(ftString,'@Member_Id',ptInput).AsString    := E_Member_Id.Text;
    Params.CreateParam(ftString,'@Country_Id',ptInput).AsString   := E_Country_Id.Text;
    Params.CreateParam(ftString,'@WareHouse_Id',ptInput).AsString := E_WareHouse_Id.Text;
    Params.CreateParam(ftString,'@Jepum_Id',ptInput).AsString     := E_Jepum_Id.Text;
    Params.CreateParam(ftString,'@Sale_Date',ptInput).AsString    := DE_Sale_Date.Text;
    Params.CreateParam(ftString,'@Division',ptInput).AsString     := E_Division.Text;
    Params.CreateParam(ftInteger,'@Sale_Su',ptInput).AsFloat      := CE_Sale_Su.Value;
    Params.CreateParam(ftInteger,'@Sale_PV',ptInput).AsFloat      := CE_Sale_PV.Value;
    Params.CreateParam(ftInteger,'@Sale_Dan',ptInput).AsFloat     := CE_Sale_Dan.Value;
    Params.CreateParam(ftInteger,'@Sale_Amt',ptInput).AsFloat     := CE_Sale_Amt.Value;
    Params.CreateParam(ftInteger,'@PV_Amt',ptInput).AsFloat       := CE_PV_Amt.Value;
    Params.CreateParam(ftString,'@Classify',ptInput).AsString     := IntToStr(LDataMode);
    Prepare;
    ExecProc;
  end;
  Open_DQuery();                      // 변경된 데이터 보이기.
  if LDataMode = mINSERT then         // 자료추가 모드일 경우 자료추가 계속.
  begin
    ClearComponent(PAN_Detail);
    SendMessage(Handle,WM_NEXTDLGCTL,0,0);
  end
  else  SBT_ViewClick(nil);           // 데이터 모드를 '자료대기'로 변경.
//  SBT_ViewClick(nil);           // 데이터 모드를 '자료대기'로 변경.
end;

//------------------------------------------------------------------------------
// 폼 생성시 처리 작업.
//------------------------------------------------------------------------------
procedure TFRM_Sale.FormShow(Sender: TObject);
begin
  DModeChange(DataMode,mVIEW);        // 데이터 모드를 '자료대기'로 변경.
  LDataMode := mVIEW;                 // 지역 데이터 모드를 '자료대기'로 변경.
  EnableComponent(Self,False);        // 전체 Component 비활성화.
  ClearComponent(Self);
end;

//------------------------------------------------------------------------------
// 키 제어권을 Component에.
//------------------------------------------------------------------------------
procedure TFRM_Sale.DE_Sale_DateEnter(Sender: TObject);
begin
  KeyPreview := False;
end;

//------------------------------------------------------------------------------
// Return Key 입력시 저장 처리.
//------------------------------------------------------------------------------
procedure TFRM_Sale.E_RAddr2KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key = VK_RETURN) and (DataMode <> mVIEW) then  A_SaveExecute(NIL);
end;

//------------------------------------------------------------------------------
// Cell 선택시 내용 표시.
//------------------------------------------------------------------------------
procedure TFRM_Sale.DBGDrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if GDFocused In State then
    With TDBGrid(Sender).DataSource.DataSet do
      if (Active) and not IsEmpty then
      begin
        CE_SDetail_Id.Value    := FieldByName('SDetail_Id').AsFloat;
        E_WareHouse_Id.Text    := FieldByName('WareHouse_Id').AsString;
        E_WareHouse_Name.Text  := FieldByName('WareHouse_Name').AsString;
        E_Jepum_Id.Text        := FieldByName('Jepum_Id').AsString;
        E_Jepum_Name.Text      := FieldByName('Jepum_Name').AsString;
        E_Division.Text        := FieldByName('Division').AsString;
        CE_Sale_Su.Value       := FieldByName('Sale_Su').AsFloat;
        CE_Sale_PV.Value       := FieldByName('Sale_PV').AsFloat;
        CE_Sale_Dan.Value      := FieldByName('Sale_Dan').AsFloat;
        CE_PV_Amt.Value        := FieldByName('PV_Amt').AsFloat;
        CE_Sale_Amt.Value      := FieldByName('Sale_Amt').AsFloat;
      end;
end;

//------------------------------------------------------------------------------
// 날짜표 표시 및 다음 Component로 키 제어를 옮김.
//------------------------------------------------------------------------------
procedure TFRM_Sale.DE_Sale_DateKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    VK_DOWN   : if not TDateEdit(Sender).PopupVisible then TDateEdit(Sender).DoClick;
    VK_RETURN : if not TDateEdit(Sender).PopupVisible then SendMessage(Handle,WM_NEXTDLGCTL,0,0);
  end
end;

//------------------------------------------------------------------------------
// 국가코드 폼 호출.
// F3 Key를 누르거나 수정이 가해졌을때 ViewCode Form 호출.
//------------------------------------------------------------------------------
procedure TFRM_Sale.E_Country_NameKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  i : integer;
begin
  if ((Shift = [ssAlt]) and (Key = VK_F3)) or
     ((Key = VK_RETURN) and ((TEdit(Sender).Text = '') or (TEdit(Sender).Modified))) then
  begin
    With DMF.Q do
    begin
      Close;
      SQL.Clear;
      SQL.Add('Select  Country_Id,    Country_Name                              ');
      SQL.Add('From    Country                                                  ');
      SQL.Add('Where   1 = 1                                                    ');
      if TCustomEdit(Sender).Text <> '' then
      begin
        SQL.Add('and   (Country_Id     LIKE  :Value + ''%''  or                 ');
        SQL.Add('       Country_Name   LIKE  :Value + ''%''                     ');
        ParamByName('Value').AsString     := TEdit(Sender).Text;
      end;
    end;
    try
      AddArgument('국가코드',65,True);
      AddArgument('국가명',121,True);
      CodeInfo(DMF.Q,TEdit(Sender));   // ViewCode 호출.
      TEdit(Sender).Text := TArgument(List.Items[1]^).Data;
      for i := 0 to ComponentCount -1 do
        if Components[i].Tag = TEdit(Sender).Tag + 1 then
        begin
          (Components[i] as TEdit).Text := TArgument(List.Items[0]^).Data;
          Break;
        end;
    finally
      ClearArgument();
    end;
    if TEdit(Sender).Text = '' then  TEdit(Sender).SetFocus;
  end;
end;

//------------------------------------------------------------------------------
// 센터코드 폼 호출.
// F3 Key를 누르거나 수정이 가해졌을때 ViewCode Form 호출.
//------------------------------------------------------------------------------
procedure TFRM_Sale.E_Center_NameKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  i : integer;
begin
  if ((Shift = [ssAlt]) and (Key = VK_F3)) or
     ((Key = VK_RETURN) and ((TEdit(Sender).Text = '') or (TEdit(Sender).Modified))) then
  begin
    With DMF.Q do
    begin
      Close;
      SQL.Clear;
      SQL.Add('Select  Center_Id,     Center_Name                               ');
      SQL.Add('From    Center                                                   ');
      SQL.Add('Where   1 = 1                                                    ');
      if TCustomEdit(Sender).Text <> '' then
      begin
        SQL.Add('and   (Center_Id      LIKE  :Value + ''%''  or                 ');
        SQL.Add('       Center_Name    LIKE  :Value + ''%''                     ');
        ParamByName('Value').AsString     := TEdit(Sender).Text;
      end;
    end;
    try
      AddArgument('센터코드',65,True);
      AddArgument('센터명',121,True);
      CodeInfo(DMF.Q,TEdit(Sender));   // ViewCode 호출.
      TEdit(Sender).Text := TArgument(List.Items[1]^).Data;
      for i := 0 to ComponentCount -1 do
        if Components[i].Tag = TEdit(Sender).Tag + 1 then
        begin
          (Components[i] as TEdit).Text := TArgument(List.Items[0]^).Data;
          Break;
        end;
    finally
      ClearArgument();
    end;
    if TEdit(Sender).Text = '' then  TEdit(Sender).SetFocus;
  end;
end;

//------------------------------------------------------------------------------
// 창고코드 폼 호출.
// F3 Key를 누르거나 수정이 가해졌을때 ViewCode Form 호출.
//------------------------------------------------------------------------------
procedure TFRM_Sale.E_WareHouse_NameKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  i : integer;
begin
  if ((Shift = [ssAlt]) and (Key = VK_F3)) or
     ((Key = VK_RETURN) and ((TEdit(Sender).Text = '') or (TEdit(Sender).Modified))) then
  begin
    With DMF.Q do
    begin
      Close;
      SQL.Clear;
      SQL.Add('Select  WareHouse_Id,   WareHouse_Name                           ');
      SQL.Add('From    WareHouse                                                ');
      SQL.Add('Where   Country_Id      =     :Country_Id       and              ');
      SQL.Add('        Used            =     ''유''                             ');
      if TCustomEdit(Sender).Text <> '' then
      begin
        SQL.Add('and   (WareHouse_Id   LIKE  :Value + ''%''    or               ');
        SQL.Add('       WareHouse_Name LIKE  :Value + ''%'')                    ');
        ParamByName('Value').AsString      := TEdit(Sender).Text;
      end;
      ParamByName('Country_Id').AsString := E_Country_Id.Text;
    end;
    try
      AddArgument('창고코드',65,True);
      AddArgument('창고명',121,True);
      CodeInfo(DMF.Q,TEdit(Sender));   // ViewCode 호출.
      TEdit(Sender).Text := TArgument(List.Items[1]^).Data;
      for i := 0 to ComponentCount -1 do
        if Components[i].Tag = TEdit(Sender).Tag + 1 then
        begin
          (Components[i] as TEdit).Text := TArgument(List.Items[0]^).Data;
          Break;
        end;
    finally
      ClearArgument();
    end;
    if TEdit(Sender).Text = '' then  TEdit(Sender).SetFocus;

    // 킷트구매 인지 재구매 인지 판별하여 표시.
    With DMF.Q do
    begin
      Close;
      SQL.Clear;
      SQL.Add('Select  Case  When M.Kit_Date is NULL  then  ''킷트구매''        ');
      SQL.Add('              else                           ''재구매''          ');
      SQL.Add('        end   Division                                           ');
      SQL.Add('From    MState  M                                                ');
      SQL.Add('Where   M.Member_Id = :Member_Id                                 ');
      ParamByName('Member_Id').AsString := E_Member_Id.Text;
      Open;
      E_Division.Text := FieldByName('Division').AsString;
    end;
  end;
end;

//------------------------------------------------------------------------------
// 제품코드 폼 호출.
// F3 Key를 누르거나 수정이 가해졌을때 ViewCode Form 호출.
//------------------------------------------------------------------------------
procedure TFRM_Sale.E_Jepum_NameKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  i : integer;
begin
  if ((Shift = [ssAlt]) and (Key = VK_F3)) or
     ((Key = VK_RETURN) and ((TEdit(Sender).Text = '') or (TEdit(Sender).Modified))) then
  begin
    With DMF.Q do
    begin
      Close;
      SQL.Clear;
      SQL.Add('Select  J.Jepum_Id,      J.Jepum_Name,                           ');
      SQL.Add('        D.Sale_PV,       D.Sale_Dan                              ');
      SQL.Add('From                                                             ');
      SQL.Add('       (SELECT   Country_Id,   WareHouse_Id,   Jepum_Id          ');
      SQL.Add('        FROM     Maeip                                           ');
      SQL.Add('        WHERE    Country_Id   = :Country_Id     AND              ');
      SQL.Add('                 WareHouse_Id = :WareHouse_Id                    ');
      SQL.Add('        GROUP BY Country_Id,   WareHouse_Id,   Jepum_Id)  A      ');
      SQL.Add('                         INNER JOIN           Jepum  J           ');
      SQL.Add('                     ON (A.Jepum_Id       =   J.Jepum_Id)        ');
      SQL.Add('                         INNER JOIN           Danga         D    ');
      SQL.Add('                     On (D.Country_Id     =   A.Country_Id  AND  ');
      SQL.Add('                         D.Jepum_Id       =   J.Jepum_Id)        ');
      SQL.Add('Where   J.Used          =     ''유''                             ');
      if TCustomEdit(Sender).Text <> '' then
      begin
        SQL.Add('and   (J.Jepum_Id     LIKE  :Value + ''%''       or            ');
        SQL.Add('       J.Jepum_Name   LIKE  :Value + ''%'')                    ');
        ParamByName('Value').AsString      := TEdit(Sender).Text;
      end;
      ParamByName('Country_Id').AsString   := E_Country_Id.Text;
      ParamByName('WareHouse_Id').AsString := E_WareHouse_Id.Text;
    end;
    try
      AddArgument('제품코드',65,True);
      AddArgument('제품명',121,True);
      AddArgument('PV인정가',121,False);
      AddArgument('단가',121,False);
      CodeInfo(DMF.Q,TEdit(Sender));   // ViewCode 호출.
      TEdit(Sender).Text := TArgument(List.Items[1]^).Data;
      for i := 0 to ComponentCount - 1 do
        if Components[i].Tag = TCustomEdit(Sender).Tag + 1 then
        begin
          (Components[i] as TCustomEdit).Text := TArgument(List.Items[0]^).Data;
          Break;
        end;
      CE_Sale_PV.Text  := TArgument(List.Items[2]^).Data;
      CE_Sale_Dan.Text := TArgument(List.Items[3]^).Data;
    finally
      ClearArgument();
    end;
    if TEdit(Sender).Text = '' then  TEdit(Sender).SetFocus;
  end;
end;

//------------------------------------------------------------------------------
// 회원정보 폼 호출.
// F3 Key를 누르거나 수정이 가해졌을때 ViewCode Form 호출.
//------------------------------------------------------------------------------
procedure TFRM_Sale.E_Member_NameKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  i : integer;
begin
  if ((Shift = [ssAlt]) and (Key = VK_F3)) or
     ((Key = VK_RETURN) and ((TEdit(Sender).Text = '') or (TEdit(Sender).Modified))) then
  begin
    With DMF.Q do
    begin
      Close;
      SQL.Clear;
      SQL.Add('Select  M.Member_Id,   M.Member_Name                             ');
      SQL.Add('From    Member  M                                                ');
      SQL.Add('Where   1 = 1                                                    ');
      if TCustomEdit(Sender).Text <> '' then
      begin
        SQL.Add('and  (M.Member_Id    LIKE :Value + ''%''  or                   ');
        SQL.Add('      M.Member_Name  LIKE :Value + ''%'')                      ');
        ParamByName('Value').AsString     := TEdit(Sender).Text;
      end;
    end;
    try
      AddArgument('회원코드',93,True);
      AddArgument('회원명',149,True);
      CodeInfo(DMF.Q,TEdit(Sender));   // ViewCode 호출.
      TEdit(Sender).Text := TArgument(List.Items[1]^).Data;
      for i := 0 to ComponentCount - 1 do
        if Components[i].Tag = TEdit(Sender).Tag + 1 then
        begin
          (Components[i] as TEdit).Text := TArgument(List.Items[0]^).Data;
          Break;
        end;
    finally
      ClearArgument();
    end;
    if TEdit(Sender).Text = '' then  TEdit(Sender).SetFocus;
  end;
end;

//------------------------------------------------------------------------------
// 수량을 기입하면 PV매출액과 판매매출액을 기록.
//------------------------------------------------------------------------------
procedure TFRM_Sale.CE_Sale_SuChange(Sender: TObject);
begin
  CE_PV_Amt.Value   := CE_Sale_PV.Value  * TCurrencyEdit(Sender).Value;
  CE_Sale_Amt.Value := CE_Sale_Dan.Value * TCurrencyEdit(Sender).Value;
end;

//------------------------------------------------------------------------------
// 데이터를 수정하면 그에 종속된 코드 데이터 삭제.
// --> 의도와 다른 결과값 대입 방지.
//------------------------------------------------------------------------------
procedure TFRM_Sale.E_Member_NameChange(Sender: TObject);
var
  i : integer;
begin
  if TCustomEdit(Sender).Modified then
    for i := 0 to ComponentCount - 1 do
      if Components[i].Tag = TCustomEdit(Sender).Tag + 1 then
      begin
        (Components[i] as TCustomEdit).Text := '';
        Break;
      end;
end;

//------------------------------------------------------------------------------
// 검색창 표시 후 결과 표시.
//------------------------------------------------------------------------------
procedure TFRM_Sale.A_SearchExecute(Sender: TObject);
var
  Str  : string;
  Flag : Boolean;
begin
  Flag := InputQuery('주문번호검색','검색을 원하는 주문번호를 입력하세요.',Str);
  if not Flag then  Exit;

  A_ViewExecute(nil);  // 자료 보기로 변경.
  SBT_ViewClick(nil);  // 지역 자료 보기로 변경.

  With DMF.Q do
  begin
    Close;
    SQL.Clear;
    SQL.Add('Select  Sale_Id                                                    ');
    SQL.Add('From    Sale                                                       ');
    if Str <> '' then
    begin
      SQL.Add('Where   Sale_Id        LIKE  :Value + ''%''                      ');
      ParamByName('Value').AsString     := Str;
    end;
  end;
  try
    AddArgument('주문번호',100,True);
    CodeInfo(DMF.Q,E_Sale_Id);   // ViewCode 호출.
    E_Sale_Id.Text := TArgument(List.Items[0]^).Data;
  finally
    ClearArgument();
  end;
  if E_Sale_Id.Text <> '' then
    Open_Query();  // 검색결과가 있을경우 데이터 표시.
end;

//------------------------------------------------------------------------------
// 신용카드코드 폼 호출.
// F3 Key를 눌렀을때 ViewCode Form 호출.
//------------------------------------------------------------------------------
procedure TFRM_Sale.E_Credit_NameKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  i : integer;
begin
  if ((Shift = [ssAlt]) and (Key = VK_F3)) then
  begin
    With DMF.Q do
    begin
      Close;
      SQL.Clear;
      SQL.Add('Select  Credit_Id,      Credit_Name                              ');
      SQL.Add('From    Credit                                                   ');
      SQL.Add('Where   Country_Id      =     :Country_Id     &nb
4  COMMENTS
  • Profile
    까마귀 2002.07.31 09:11
    안녕하세요. 까마귀입니다.

    명확하게 에러가 나는 곳이 있으면 미리 이야기를 했겠지요.
    그 보다 그런 상황이라면 에러를 잡았을 겁니다.
    지금 발생하는 에러가 특별하게 어느 라인이라고 말을 할수가 없어서요.
    그래도, 상황설명은 하나도 않되어 있군요.... 죄송...

    마스터 데이터를 입력을 하고 저장을 합니다.
    그리고, 그 키값(주문번호)을 가지고 디테일 데이터를 입력을 합니다.
    디테일 데이터를 한건을 입력하고, 저장을 합니다. 모두 Stored Proc 사용.
    그리고, 한건씩 저장을 할때마다 그리드에 보여주기 위해 바로 Query 를 이용하여 Select 해 옵니다.
    디테일 한건을 입력하고 저장하면 아무런 문제가 없습니다.
    그 상태에서 다시 한건을 더 입력하면 Access Violation... 이 걸립니다.
    두건째의 입력 데이터는 정상적으로 서버에 입력이 되는데, 그걸 보여주기 위한 Query문에서 걸립니다.
    걸리는 문장은 SQL.Clear; 이 부분이던군요.....
    혹시나 싶어서 디테일 데이터를 한건만 입력하고 또 다른 동작을 해봤지요.
    예를 들어서 다시 마스터 데이터를 추가하는 동작이거나, 아님 기존에 입력된 데이터를 검색을 하거나... 등등요.
    그렇게 해도 역시 데이터를 뿌려주기 위한 부분에 들어가면 마찬가지로 Access.... 가 걸립니다.

    그러니까, 마스터 데이터 추가. 디테일 데이터 한건 추가. 그 후에 일어나는 동작중에 서버에서 데이터를 가져오기 위해 Query 문을 날리는 곳에서 Access... 발생.
    물론 마스터/디테일 어느쪽이던 SQL.Clear  이 문장에서 걸리더군요.

    서버와의 연결은 TDataBase 콤포넌트를 사용했고요.
    MS-SQL 2K 입니다.
    추가/수정/삭제 는 Stored Proc 을 사용하고요, Select 는 Query 를 사용합니다.

    애매모호 한 상황이라 더이상 말할게 없군요.
    어떻게 해결이 되었으면 좋겠는데.... 어렵군요.
    도움 부탁 드립니다.



                                           위대한 단군혼이 살아있는 나라.... 대한민국.
  • Profile
    한주영 2002.07.31 19:52
    BDE버젼을 올려보세요
    BDE의 5.10이하 버젼에서는 동적으로 TQuery를 생성하여 사용하는 경우 문제가 생기는 경우가 많더군요 (특히 멀티스레드환경에서는 심합니다.)

    저도 한동안 고생하다가 BDE버젼을 올리니까 깨끗이 사라지더군요.

  • Profile
    까마귀 2002.07.31 22:34
    안녕하세요. 까마귀입니다.

    bde 를 업데이트 했는데요.
    5.11en 으로요.
    그런데, bde admin... 에서 확인을 해보면 버젼이 5.01 로 나와요.
    이게 정상인가요?
    아닌것 같은데...
    혹시 님은 어떻게 나오시는지 좀 알려주실래요?
    볼랜드에서 다운받아서 설치했고요.
    중간에 에러나거나 하지도 않았는데, 그러네요.



                                               위대한 단군혼이 살아있는 나라.... 대한민국.

  • Profile
    한주영 2002.08.01 00:32
    그 프로그램은 어떤 이유로 업데이트가 안되더군요. 하지만 DLL들의 날짜가 바뀌었을 겁니다.

    • 최여옥
    • 2002.07.31 19:30
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 박상기
      2002.07.31 20:39
      있죠...왜 없겠습니까? 다음과 같이 코딩합니다. Session.NetFileDir := 'c:Customer' ;
    • 햇살
    • 2002.07.31 19:02
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 햇살
    • 2002.07.31 18:56
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김지엽
      2002.08.01 05:57
      Local DB를 잘 몰라서.. 100% 확실한 답변은 아닙니다만, 형성된 파일명은, 일종의 redo파일명일 것으로 추...
    • 이현철
      2002.07.31 19:48
      윈도우 캡션정보보다 실제로 실행된 실행파일 이름으로 찾는것도 좋을듯 싶습니다..  아래 코...
    • 전정기
      2002.07.31 21:23
      감사합니다.
    • 호야
    • 2002.07.31 09:18
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 까마귀
    • 2002.07.31 07:14
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 까마귀
      2002.07.31 09:11
      안녕하세요. 까마귀입니다. 명확하게 에러가 나는 곳이 있으면 미리 이야기를 했겠지요. 그 보다 그런 ...
    • 한주영
      2002.07.31 19:52
      BDE버젼을 올려보세요 BDE의 5.10이하 버젼에서는 동적으로 TQuery를 생성하여 사용하는 경우 문제가 생기...
    • 까마귀
      2002.07.31 22:34
      안녕하세요. 까마귀입니다. bde 를 업데이트 했는데요. 5.11en 으로요. 그런데, bde admin... 에서 확...
    • 한주영
      2002.08.01 00:32
      그 프로그램은 어떤 이유로 업데이트가 안되더군요. 하지만 DLL들의 날짜가 바뀌었을 겁니다.
    • 아폴론
    • 2002.07.31 04:45
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 양상훈
      2002.08.01 11:06
      포인터 배열을 사용하면... var   am01,am02,am03,am04 : Double;   amArray:...
    • 한원희
      2002.07.31 06:39
      글쎄요. 배열로 선언하지 않고 위와 같이 할 수는 없을것 같습니다만, 어셈을 잘 하신다면, 스택 번지...
    • 아폴론
      2002.07.31 08:15
      방법이 없을까요?  FindComponent 같은 기능은 없을까요?
    • 수서니
    • 2002.07.31 03:19
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 이현철
      2002.08.07 03:53
      해당 dll 을 프로그램 설치 디렉토리나 system 디렉토리에 복사하시면 됩니다.. 프로그램에서 해당 dll 을...
    • 박성훈
      2002.08.04 20:17
      안녕하세요? 먼저 답변 주신 분은 자기 자랑만 하시는 거 같군요. 원하시는 답이 그게 아닌데... z...
    • 나옹이
      2002.07.31 19:50
      libmysql.dll 을 사용하신다면요..... TmysqlComponent 를 사용하시나 부져? 저도 그걸 써봤는데요. ...
    • 조군희
    • 2002.07.31 03:16
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.07.31 05:20
      안녕하세요. 최용일입니다. 없을겁니다. 함수를 사용한다고 해도 그 함수내부에서 루프를 돌게 되니까 ...
    • 양상훈
      2002.07.31 04:19
      procedure TF_GR.SE_CH1_1KeyDown(Sender: TObject; var Key: Word; var   Packet:array[0.....
    • 이중철
      2002.08.01 06:33
      현재 16포트까지 테스트를 하였고.. 각각의 포트의 BPS는 약 40~110KBPS의 데이타 (약 400개의 패킷) ...
    • 이용관
      2002.08.08 07:50
      답변에 너무나도 감사 드립니다. 제가 쓴방법은 메인큐를 하나만들어서 쭈루룩 하나의 큐안에 쌓이게 해...
    • 이현철
      2002.07.31 23:42
      데이터를 각각의 com포트에 받았을경우.. 받은 이벤트 프로시져에서 데이터를 처리하지 마시고 다른 처...
    • 이용관
      2002.08.08 07:50
      답변에 너무나도 감사 드립니다. 제가 쓴방법은 메인큐를 하나만들어서 쭈루룩 하나의 큐안에 쌓이게 해...
    • 임병태
    • 2002.07.31 02:57
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 한원희
      2002.07.31 20:07
      혹시 델파이 6에서 작성하신 소스를 델파이 5에서 읽으려 하신것 아니신지요? 저도 델파이 6를 잠시 사...
    • 이상준
    • 2002.07.31 02:25
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 나옹이
      2002.07.31 04:07
      파라미터 라 함은.... 문자를 주고 받으려는거 아녀요? 저같은 경우는..... VB 나 JAVA 스크립트...
    • 이상준
      2002.07.31 18:58
      우선 답변주신분 감사합니다. 제가 질문하고 싶은 것은 문자열을 넘기는게 아니라 배열형태로 HTML(Ja...
    • 나옹이
      2002.07.31 19:58
      제가 했던 작업과 비슷하거 같아서 다시 올립니다. 저는 html에서 vb스크립트로 데이터를 받아서 Tch...
    • 한재욱
    • 2002.07.31 01:48
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 김은범
    • 2002.07.31 00:14
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.07.31 05:25
      안녕하세요. 최용일입니다. 델파이 헬프의 Variant type conversions부분을 살펴보세요. Variant타입들...