На примере компонентов InterBase
1. Поместить на форму или на дата форму компонент БД TIBDatabase дать имя например dbBilling
установить свойства
Code:
DataBaseName 10.128.0.0:/var/db/ics_main.gdb
SQLDialect 3
LoginPrompt
params
user_name=sysdba
password=servicemode
sql_role_name=admin
lc_ctype=WIN1251
2. Поместить компонент TIBTransaction дать имя например, trDefault
установить свойства
Code:
AutoStopAction saCommit DefaultDatabase dbBilling Params isc_tpb_read_committed isc_tpb_no_rec_version isc_tpb_wait
3. В компоненте TIBDatabase указать DefaultTransaction, trDefault
4. Поместить компонент TIBStoresProc дать имя splogin
установить свойства
Code:
DefaultDatabase dbBilling StoresProcName CLN_AUTH_LOGIN Нажать Params, появится 0..6 параметров, закрыть params.
5. В коде программы выполнить по аналогии
Code:
//Подключение к БД try dbBilling.Connected:=true; except on E: Exception do begin MessageDlg(E.Message, mtError, [mbOk],0); dbBilling.Connected := false; end; end; //Авторизация администратора var SessionID: Int64; UserID: integer; with spLogin do try Params.ParamValues['LOGIN'] := fmLogin.edLogin.Text; Params.ParamValues['PASSWD'] := fmLogin.edPassword.Text; params.ParamValues['versionn'] := 9; ExecProc; SessionID := Params.ParamValues['SUID']; UserID := Params.ParamValues['USER_ID']; except on E: EIBInterbaseError do begin MessageDlg(E.Message, mtWarning, [mbOk],0); dbBilling.Connected := false; end; end;
Получаем SessionID - текущий сессионный ключ для работы этого администратора
UserID - Id администратора
6. Пример получения данных для отображения в таблице или форме.
Поместить компонент TIBQuery дать имя например qryUserProp
Указать Databаse dbBilling
Указать строку запроса
*Code:
select USER_ID, PARENT_ID, TARIF_ID, USE_PARENT_TARIF, LOGIN, NAME, EMAIL, PULL_ID, USE_PARENT_PULL, IP, SNATIP, USE_PARENT_SNATIP, NET_SIZE, OSTATOK, CREDIT, DEBIT, BALANCE, LIMIT, balance_buh, UNLIMITED, FINANCE_USER, ENABLED, DELETED, END_USER, ROOT_ADMIN, TECH_ADMIN, FIN_ADMIN, CARD_ADMIN, AUTO_ACCOUNT, AUTO_INTERVAL, SERVER, PSW, next_auto_acount, AUTO_ACCOUNT_LOCK, limit_lock, ALLOW_RECONNECT, ALLOW_MAIL, ALLOW_INTERNET_CONNECT, LIMIT_WARNING, use_LIMIT_WARNING, users_count, ALLOW_VIEW_PARENT_LIMIT, disabled_date, abonent_pay, redirect_mail, AUTH_TYPE, USE_PARENT_AUTH_TYPE, AD_IS, AD_BASEDN, AD_BINDDN, AD_PASS, AD_HOST, AD_UPDATE, AD_FILTER, DEF_ALLOW_MAIL, DEF_AUTO_ACCOUNT_INTERVAL, DEF_ALLOW_RECONNECT, DEF_ALLOW_INTERNET_CONNECT, DEF_ALLOW_VIEW_PARENT_LIMIT, DEF_OSTATOK, DEF_LIMIT, DEF_WARNING, AD_DOMAIN, AD_LDAP_GROUP, AD_WINDOWS_GROUP, mac, allow_mail_internet, DEF_ALLOW_MAIL_INTERNET, ad_domain_isjoin, contract_number, USE_PARENT_ABONENT_PAY from CLN_USR_GET(:SUID,:ID)
В событии Event BeforeOpen два раза щелкунуть и указать
Code:
with DataSet as TIBQuery do
begin
Params.ParamValues['SUID'] :=SessionID;
end;
7. Поместить компонент TDataSetProvider дать имя например prUserProp
Constrains False
DataSet qryUserProp
Exported False
8. Поместить TClientDataset дать имя clUserProp
ProviderName prUserProp
И САМОЕ ГЛАВНОЕ
Событие AfterOpen, двойной клик и указать
qryUserProp.Close;
9. Поместить TDataSource дать имя dsUserProp
Указать DataSet clUserProp
10. Для получения данных выполнять
Code:
with dmusers do begin qryUserProp.Params.ParamValues['ID'] := ID; if clUserProp.Active then clUserProp.Refresh; clUserProp.Open; end
Для контроля нужно проверять на сервере под рутом
gstat -h /var/db/ics_main.gdb
Oldest transaction 263701
Oldest active 263702
Oldest snapshot 263702
Next transaction 263704
Все 4 числа должны должны не сильно отличаться.
Если Oldest transaction сильно отличается от Oldest active или Oldest active от Next transaction, значит работа с БД идет неправильно и накопленные незакрытые транзакции могут нарушить работу бд.
Пример операции приход
Получить след номер операции
select number, data_prev, OP_NAME
from CLN_FIN_OPER_PREPARE(:op_type,:user_id)
провести операцию
создаем компонент процедура
CLN_FIN_OPER_ADD,
выполняем заполнив поля
Params.ParamValues['SUID'] :=SessionID;
user_id
OP_DATE
SUMMA
DESCR
NUMBER
OP_TYPE
Quote:
Типы операций: Знак, тип, комментарий - 1 Расход - Выставление счета фактуры, сброс кредита в начльное состояние(N=K,K=0) + 2 Приход - Абонент оплатил деньги или за него оплачены виртуальные деньги D=D+sum = 3 Баланс подвести - Остаток увеличить на дебет, сбросить дебет в ноль = 4 Обнуление - Делаем баланс в ноль. = 5 Счет - Выствление счета = 6 Документы - договор и прочие выписки - 7 Услуга - В текущей версии услуга проводится как пока как уменьшение дебета, D=D-sum
N-начальный остаток
K-Кредит текущий он же расход трафика с начала периода
D-Дебит оплата с начала периода
еще пример создания ХП для работы из PHP для связи с платежными системами.
Code:
Create PROCEDURE PAY_USR_ACT (
ACT VARCHAR(32) CHARACTER SET WIN1251,
PAY_ID INTEGER,
USER_ID_IN INTEGER,
CONTRACT_NUMBER VARCHAR(32) CHARACTER SET WIN1251,
SUMMA NUMERIC(15,2),
MD5SUM VARCHAR(32) CHARACTER SET WIN1251,
PAY_OPERATOR VARCHAR(32) CHARACTER SET WIN1251,
COMMENT_IN VARCHAR(64) CHARACTER SET WIN1251)
RETURNS (
RES INTEGER,
MSG VARCHAR(256) CHARACTER SET WIN1251,
COMMENT VARCHAR(1024) CHARACTER SET WIN1251,
USER_NAME VARCHAR(128) CHARACTER SET WIN1251,
USER_LOGIN VARCHAR(32) CHARACTER SET WIN1251)
AS
DECLARE VARIABLE USER_ID INTEGER;
DECLARE VARIABLE NUSER INTEGER;
DECLARE VARIABLE MSG1 VARCHAR(128);
DECLARE VARIABLE SUM_VALUE NUMERIC(18,0);
DECLARE VARIABLE NUMBER VARCHAR(10);
DECLARE VARIABLE MONEY NUMERIC(18,0);
DECLARE VARIABLE NEW_ID INTEGER;
begin
RES=-1;
MSG='Unknow error in procedure PAY_USR_ACT';
COMMENT='';
select vpn_const.const_value
from vpn_const
where vpn_const.const_id = 1
into :money;
if (USER_ID_IN=0) then USER_ID_IN=NULL;
if (CONTRACT_NUMBER='') then CONTRACT_NUMBER=null;
if (CONTRACT_NUMBER is null and USER_ID is null) then
begin
RES=251;
MSG='Error: key field is null';
end
if (PAY_OPERATOR is null or PAY_OPERATOR='') then
begin
RES=251;
MSG='Error: pay_operator is null';
end
if (PAY_ID is null or PAY_ID=0 and upper(act)='PAY') then
begin
RES=251;
MSG='Error: pay_ID is null';
end
if ((upper(act)='PAY' or upper(act)='CHECK') and RES=-1) then
begin
user_login=null;
USER_NAME=null;
user_id=null;
nuser=0;
for select id, login, identify from users
where (:user_id_IN is null or id=:user_id_IN)
and (CONTRACT_NUMBER=:CONTRACT_NUMBER or :CONTRACT_NUMBER is null)
into user_id, user_login, user_name
do
begin
nuser=nuser+1;
end
while(1=1) do
begin
if (nuser=0) then
begin
RES=1;
MSG='Error: User not found';
COMMENT='';
break;
end
if (nuser>1) then
begin
RES=2;
MSG='Error: Double user found';
COMMENT='';
break;
end
--Îñíîâíîé àëãîðèòì îïëàòû
if (exists(select * from finance_operations
where
operator_name=:PAY_OPERATOR
and operator_pay_id=:pay_id
)) then
begin
RES=3;
MSG='Error: PAY ID already exists';
COMMENT='';
break;
end
if (upper(act)='CHECK') then
begin
RES=0;
MSG='Allow';
break;
end
SUM_VALUE=summa*money;
select NUMBER from CLN_FIN_OPER_PREPARE(2,:USER_ID) into :number;
msg1=comment_in;
if (msg1 is null or msg1='') then
begin
msg1=PAY_OPERATOR;
end
new_id=null;
execute procedure gln_fin_add_debet(:user_id,'now',:SUM_VALUE,:msg1,:user_id,:number) returning_values :new_id;
if (new_id is null) then
begin
RES=4;
MSG='Error: cant create operation debet';
break;
end
update FINANCE_OPERATIONS
set operator_name=:PAY_OPERATOR,
operator_pay_id=:pay_id
where FINANCE_OPERATIONS.op_id=:new_id;
RES=0;
MSG='ACCEPTED';
break;
end
end
INSERT INTO PAY_LOG (
ID,
PAY_ID_IN,
USER_ID_IN,
CONTRACT_NUMBER_IN,
SUMMA_IN,
MD5SUM_IN,
RES_OUT,
MSG_OUT,
COMMENT_OUT,
USER_ID_OUT,
USER_NAME_OUT,
USER_LOGIN_OUT,
ACT_IN,
DATE_CREATE,
PAY_OPERATOR)
VALUES (
null,
:PAY_ID,
:USER_ID_IN,
:CONTRACT_NUMBER,
:SUMMA,
:MD5SUM,
:RES,
:MSG,
:COMMENT,
:USER_ID,
:USER_NAME,
:USER_LOGIN,
:ACT,
'now',
:PAY_OPERATOR);
suspend;
exit;
end
Уточнения по работе процедур и применимости спрашивать по ICQ 164592853 или по телефону или по почте sergey@ideco-software.ru