Добавлено: 12 сен 2007, 22:52
Клиника просто. Ты всерьёз думаешь, что сервер посылает записи клиенту поштучно? И что "массив" он захреначит в один TCP пакет?
Форум по InterBase, Firebird и Yaffil
http://ibaseforum.ru/
а если он выдаст 100000 записей? Как ты думаешь, сервер сможет зафигачить такой массив, и передать его тебе "одним махом"?Если результат таблицы выдаст 1000 записей, придется делать progressbar и пользователь будет "втыкать" в монитор пока процес не пройдет от первой и до последней 1000`ной записи. Вот я и ищу способ, что бы не перебирать по одной записи, а получить от сервера результат в удобном мне виде
понятно. т.е. все что тебе отвечали, ты читал невнимательно.скучно, я ожидал от interbase больше спецэффектов
и не надейся. я что-то за 12 лет не припомню, чтобы кто-то еще вот так хотел - "раз, и в массив". это ведь совершенно частная задача, для клиент-сервера на 99.999% не подходящая.но видимо эксперименты собираются открывать по одной-две-четыре штуке, постепенно, ...в новых версиях
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
const TABLE_RECORDS = 003; // макс длинна массива
{сутки , деньги}
IBLINE_AGENTS_DEMURRAGE: array [000..TABLE_RECORDS , 000..001] of integer=(( 7, 0) ,
( 7, 8) ,
( 14, 16) ,
( 100, 20));
DAYSPRESENT = 035; // общее кол-во имеющихся дней
var counter_days : integer; // контрольный счетчик дней; контроль от 0 до DAYSPRESENT;
get_moneys : integer; // суммирование последующего полученного денежного числа с массива;
cycle_array : integer;
cycle_array_itm: integer;
begin counter_days :=000; // счетчик суток;
get_moneys :=000; // суммирование денег;
for cycle_array :=000 to TABLE_RECORDS do // общая длинна записей всего массива;
for cycle_array_itm:=001 to IBLINE_AGENTS_DEMURRAGE[cycle_array , 000] do // длинна ячейки "сутки" в cycle_array эллементе массива;
if(DAYSPRESENT>counter_days )
then begin get_moneys:=get_moneys+IBLINE_AGENTS_DEMURRAGE[cycle_array , 001];
inc(counter_days);
end
else break;
memo1.Lines.Text:='Moneys count: '+IntToStr(get_moneys);
end; // procedure
Код: Выделить всё
на протяжении DAYSPRESENT (35 cуток) осуществляется оплата за:
за первые 7 суток из DAYSPRESENT ( 1) ( 1) получаем = 0$
по 0$ ( 2) ( 2) получаем = 0$
( 3) ( 3) получаем = 0$
( 4) ( 4) получаем = 0$
( 5) ( 5) получаем = 0$
( 6) ( 6) получаем = 0$
( 7) ( 7) получаем = 0$ = сумма первых пройденных 7 (из DAYSPRESENT (35 cуток)) суток
за сл. 7 суток из DAYSPRESENT ( 8) ( 1) получаем = 8$
по 8$ ( 9) ( 2) получаем = 16$
(10) ( 3) получаем = 24$
(11) ( 4) получаем = 32$
(12) ( 5) получаем = 40$
(13) ( 6) получаем = 48$
(14) ( 7) получаем = 56$ = сумма сл. пройденных 7 (из DAYSPRESENT (35 cуток)) суток
за сл. 14 суток из DAYSPRESENT (15) ( 1) получаем = 72$
по 16$ (16) ( 2) получаем = 88$
(17) ( 3) получаем = 104$
(18) ( 4) получаем = 120$
(19) ( 5) получаем = 136$
(20) ( 6) получаем = 152$
(21) ( 7) получаем = 168$
(22) ( 8) получаем = 184$
(23) ( 9) получаем = 200$
(24) ( 10) получаем = 216$
(25) ( 11) получаем = 232$
(26) ( 12) получаем = 248$
(27) ( 13) получаем = 264$
(28) ( 14) получаем = 280$ = сумма сл. пройденных 14 (из DAYSPRESENT (35 cуток)) суток
за сл. 100 суток из DAYSPRESENT (29) ( 1) получаем = 300$
по 20$ (30) ( 2) получаем = 320$
(31) ( 3) получаем = 340$
(32) ( 4) получаем = 360$
(33) ( 5) получаем = 380$
(34) ( 6) получаем = 400$
(35) ( 7) получаем = 420$ = cумма оставшихся 7 из 35 суток;
(36) ( 8) получаем = дальшне не считаем
(37) ( ..) получаем = дальшне не считаем
(38) ( ..) получаем = дальшне не считаем
(39) (100) получаем = дальшне не считаем
в сумме по тарификации получается 420$
Код: Выделить всё
CREATE PROCEDURE GET_DEMURRAGE("LINECODE" INTEGER , /* флаг ID компании */
"CONTNUM" VARCHAR(20) , /* тип контейнера [40`GP, 20`GP] */
"DAYSPRESENT" INTEGER) /* общий промежуток дней */
RETURNS ("DEMURRAGE_MONEYS" INTEGER) /* результат подсчета */
AS DECLARE VARIABLE "GET_DAYCOUNT" INTEGER; /* КОЛ-ВО СУТОК */
DECLARE VARIABLE "GET_SALARY" INTEGER; /* КОЛ-ВО ДЕНЕГ */
DECLARE VARIABLE "INC_DAYCOUNT" INTEGER; /* СЧЕТЧИК СУТОК */
DECLARE VARIABLE "INC_MONEYS" INTEGER; /* СЧЕТЧИК ДЕНЕГ */
DECLARE VARIABLE "CYCLE" INTEGER; /* ЦИКЛ */
BEGIN INC_DAYCOUNT=000;
FOR
SELECT IBLINE_AGENTS_DEMURRAGE."DEM_DAYSCOUNT" ,
IBLINE_AGENTS_DEMURRAGE."DEM_SALARY"
FROM IBLINE_AGENTS_DEMURRAGE
WHERE (IBLINE_AGENTS_DEMURRAGE."DEM_LINECODE" =:LINECODE)
AND (IBLINE_AGENTS_DEMURRAGE."DEM_CONTNUM" =:CONTNUM)
ORDER BY IBLINE_AGENTS_DEMURRAGE."DEM_STEPINC"
INTO :GET_DAYCOUNT ,
:GET_SALARY
DO BEGIN
WHILE(CYCLE<GET_DAYCOUNT-001)
DO BEGIN
IF(DAYSPRESENT>INC_DAYCOUNT)
THEN BEGIN INC_MONEYS = INC_MONEYS+GET_SALARY;
INC_DAYCOUNT= INC_DAYCOUNT+001;
END /* IF.. */
CYCLE=CYCLE+001;
END /* WHILE... */
END /* FOR... */
DEMURRAGE_MONEYS=INC_MONEYS;
SUSPEND;
ENd
Код: Выделить всё
CREATE TABLE IBLINE_AGENTS_DEMURRAGE
(
AINC INTEGER DEFAULT NULL , /* инкримент
DEM_LINECODE INTEGER DEFAULT NULL , /*(ПРИВЯЗКА) КОД ЛИНИИ;
DEM_CONTNUM INTEGER DEFAULT NULL , /*(ПРИВЯЗКА) ТИП КОНТЕЙНЕРА;
DEM_STEPINC INTEGER DEFAULT NULL , /* ПОСЛЕДОВАТЕЛЬНОСТЬ;
DEM_DAYSCOUNT INTEGER DEFAULT NULL , /* СУТКИ;
DEM_SALARY INTEGER DEFAULT NULL , /* ДЕНЬГИ;
DEM_CURR VARCHAR(255) DEFAULT NULL , /* ВАЛЮТНОЕ СЧИСЛЕНИЕ;
DEM_COMMENT VARCHAR(255) DEFAULT NULL); /* КОМЕНТ;
Код: Выделить всё
| AINC | DEM_LINECODE | DEM_STEPINC | DEM_DAYSCOUNT | DEM_SALARY | DEM_CURR | DEM_CONTNUM | DEM_COMMENT
| 49 | 48 | 1 | 7 | 0 | ДОЛЛ. | 20`GP | FREE 7 (ДНЕЙ)
| 50 | 48 | 1 | 7 | 0 | ДОЛЛ. | 40`GP | FREE 7 (ДНЕЙ)
| 53 | 2 | 1 | 14 | 0 | ДОЛЛ. | 20`GP | FREE 14 (ДНЕЙ)
| 54 | 2 | 2 | 14 | 8 | ДОЛЛ. | 20`GP |
| 55 | 2 | 3 | 100 | 15 | ДОЛЛ. | 20`GP | RELEASE
| 56 | 48 | 2 | 7 | 8 | ДОЛЛ. | 20`GP |
| 57 | 48 | 3 | 14 | 16 | ДОЛЛ. | 20`GP |
| 58 | 48 | 4 | 100 | 20 | ГРН. | 20`GP | RELEASE
| 59 | 48 | 2 | 7 | 16 | ДОЛЛ. | 40`GP |
| 60 | 48 | 3 | 14 | 32 | ДОЛЛ. | 40`GP |
| 61 | 48 | 4 | 100 | 40 | ДОЛЛ. | 40`GP | RELEASE
| 62 | 2 | 1 | 14 | 0 | ДОЛЛ. | 40`GP | FREE 14 (ДНЕЙ)
| 63 | 2 | 2 | 14 | 15 | ДОЛЛ. | 40`GP |
| 64 | 2 | 3 | 100 | 30 | ДОЛЛ. | 40`GP | RELEASE
Код: Выделить всё
| DEM_DAYSCOUNT | DEM_SALARY |
| 7 | 0 |
| 7 | 8 |
| 14 | 16 |
| 100 | 20 |
Код: Выделить всё
CREATE PROCEDURE TESTING
RETURNS("VARR_A" INTEGER, "SUMM" INTEGER)
AS
BEGIN
FOR
SELECT IBLINE_AGENTS_DEMURRAGE."DEM_DAYSCOUNT" FROM IBLINE_AGENTS_DEMURRAGE
INTO :VARR_A
DO BEGIN SUMM=SUMM+VARR_A;
END
SUSPEND;
ENd
Видимо потому что она не инициализирована.ERrorMAKros писал(а):Подскажите - почему после EXECUTE PROCEDURE TESTING или SELECT * FROM TESTING
переменаня SUMM ничему не равна?
Код: Выделить всё
CREATE PROCEDURE GET_DEMURRAGE("LINECODE" INTEGER , /* флаг ID компании */
"CONTNUM" VARCHAR(20) , /* тип контейнера [40`GP, 20`GP] */
"DAYSPRESENT" INTEGER) /* общий промежуток дней */
RETURNS ("DEMURRAGE_MONEYS" INTEGER) /* результат подсчета */
AS DECLARE VARIABLE "GET_DAYCOUNT" INTEGER; /* КОЛ-ВО СУТОК */
DECLARE VARIABLE "GET_SALARY" INTEGER; /* КОЛ-ВО ДЕНЕГ */
DECLARE VARIABLE "INC_DAYCOUNT" INTEGER; /* СЧЕТЧИК СУТОК */
DECLARE VARIABLE "INC_MONEYS" INTEGER; /* СЧЕТЧИК ДЕНЕГ */
DECLARE VARIABLE "CYCLE" INTEGER; /* ЦИКЛ */
BEGIN /* DAYSPRESENT =DAYSPRESENT; */
DEMURRAGE_MONEYS=000;
GET_DAYCOUNT =000;
GET_SALARY =000;
INC_DAYCOUNT =000;
INC_MONEYS =000;
CYCLE =000;
FOR
SELECT IBLINE_AGENTS_DEMURRAGE."DEM_DAYSCOUNT",
IBLINE_AGENTS_DEMURRAGE."DEM_SALARY"
FROM IBLINE_AGENTS_DEMURRAGE
WHERE (IBLINE_AGENTS_DEMURRAGE."DEM_LINECODE" =:LINECODE)
AND (IBLINE_AGENTS_DEMURRAGE."DEM_CONTNUM" =:CONTNUM)
ORDER BY IBLINE_AGENTS_DEMURRAGE."DEM_STEPINC"
INTO :GET_DAYCOUNT,
:GET_SALARY
DO BEGIN
WHILE(CYCLE < GET_DAYCOUNT)
DO BEGIN
IF(DAYSPRESENT>INC_DAYCOUNT)
THEN BEGIN INC_MONEYS = INC_MONEYS +GET_SALARY;
INC_DAYCOUNT = INC_DAYCOUNT+001;
END /* IF.. */
CYCLE=CYCLE+001;
END /* WHILE... */
CYCLE = 000;
GET_DAYCOUNT = 000;
GET_SALARY = 000;
END /* FOR... */
DEMURRAGE_MONEYS= INC_MONEYS;
SUSPEND;
ENd
ох уж эти начинающие программисты, доку не читают, и все жалуются...Ох уж этот вашь Интербейz-ДрамЭнБэйз.
Код: Выделить всё
SELECT IBLINE_AGENTS_DEMURRAGE."DEM_DAYSCOUNT",
IBLINE_AGENTS_DEMURRAGE."DEM_SALARY"
FROM IBLINE_AGENTS_DEMURRAGE
...
Код: Выделить всё
SELECT I.DEM_DAYSCOUNT, I.DEM_SALARY
FROM IBLINE_AGENTS_DEMURRAGE I
WHERE (I.DEM_LINECODE =:LINECODE)
AND (I.DEM_CONTNUM =:CONTNUM)
ORDER BY I.DEM_STEPINC