안녕하세요. 까마귀입니다.
매출 입력폼을 만들고 있는데요.
마스터를 입력하고 저장한 후, 디테일 데이터를 입력하면 한건 입력후 어떤 동작을 하던지 간에 프로그램이 그냥 종료되어 버립니다.
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
명확하게 에러가 나는 곳이 있으면 미리 이야기를 했겠지요.
그 보다 그런 상황이라면 에러를 잡았을 겁니다.
지금 발생하는 에러가 특별하게 어느 라인이라고 말을 할수가 없어서요.
그래도, 상황설명은 하나도 않되어 있군요.... 죄송...
마스터 데이터를 입력을 하고 저장을 합니다.
그리고, 그 키값(주문번호)을 가지고 디테일 데이터를 입력을 합니다.
디테일 데이터를 한건을 입력하고, 저장을 합니다. 모두 Stored Proc 사용.
그리고, 한건씩 저장을 할때마다 그리드에 보여주기 위해 바로 Query 를 이용하여 Select 해 옵니다.
디테일 한건을 입력하고 저장하면 아무런 문제가 없습니다.
그 상태에서 다시 한건을 더 입력하면 Access Violation... 이 걸립니다.
두건째의 입력 데이터는 정상적으로 서버에 입력이 되는데, 그걸 보여주기 위한 Query문에서 걸립니다.
걸리는 문장은 SQL.Clear; 이 부분이던군요.....
혹시나 싶어서 디테일 데이터를 한건만 입력하고 또 다른 동작을 해봤지요.
예를 들어서 다시 마스터 데이터를 추가하는 동작이거나, 아님 기존에 입력된 데이터를 검색을 하거나... 등등요.
그렇게 해도 역시 데이터를 뿌려주기 위한 부분에 들어가면 마찬가지로 Access.... 가 걸립니다.
그러니까, 마스터 데이터 추가. 디테일 데이터 한건 추가. 그 후에 일어나는 동작중에 서버에서 데이터를 가져오기 위해 Query 문을 날리는 곳에서 Access... 발생.
물론 마스터/디테일 어느쪽이던 SQL.Clear 이 문장에서 걸리더군요.
서버와의 연결은 TDataBase 콤포넌트를 사용했고요.
MS-SQL 2K 입니다.
추가/수정/삭제 는 Stored Proc 을 사용하고요, Select 는 Query 를 사용합니다.
애매모호 한 상황이라 더이상 말할게 없군요.
어떻게 해결이 되었으면 좋겠는데.... 어렵군요.
도움 부탁 드립니다.
위대한 단군혼이 살아있는 나라.... 대한민국.