Cum UDF
Cum sa faci o UDF
Bună tuturor! Înapoi la oile mele.
Adresați întrebarea necuviincios prost:
Există o funcție în DLL, această funcție
Funcția nextdate (datn, datk: pdate): pdate; cdecl;
var d, m, y: Word;
r: întreg;
DAT: TDate;
începe
decodedate (datn ^, y, m, d);
inc (m);
dacă m> 12 atunci
începe
inc (y);
m: = 1;
se încheie;
d: = 1;
dat: = encodedate (y, m, d) -1;
dacă este dat> datk ^ atunci
începe
r: = Trunc (datk ^);
capăt
altfel
începe
r: = Trunc (DAT);
se încheie;
Nou (rezultat);
rezultat ^: = r;
se încheie;
După cum se atașează la baza de date în IBExpert „e ca UDF.
Vasya, draga mea, despre „oi“ tău ți-am spus acum o săptămână ca un răspuns dat). anterior aceeași întrebare)
și voi toți să-l, „Du-te înapoi“ până în prezent). ar fi o ramură să se uite, din moment ce a pierdut)
și, dacă nu a pierdut, nu se înfrupta complet - transmis numai cdecl stdcall si toata lumea sa calmat pentru un motiv oarecare.
Dar nu voi spune în limba rusă - formatele de dată-oră în IB și incompatibile Object Pascal. Și dacă intrarea Fct aplicată valoarea dată de timp în formatul IB (și se întoarce la cali rezultat -ve), este necesar să se efectueze conversia intermediarului
> Cum atașați-l la „baza de date e în IBExpert ca UDF
despre sintaxa și utilizarea DDL-script DECLAR FUNCȚIE - propuneri auzit nimic.
Nu jura, nu se poate jura pe mine.
Cu infoy-mă strâns, nici literatură, nu, nimeni să ceară, iar conexiunea cu un rahat de Internet.
Trăim în muhosranske, întuneric, înjosită, foame.
Înșiși noi nu suntem de ajutor locale decât poate
> În cazul în care de intrare fct aplicată valoarea dată de timp în formatul
> IB (precum și se întoarce la Kutch-ve rezultat), este necesar
> Efectuați conversia intermediară
Cum pot efectua?
> Despre sintaxa și utilizarea de scripturi DDL DECLARE FUNCȚIE
> - propuneri auzit nimic.
Dacă aș fi auzit că firul, nu te-ar cere. Nu am folosit pentru a UDF yuzal, care a vrut să-l încercați, nu doar cum să se apropie știu
ah, bine, vă posmoti cât de săraci suntem, razneschastnye ceva.
La fel de mult ca o lacrima sparge prin)
MSecsPerDay10 = MSecsPerDay * 10; // milisecunde într-o zi * 10
IBDateDelta = 15018; // diferență de zile între „zero“ datează PO și OI
funcționa DateToQuad (d: TDateTime): TISC_QUAD;
var
Zile: Integer;
începe
Zile: = Trunc (d);
Result.gds_quad_high: = Zile + IBDateDelta;
Result.gds_quad_low: = Trunc ((d - Days) * MSecsPerDay10);
se încheie;
Funcția QuadToDate (ibd: TISC_QUAD): TDateTime;
începe
Rezultat: = ibd.gds_quad_high - IBDateDelta + ibd.gds_quad_low / MSecsPerDay10;
se încheie;
Funcția nextdate (var datn, datk: TISC_QUAD): TISC_QUAD; cdecl;
var
DateFrom, DateTo, DateResult: TDateTime;
începe
// transforma IB-data formatul / ora în PO
DateFrom: = QuadToDate (datn);
DateTo: = QuadToDate (datk);
// se întâmplă aici cu parametrii DateFrom, DateTo ceea ce ai nevoie, și notați rezultatul „creativitate“ în DateResult lok.peremennuyu
// conversie inversă cut-ta
DECLAR nextdate FUNCȚIA EXTERNĂ
DATE, DATE
REVINE DATE
ENTRY_POINT "nextdate" MODULE_NAME "MoyaUDF.dll"
> Ah, ei bine, posmoti cât de săraci suntem, razneschastnye ceva.
> La fel de mult ca o lacrima sparge prin)
Vă mulțumim pentru înțelegere, se poate vedea un domn.
> ENTRY_POINT "nextdate" MODULE_NAME "MoyaUDF.dll"
Nu știu de ce, dar dacă „e IBExpert scrie în acest fel. Asta nu funcționează, iar dacă nu scrie .dll, atunci totul este în regulă
ENTRY_POINT "nextdate" MODULE_NAME "MoyaUDF"
Voi încerca să facă acest lucru, așa cum sa menționat mai sus, în avans mulțumesc sardechno! (Există, de asemenea, oameni inteligenți pe pământ!)
Un Didzhitman nu poate blestem. E în sângele lui. sânge digital.
esti un programator, sau în cazul în care.
că, la fel ca cea de pe ecran, și în scris, spun ei, „nu funcționează“ sau „bine“?))
> Asta, la fel ca cea de pe ecran, și în scris, spun ei, „nu este de lucru“
> Sau "bine"?))
Se înțelege că, fără .dll de cel care nu a trimis pe „violare de acces.“
Textul integral al DLL, text IB-script, c pom.kotorogo ai anunțat o astfel de f-TION în bază de IB-lor, precum și textul SQL propuneri, care a prezentat un recurs la acest UDF-FCT
ceva de genul asta ar trebui să fie, dacă am înțeles logica dvs. UDF necesare.
Funcția nextdate (var datn, datk: TISC_QUAD): TISC_QUAD; cdecl;
var
Dat, DateFrom, DateTo, DateResult: TDateTime;
începe
DateFrom: = QuadToDate (datn);
DateTo: = QuadToDate (datk);
/////////////
decodedate (DateFrom, y, m, d);
inc (m);
dacă m> 12 atunci
începe
inc (y);
m: = 1;
se încheie;
d: = 1;
Dat: = encodedate (y, m, d) - 1;
dacă Dat> DateTo atunci
începe
DateResult: = Trunc (DateTo);
capăt
altfel
începe
DateResult: = Trunc (DAT);
se încheie;
/////////////
Rezultat: = DateToQuad (DateResult);
se încheie;
rezultat Fct - valoare de 8 octeți în IB format - mb destul Valoarea returnată de server, astfel încât nu este necesară rezultatul unei alocări de memorie, și chiar mai mult - nici un management de mijloace de memorie de la Borland
> Textul integral al DLL
datele de bibliotecă;
utilizări
SysUtils,
Controale,
clase,
IBHeader;
MSecsPerDay10 = MSecsPerDay * 10;
IBDateDelta = 15018;
tip pdate = ^ Tdate;
funcționa DateToQuad (d: TDateTime): TISC_QUAD;
var
Zile: Integer;
începe
Zile: = Trunc (d);
Result.gds_quad_high: = Zile + IBDateDelta;
Result.gds_quad_low: = Trunc ((d - Days) * MSecsPerDay10);
se încheie;
Funcția QuadToDate (ibd: TISC_QUAD): TDateTime;
începe
Rezultat: = ibd.gds_quad_high - IBDateDelta + ibd.gds_quad_low / MSecsPerDay10;
se încheie;
Funcția nextdate (var datn, datk: ISC_QUAD): ISC_QUAD; cdecl;
var d, m, y: Word;
r: întreg;
DateFrom, DateTo, DateResult: TDateTime;
începe
DateFrom: = QuadToDate (datn);
DateTo: = QuadToDate (datk);
decodedate (DateFrom, y, m, d);
inc (m);
dacă m> 12 atunci
începe
inc (y);
m: = 1;
se încheie;
d: = 1;
DateResult: = encodedate (y, m, d) -1;
dacă DateResult> DateTo apoi
începe
r: = Trunc (DateTo);
capăt
altfel
începe
r: = Trunc (DateResult);
se încheie;
Rezultat: = DateToQuad (r);
se încheie;
exporturi
nextdate;
începe
end.
> Text IB-script, c pom.kotorogo ai anunțat o astfel de f-TION
> În dvs. IB-based
DECLAR NDAT FUNCȚIA EXTERNĂ
DATE,
DATE
REVINE DATE FREE_IT
ENTRY_POINT "nextdate" "datele" MODULE_NAME
> Text SQL-propunere, care pare a face apel
> Acest UDF-Fct
CREATE PROCEDURA NEW_PROCEDURE (
DN DATE,
DK DATE)
AS
DECLAR VARIABILĂ DATA DS;
începe
ds = ndat (dn, dk);
suspenda;
capăt
> Rezultat Fct - 8-byte Valoare format IB DATA -
> mb Destul Serverul a returnat semnificativ
Aș fi fericit pentru valoarea, dar IBExpert jură, se spune că acest tip de date sunt transmise doar prin referință.
Aș dori să transmit, în general, deși (de bine, și de a lua).
Textul de mai sus UDF am citat
Textul declarației în script-ul pentru a aduce declarația Pascal și punerea în aplicare a UDF nu conține dolezhen FREE_IT (aceasta este doar o grebla, pe care le-ați primit pe frunte)
DECLAR NDAT FUNCȚIA EXTERNĂ
DATE,
DATE
REVINE DATE
ENTRY_POINT "nextdate" "datele" MODULE_NAME
> CREATE PROCEDURE NEW_PROCEDURE (
> DN DATE,
> DK DATE)
> AS
> DECLAR VARIABILĂ DATA DS;
> începe
> Ds = ndat (dn, dk);
> Suspendare;
> end
Desenați suspend. Expl.
și chiar (am trecut cu vederea evident ai cădea în apă)
CREATE PROCEDURA NEW_PROCEDURE (
DN DATE,
DK DATE)
RETURNĂRI (DS data) / *. * /
AS
începe
ds = ndat (dn, dk);
/ * Suspendare; sub o mare îndoială, trebuie să saspenda aici - avea nevoie numai în cazul în care SP este folosit ca clientul returnează LP, controlată de auto-ki crea cursoare pe serv.storone * /
capăt
ah, da. îmi pare rău). într-adevăr - asa
Ei bine, Tady - cel puțin simplu.
Funcția nextdate (var datn, datk: TISC_QUAD): P ISC_QUAD; cdecl;
var
Dat, DateFrom, DateTo, DateResult: TDateTime;
începe
DateFrom: = QuadToDate (datn);
DateTo: = QuadToDate (datk);
/////////////
decodedate (DateFrom, y, m, d);
inc (m);
dacă m> 12 atunci
începe
inc (y);
m: = 1;
se încheie;
d: = 1;
Dat: = encodedate (y, m, d) - 1;
dacă Dat> DateTo atunci
începe
DateResult: = Trunc (DateTo);
capăt
altfel
începe
DateResult: = Trunc (DAT);
se încheie;
/////////////
Rezultat: = @datk;
Rezultat ^: = DateResult;
se încheie;
DECLAR NDAT FUNCȚIA EXTERNĂ
DATE,
DATA // form.parametr această utilizare fakt.parametra pentru transmisie și, în același timp, pentru a reveni la cut-ta
REVINE PARAMETRI 2
ENTRY_POINT "nextdate" "datele" MODULE_NAME
și. În cele din urmă, merge înapoi la pervonach.variantu dvs. cu FREE_IT.
el funcționează, de asemenea, dar aplicarea ei nu este deloc justificată, în cazul în care nu - rău (în mod evident inutile și prost realocare de operare).
Funcția nextdate (var datn, datk: TISC_QUAD): PISC_QUAD; cdecl;
var
Dat, DateFrom, DateTo, DateResult: TDateTime;
începe
DateFrom: = QuadToDate (datn);
DateTo: = QuadToDate (datk);
/////////////
decodedate (DateFrom, y, m, d);
inc (m);
dacă m> 12 atunci
începe
inc (y);
m: = 1;
se încheie;
d: = 1;
Dat: = encodedate (y, m, d) - 1;
dacă Dat> DateTo atunci
începe
DateResult: = Trunc (DateTo);
capăt
altfel
începe
DateResult: = Trunc (DAT);
se încheie;
/////////////
Rezultat: = ib_util_malloc (sizeof (Rezultat ^)); // solicita un bloc de memorie în memoria managerului stand.soglasheniyam IB
Rezultat ^: = DateResult; // scrie la cut-ta, după ce a primit-cut că serverul va elibera blocul, pentru că avem nevoie de el este în mod clar care să ateste FREE_IT-Specificator cut-ta
DECLAR NDAT FUNCȚIA EXTERNĂ
DATE,
DATE
REVINE
DATE FREE_IT // întotdeauna de așteptat să se întoarcă prin referință, este zavisimomti pe tipul de rezultat, pentru real pointer de 4 octeți la blocul de memorie este returnat este întotdeauna alocat în corpul UDF al ib_util_malloc ()
ENTRY_POINT "nextdate" "datele" MODULE_NAME
> Rezultat: = @datk;
> Rezultat ^: = DateResult;
Greseala: Rezultat ^: = DateToQuad (DateResult);
URRRRRAAAAAA.
Câștigați.
Digitman, te iubesc.
ZY Și cum știi totul.
banner-ul, în cazul în care). cămilă!)
O să arăt tocmai ai spus - aici este o soluție conceptuală a problemei). și Golovenko ceva ce mutați malyas dvs.))). Nu pot să am kakzhnuyu line-calibra ling lor aici). nu este pentru mine - este tu Nada))))
ci despre ceva saspend - Scratch napi). nu fi leneș). întrebarea nu este mai puțin importantă. deși nu foarte principiu cu TZ „Viabilitatea“ de cod. resurse - acestea nu vor cauciuc)