Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хранимая процедура, заполнить таблицу из других, Заполнить таблицу с данными из других 
:(
    Опции темы
VitaL
Дата 22.5.2009, 03:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 24.6.2006

Репутация: нет
Всего: нет



Всем доброе время суток!

Сталкнулся с конкретной проблемой, реализовать хранимую процедуру. Сразу скажу что в не сильно шарю, по этому прошу подсказку знатаков.

Проблема состаит в следующим.

Имеется таблица ПЛАН (недельное расписание занятий, для нескольких груп), которая состаит из полей 

(код_занятия, код_аудитории, код_уровень, код_группы, время_начало, день, время_конец) 

Код

CREATE TABLE "planing" 
(
  "act_cod"     SMALLINT NOT NULL,
  "au_cod"     SMALLINT NOT NULL,
  "nivel_num"     SMALLINT NOT NULL,
  "grupo_cod"     SMALLINT NOT NULL,
  "planing_hora"     TIME NOT NULL,
  "planing_dias"     DIAS  NOT NULL,
  "planing_hora_hasta"     TIME NOT NULL,
CONSTRAINT "PK_planing" PRIMARY KEY ("act_cod", "grupo_cod", "nivel_num", "au_cod", "planing_hora", "planing_dias")
);


Так же имеется таблица УЧИТЕЛЕЙ. где

(имя, отчество, фамилия, вторая_фамилия, код_страховки, телефон, образование, адрес, паспорт)

Код

CREATE TABLE "educadores" 
(
  "edu_nom1"     VARCHAR(15) NOT NULL,
  "edu_nom2"     VARCHAR(15),
  "edu_ape1"     VARCHAR(15) NOT NULL,
  "edu_ape2"     VARCHAR(15),
  "edu_num_ss"     VARCHAR(15) NOT NULL,
  "edu_tel"     VARCHAR(9) NOT NULL,
  "edu_niel_est"     VARCHAR(30) NOT NULL,
  "edu_dir"     VARCHAR(40) NOT NULL,
  "edu_dni"     VARCHAR(10) NOT NULL,
CONSTRAINT "PK_educadores_1" PRIMARY KEY ("edu_dni")
);


Необходимо заполнить таблицу РАСПИСАНИЕ_УЧИТЕЛЯ, состоит из 

(код_занятия, код_аудитории, код_уровень, код_группы, время_начало, паспорт, дата, день, время_конец)

Код

CREATE TABLE "cuadrante_ed" 
(
  "act_cod"     SMALLINT NOT NULL,
  "au_cod"     SMALLINT NOT NULL,
  "nivel_num"     SMALLINT NOT NULL,
  "grupo_cod"     SMALLINT NOT NULL,
  "cuadrante_hora"     TIME NOT NULL,
  "edu_dni"     VARCHAR(10) NOT NULL,
  "cuadrante_fecha"     DATE NOT NULL,
  "cuadrante_dia"     DIAS  NOT NULL,
  "cuadrante_hora_hasta"     TIME NOT NULL,
CONSTRAINT "PK_cuadrante_ed_1" PRIMARY KEY ("act_cod", "au_cod", "nivel_num", "grupo_cod", 
"cuadrante_hora", "edu_dni", "cuadrante_fecha", "cuadrante_dia")
);


Повторяюсь, имея 2 первые таблицы я пытаюсь заполнить третью. Создать расписания учителей на месяц. Любой учитель может преподавать любой предмет.

У меня такая идея, сделать цикл while. Пока не закончится таблица ПЛАН, брать необходимые данные  для таблицы РАСПИСАНИЕ_УЧИТЕЛЯ. 

В тоже врмя должен быть другой цикр while для таблицы УЧИТЕЛЯ, откуда бы брался код учителя и прописывался бы в ту же линию что и те данные которые были взяты из таблицы ПЛАН.

Следующая линия из таблицы ПЛАН должна принадлежать другому учителю. на линию ниже чем предедущий учитель. вписать инфу в следующию линию таблицы РАСПИСАНИЕ_УЧИТЕЛЯ.

А теперь к делу! PS использую Firebird

Что я меня получается или не получается  smile ...

Код

declare variable acti_cod integer;
declare variable aul_cod integer;
declare variable niv_num integer;
declare variable gr_cod integer;
declare variable pl_dias  integer;
declare variable pl_hora_hasta integer;
declare variable e_dni integer;

begin
  /*использую фор так как не зна как правильно висать цикл вайл*/
  for select   "act_cod", "au_cod", "nivel_num",  "grupo_cod", "planing_hora",  "planing_dias",  "planing_hora_hasta",”edu_dni” from “planing”, “educadores” into :acti_cod, : aul_cod, 
: niv_num, :gr_cod, :pl_dias, :pl_dias, : e_dni    do
  begin
/*вытаскиваю построчно поля из таблицы ПЛАН*/

/*НЕ ЗНАЮ КАК ГЕНЕРИРОВАТЬ ДНИ МЕСЯЦА, для инсерта в графу "cuadrante_ed".”cuadrante_fecha”*/

  insert into "cuadrante_ed" (все ячейки) values (:acti_cod, : aul_cod, : niv_num, :gr_cod, :pl_dias, :pl_dias, :e_dni)

  end



Помогите с правельным кодом.

ещё один не понятный момент. Допустим учителей меньше чем занятий, while должен после чтения последней строчки учителя возвратится на первую, чтобы продолжить назначеня новых лекций в таблицу РАСПИСАНИЯ_УЧИТЕЛЕЙ

УХ как сложно и не понятно прошу помощи  smile 

Это сообщение отредактировал(а) VitaL - 22.5.2009, 03:15
PM MAIL WWW Skype   Вверх
Zloxa
Дата 22.5.2009, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 2
Всего: 161



т.е. у вас любой учитель может вести любое занятие?
У учителей нет специализации по предметам?


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
VitaL
Дата 22.5.2009, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 24.6.2006

Репутация: нет
Всего: нет



Цитата(Zloxa @ 22.5.2009,  09:24)
т.е. у вас любой учитель может вести любое занятие?
У учителей нет специализации по предметам?

да, у учителей нет специальностей, допустим это детский сад а учителя это няньки.
PM MAIL WWW Skype   Вверх
VitaL
Дата 27.5.2009, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 24.6.2006

Репутация: нет
Всего: нет



Уф. додумался то такого, но всё равно не работает  smile  хотя всё компилируется 

Код

COMMIT WORK;
SET AUTODDL OFF;
SET TERM ^ ;

/* Stored procedures */

CREATE PROCEDURE "SP_CUADRANTE" 
(
  "FechaIni" DATE,
  "FechaFin" DATE
)
AS
BEGIN EXIT; END ^


ALTER PROCEDURE "SP_CUADRANTE" 
(
  "FechaIni" DATE,
  "FechaFin" DATE
)
AS
declare variable acti_cod smallint;
declare variable aul_cod smallint;
declare variable niv_num smallint;
declare variable gr_cod smallint;
declare variable pl_dias varchar(9);
declare variable pl_hora TIME;
declare variable pl_hora_hasta TIME;
declare variable e_dni varchar(10);
declare variable Fecha date;
declare variable dias varchar(9);
declare variable i integer;
begin

i = 0;
e_dni = '0';
fecha = "FechaIni";
dias ='0';
 -- пока в ранге даты, не вылазию
while (fecha < "FechaFin") do
   begin
     SELECT extract(weekday from :fecha) from rdb$database into :i;

     /* не играюсь с кайсом, выбираю день недели и прописываю его */
     if( i = 1 ) then
        begin
           dias = 'lunes';
        end
     if( i = 2 ) then
        begin
          dias = 'martes';
        end
     if( i = 3 ) then
        begin
          dias = 'miercoles';
        end
     if( i = 4 ) then
        begin
          dias = 'jueves';
        end
     if( i = 5 ) then
        begin
          dias = 'viernes';
        end
     /* fin no jugare con el case */

     -- если день недели понеделник . пятница то вхожу
     if( i > 0 and i < 6 )then
      begin
      
         for select "act_cod", "au_cod", "nivel_num", "grupo_cod", "planing_hora",
                    "planing_dias", "planing_hora_hasta"
             from "planing" where "planing_dias" = :dias
             into :acti_cod, :aul_cod, :niv_num, :gr_cod, :pl_hora, :pl_dias, :pl_hora_hasta do

             begin
                  -- биру учителя
                  select min("edu_dni") from "educadores" where "edu_dni" > :e_dni into :e_dni;
                  -- есть учитель. всё прописываю в новую таблицу все данные
                  if (e_dni != NULL) then
                     begin
                        insert into "cuadrante_ed" ( "act_cod", "au_cod","nivel_num",
                                                     "grupo_cod","cuadrante_hora","edu_dni",
                                                     "cuadrante_fecha","cuadrante_dia","cuadrante_hora_hasta")
                               values (:acti_cod, :aul_cod, :niv_num, :gr_cod, :pl_hora, :e_dni, :fecha, :pl_dias, :pl_hora_hasta );
                     end
                  -- для возврата к первому учителю если конец списка
                  if (e_dni = NULL) then
                     begin
                         e_dni = '0';
                     end
            end
        end  
        SELECT :fecha+1 from rdb$database into :fecha;--следующий день
    end -- WHILE
end
 ^

SET TERM ; ^
COMMIT WORK;
SET AUTODDL ON;


инсерт в таблицу не происходит, помогите  smile 
PM MAIL WWW Skype   Вверх
VitaL
Дата 27.5.2009, 02:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 24.6.2006

Репутация: нет
Всего: нет



ошибка в следующим фрагменте

Код

  SELECT :fecha+1 from rdb$database into :fecha;


а именно в :fecha+1, где :fecha переменная DATE которую я хочу увеличить на 1. Например у меня дата 27/05/2009 => 28/05/2009, в этом firebird не понять как это реализовать.

Помогите smile 
PM MAIL WWW Skype   Вверх
Deniz
Дата 27.5.2009, 05:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



А если просто
Код
fecha = fecha + 1;



--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
VitaL
Дата 27.5.2009, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 24.6.2006

Репутация: нет
Всего: нет



всё ранво не работает  smile 

должна быть обыкновенная фунция увеличить дату на один день, которую я немогу найти smile , помогите плз.
PM MAIL WWW Skype   Вверх
Deniz
Дата 27.5.2009, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



Цитата(VitaL @  27.5.2009,  14:06 Найти цитируемый пост)
должна быть обыкновенная фунция увеличить дату на один день, которую я немогу найти
именно так, как я написал.
Попробуй простую создать процедуру типа
Код

create procedure Test
(
  Fecha_in date,
  CntDays Integer
)
returns (Fecha_out date)
as
begin
  Fecha_out = Fecha_in + CntDays;
  suspend;
end
и выполни ее.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0687 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.