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

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

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

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

Сообщение Bodybomber » Ср янв 06, 2021 14:19

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

Как передать в процедуру параметры имени таблицы и экземпляра 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.

Заранее спс.
Bodybomber
 
Сообщения: 4
Зарегистрирован: Вт дек 01, 2020 09:15
Reputation point: 0

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

Сообщение edward_K » Чт янв 07, 2021 20:21

исходите из того, что вам нужно передать в
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

edward_K
Заслуженный деятель интернет-сообщества
 
Сообщения: 5164
Зарегистрирован: Вт мар 29, 2005 17:49
Откуда: SPB galaxy spb
Reputation point: 115


Вернуться в Программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 2