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

📄 wwprovider.pas

📁 胜天进销存源码,国产优秀的进销存
💻 PAS
字号:
{
//
// Components : TwwProvider - Used by TwwFilterDialog
//
// Copyright (c) 1998-2001 by Woll2Woll Software
//
}
unit wwProvider;

interface

{$i wwIfDef.pas}

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Provider,
  {$ifndef wwDelphi5Up}
  BdeProv,
  {$endif}
  {$ifdef wwDelphi6Up}
  Variants,
  {$endif}
  wwcommon, dbtables, db;

type
  TwwProvider = class(TProvider)
  public
    function DataRequest(Input: OleVariant): OleVariant; override;
  end;

implementation

uses typinfo;

function TwwProvider.DataRequest(Input: OleVariant): OleVariant;
const dbl='"';
      single='''';
var apos, i, j: integer;
    s: string;
    sql: TStrings;
    PropInfo: PPropInfo;
    querySQL: TStrings;
    line, word: string;
    tempDataSet, table: TTable;
    TempFldList, TempAllFldList: TStrings;
    TableName, TableAlias, PhysFieldName, LogicalFieldName, DisplayLabel,
    FieldType, Key: string;
    TempField: TField;
    FieldDef: TFieldDef;
    FieldSize: string;

   Function ComputeFieldName(TempFldName: wwSmallString): string;
   begin
       result:= TempFldName;
   end;

begin
   try
      if Input[0]='w2wGetSQL' then begin
         PropInfo:= Typinfo.GetPropInfo(DataSet.ClassInfo,'Sql');
         if PropInfo<>Nil then sql:= TStrings(GetOrdProp(DataSet, PropInfo))
         else exit;

         with sql do
         begin
            for i:= 0 to sql.count-1 do begin
               s:= s + sql[i];
               if i<sql.count-1 then s:= s + #13;
            end
         end;
         result:= s;
         exit;
      end
      else if Input[0]='w2wGetFieldInfo' then begin
          if Dataset=Nil then exit;

          PropInfo:= Typinfo.GetPropInfo(Dataset.ClassInfo,'Sql');
          if PropInfo<>Nil then querysql:= TStrings(GetOrdProp(DataSet, PropInfo))
          else exit;

          for i:= 0 to querysql.count-1 do begin
            line:= uppercase(querysql[i]);
            APos:= 1;
            repeat
               word:= wwGetSQLWord(line, APos);
            until (word='FROM') or (word='');
            if word='FROM' then break;
          end;

          table:= TTable.create(Nil);
          tempDataSet:= table;

          TempFldList:= TStringList.create;
          TempAllFldList:= TStringList.create;

          if word='FROM' then begin
            repeat
               repeat { Get Next table in From list }
                  TableName:= wwGetSQLWord(line, APos);
                  if TableName='' then begin
                     if (i>=querysql.count-1) then break;
                     inc(i);
                     line:=uppercase(querysql[i]);
                     APos:= 1;
                  end
               until TableName<>'';

               if (TableName[1]=Dbl) or (TableName[1]=Single) then
               begin
                  TableName:= copy(TableName, 2, length(TableName)-2);
                  TableAlias:= wwGetSQLWord(line, APos);
               end
               else begin
                  TableAlias:= TableName;
               end;

               table.databaseName:= wwGetDatabaseName(dataset);
               table.sessionName:= wwGetSessionName(dataset);
               table.tableName:= tableName;
               table.readOnly:= True;
               table.GetFieldNames(TempFldList);

               for j:= 0 to TempFldList.Count-1 do begin
                  PhysFieldName:= TempFldList[j];
                  TempFldList[j]:= ComputeFieldName(TempFldList[j]);
                  LogicalFieldName:= TempFldList[j];
                  TableName:= TableAlias;

                  FieldDef:= tempDataSet.FieldDefs.Find(PhysFieldName);
                  if FieldDef<>nil then begin
                     FieldType:= GetEnumName(TypeInfo(TFieldType), Integer(FieldDef.DataType));
                     FieldSize:= inttostr(FieldDef.size);
                  end
                  else begin
                     FieldType:= '';
                     FieldSize:= '0';
                  end;

                  tempField:=tempDataSet.FindField(PhysFieldName);
                  if tempField=nil then begin  { If field not found check query's fields }
                     tempField:= dataset.FindField(PhysFieldName);
                     if tempField=nil then DisplayLabel:= PhysFieldName
                     else DisplayLabel:= tempField.DisplayLabel;
                  end
                  else DisplayLabel:= tempField.DisplayLabel;
                  Key:= PhysFieldName + ';' + LogicalFieldname + ';' +
                        TableName + ';' + DisplayLabel + ';' + FieldType + FieldSize;
                  if (TempAllFldList.indexOf(key)<0) then TempAllFldList.add(key)
               end;

               if wwGetSQLWord(line, APos)<>',' then break;
            until False;

            with TempAllFldList do
            begin
               for i:= 0 to TempAllFldList.count-1 do begin
                  s:= s + TempAllFldList[i];
                  if i<TempAllFldList.count-1 then s:= s + #13;
               end
            end;
            result:= s;
{
            returnOLE:= VarArrayCreate([0, TempAllFldList.count], varVariant);
            for i:= 0 to TempAllFldList.count-1 do begin
               returnOLE[i]:= TempAllFldList[i];
            end;
            result:= returnOLE;}
         end;

         tempDataSet.Free;
         tempFldList.Free;
         tempAllFldList.Free;
         exit;
      end
      else if Input[0]='w2wSetSQL' then begin
          PropInfo:= Typinfo.GetPropInfo(DataSet.ClassInfo,'Sql');
          if PropInfo<>Nil then sql:= TStrings(GetOrdProp(DataSet, PropInfo))
          else exit;

          sql.clear;
          for i:= VarArrayLowBound(Input, 1)+1 to
                  VarArrayHighBound(Input, 1) do
          begin
              sql.add(Input[i]);
          end;
          exit;
      end;

   except
   end;

   result:= inherited DataRequest(Input);

end;

end.

⌨️ 快捷键说明

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