Как СДС правя
Как да си направим СДС
Здравейте всички! Обратно към овцете.
Попитайте неприлично глупав въпрос:
Има една функция в DLL, тази функция
функция nextdate (datn, datk: pdate): pdate; cdecl;
Var г, т, у: Word;
г: цяло число;
DAT: TDate;
започвам
decodedate (datn ^, Y, m, г);
Inc (т);
ако m> 12 след това
започвам
Inc (у);
m: = 1;
приключи;
г: = 1;
DAT: = encodedate (у, т, г) -1;
ако DAT> datk ^ след това
започвам
R: = TRUNC (datk ^);
край
още
започвам
R: = TRUNC (DAT);
приключи;
New (резултат);
резултат ^: = R;
приключи;
Както го прикрепите към базата данни в IBExpert "д като СДС.
Вася, мила моя, за вашия "овца" Казах ви, че преди една седмица като отговор даден). предишното същия въпрос)
и всичко, което му "Върни се", докато сега). няма да има клон да гледам, тъй като изгубена)
и ако не е загубена, тя не е ровене в него напълно - изпраща само до cdecl stdcall и имат всички успокои по някаква причина.
Но има и аз ще кажа на Руски - формати дата работно време в IB и ObjectPascal несъвместими. И ако на входа Fct прилага дата време стойност във формат IB (и се връща в Qual-съм резултат), е необходимо да се извърши междинно конвертиране
> Как да го прикачите към "електронна база данни, в IBExpert като СДС
за синтаксиса и използването на DDL-скриптове ДЕКЛАРИРАМЕ функция - предложения чули нищо.
Не Кълна се, не мога да се закълна в мен.
С infoy ме здраво, без литература, не, никой не може да попитам, и връзката с интернет глупости.
Ние живеем в muhosranske, тъмна, тормозен, гладен.
Самите ние не сме местна помощ, отколкото може да
> Ако входната FCT прилага дата време стойност във формат
> IB (както се връща в Kutch-положителни резултат), е необходимо
> Извършване на междинно превръщане
Как мога да извърши?
> За синтаксиса и използването на скриптове DDL ДЕКЛАРИРАМЕ ФУНКЦИЯ
> - предложения чули нищо.
Ако бях чул, че нишката, нямаше да питам. Аз не се използва за СДС yuzal, че е искал да го пробвам, просто не знам как да се подходи
Е, добре, вие posmoti колко сме бедни, razneschastnye нещо.
Точно толкова, колкото една сълза пробие)
MSecsPerDay10 = MSecsPerDay * 10; // милисекунди на ден * 10
IBDateDelta = 15018; // разлика в дните между "нула" датира ОП и МЗ
функционира DateToQuad (г: TDateTime): TISC_QUAD;
Var
Дни: цяло число;
започвам
Дни: = TRUNC (г);
Result.gds_quad_high: = дни + IBDateDelta;
Result.gds_quad_low: = TRUNC ((г - дни) * MSecsPerDay10);
приключи;
функция QuadToDate (IBD: TISC_QUAD): TDateTime;
започвам
Резултати: = ibd.gds_quad_high - IBDateDelta + ibd.gds_quad_low / MSecsPerDay10;
приключи;
функция nextdate (Var datn, datk: TISC_QUAD): TISC_QUAD; cdecl;
Var
DateFrom, DateTo, DateResult: TDateTime;
започвам
// трансформира IB-дата / час формат в ОП
DateFrom: = QuadToDate (datn);
DateTo: = QuadToDate (datk);
// става тук с параметрите DateFrom, DateTo какво имате нужда, и напишете в резултат на "творчеството" в lok.peremennuyu DateResult
// обратна конверсия нарязани-та
ДЕКЛАРИРАМЕ ВЪНШЕН ФУНКЦИЯ nextdate
ДАТА, DATE
ВРЪЩАНЕТО НА ДАТА
ENTRY_POINT "nextdate" MODULE_NAME "MoyaUDF.dll"
> Е, добре, вие posmoti колко сме бедни, razneschastnye нещо.
> Точно толкова, колкото една сълза пробие)
Благодаря ви за съчувствие, може да се види един джентълмен.
> ENTRY_POINT "nextdate" MODULE_NAME "MoyaUDF.dll"
Не знам защо, но ако "д IBExpert пиша по този начин. Това не работи, и ако не пиша .dll, тогава всичко е наред
ENTRY_POINT "nextdate" MODULE_NAME "MoyaUDF"
Аз ще се опитам да направя така, както бе споменато по-горе, преминете sardechno благодаря! (Има и интелигентни хора на земята!)
А Didzhitman не може да прокълне. Това е в кръвта му. Digital кръв.
Ако сте програмист, или къде.
че, просто ей така, на екрана, както и написани, те казват: "не работи" или "всичко е наред"?))
> Това, просто ей така, на екрана, както и написани, те казват: "не работи"
> Или "всичко е наред"?))
Ясно е, че без да е .dll-малко не изпращане на "нарушение достъп".
Пълният текст на DLL, IB-скрипт текст, С pom.kotorogo ви съобщи, такъв е-му в тяхната IB-базирани, и текста на SQL-предложенията, което включваше призив към тази на СДС-FCT
нещо като това трябва да бъде, ако разбирам вашата логика изисква СДС.
функция nextdate (Var datn, datk: TISC_QUAD): TISC_QUAD; cdecl;
Var
Dat, DateFrom, DateTo, DateResult: TDateTime;
започвам
DateFrom: = QuadToDate (datn);
DateTo: = QuadToDate (datk);
/////////////
decodedate (DateFrom, Y, m, г);
Inc (т);
ако m> 12 след това
започвам
Inc (у);
m: = 1;
приключи;
г: = 1;
Dat: = encodedate (у, т, г) - 1;
ако Dat> DateTo след това
започвам
DateResult: = TRUNC (DateTo);
край
още
започвам
DateResult: = TRUNC (DAT);
приключи;
/////////////
Резултати: = DateToQuad (DateResult);
приключи;
доведе Fct - 8-байт стойност в IB ДАТА формат - доста МБ стойност, върната от сървъра, така че не е необходимо в резултат на разпределение на паметта, и още повече - не означава, управление на паметта от Borland
> Пълният текст на DLL
библиотечни дати;
употреби
SysUtils,
Controls,
Курсове,
IBHeader;
MSecsPerDay10 = MSecsPerDay * 10;
IBDateDelta = 15018;
тип pdate = ^ Tdate;
функционира DateToQuad (г: TDateTime): TISC_QUAD;
Var
Дни: цяло число;
започвам
Дни: = TRUNC (г);
Result.gds_quad_high: = дни + IBDateDelta;
Result.gds_quad_low: = TRUNC ((г - дни) * MSecsPerDay10);
приключи;
функция QuadToDate (IBD: TISC_QUAD): TDateTime;
започвам
Резултати: = ibd.gds_quad_high - IBDateDelta + ibd.gds_quad_low / MSecsPerDay10;
приключи;
функция nextdate (Var datn, datk: ISC_QUAD): ISC_QUAD; cdecl;
Var г, т, у: Word;
г: цяло число;
DateFrom, DateTo, DateResult: TDateTime;
започвам
DateFrom: = QuadToDate (datn);
DateTo: = QuadToDate (datk);
decodedate (DateFrom, Y, m, г);
Inc (т);
ако m> 12 след това
започвам
Inc (у);
m: = 1;
приключи;
г: = 1;
DateResult: = encodedate (у, т, г) -1;
ако DateResult> DateTo след това
започвам
R: = TRUNC (DateTo);
край
още
започвам
R: = TRUNC (DateResult);
приключи;
Резултати: = DateToQuad (R);
приключи;
износа
nextdate;
започвам
край.
> Текст IB-скрипт, С pom.kotorogo ви съобщи, такъв е-ТА
> В твоя IB-базирани
ДЕКЛАРИРАМЕ ВЪНШЕН ФУНКЦИЯ NDAT
ДАТА,
ДАТА
ВРЪЩА ДАТА FREE_IT
ENTRY_POINT "nextdate" MODULE_NAME "датира"
> Текст SQL-предложение, което се появява на обжалване
> Това СДС Fct
СЪЗДАВАНЕ НА ПРОЦЕДУРА NEW_PROCEDURE (
DN ДАТА,
DK DATE)
AS
ДЕКЛАРИРАМЕ VARIABLE DS дата;
започвам
DS = ndat (DN, DK);
преустанови;
край
> Резултат Fct - 8-байт стойност IB ДАТА формат -
> Доста MB се върна на сървъра значение
Ще се радвам за стойността, но IBExpert кълне, той казва, че този тип данни се предават само чрез препратка.
Бих искал да предам като цяло все пак (добре, и да получите).
текст на СДС, който цитирах по-горе
текст на декларацията в скрипта да донесе декларацията Pascal и прилагането на СДС не съдържа dolezhen FREE_IT (това е само една рейк, който сте получили по челото)
ДЕКЛАРИРАМЕ ВЪНШЕН ФУНКЦИЯ NDAT
ДАТА,
ДАТА
ВРЪЩАНЕТО НА ДАТА
ENTRY_POINT "nextdate" MODULE_NAME "датира"
> CREATE ПРОЦЕДУРА NEW_PROCEDURE (
> DN ДАТА,
> DK DATE)
> AS
> ДЕКЛАРИРАМЕ VARIABLE DS дата;
> започне
> Ds = ndat (DN, DK);
> Суспендира;
> край
Начертайте спре. Expl.
и дори (I пренебрегва очевидното ви цоп)
СЪЗДАВАНЕ НА ПРОЦЕДУРА NEW_PROCEDURE (
DN ДАТА,
DK DATE)
ВРЪЩАНЕ (DS дата) / *. * /
AS
започвам
DS = ndat (DN, DK);
/ * Суспендира; под голям съмнение е необходимо saspenda тук - той се нуждае само ако СК се използва като клиентът връща LP, контролирана от Авто-ки създаде курсори на serv.storone * /
край
А, да. съжалявам). наистина - така
Ами tady - най-малко прост.
функция nextdate (Var datn, datk: TISC_QUAD): P ISC_QUAD; cdecl;
Var
Dat, DateFrom, DateTo, DateResult: TDateTime;
започвам
DateFrom: = QuadToDate (datn);
DateTo: = QuadToDate (datk);
/////////////
decodedate (DateFrom, Y, m, г);
Inc (т);
ако m> 12 след това
започвам
Inc (у);
m: = 1;
приключи;
г: = 1;
Dat: = encodedate (у, т, г) - 1;
ако Dat> DateTo след това
започвам
DateResult: = TRUNC (DateTo);
край
още
започвам
DateResult: = TRUNC (DAT);
приключи;
/////////////
Резултат: = @datk;
Резултати ^: = DateResult;
приключи;
ДЕКЛАРИРАМЕ ВЪНШЕН ФУНКЦИЯ NDAT
ДАТА,
ДАТА // това form.parametr употреба fakt.parametra за предаване и в същото време да се върне в разрез-ТА
ВРЪЩАНЕТО НА ПАРАМЕТРИ 2
ENTRY_POINT "nextdate" MODULE_NAME "датира"
и. И накрая, връщайки се към вашите pervonach.variantu с FREE_IT.
той също работи, но прилагането му едва ли е оправдано, ако не - лошо (очевидно ненужно и глупаво операция преразпределение).
функция nextdate (Var datn, datk: TISC_QUAD): PISC_QUAD; cdecl;
Var
Dat, DateFrom, DateTo, DateResult: TDateTime;
започвам
DateFrom: = QuadToDate (datn);
DateTo: = QuadToDate (datk);
/////////////
decodedate (DateFrom, Y, m, г);
Inc (т);
ако m> 12 след това
започвам
Inc (у);
m: = 1;
приключи;
г: = 1;
Dat: = encodedate (у, т, г) - 1;
ако Dat> DateTo след това
започвам
DateResult: = TRUNC (DateTo);
край
още
започвам
DateResult: = TRUNC (DAT);
приключи;
/////////////
Резултати: = ib_util_malloc (SizeOf (Резултати ^)); // заявка за блок от памет в паметта на IB stand.soglasheniyam мениджър
Резултати ^: = DateResult; // запис на рязане-та, след получаване на прекъсване, че сървърът ще пусне блока, защото имаме нужда от него се указват ясно FREE_IT-спецификатор нарязани-та
ДЕКЛАРИРАМЕ ВЪНШЕН ФУНКЦИЯ NDAT
ДАТА,
ДАТА
ВРЪЩАНЕ
ДАТА FREE_IT // винаги очаква да се върне чрез препратка, е zavisimomti от типа на резултат, за действителната 4 байта указател към блока на паметта се връща винаги се дава в тялото на СДС на ib_util_malloc ()
ENTRY_POINT "nextdate" MODULE_NAME "датира"
> Резултати: = @datk;
> Резултати ^: = DateResult;
Грешка: Резултати ^: = DateToQuad (DateResult);
URRRRRAAAAAA.
Спечелете.
Digitman, обичам те.
ZY И откъде знаеш всичко.
знамето, където). камила!)
Аз ще ви покажа току-що каза - ето един концептуално решение на проблема). и Golovenko нещо преместите malyas))). Не мога да не съм kakzhnuyu линия калибрира им оближе тук). това не е за мен - това е, че Нада))))
но за нещо saspend - Scratch ряпа). не се мързеливи). въпросът не по-малко важно. макар и не много принцип с TZ "Жизнеспособност" код. ресурси - те няма гума)