Alex_Losk (alex_losk) wrote,
Alex_Losk
alex_losk

пиздец оказался победимым

итак кратко

предистория: есть в наличии 6,00,004,2337 RS-Bank, так же и версия 2410. на обоих система падала втихушку, не успевая ничего записать в trace лог. после почти суточного анализа, было полностью осознан момент когда она падает: при пакетной процедуре причисления процентов попадание на счет, по которому отсутствовали любые финансовые операции за 2007 год.
самое неприятное, что таких счетов было не менее 1500 - 2000 штук. и нажать в каждом операцию просто изически невыполнимо, учитывая закрывающийся баланс банка и смены плана счетов.

я перепробывал почти все, что знал про систему. также пытался понять, что можно исправить, подправить в счете, чтоб система приняла его за "своего".

решением оказалось создание (как я вчера придумал) макроса, которй будет выполнять некую RSL функцию в CommonInter "Выполнить операцию". на самом деле она вызывается при проведении операций из самого счета, там есть параметры, которые могут скрыть от пользователя любые панели.
я сделал макрос, который бегает по всем нужным мне счетам (смотреть SQL текст) и потом дергает функцию. система это понимает, как будто из счета нажали кнопку.

/******************************************************************************

MacroName: press72operation.mac
Created : 01/06/2008 6:10
Author : LAA

Requested: press72operation.mac
Comments : Программа для выполнения 72й операции, когда несколько билдов подряд
падали из-за пробем в исполняемых. пакетная процедура по счетам пластика,
по которым не было движения в 2007 году по работала
Созданный макрос бужит по пластиковым счетам и эмулирует нажатие кнопки
ПРИЧИСЛЕНИЕ процентов
*******************************************************************************
History:

******************************************************************************/
import DeprIntr;
import "Retail.lib.mac";

record REC_OPERPARM ("oper_prm.1", "sbbank.def") write;
record REC_SBDEPDOC ("sbdepdoc.dbt","sbbank.def") write;

var DEPOSITR = TBFile("depositr.dbt", "r");

var {oper};
var Oper = {oper};
var {curdate};
var OperDate = {curdate};

var OperDepDate = date(31,12,2007);
var iRec = 0;

/*===========================================================================*/
MACRO insert_DATA_SBDEPDOC(FNCash, Referenc, Account, Type_Account, OperDate, Oper, CodClient);

ClearRecord(REC_SBDEPDOC );
KeyNum (REC_SBDEPDOC,0);
Rewind (REC_SBDEPDOC );

REC_SBDEPDOC.Referenc = Referenc;
REC_SBDEPDOC.Type_Account = Type_Account;
REC_SBDEPDOC.FNCash = FNCASH;
REC_SBDEPDOC.Account = Account;
REC_SBDEPDOC.Date_Document = OperDate;
REC_SBDEPDOC.DepDate_Document = OperDepDate;
REC_SBDEPDOC.IsCur = 0;
REC_SBDEPDOC.Code_Currency = 0;
REC_SBDEPDOC.Oper = Oper;
REC_SBDEPDOC.VidDoc = 1;
REC_SBDEPDOC.ApplType = 0;
REC_SBDEPDOC.NDoc = 0;
REC_SBDEPDOC.NPack = 0;
REC_SBDEPDOC.KindOp = 5;
REC_SBDEPDOC.InSum = $0;
REC_SBDEPDOC.OutSum = $0;
REC_SBDEPDOC.Rest = $0;
REC_SBDEPDOC.PercOprSum = $0;
REC_SBDEPDOC.PercRest = $0;
REC_SBDEPDOC.ArDate = date(0,0,0);
REC_SBDEPDOC.YesSbook = "X";
REC_SBDEPDOC.ListTransfer = 0;
REC_SBDEPDOC.CodClient = CodClient;
REC_SBDEPDOC.TypeOper = 72;//причисление
REC_SBDEPDOC.NotConfirm = "";
REC_SBDEPDOC.TypeComplexOper = 72; //в составе
REC_SBDEPDOC.CodCashier = 0;
REC_SBDEPDOC.NumSession = 0;
REC_SBDEPDOC.Action = 0;
REC_SBDEPDOC.ObjectPerc = 2001;
REC_SBDEPDOC.IsControl = "X";
REC_SBDEPDOC.Brigade = 1;
REC_SBDEPDOC.Ground = "";
REC_SBDEPDOC.ArDatePcCalc = date(31,12,2099);
REC_SBDEPDOC.Mode = 0;
REC_SBDEPDOC.OrderNum = 0;
REC_SBDEPDOC.Source = 0;
REC_SBDEPDOC.OrderCount = 0;
REC_SBDEPDOC.Flags = 4104; /*??*/
REC_SBDEPDOC.KNFCode = 0;
REC_SBDEPDOC.RealFNCash = FNCash;
END;

/*===========================================================================*/
MACRO insert_DATA_OPERPARM(FNCash, Type_Account, CodClient, OperDate)

ClearRecord(REC_OPERPARM );
KeyNum (REC_OPERPARM,0);
Rewind (REC_OPERPARM );

REC_OPERPARM.Account = ""/*Account*/;
REC_OPERPARM.Type_Account = Type_Account;
REC_OPERPARM.Code_Currency = 0;
REC_OPERPARM.Type_Oper = 72;
REC_OPERPARM.Show_Panel = 0; /*не 0 - показывать панель*/
REC_OPERPARM.UseMaxDate = 0; /*при ноле - использовать оперДату*/
REC_OPERPARM.NoPrint = 0; /*не печатать документы*/
REC_OPERPARM.TypeComplexOper = 72;
REC_OPERPARM.DocumentAuthor = Oper;
REC_OPERPARM.AuthorCode = CodClient; /*??? код клиента на кого выполнить*/
REC_OPERPARM.CorrAcc = ""; /*счет корреспондента*/
REC_OPERPARM.CorrType = "";
REC_OPERPARM.DepDate = OperDepDate;
REC_OPERPARM.PercType = 2001;
REC_OPERPARM.CalcDate = OperDepDate;
REC_OPERPARM.IsControl = 1;
REC_OPERPARM.NonCashCommission = 0;
REC_OPERPARM.SwitchToFCContext = 0;
//REC_OPERPARM.MainDocRecPos = "";
REC_OPERPARM.ApplicationKind = 0;
REC_OPERPARM.ApplicationKey = "";
REC_OPERPARM.SvodAccount = "";
REC_OPERPARM.GroupID = "72";
REC_OPERPARM.NotMakePercentDocument = 0;
END;


/*****************************************************************************/
MACRO Run_Account_Operation(Referenc);

private var ErrorCode = 0;

//DEPOSITR
DEPOSITR.Clear();
DEPOSITR.KeyNum() = 8;
DEPOSITR.rec.Referenc = Referenc;
if (not DEPOSITR.GetEQ())
MsgBox("not search referenc = ", Referenc);
else
insert_DATA_OPERPARM(DEPOSITR.rec.FNCash,
DEPOSITR.rec.Type_Account,
DEPOSITR.rec.CodClient,
OperDate
);

insert_DATA_SBDEPDOC(DEPOSITR.rec.FNCash,
DEPOSITR.rec.Referenc,
DEPOSITR.rec.Account,
DEPOSITR.rec.Type_Account,
OperDate,
Oper,
DEPOSITR.rec.CodClient
);

ErrorCode = Выполнение_операции(REC_OPERPARM,REC_SBDEPDOC);
//MsgBox(ErrorCode);
if (ErrorCode == 0)
printLN(iRec," ",DEPOSITR.rec.Account, " ", DEPOSITR.rec.Referenc, " ОК");
else
printLN(iRec," ",DEPOSITR.rec.Account, " ", DEPOSITR.rec.Referenc, " Error code ", ErrorCode);
end;

end;
END;

/*****************************************************************************/
private var SQL = "";
private var cmd1, rsm1;

SQL = SQL + "select dep.t_referenc from ddepositr_dbt dep \n";
SQL = SQL + "where dep.t_fncash = 2 and dep.t_open_close != 'З' \n";
SQL = SQL + "and dep.t_action < 2 and dep.t_iscur = 0";

cmd1 = RsdCommand(SQL);
cmd1.execute;
rsm1 = RsdRecordset(cmd1);

OpenDepFiles();
while (rsm1.moveNext())
Run_Account_Operation(rsm1.Value("T_REFERENC"));
InterDesk_EndDocBunch(); //закрытие связки
iRec = iRec + 1;
message(iRec);
end;
CloseDepFiles();
Tags: rs-retail, rsl, исходники, работа
Subscribe

  • зарисовки о выборе профессии и сферах услуг

    Когда я был маленьким, мой отец говорил, что медики, учителя и военные всегда будут в почете. Какая бы власть не существовала в стране. Прошли годы.…

  • Excel - округление.

    Пишем в ячейку MS Excel значение 1.75. Во вторую 1.75. Ставим в формате ячеек значение как "числовой" с числом десятичных знаков 1. Видим…

  • Рабочее. Второй proxy сервер

    В свое время мне от руководителя филиала банка, где я тружусь была поставлена задача: сделать контролируемым доступ в интернет. По существующей…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 2 comments