![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Здравствуйте!
Возникло не сколько странных проблем с СУБД/БД никак не могу решить, может сможете что-то подсказать... IBExpert + FB2.5 1. Не воспринимает CASE, ругается на строке (!) Parsing error! Пробовал в конце каждой строки when ставить ";" без разницы. Переделал на IF всё сразу заработало. ![]() Код:
begin case TYPE when 1 then a_shift=:shift (!) when 2 then b_shift=:shift when 3 then c_shift=:shift end end Код:
create or alter procedure LIST_TO_VALUES (
LST blob sub_type 1 segment size 80)
returns (
ID varchar(100))
as
declare variable I integer = 1;
declare variable J integer = 1;
begin
while (i <= char_length(lst)) do begin
if (substring(lst from i for 1) = ',') then begin
if (i > j) then
id = trim(leading from substring(lst from j for i - j));
else
id = null;
if (id is not null) then suspend;
j = i+1;
end
i = i+1;
end
if (i > j) then
id = trim(leading from substring(lst from j for i - j));
else
id = null;
if (id is not null) then suspend;
endА. Первая совершает определённое действие над всем списком, корректировка данных в БД для строк из списка. Увы, почему-то обрабатывает только последний (!) номер из списка. Содержит конструкцию:Код:
for select id from list_to_values (:list_value) into :id do < далее код обработки > ![]() Код:
create or alter procedure RPR_OFFICES (
LIST_ID NOTE_BLOB)
returns (
"Компания" NAME,
"Офис" NAME,
"ОфисНомер" NUM)
as
begin
for
select
c.company_name, o.name, o.number
from
list_to_values(:list_id) l
left join offices o on l.id = o.office_id
left join companies c on o.company_id=c.company_id
order by 1,2,3
into :"Компания", :"Офис", :"ОфисНомер"
do begin
suspend;
end
endКовыряюсь над этими проблемами уже два дня не могу понять что неправильно... ?! Может СУБД работает в режиме старой версии типа FB1.0? Как это проверить в IBExpert??? |
|
#2
|
|||
|
|||
|
PS Админам и модераторам - советую подкорректировать тег кода на форуме, чтобы в конце кода не добавлял лишние три пустые строки. Если сделано специально для отделения и одной строки хватит. Сейчас выглядит неаккуратно.
|
|
#3
|
|||
|
|||
|
1. CASE пишется так:
Код:
CASE WHEN [BOOL CONDITION 1] THEN [DO SOMETHING 1] WHEN [BOOL CONDITION 2] THEN [DO SOMETHING 2] ... ELSE [DO SOMETHING ELSE] END Как не трудно заметить у тебя в WHEN не условие, а просто значение. Соответсвенно надо писать что-то типа: Код:
WHEN MyField = 1 THEN a_shift = :shift 2. Есть подозрение, что вот так: Код:
create or alter procedure LIST_TO_VALUES (
LST blob sub_type 1 segment size 80)
returns (
ID varchar(100))У тебя возвращается не таблица, а именно одно значение. вообще не уверен, что в FB можно из сторки возвращать таблицу. И вооюще не понимаю, почему бы не сделать сразу вызов из клиента одного запроса на обработку всего списка через IN. |
|
#4
|
|||
|
|||
|
Цитата:
Код:
case sl.order_status
when 'open' then 'открыт'
when 'waiting' then 'в ожидании'
when 'shipped' then 'отгруженный'Цитата:
|
|
#5
|
|||
|
|||
|
Профи, помогайте, сам пока разобраться не могу - не хватает опыта с SQL...
Проверил в БД все входящие данные, всё передано из программы верно. Код:
insert into "_TEST_TEMP" (TEXT) VALUES (:list_value); (1)
for
select id from list_to_values (:list_value) into :id
do
insert into "_TEST_TEMP" (TEXT) VALUES (:id); (2)
if (:status_id=5) then
update Offices set OFFICE_STATUS_ID=5
where OFFICE_ID=:ID;
if (:status_id=3 or :status_id=4) then
update Offices set OFFICE_STATUS_ID=3
where OFFICE_ID=:ID;Главная процедура п.2.А получила весь список "100,101,102" (1), процедура разбиения списка п.2 разбила список и вернула таблицу (проверено вручную запросом и проверкой результата), после чего процедура п.2.А отработала (2) - согласно проверочной записе вставленной после слова "do" - 3 раза, тк при каждом цикле в тестовую таблицу добавлялись номера "100","101","102"... но в реальности данные изменились только у последней записи номер "102"! Впечатление, что у конструкции функция корректировки записей работает после ВСЕХ циклов, а не в каждом цикле... Или же наоборот - начинается цикл с конца списка и сразу после обработки первой в исполнении записи (последней в списке - "102") цикл работает вхолостую не корректируя нужные записи... Подскажите что нужно скорректировать для этого... Последний раз редактировалось delphicoding, 31.07.2011 в 13:21. |
|
#6
|
|||
|
|||
|
=== вопрос 1 решён только с использованием IF, CASE не принимает ни в каком виде! странно.
=== вопрос 2.А решён добавлением else в каждую строку. По поводу вопроса 2.Б тоже нашёл где проблема - с процедурой в БД написанной в первом постинге всё в порядке, список просто не доходит до процедуры. Проблема в конструкции: Код:
spDS1: TpFIBDataSet;
With spDS1 do begin
close;
Prepare;
InsertSQL.Text:='insert into "_TEST_TEMP" (TEXT_BLOB, TEXT) VALUES (:list_id, 10)';
Params[0].Value:=pList; (проверено, что pList содержит список)
open;
end;Последний раз редактировалось delphicoding, 31.07.2011 в 16:12. |