Delphi 3층 실례(2)

6834 단어 Delphi삼층
물류 정보 시스템 개발 수기 - 델피의 3층 개발
에서 제가 개발 시스템에서 겪은 기술 문제와 해결 방안을 설명하고 여러분에게 도움을 주기를 바랍니다.물류 정보 시스템의 분석과 디자인 문제에 대해 저는 다른 글인 에서 설명하겠습니다.
1. Midas의 안전 문제.
미다스 기술은 델피에서 3층 개발을 진행하는 첫 번째 기술로 순수한 DCOM/COM+(COM+기술은.NET기술의 기초)의 장점이 있을 뿐만 아니라 델피의 빠른 개발 특성과 결합하여 원하는 시스템을 신속하게 개발할 수 있다. 그 개발 속도는 VC, PB 등으로 DCOM을 개발하는 수십 배로 프로그래머를 복잡한 코드에서 벗어나 업무 논리적인 디자인에 더 많은 정력을 기울일 수 있다.
그러나 Midas 기술의 가장 큰 걱정거리는 보안 문제입니다.
원격에서 응용 서버의 포트 번호만 알면 응용 서버에 접근할 수 있고, 응용 서버에 접근하면 TClientDataSet에서ProviderNames 목록을 얻을 수 있다.일단 ProviderNames 목록을 알게 되면 데이터베이스를 밖으로 노출시키는 셈이다.
ProviderNames 목록을 쉽게 구할 수 있는 문제에 대해서는 다음 방법을 사용하여 해결합니다.
서버측 정의
LoginMTS(const AUserId, APassword: WideString): WordBool;
방법초기 상태에서는 모든 DataSetProvider와 데이터 세트의 연결이 끊어집니다.사용자는 LoginmTS를 호출하고 사용자 이름과 비밀번호를 전달해야 DataSetProvider와 데이터 세트의 연결을 열 수 있습니다.이렇게 하면 사용자 검증이 통과하지 못하면,ProviderNames 목록을 얻었더라도 인터페이스의 방법을 사용해서 데이터베이스를 조작할 수 없습니다.
2. Midas에서 주종표의 실현
주종표의 응용은 정보 시스템에서 매우 광범위하게 응용된다.두 층의 개발에서 우리는 두 데이터 집합 간의 주종 관계를 직접 구축함으로써 주종표를 실현할 수 있다.
3층에서 우리는 두 데이터 집합 간의 주종 관계를 직접 구축함으로써 주종표를 실현할 수 있지만 이렇게 하면 데이터베이스에 있는 모든 관련 데이터 줄을 로컬로 다운로드해야 하기 때문에 3층 개발의 장점을 잃게 된다.나는 실제에서 아래의 방법을 사용하여 실현한다.이 슬라이드에서는 Library Querues, 추가, 수정, 삭제(CRUD)를 구현하는 예를 들어 설명합니다.
(1) TmtsStockInListBiz라는 이름의 MTS Data Module을 새로 만듭니다.
    function QueryStockInListMasterById(const AId: WideString;var ADatas: OleVariant): WordBool; safecall;
    function QueryStockInListSlaveByMasterId(const AId: WideString;var ADatas: OleVariant): WordBool; safecall;
    procedure UpdataStockInListMaster(var ADatas: OleVariant); safecall;
    procedure UpdataStockInListSlave(var ADatas: OleVariant); safecall;
    function GenerateStockInListId: WideString; safecall;
QueryStockInListMasterById 역할은 입고표 번호에 따라 입고서의 기본 정보(입고일자, 담당자 등)를 조회하는 것이다. Aid는 입고표 번호이고 Adatas는 반환값이다. 그 형식은 Midas의 데이터 패키지로 ClientDatSet의 데이터 속성에 첨부할 수 있다.
QueryStockInListSlaveByMasterId의 역할은 입고표 번호에 따라 입고표에 대한 상세한 정보(상품 번호, 수량)를 조회하는 것이다.
UpdataStockInListMaster는 입고 양식의 마스터 테이블을 삭제, 추가, 수정하는 작업입니다.ClientDataSet의 Delta 속성을 라우팅하면 됩니다.
UpdataStockInListSlave는 입고표를 테이블에서 삭제, 추가, 수정하는 작업입니다.
GenerateStockInListId는 유일한 입고 번호를 생성합니다.
다음은 몇 가지 방법의 코드입니다. 모두 간단합니다. 설명을 많이 하지 않아도 델피의 도움말을 볼 수 있습니다.
function TmtsStockInListBiz.QueryStockInListMasterById(

const AId: WideString; var ADatas: OleVariant): WordBool;

begin

result := false;

ADatas := null;

try

    cdsQuery.Close;

    cdsQuery.CommandText := 'select * from t_StockInListMaster where Id=:Id';

    cdsQuery.Params.ParamByName('Id').AsString := AId;

    cdsQuery.Open;

    if cdsQuery.RecordCount > 0 then

    begin

      result := true;

      ADatas := cdsQuery.Data;

    end;

finally

    cdsQuery.Close;

end;

end;


procedure TmtsStockInListBiz.UpdataStockInListMaster(var ADatas: OleVariant);
var
eCount: Integer;
OwnerData: OleVariant;
begin
  DCOMConStockInList.GetServer.AS_ApplyUpdates('dspStockInListMaster',
    ADatas, -1, eCount, OwnerData);
end;

function TmtsStockInListBiz.GenerateStockInListId: WideString;
var
LPrior: string;
i: Integer;
begin
cdsQuery.Close;
cdsQuery.CommandText := 'select top 1 id from t_StockInListMaster order by id desc';
cdsQuery.Open;
LPrior := cdsQuery.FieldByName('Id').AsString;

i := StrToIntDef(RightStr(LPrior,8),0);
Inc(i);

result := 'RK' + FormatFloat('00000000',i);
cdsQuery.Close;
end;

(2) 새로운 응용 프로그램은 DCOMConnection, SocketConnection 등을 통해 MTS 구성 요소에 연결한 다음에 MTS의 상응하는 방법을 호출하여 클라이언트 기능을 실현할 수 있다.
cds Stock InList Master, cds Stock InList Slave 두 개의 클라이언트 데이터 세트 컨트롤을 넣고 컨트롤에서 오른쪽 단추를 누르고'Fields Editor'가 서버에 새로 만든 필드와 같은 필드를 선택한 다음 컨트롤에서 오른쪽 단추를 누르고'Create Data Set'을 선택하여 로컬 데이터베이스를 만듭니다.
(3) 입고번호에 따라 입고표를 조회하는 방법에 따라 다음과 같이 실현한다.
procedure TFormStockInList.BtnFindClick(Sender: TObject);
var
v,vs: OleVariant;
begin
if SocketConStockInList.AppServer.QueryStockInListMasterById(Trim(LEdtId.Text), v) then
begin
    cdsStockInListMaster.Data := v;//입고 양식 마스터 테이블 표시(주요 정보)
    if SocketConStockInList.AppServer.QueryStockInListSlaveByMasterId(Trim(LEdtId.Text), vs) then
      cdsStockInListSlave.Data := vs; ;//입고 목록 리스트(내역 정보) 표시
end
else
ShowMessage("이 목록은 존재하지 않습니다!);
end;
(4) 새 입고서의 실현
procedure TFormStockInList.BtnNewClick(Sender: TObject);
var
LId: string;
begin
ClearCDSRecord;
cdsStockInListMaster.Open;
cdsStockInListMaster.Insert;
LId := SocketConStockInList.AppServer.GenerateStockInListId;
LEdtId.Text := LId;
cdsStockInListMaster.FieldByName('Id').AsString := LId;
cdsStockInListMaster.FieldByName('GenerateDate').AsDateTime := Now();
end;
(5) 제출 기능의 실현
procedure TFormStockInList.BtnPostClick(Sender: TObject);
var
LQuerymts: ImtsQueryObjDisp;
LBar: string;
begin
SetSocketConnectionConnect(SocketConQuery);
LQuerymts := ImtsQueryObjDisp(SocketConQuery.GetServer);
SocketConQuery.Close;
if cdsStockInListMaster.RecordCount > 0 then
    SocketConStockInList.AppServer.UpdataStockInListMaster(cdsStockInListMaster.Delta);
if cdsStockInListSlave.RecordCount > 0 then
SocketConStockInList.AppServer.UpdataStockInListSlave(cdsStockInListSlave.Delta);
end;
참고: 본 문서에서 ClientDataSet 컨트롤의 이름은 일반적으로 cds, TsocketConnection 컨트롤의 이름은 일반적으로 SocketCon으로 시작합니다.
3. TsimpleObjectBroker의 서버 목록을 동적으로 설정
procedure SetSocketConnectionConnect(AValue: TSocketConnection);

procedure FillAppServerList(ABroker: TSimpleObjectBroker);
var
    sl: TStringList;
   i, n: Integer;
begin
    sl := TStringList.Create;
                 ,    sl ;
    n := sl.Count - 1;

    ABroker.ServerData := null;
    for i := 0 to n do
    begin
      ABroker.Servers.Add;
      ABroker.Servers[i].ComputerName := sl.Strings[i]
   end;
    sl.Free;
end;

var
LBroker: TSimpleObjectBroker;
begin
LBroker := TSimpleObjectBroker.Create(nil);
    FillAppServerList(LBroker);
    AValue.ObjectBroker := LBroker;

    try
      AValue.Connected := true;
    except
      raise Exception.Create('         !');
    end;
    LBroker.Free;
end;

좋은 웹페이지 즐겨찾기