乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Delphi數(shù)據(jù)庫開發(fā)及統(tǒng)計表格設計

       漫游人 2010-09-30
      Delphi是Borland公司開發(fā)的基于PASCAL語言的Windows平臺應用程序開發(fā)工具,它將可視化編程(Visual Programming)與面向?qū)ο?Object-Oriented)的卓越優(yōu)點結合在PASCAL語言開發(fā)平臺上,而且同時可以支持Client/Server模式的SQL數(shù)據(jù)庫訪問與ODBC(開發(fā)數(shù)據(jù)庫互連),是一個真正面向?qū)ο蟮拈_發(fā)工具。

        Delphi最吸引人的特點是它的強大的數(shù)據(jù)庫訪問能力,它主要通過使用數(shù)據(jù)庫引擎(Borland Database Engine,簡稱BDE)來訪問本地數(shù)據(jù)庫和遠程數(shù)據(jù)庫。但對于用戶而言,不必直接編程訪問BDE,而只需通過采用窗體(FORM)和大量方便且實用的數(shù)據(jù)庫訪問元件(Component)來實現(xiàn),通過ReportSmith報表生成器可以生成多種隨心所欲的報表。

        但是,用ReportSmith制作的各類報表,只便于輸出至打印機上打印出來,若想把報表在屏幕上顯示,則還需調(diào)用ReportView。而ReportView窗口界面對不太懂Delphi和Windows操作的普通用戶來說,不直觀,也不易操作。如何制作并在屏幕上顯示出直觀的二維統(tǒng)計報表,這是本文所要闡述的主要問題。

        以表格形式顯示數(shù)據(jù)庫內(nèi)容一般地采用下面兩種方式:
        ●縱向列表(如圖1)
        ●交叉統(tǒng)計列表(如圖2)


      一、縱向列表
        Delphi可以用TDBGRID控件,以表格形式非常方便地顯示單一或多數(shù)據(jù)庫縱向列表。一般采用兩種方法實現(xiàn):
        (一)采用TTable與Tdatasource、TDbgrid控件
        在窗體中引入上述三個控件,并在Ttable中控件指出要訪問的數(shù)據(jù)庫存放路徑及數(shù)據(jù)庫名,在Tdatasource控件中指出數(shù)據(jù)源與Ttable相連,在TDbgrid控件中指出顯示Tdatasource數(shù)據(jù)源內(nèi)容,程序運行后,則顯示出如圖1所示的數(shù)據(jù)庫縱向列表。
        該種方法一般用來顯示單數(shù)據(jù)庫表格或一對多兩個數(shù)據(jù)庫表格。

       ?。ǘ┎捎肨Query與Tdatasource、TDbgrid控件

       


        同樣,在窗體中引入上述三個控件,并在TQuery控件中用SQL語句給出對有關數(shù)據(jù)庫的查詢,在Tdatasource控件中指出數(shù)據(jù)源與TQuery相連,在TDbgrid控件中指出顯示查詢的結果。程序運行后,則顯示出如圖1所示的數(shù)據(jù)庫縱向列表。
        該種方法一般用于兩個以上的多數(shù)據(jù)庫查詢。
        在TQuery控件中建立SQL查詢有兩種方法,一種是在程序設計階段使用SQL查詢,即為靜態(tài)查詢,第二種是在程序運行階段使用SQL查詢,即為動態(tài)查詢。
        1. 靜態(tài)查詢 編寫程序時,在窗體中放置Tquery元件,并設置對象名稱,如Query1。使用Delphi對象檢測器Object,雙擊Query 1對象的SQL屬性,則激活SQL語句輸入框,根據(jù)要求輸入SELECT語句。當程序運行后,則顯示出數(shù)據(jù)庫縱向列表。靜態(tài)查詢比較簡單,但實用性差。對于較復雜的查詢,一般采用動態(tài)查詢。
        2. 動態(tài)查詢同樣,在編寫程序時,在窗體中放置TQUERY元件,并設置對象名稱,如Query 1。在相關的事件函數(shù)中輸入SQL語句,例如:

        WITH QUERY 1 DO
        BEGIN
        SQL.CLEAR;
        SQL.ADD(SELECTDW,COUNT(DW)FROM B_BASETJ F,B_INFO E);
        SQL.ADD(WHERE F.”SHBZCODE”=E.”SHBZCODE”GROUP BY DW);
        OPEN;
        END;

        當程序運行后,由某一事件激發(fā),則顯示出查詢結果縱向列表。


      二、交叉統(tǒng)計列表
        在Delphi環(huán)境下,無論用上述哪種方法制作數(shù)據(jù)庫縱向列表,都是相對容易的。但要生成如圖2所示二維統(tǒng)計報表,則并非易事。
        下面以筆者開發(fā)的《社會養(yǎng)老保險管理系統(tǒng)--統(tǒng)計管理》中的一段程序為例,詳細說明圖2所示交叉統(tǒng)計列表的制作。

       ?。ㄒ唬┱{(diào)用數(shù)據(jù)庫B_BASETJ.DB和B_INFO.DB
        上述兩數(shù)據(jù)庫的結構分別為:
        B_BASETJ.DB B_INFO.DB

      字段名 字段類型 字段長度 字段名 字段類型 字段長度
      dw a 4(單位代碼) shbzcode a 21(社會保障號碼)
      shbzcode a 21(社會保障號碼) attribution a 10(工作屬性)
      cadre_zw a 4(干部職務) sex a 2(性別)

        在B_INFO.DB數(shù)據(jù)庫中存放著各人的基本情況,其中ATTRIBUTION字段包含固定工、農(nóng)民合同工等工作屬性;CADRE_ZW字段包含干部職務,若該字段內(nèi)容為空,則表示為工人。

        (二)窗口界面設計及各組件屬性說明
        用到的重要組件及其屬性如下:
        QYERYTB1:TQUERY;{指明SQL的存取元件名為QUERYTB1}
        DataSourceTB1:Tdatasource;{指明與TQUERY相連的數(shù)據(jù)源為DatasourceTB1}
        Datasourcename=DataSourceTB1
        Dataset=QYERYTB1
        SG11:TstringGrid;{字符型二維數(shù)據(jù)表格}
        BTNEXIT:Tbutton;{取消按鈕}

       ?。ㄈ┏绦虼a及其分析
        程序中主要通過使用TStringGrid和TQUERY控件來生成交叉統(tǒng)計列表。其中TStringGrid控件以二維網(wǎng)格形式顯示字符型數(shù)據(jù)表格,CELL[I,K]為表格中的一個數(shù)據(jù)單元,K為行號,I為列號,K、I的起始值為0;TQUERY控件的作用是利用SQL語句統(tǒng)計出表格中某一列數(shù)據(jù),如圖2表格中共有6列,則需6次調(diào)用TQUERY。

        本程序還設置了公共程序段procedure COL(var I,k:INTEGER),這一子程序?qū)⒈欢啻握{(diào)用,用于填寫表格中某一列數(shù)據(jù)。
        主要程序代碼如下:
        unit T1;
        interface
        uses

      SysUtils,WinTypes,WinProcs,Messages,Classes,Graphics,Controls,Forms,Dialogs,
      StdCtrls,ExtCtrls,Grids,DB,DBTables, DBGrids,Report;

        type
        TT1FORM=class(TForm)
        BTNEXIT:TButton;
        SG11:TStringGrid;
        Labell:TLabel;
        QueryTB1:TQuery;
        DataSourceTB1:TDataSource;
        procedure FormCreate(Sender:TObject);
        procedure BTNEXIT Click(Sender:TObject);
        private
        PROCEDURE COL(VAR I,K:INTEGER);
        PROCEDURE CC(VAR I,K:INTEGER);
        {Private declarations}
        public
        {Public declarations}
        end;

        var
        T1FORM:TT1FORM;

        implementation
        {$R*.DFM}

        PROCEDURE tt1form.COL(VAR I,K:INTEGER);{用FOR...DO循環(huán)填寫SG11表格中第I列的VAR J:INTEGER;值}
        BEGIN
        WITH SG11 DO
        BEGIN
        QUERYTB1.FIRST;
        FOR J:=2 TO K-1 DO
        BEGIN
        IF CELLS[0,J]=QUERYTB1.FIELDS[0].ASSTRING THEN{第0列填寫單位代碼}
      BEGIN
        CELLS[I,J]:=QUERYTB1.FIELDS[1].ASSTRING;{填寫第I列中某一行的值}
        QUERYTB1.NEXT;
        CELLS[I,1]:=INTTOSTR(STRTOINT(CELLS[I,1])+STRTOINT(CELLS[I,J]));
        END
        ELSE
      CELLS[I,J]:=INTTOSTR(0);
        END;{FOR}
        END;{WITH}
        END;

        PROCEDURE Tt1form.CC(VAR I,K:INTEGER);
        VAR
      J:INTEGER;
        BEGIN
        WITH SG11 DO
        BEGIN
        FOR J:=1 TO K-1 DO
        CELLS[I,J]:=INTTOSTR(STRTOINT(CELLS[1,J]-STRTOINT(CELLS[I-1,J])));
        END;{WITH}
        END;

        procedure TT1FORM.FormCreate(Sender:TObject);{在創(chuàng)建窗體T1FORM時生成表格并填寫統(tǒng)計值}
        VAR
      R,I,K,J:INTEGER;
        begin
        WITH SGLL DO
        BEGIN
      CELLS[0,0]:=單位{填寫第0行各列標題}
        CELLS[1,0]:=總?cè)藬?shù);
        CELLS[2,0]:=固定;
        CELLS[3,0]:=合同;
        CELLS[4,0]:=干部;
        CELLS[5,0]:=工人;
        FOR I:=1 TO 5 DO
        BEGIN
        CELLS[I,1]:=INTTOSTR(0);
        END;
        END;

        WITH QUERYTB1 DO
        BEGIN
        SQL.CLEAR;
        SQL.ADD(SELECT DW,COUNT(DW)FROM B_BASETJ F,B_INFO E);
        SQL.ADD(WHERE F.”SHBZCODE”=E.”SHBZCODE”GROUP BY DW);
        OPEN;
        R:=RECORDCOUNT+2;
        SG11.ROWCOUNT:=R;
        SG11.CELLS[0,1]:=合計;
        FIRST;
        K:=R;
        FOR J:=2 TO K DO
        BEGIN
      SG11.CELLS[0,J]:=FIELDS[0].ASSTRING;{填寫第0列單位號}
        NEXT;
        END;

        I:=1;
        COL(I,K);{填寫第1列合計}
        SQL.CLEAR;
        SQL.ADD(SELECT DW,COUNT(E.”DW”));
        SQL.ADD(FROM “B_BASETJ.DB”E,B_INFO F WHERE E.”SHBZCODE”=F.”SHBZCODE” AND F

      .”ATTRIBUTION”=”固定職工”GROUP BY DW);

        I:=2;
        OPEN;
        COL(I,K);{填寫第2列各單位固定工人數(shù)}
        SQL.CLEAR;
        SQL.ADD(SELECT DW,COUNT(E.”DW”));
        SQL.ADD(FROM “B_BASETJ.DB”E,B_INFO F WHERE E.”SHBZCODE”=F.”SHBZCODE” AND F.”

      ATTRIBUTION”=”農(nóng)民合同工”GROUP BY DW);

         I:=3;
        CC(I,K);{填寫第3列各單位合同工人數(shù)}
        SQL.CLEAR;
        SQL.ADD(SELECT DW,COUNT(E.”DW”));
        SQL.ADD(FROM “B_BASETJ.DB”E,B_INFO F WHERE E.”SHBZCODE”=F.”SHBZCODE”AND F.”

      CADRE_ZW”$#@60;$#@62;””GROUP BY DW);

        I:=4;
        OPEN;
        COL(I,K);{填寫第4列各單位干部人數(shù)}

        I:=5;
        CC(I,K);{填寫第5列各單位工人人數(shù)}
       END;
       end;

        ......


        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多