Формальные параметры

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Bodybomber
Сообщения: 14
Зарегистрирован: 01 дек 2020, 08:15

Формальные параметры

Сообщение Bodybomber »

Доброго времени суток.

Как передать в процедуру параметры имени таблицы и экземпляра ISQLManager для исключения повторяемости кода
в последующих операторах альтернативного выбора case, if
в приблизительно такой реализации:

Код: Выделить всё

#include Query.vih
...
procedure procSetSQLMngr(
       qrySqlMngrName: <VarType_Of_iQuery>;
       tblTableName: <VarType_Of_Table>
); forward;
...
DataStream dsDS
(
  [D1] DFrom;
  [D2] DTo;

  table tblT1
  (
    ...
  );
  table tblT2
  (
   ...
  );
)
end;
...
procedure procSetSQLMngr(
       q: <VarType_Of_iQuery>;                //Здесь непонятно 
       tblTblName: <VarType_Of_Table>; //как правильно определить и вызывать параметры процедуры
); 
{
      q.SetParam('AnyVar', AnyVar ).SetParam('dStart', D1).SetParam('dEnd', D2);
      if RecordsInTable(#tblTblName) > 0 then 
      {
         sqlCopyInto(q, #tblTblName, true);
         ...
      };
}
...
cmOk:
{
  var q1 : iQuery = queryManager.CreateQuery(dsDS);
 Case VarSelectable of 
   #csCaseFirst:
     {
       procSetSQLMngr(q1,   tblT1)
     }
    #csCaseSecond:
     {
       procSetSQLMngr(q1,   tblT2)
     }
}
end.
Заранее спс.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Формальные параметры

Сообщение edward_K »

исходите из того, что вам нужно передать в
function sqlCopyInto(var QueryOrResultSet; iTable: integer; byName: boolean): integer;
То есть в вашем случае 2 параметр однозначно integer, а передавать туда нужно #таблица, где таблица указана в from 1-ого create view интерфейса - #tblT1 . На первое место проситься q1 и тип iQuery - но в sqlCopyInto уже должен быть готовый запрос. Вполне возможно, что прокатит тип TPTR (= longint в текущей версии или comp в следующей).
Что касается установки параметров возможно создание типа record с динамическим массивами.

Код: Выделить всё

Type TParam_Doc = Record
     descript      : Array[0..0] Of String; //
     Val             : Array[0..0] Of Variant //
 End;
Но зачем усложнять себе жизнь сначала упаковкой в структуру а потом ее распаковкой, когда можно сразу в q1 поставить?
Перенесите обработку из cmOk в функцию.
В целом все универсальные вещи априори медленнее.
Чтобы упростить код можно использовать declare.
Также вы можете управлять запросом sqlSetMacro или же вообще пересоздавая его целиком через sqlAddStr.

Код: Выделить всё

объявление запроса
 SQL QUERY SqlTmp_Nach = 
       SELECT
       ...
       From Nachisl
// пример учета прав по подразделению в ЗП
       inner join ZAR_USER ZU on (upper(ZU.OWNNAME) = upper(:sUserName))
       and  (ZU.POdrShare <> '+'
          or (Nachisl.cexoz in (Select UR.crecds from USERRIGHTS UR  where ZU.OWNNAME = UR.OWNNAME ) )
          )

       ...
       where ...
       %Filter_Nach
       %FilterP_Nach

;

Использование
    case wTypeSB of
    0: sqlSetMacro('Filter_Nach', ' and Nachisl.YearK='+String(wYear)
                     +' and Nachisl.Mes>=' +string(wMesB)
                     +' and Nachisl.Mes<=' +string(wMesE)
                );
    1: sqlSetMacro('Filter_Nach', ' and Nachisl.YearV='+String(wYear)
                     +' and Nachisl.MesV>=' +string(wMesB)
                     +' and Nachisl.MesV<=' +string(wMesE)
                );
    end;
    var hStrFilter:longint=0;
    if IsBitCTW(wFilter,1)
    { sqlAddStr(hStrFilter,iQBuilder.MakeCriteriaFromMarker(' and Nachisl.cexoz ',DepList));
    }
    if (hStrFilter<>0)
    { SqlsetMacro('FilterP_Nach',hStrFilter);
      sqlFreeStr(hStrFilter);
    }
    else
    { SqlsetMacro('FilterP_Nach','');
    }
    stmt := sqlAllocStmt;
    ExecuteErrorCode:=sqlPrepare(stmt,SqlTmp_Nach);
    if ExecuteErrorCode=0
    { sqlBindParamByName(stmt,'sUserName', sUserName);
      ExecuteErrorCode:=SqlExecute(stmt);
      if ExecuteErrorCode=0
      { ExecuteErrorCode:=SqlFetchInto(stmt,#Tmp_Report);
      }
    } // ExecuteError

Ответить