|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Странные баги в FB
Здравствуйте!
Возникло не сколько странных проблем с СУБД/БД никак не могу решить, может сможете что-то подсказать... 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. |
#7
|
|||
|
|||
Решён вопрос 2.Б!
Заработала такая конструкия: Цитата:
============================= Осталось лишь непонятно почему IBExpert+FB2.5 никак не хочет пропускать CASE ??? |
#8
|
|||
|
|||
Потому и "не пропускает", что после then не может быть присвоения.
|
#9
|
|||
|
|||
Блин фигня то какая, а почему не может то?!
то есть в таком случае писать можно только через конструкцию: Код:
IF TYPE=1 THEN a_shift=:shift; else IF TYPE=2 THEN b_shift=:shift; else IF TYPE=3 THEN c_shift=:shift; |