⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sybgenerate.pas

📁 sybase大全
💻 PAS
字号:
unit sybgenerate;

interface

uses
  stdctrls,Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  sybase_components,dsgnintf,sybdatabase,
  u_generate1,u_generate2,u_generate3,u_generate4,u_generate25,u_generate5,u_generate27,
  sybnavigator,sybtable,extctrls,sybquery;

const top_of_first_field = 30;
      left_of_first_field = 30;

type
  SybObjectname = string[30];

type
  Tsybobjectproperty = class(TStringProperty)
  public
    procedure GetValues(TheProc: TGetStrProc); override;
    function getattributes:Tpropertyattributes; override;
  end;

type
  TSybGenerate = class(TComponent)
  private
    { Private declarations }
    FDbname      :SybObjectname;
    FDesignActive:boolean;
    FDbProc      :integer;
    fparent      :tcomponent;
    procedure SetDbProc(Value :integer);
    procedure SetDbName(Value :SybObjectname);
    procedure SetDesignActive(Value :boolean);
    procedure get_datatypes;
    procedure create_fields;
    procedure create_table_component;
    procedure create_sproc(sproc_type:integer;procname:sybobjectname);
    function no_under(col:string):string;
    function iskey(name :string):boolean;
    function is_table(name   :SybObjectname):boolean;
  protected
     r_simple,r_masterdetail,
     r_horizontal,r_vertical,r_grid,
     r_left,r_top,
     r_form_only,r_form_procs  :boolean;
     r_table,r_query           :boolean;
     c_form                    :boolean;
     chk_sprocs                :boolean;
     dataset                   :string;
     update_sproc,
     insert_sproc,
     delete_sproc              :SybObjectname;
     field_names               :array[1..100] of string[30];
     field_datatypes           :array[1..100] of string[30];
     field_lengths             :array[1..100] of integer;
     fieldscount               :integer;
     navigator                 :tsybnavigator;
     table                     :tsybtable;
     query                     :tsybquery;
     pan_top,pan_main          :tpanel;
     scbox_main                :tscrollbox;
     first_pos                 :integer;

     procedure get_dbproc;
  public
    dbprocc:integer;
    constructor create(AOwner:TComponent); override;
  published
    { Published declarations }
    property DbName :SybObjectname read FDbName write setDbname;
    property DesignActive:boolean read fdesignactive write setdesignactive stored false;
    property DbProc:integer read FDbproc write SetDbProc default 0;
  end;

procedure Register;

implementation
uses sybcheckbox,
     sybedit,
     sybmemo,
     sybsproc;

procedure Register;
begin
  RegisterPropertyEditor(TypeInfo(SybObjectname),TSybGenerate,'',Tsybobjectproperty);
  RegisterComponents('Sybase DBLIB', [TSybGenerate]);
end;

constructor Tsybgenerate.create(AOwner:TComponent);
begin
  inherited create(AOwner);
  fparent:=aowner;
  Fdesignactive:=false;
  Fdbproc:=0;
  first_pos:=524550;
end;

procedure Tsybgenerate.SetDbname(Value :SybObjectname);
begin
  FDbname:=value;
  if navigator <> nil then
    navigator.dbname:=value;
  if table <> nil then
    table.dbname:=value;
  if query <> nil then  
    query.dbname:=value;
  get_dbproc;
end;

procedure tsybgenerate.SetDbProc(Value :integer);
begin
  FDbproc:=Value;
  Dbprocc:=Value;
end;

procedure Tsybgenerate.Setdesignactive(Value :boolean);
var frm  :tform;
    i    :integer;
begin
  if value then
  begin
    get_dbproc;
  end;
  Fdesignactive:=Value;
  if FDesignActive then
  begin
    f_form1:=tf_form1.create(nil);
    f_form2:=tf_form2.create(nil);
    f_form25:=tf_form25.create(nil);
    f_form27:=tf_form27.create(nil);
    f_form3:=tf_form3.create(nil);
    f_form4:=tf_form4.create(nil);
    f_form5:=tf_form5.create(nil);
    f_form2.l_tablenames.dbname:=dbname;
    f_form2.l_tablenames.dbproc:=dbproc;
    f_form25.l_allfields.dbproc:=dbproc;
    f_form5.com_update_sproc.dbproc:=dbproc;
    f_form5.com_insert_sproc.dbproc:=dbproc;
    f_form5.com_delete_sproc.dbproc:=dbproc;
    f_form2.l_tablenames.sqlexec;
    f_form5.com_update_sproc.sqlexec;
    f_form5.com_insert_sproc.sqlexec;
    f_form5.com_delete_sproc.sqlexec;
    f_form1.showmodal;

    if f_form1.action = 4 then
    begin
      r_simple:=f_form1.r_simple.checked;
      r_masterdetail:=f_form1.r_masterdetail.checked;
      r_horizontal:=f_form3.r_horizontal.checked;
      r_vertical:=f_form3.r_vertical.checked;
      r_grid:=f_form3.r_grid.checked;
      r_left:=f_form4.r_left.checked;
      r_top:=f_form4.r_top.checked;
      r_form_only:=f_form5.r_form_only.checked;
      r_table:=f_form5.r_table.checked;
      r_query:=f_form5.r_query.checked;
      r_form_procs:=f_form5.r_form_procs.checked;
      chk_sprocs:=f_form5.chk_sprocs.checked;
      c_form:=f_form5.c_form.checked;
      dataset:=f_form2.e_tablename.text;

      fieldscount:=f_form25.l_thefields.items.count;
      for i:=0 to fieldscount-1 do
        field_names[i+1]:=f_form25.l_thefields.items[i];

      if r_form_procs then
      begin

        create_table_component;
        if chk_sprocs then
        begin
          if f_form5.chk_update.checked then
          begin
            update_sproc:=f_form5.com_update_sproc.text;
            create_sproc(1,update_sproc);
          end;
          if f_form5.chk_insert.checked then
          begin
            insert_sproc:=f_form5.com_insert_sproc.text;
            create_sproc(2,insert_sproc);
          end;
          if f_form5.chk_delete.checked then
          begin
            delete_sproc:=f_form5.com_delete_sproc.text;
            create_sproc(3,delete_sproc);
          end;
        end;
      end;
      get_datatypes;
      create_fields;
    end;

    f_form1.free;
    f_form2.free;
    f_form25.free;
    f_form27.free;
    f_form3.free;
    f_form4.free;
    f_form5.free;

    Fdesignactive:=false;
  end;
  destroy;
end;

procedure Tsybgenerate.get_dbproc;
var i         :integer;
    adatabase :tsybdatabase;
begin
  if databaseslist <> nil then
    for i:=0 to (databaseslist.count-1) do
    begin
      adatabase:=databaseslist[i];
      if FDbName = adatabase.name then
      begin
        setdbproc(adatabase.dbproc);
        break;
      end;
  end;
end;

procedure Tsybobjectproperty.GetValues(TheProc: TGetStrProc);
var
  dbname    :SybObjectname;
  adatabase :tsybdatabase;
  i         :integer;
begin
  if getname = 'DbName' then
  begin
    if databaseslist <> nil then
      for i:=0 to (sybase_components.databaseslist.count-1) do
      begin
        adatabase:=databaseslist[i];
        theproc(adatabase.name);
      end;
  end
end;

function Tsybobjectproperty.getattributes:Tpropertyattributes;
begin
  Result := [paValueList,paAutoUpdate,paMultiSelect];
end;

procedure Tsybgenerate.get_datatypes;
var query  :tsybquery;
    i      :integer;
    foundq :boolean;

begin
  query:=tsybquery.create(nil);
  query.dbproc:=dbproc;

  foundq:=false;
  for i:=0 to querylist.count-1 do
  begin
    if tsybquery(querylist[i]).name=dataset then
    begin
      query.sql:=tsybquery(querylist[i]).designsql;
      foundq:=true;
      break;
    end;
  end;
  if not foundq then
  begin
    query.sql:='select ';
    for i:=1 to fieldscount-1 do
      query.sql:=query.sql + field_names[i] + ',';
    query.addsql(field_names[fieldscount] + ' from ' + dataset + ' where 1=2');
  end;
  query.sqlexec;

  for i:=1 to fieldscount do
  begin
    field_datatypes[i]:=query.coltype(i);
    field_lengths[i]:=query.collength(i);
  end;
end;

procedure Tsybgenerate.create_fields;
var edit       :tsybedit;
    check      :tsybcheckbox;
    memo       :tsybmemo;
    lab        :tlabel;
    i,topp,
    maxwidth,
    lft,j      :integer;
    s          :string;

begin

  for i:=fparent.componentcount-1  downto 0 do
  begin
    if fparent.components[i].tag >= 100 then
    begin
      fparent.components[i].destroy;
    end;
  end;

  pan_top:=tpanel.create(fparent);
  pan_top.align:=altop;
  pan_top.alignment:=tacenter;
  pan_top.name:='pan_top';
  pan_top.tag:=100;
  pan_top.caption:='';
  pan_top.parent:=twincontrol(fparent);

  navigator:=tsybnavigator.create(fparent);
  navigator.name:='nav_' + dataset;
  navigator.left:=8;
  navigator.top:=8;
  navigator.dbname:=dbname;
  navigator.dataset:='ds_' + dataset;
  navigator.parent:=twincontrol(pan_top);

  pan_main:=tpanel.create(fparent);
  pan_main.align:=alclient;
  pan_main.alignment:=tacenter;
  pan_main.bevelinner:=bvlowered;
  pan_main.bevelouter:=bvraised;
  pan_main.name:='pan_main';
  pan_main.caption:='';
  pan_main.tag:=100;
  pan_main.parent:=twincontrol(fparent);

  scbox_main:=tscrollbox.create(fparent);
  scbox_main.align:=alclient;
  scbox_main.name:='scbox_main';
  scbox_main.tag:=100;
  scbox_main.parent:=twincontrol(pan_main);

  topp:=top_of_first_field;
  lft:=left_of_first_field;
  maxwidth:=0;
  if (r_vertical) then
  begin
    if r_left then
    begin
    for i:=1 to fieldscount do
      begin
        lab:=tlabel.create(fparent);
        lab.left:=lft;
        lab.tag:=105;
        lab.name:='lab_' + field_names[i];
        lab.caption:=no_under(field_names[i]);
        lab.top:=topp;
        if lab.width > maxwidth then
          maxwidth:=lab.width;
         if (field_datatypes[i] = 'text') then
          topp:=topp + 90
        else
          topp:=topp + 22;
        lab.parent:=twincontrol(scbox_main);
      end;
      topp:=top_of_first_field;
      lft:=(left_of_first_field + 10) + maxwidth;
    end
    else
      lft:=left_of_first_field + 10;
    for i:=1 to fieldscount do
    begin
      if (r_top) then
      begin
        lab:=tlabel.create(fparent);
        lab.left:=lft;
        lab.tag:=105;
        lab.name:='lab_' + field_names[i];
        lab.caption:=no_under(field_names[i]);
        lab.top:=topp;
        if (field_datatypes[i] = 'text') then
          topp:=topp + 90
        else
          topp:=topp + 22;
        lab.parent:=twincontrol(scbox_main);
      end;

      if (field_datatypes[i] <> 'bit')
        and (field_datatypes[i] <> 'text') then
      begin
        edit:=tsybedit.create(fparent);
        edit.isprimarykey:=iskey(field_names[i]);
        edit.dataset:='ds_' + dataset;
        edit.name:='e_' + field_names[i];
        edit.text:='';
        edit.datafield:=field_names[i];
        edit.top:=topp;
        edit.left:=lft;
        if (r_top) then
          topp:=topp + 25
        else
          topp:=topp + 22;
        edit.tag:=110;
        if field_datatypes[i] = 'char' then
        begin
          edit.width:=(field_lengths[i]+1)* (tform(fparent).font.size);
          edit.maxlength:=field_lengths[i];
          edit.length:=field_lengths[i];
        end;

        if (field_datatypes[i] = 'datetime')
          or (field_datatypes[i] = 'smalldatetime') then
        edit.datatype:='datetime';

        if (field_datatypes[i] = 'float')
          or (field_datatypes[i] = 'money')
          or (field_datatypes[i] = 'real') then
        edit.datatype:='float';

        if (field_datatypes[i] = 'int')
          or (field_datatypes[i] = 'smallint')
          or (field_datatypes[i] = 'tinyint') then
        edit.datatype:='int';

        if (field_datatypes[i] = 'char') then
          edit.datatype:='char';

        edit.tag:=105;
        edit.parent:=twincontrol(scbox_main);
      end;
      if (field_datatypes[i] = 'bit') then
      begin
        check:=tsybcheckbox.create(fparent);
{        if table <> nil then
          check.tablename:=table.name;}
        check.dataset:='ds_' + dataset;
        check.name:='chk_' + field_names[i];
        check.caption:='';
        check.datafield:=field_names[i];
        check.datatype:='bit';
        check.top:=topp;
        check.left:=lft;
        if (r_top) then
          topp:=topp + 25
        else
        topp:=topp + 22;
        check.tag:=115;
        check.parent:=twincontrol(scbox_main);
      end;
      if (field_datatypes[i] = 'text') then
      begin
        memo:=tsybmemo.create(fparent);
{        if table <> nil then
        memo.tablename:=table.name;}
        memo.dataset:='ds_' + dataset;
        memo.name:='mem_' + field_names[i];
        memo.datafield:=field_names[i];
        memo.datatype:='text';
        memo.top:=topp;
        memo.left:=lft;
        memo.tag:=120;
        memo.text:='';
        topp:=topp + memo.height;
        memo.parent:=twincontrol(scbox_main);
      end;
    end;

  end;
end;

function Tsybgenerate.no_under(col :string):string;
var i,j  :integer;
    s    :string;
    c    :string[1];
begin
  i:=1;
  c:=col[i];
  if c<> '_' then
    s:=s + upcase(col[i]);
  while i < length(col) do
  begin
    inc(i);
    c:=col[i];
    if c <> '_' then
      s:=s + c;
    if c='_' then
    begin
      inc(i);
      c:=upcase(col[i]);
      s:=s + ' ' + c;
    end;
  end;
  result:=s;
end;

procedure Tsybgenerate.create_table_component;
var i,j  :integer;
begin
  if r_table then
  begin
    table:=tsybtable.create(fparent);
    table.designinfo:=first_pos;
    table.name:='ds_' + dataset;
    table.tablename:=dataset;
    table.dbname:=dbname;
    table.dbproc:=dbproc;
  end
  else
  begin
    query:=tsybquery.create(fparent);
    query.designinfo:=first_pos;
    query.name:='ds_' + dataset;

    for i:=0 to querylist.count-1 do
    begin
      if tsybquery(querylist[i]).name='ds_' + dataset then
      begin
        query.sql:='select ';
        for j:=1 to fieldscount-1 do
          query.sql:=query.sql + field_names[j] + ',';
        query.addsql(field_names[fieldscount] + ' from ' + dataset);
        break;
      end;
    end;
    query.dbname:=dbname;
    query.dbproc:=dbproc;
  end

end;

function Tsybgenerate.iskey(name :string):boolean;
var i  :integer;
begin
  result:=false;
  for i:=0 to f_form27.l_primarykeys.items.count-1 do
    if (f_form27.l_primarykeys.selected[i]) and (f_form27.l_primarykeys.items[i]=name) then
    begin
      result:=true;
      exit;
    end;
end;

procedure Tsybgenerate.create_sproc(sproc_type:integer;procname:sybobjectname);
var sproc  :tsybsproc;
begin
  first_pos:=first_pos + 30;
  sproc:=tsybsproc.create(fparent);
  sproc.designinfo:=first_pos;
  case sproc_type of
    1:  sproc.name:='sp_u_' + procname;
    2:  sproc.name:='sp_i_' + procname;
    3:  sproc.name:='sp_d_' + procname;
  end;
  sproc.sprocname:=procname;
  sproc.dbname:=dbname;
  sproc.dbproc:=dbproc;
  sproc.designactive:=true;
end;

function Tsybgenerate.is_table(name   :SybObjectname):boolean;
var i   :integer;
begin
  result:=false;
  for i:=0 to tablelist.count-1 do
  begin
    if tsybtable(tablelist[i]).name=dataset then
    begin
      result:=true;
      break;
    end;
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -