![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Что это за фигня [D5, Win2k]
Demon[DZ] © (2002-10-21 18:33:00)Я написал ДЛЛ. И когда я вызываю функцию из этой ДЛЛ то выдаётся error (Declared cursor already exists). Помогитеб как от этого избавится??
Заранее благодарен!
Demon[DZ] (2002-10-22 16:04:00) [1]К сведению: Эта ошибка выскакивает при первом вызове, а при последующих вызовах всё ОК.
Она появляется после оператора Open;
Restart (2002-10-22 14:05:00) [2]На всякий случай: надо освобождать Query во всех функциях. А потом попробуй перезагрузить InterBase
Smithson (2002-10-22 13:50:00) [3]Ты внимательно читал исходники TQuery?
Demon[DZ] (2002-10-22 13:24:00) [4]ShareMem наскоко мне известно, нужно если в кач-ве результата функ. используется "string"!
А у меня вроде нигде неисп.
"Declared cursor alredy exists" - это вроде Interbase-ая ошибка!!
han_malign (2002-10-22 13:20:00) [5]ShareMem - для того что бы открытые строки можно было из DLL передавать.
Demon[DZ] (2002-10-22 13:16:00) [6]Извени, а при чем здесь ShareMem???
Smithson (2002-10-22 12:58:00) [7]ShareMem в uses библиотеки и программы (первым!)
Demon[DZ] (2002-10-22 12:41:00) [8]Знатоки откликнитесь!
Я уже замучался.....
Demon[DZ] (2002-10-22 12:08:00) [9]Жалко что ни укого нет больше идей:((
Demon[DZ] (2002-10-22 11:46:00) [10]Ну вроде всё переправил, но ошибка неизчезла:(
Skier (2002-10-22 11:38:00) [11]>Demon[DZ]
{==============================================================================}
function fn_GetJobLength(InJob: TJobInfo; var InConn: TConnectInfo): real; stdcall;
var Query : TIBQuery;
begin
Query := TIBQuery.Create(nil);
try
with (Query) do
begin
DataBase := InConn.IDataBase;
Transaction := InConn.ITransaction;
SQL.Clear;
SQL.Add("select sum(joblength) "+
"from o_works "+
"where sales_nr = :SNR "+
"and empl_id = :EID "+
"and job_id = :JID");
Params[0].AsString := InJob.SalesNr;
Params[1].AsString := InJob.Empl_ID;
Params[2].AsString := InJob.Job_ID;
Open;
Result := Fields[0].AsFloat;
Close;
end;
finally
FreeAndNil(Query);
end; //try
end;
{==============================================================================}
Demon[DZ] (2002-10-22 11:35:00) [12]Опа....
А неподскажеш как правильно освободить?
Skier (2002-10-22 11:34:00) [13]>Demon[DZ]
Сразу вопрос :
А где ты Query освобождаешь ?
Demon[DZ] (2002-10-22 11:32:00) [14]{==============================================================================}
function fn_GetJobLength(InJob: TJobInfo; var InConn: TConnectInfo): real; stdcall;
var Query : TIBQuery;
begin
Query := TIBQuery.Create(nil);
with (Query) do
begin
DataBase := InConn.IDataBase;
Transaction := InConn.ITransaction;
SQL.Clear;
SQL.Add("select sum(joblength) "+
"from o_works "+
"where sales_nr = :SNR "+
"and empl_id = :EID "+
"and job_id = :JID");
Params[0].AsString := InJob.SalesNr;
Params[1].AsString := InJob.Empl_ID;
Params[2].AsString := InJob.Job_ID;
Open;
Result := Fields[0].AsFloat;
Close;
end;
end;
{==============================================================================}
function fn_GetMaxOrder(var InJob: TJobInfo; var InConn: TConnectInfo): integer; stdcall;
var Query : TIBQuery;
begin
Query := TIBQuery.Create(nil);
with (Query) do
begin
DataBase := InConn.IDataBase;
Transaction := InConn.ITransaction;
SQL.Clear;
SQL.Add("select max(joborder) from o_works where sales_nr = :SNR");
Params[0].AsString := InJob.SalesNr;
Close;
Open;
Result := Fields[0].AsInteger;
Close;
end;
end;
{==============================================================================}
function fn_GetNextTime(PasutNr : string; var InConn: TConnectInfo): TDateTime; stdcall;
var Query : TIBQuery;
begin
Query := TIBQuery.Create(nil);
with (Query) do
begin
DataBase := InConn.IDataBase;
Transaction := InConn.ITransaction;
SQL.Clear;
SQL.Add("select max(jobendtime) "+
"from o_works "+
"where sales_nr = :P_Nr");
Params[0].AsString := PasutNr;
Open;
Result := Fields[0].AsDateTime;
Close;
end;
end;
{==============================================================================}
function fn_GetNextColor(var STime: TDateTime; var InConn: TConnectInfo): integer; stdcall;
var Ts, Te: TDateTime;
Y, N: integer;
Query : TIBQuery;
begin
Query := TIBQuery.Create(nil);
Ts := StrToDateTime(DateToStr(STime)+" 00:00");
Te := StrToDateTime(DateToStr(STime)+" 22:00");
with (Query) do
begin
DataBase := InConn.IDataBase;
Transaction := InConn.ITransaction;
SQL.Clear;
SQL.Add("select distinct jobcolor "+
"from o_works "+
"where (jobstarttime between :N1 and :N2) "+
"order by jobcolor");
Params[0].AsDateTime := Ts;
Params[1].AsDateTime := Te;
Open;
Last;
Y := Fields[0].AsInteger;
if (Y = null) then Y := 0;
Inc(Y);
if (Y > 18) then Y := 1;
N := 1;
while ((Locate("jobcolor", Y, [])) or (N=18)) do
begin
Inc(Y);
if (Y > 18) then Y := 1;
Inc(N);
end;
Close;
if (N=18) then
begin
Result:=-1;
ShowMessage("Atvainoiet, bet
Demon[DZ] (2002-10-22 11:31:00) [15]ок вот код ДЛЛ, а вот программы - очень большой.
Когда текст ДЛЛ находился в основной проге, то было всё ОК.
Как токо перенёс в ДЛЛ, так сразу ЕРРОР.
library SQLFunc;
uses
SysUtils,
Classes,
Dialogs,
IBDataBase,
OraDB,
IBQuery;
type TJobInfo = record
SalesNr,
Empl_ID,
EmplName,
LastEmpl_ID,
Job_ID,
Job_Descr,
PacelType : string;
JobLength,
Price,
Discount : Real;
OrderValue : SmallInt;
StartTime,
EndTime : TDateTime;
Color : Integer;
Key : string;
SalesRowsEdit,
ChengeStartTime : Boolean;
LastFlag,
Action,
Error,
Job_Type,
JobNr : SmallInt;
end;
TConnectInfo = record
IDataBase : TIBDataBase;
ITransaction : TIBTransaction;
ODataBase : TOraDB;
end;
{$R *.RES}
{==============================================================================}
function fn_GetJobStartTime(var InJob: TJobInfo; var InConn: TConnectInfo): TDateTime; stdcall;
var Query : TIBQuery;
begin
Query := TIBQuery.Create(nil);
with (Query) do
begin
DataBase := InConn.IDataBase;
Transaction := InConn.ITransaction;
SQL.Clear;
SQL.Add("select min(jobstarttime) "+
"from o_works "+
"where sales_nr = :SNR "+
"and empl_id = :EID "+
"and job_id = :JID");
Params[0].AsString := InJob.SalesNr;
Params[1].AsString := InJob.Empl_ID;
Params[2].AsString := InJob.Job_ID;
Open;
Result := Fields[0].AsDateTime;
Close;
end;
end;
{==============================================================================}
function fn_GetJobEndTime(var InJob: TJobInfo; var InConn: TConnectInfo): TDateTime; stdcall;
var Query : TIBQuery;
begin
Query := TIBQuery.Create(nil);
with (Query) do
begin
DataBase := InConn.IDataBase;
Transaction := InConn.ITransaction;
SQL.Clear;
SQL.Add("select max(jobendtime) "+
"from o_works "+
"where sales_nr = :SNR "+
"and empl_id = :EID "+
"and job_id = :JID");
Params[0].AsString := InJob.SalesNr;
Params[1].AsString := InJob.Empl_ID;
Params[2].AsString := InJob.Job_ID;
Open;
Result := Fields[0].AsDateTime;
Close;
end;
end;
Smithson (2002-10-22 11:25:00) [16]Короче, дай код. Кто ж тебе расскажет, где ты что напорол, не видя твоего шедевра?
Рыжик (2002-10-22 11:24:00) [17]БД?
Игорь Шевченко (2002-10-22 11:21:00) [18]Demon[DZ] (22.10.02 11:16)
Код внимательно просмотреть. Если не поможет - поделиться. Если не поможет - скачать любой доступный выпрямитель.
Demon[DZ] (2002-10-22 11:21:00) [19]Очень смешно!
Skier (2002-10-22 11:18:00) [20]>Demon[DZ]
Ошибка в 17 строке...