powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите с написанием ХП
3 сообщений из 3, страница 1 из 1
Помогите с написанием ХП
    #38376349
ibnewbie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.

Delphi XE2, IBX, FireBird 2.5

Задача следующая: Процедура для получения новых номеров, основываясь на уже введенных данных.
Новое (следующее) значение для REG_NUM считается так: REG_NUM + BLOCKS, при этом, если Поле NUM_SLICE не пусто, то новое значение считается: Найти сумму NUM_SLICE+BLOCK_SLICE по максимальному NUM_SLICE где ИзвлечьГод(DATE_IN) = Год_С_Клиента, то есть найти запись введенную в этом году. Если год с клиента больше года последней записи в таблице, но Нумерация для записи в REG_NUM начнется с 1, т.е. нумерация с нового года начинается с 1 номера.

Есть таблица с полями:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE RESULTS (
    ID_RES            INTEGER NOT NULL,
    REG_NUM         INTEGER 
    BLOCKS           INTEGER 
    DATE_IN          DATE 
    NUM_SLICE      INTEGER 
    BLOCK_SLICE   INTEGER 
);



ХП (просьба сильно не пинать, опыта мало)

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
SET TERM ^ ;

create or alter procedure NEWREG (
    DATE_P date)
returns (
    NREG integer)
as
declare variable OLDDATE_IN date;
declare variable VDATE_P varchar(4);
declare variable NDATE_P varchar(4);
declare variable OLDBLOCKS integer;
declare variable OLDREG integer;
declare variable MAXID integer;
declare variable MAX_NUM_SLICE integer;

begin
  select max(ID_RES)
  from RESULTS /*Находим последнюю запись*/
  into :MAXID;
  /*Выбираем дату поступления, старый рег. номер*/
  select REG_NUM, BLOCKS, DATE_IN
  from RESULTS
  where ID_RES = :MAXID
  into :OLDREG, :OLDBLOCKS, :OLDDATE_IN;
  /*Сравниваем, если год поступления последней записи меньше чем с клиента,
то Ставим номер 1*/

  VDATE_P = extract(year from OLDDATE_IN);
  NDATE_P = extract(year from DATE_P);

  if ((MAXID is null) or (VDATE_P < NDATE_P)) then
  begin
    NREG = 1;
  end

  /*Иначе, продолжаем нумерацию*/
  else
  begin
    if (NUM_SLICE is null) then
      NREG = OLDREG + OLDBLOCKS;
    else
    begin

      select max(NUM_SLICE)
      from RESULTS
      where extract(year from DATE_IN) = extract(year from :DATE_P)
      into :MAX_NUM_SLICE;

      select NUM_SLICE + BLOCK_SLICE as NEXTNUM
      from RESULTS
      where NUM_SLICE = :MAX_NUM_SLICE
      into :NREG;

    end

    suspend;

  end
end

^

SET TERM ; ^




Получается, что процедура должна возвращать для текущего года либо новый номер (REG_NUM + BLOCKS), либо новый номер из NUM_SLICE+BLOCK_SLICE по максимальному NUM_SLICE



Помогите решить проблему.
Заранее благодарен
...
Рейтинг: 0 / 0
Помогите с написанием ХП
    #38377149
Фотография Exteris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если Поле NUM_SLICE не пусто
Оно всегда будет пусто, вы его нигде не получаете.
...
Рейтинг: 0 / 0
Помогите с написанием ХП
    #38377929
ibnewbie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, что ответили )
Проблему решил сам
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите с написанием ХП
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]