|
|
|
when sqlcode ... do Не желает компилить ХП
|
|||
|---|---|---|---|
|
#18+
IB7.1 Требуется из даты вычесть/добавить определённое количество лет, месяцев, дней. Сваял процедуру. Всё 'Ок'. Отрабатывает на ура как в (+) так и в (—). Но напоролся на '29-feb-2004' минус три года. '29-feb-2001' не существует. Следует грамотно обработать ситуёвину. Код: plaintext 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. и далее куча кода и всё работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2004, 14:53:26 |
|
||
|
when sqlcode ... do Не желает компилить ХП
|
|||
|---|---|---|---|
|
#18+
А зачем перед переменными двоеточие стоят. Они вообщето в данном случае не нужны. Best regards, Dnico. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2004, 15:04:22 |
|
||
|
when sqlcode ... do Не желает компилить ХП
|
|||
|---|---|---|---|
|
#18+
IBExpert c двоеточием рисует переменные другим цветом, меня это вполне устраивает. Но суть не в этом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2004, 15:08:20 |
|
||
|
when sqlcode ... do Не желает компилить ХП
|
|||
|---|---|---|---|
|
#18+
У тебя что крыша поехала ? Ты ее в ХП обрабатывай... там ты и сделаешь с ней все что хош... Если дата в виде чисел и ОЧЕНЬ хочется без ХП... могу дать процедурку расчета (проверено, работает) и без перехватов ошибок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2004, 15:12:36 |
|
||
|
when sqlcode ... do Не желает компилить ХП
|
|||
|---|---|---|---|
|
#18+
ololУ тебя что крыша поехала ? Ты ее в ХП обрабатывай... там ты и сделаешь с ней все что хош... Если дата в виде чисел и ОЧЕНЬ хочется без ХП...Хочешь чтобы я что-нибудь ответил? Я вообще-то вменяемый. По твоему я её где обрабатываю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2004, 15:16:11 |
|
||
|
when sqlcode ... do Не желает компилить ХП
|
|||
|---|---|---|---|
|
#18+
Zmeishe...По твоему я её где обрабатываю? Sorry... Я имел в виду внешнюю UDF... У меня для одной проги на IB6 дата в виде одного числа INTEGER использовалась, и вычислял я начало месяца, конец и прочее без UDF... Для твоего случая можно сделать так: EXECUTE PROCEDURE peEncodeDate (Y INTEGER, M INTEGER, D INTEGER) RETURNING_VALUES :L,:n; EXECUTE PROCEDURE peIncMonth (n INTEGER, k INTEGER) RETURNING_VALUES :L,:n; Должно работать и на IB и на Oracle... проблемы будут только с датой до рождества Христова... минус я в peDiv2i не учел... CREATE PROCEDURE peDiv2i (n1 INTEGER, n2 INTEGER) RETURNS (i INTEGER, n INTEGER) AS DECLARE VARIABLE f DOUBLE PRECISION; BEGIN IF (n1 IS NULL) THEN n1 = 0; f = n1; f = f / n2; i = 0.5; IF (i = 0) THEN IF (f < 0) THEN f = f - 1; ELSE f = f + 1; ELSE IF (f < 0) THEN f = f - 0.5; ELSE f = f + 0.5; i = f; IF (i < 0) THEN i = i + 1; ELSE i = i - 1; n = n1 - i * n2; END [quot] [quot] CREATE PROCEDURE peEncodeYear (Y INTEGER) RETURNS (L INTEGER, n INTEGER) AS DECLARE VARIABLE i INTEGER; BEGIN EXECUTE PROCEDURE peDiv2i (:Y, 1000) RETURNING_VALUES :i,:Y; n = 365241 * i; L = 1; IF (Y >= 100) THEN BEGIN EXECUTE PROCEDURE peDiv2i (:Y, 100) RETURNING_VALUES :i,:Y; n = n + 36524 * i + 1; L = 0; END IF (Y >= 4) THEN BEGIN EXECUTE PROCEDURE peDiv2i (:Y, 4) RETURNING_VALUES :i,:Y; n = n + 1461 * i; IF (L = 0) THEN n = n - 1; L = 1; END IF (Y > 0) THEN BEGIN n = n + 365 * Y + L; L = 0; END END CREATE PROCEDURE peEncodeMonth (Y INTEGER, M INTEGER) RETURNS (L INTEGER, n INTEGER) AS BEGIN EXECUTE PROCEDURE peEncodeYear (:Y) RETURNING_VALUES :L,:n; IF (M > 1) THEN BEGIN n = n + 31; IF (M > 2) THEN BEGIN n = n + 28 + L; IF (M > 3) THEN BEGIN n = n + 31; IF (M > 4) THEN BEGIN n = n + 30; IF (M > 5) THEN BEGIN n = n + 31; IF (M > 6) THEN BEGIN n = n + 30; IF (M > 7) THEN BEGIN n = n + 31; IF (M > 8) THEN BEGIN n = n + 31; IF (M > 9) THEN BEGIN n = n + 30; IF (M > 10) THEN BEGIN n = n + 31; IF (M > 11) THEN n = n + 30; END END END END END END END END END END END CREATE PROCEDURE peEncodeDate (Y INTEGER, M INTEGER, D INTEGER) RETURNS (L INTEGER, n INTEGER) AS BEGIN EXECUTE PROCEDURE peEncodeMonth (:Y,:M) RETURNING_VALUES :L,:n; n = n + D - 1; END CREATE PROCEDURE peDecodeYear (i INTEGER) RETURNS (L INTEGER, Y INTEGER, n INTEGER) AS BEGIN EXECUTE PROCEDURE peDiv2i (:i, 365241) RETURNING_VALUES :i,:n; Y = 1000 * i; L = 1; IF (n > 36524) THEN BEGIN n = n - 1; EXECUTE PROCEDURE peDiv2i (:n, 36524) RETURNING_VALUES :i,:n; Y = Y + 100 * i; L = 0; END IF (n >= 1460 + L) THEN BEGIN IF (L = 0) THEN n = n + 1; EXECUTE PROCEDURE peDiv2i (:n, 1461) RETURNING_VALUES :i,:n; Y = Y + 4 * i; L = 1; END IF (n >= 365 + L) THEN BEGIN n = n - L; EXECUTE PROCEDURE peDiv2i (:n, 365) RETURNING_VALUES :i,:n; Y = Y + i; L = 0; END END CREATE PROCEDURE peDecodeMonth (i INTEGER) RETURNS (L INTEGER, Y INTEGER, M INTEGER, n INTEGER) AS BEGIN M = 1; EXECUTE PROCEDURE peDecodeYear (:i) RETURNING_VALUES :L,:Y,:n; IF (n >= 31) THEN BEGIN M = 2; n = n - 31; IF (n >= 28 + L) THEN BEGIN M = 3; n = n - 28 - L; IF (n >= 31) THEN BEGIN M = 4; n = n - 31; IF (n >= 30) THEN BEGIN M = 5; n = n - 30; IF (n >= 31) THEN BEGIN M = 6; n = n - 31; IF (n >= 30) THEN BEGIN M = 7; n = n - 30; IF (n >= 31) THEN BEGIN M = 8; n = n - 31; IF (n >= 31) THEN BEGIN M = 9; n = n - 31; IF (n >= 30) THEN BEGIN M = 10; n = n - 30; IF (n >= 31) THEN BEGIN M = 11; n = n - 31; IF (n >= 30) THEN BEGIN M = 12; n = n - 30; END END END END END END END END END END END END CREATE PROCEDURE peDecodeDate (i INTEGER) RETURNS (L INTEGER, Y INTEGER, M INTEGER, D INTEGER) AS BEGIN EXECUTE PROCEDURE peDecodeMonth (:i) RETURNING_VALUES :L,:Y,:M,:D; D = D + 1; END CREATE PROCEDURE peDaysInLMonth (L INTEGER, M INTEGER) RETURNS (D INTEGER) AS BEGIN IF (M = 1) THEN D = 31; ELSE IF (M = 2) THEN D = 28 + L; ELSE IF (M = 3) THEN D = 31; ELSE IF (M = 4) THEN D = 30; ELSE IF (M = 5) THEN D = 31; ELSE IF (M = 6) THEN D = 30; ELSE IF (M = 7) THEN D = 31; ELSE IF (M = 8) THEN D = 31; ELSE IF (M = 9) THEN D = 30; ELSE IF (M = 10) THEN D = 31; ELSE IF (M = 11) THEN D = 30; ELSE D = 31; END CREATE PROCEDURE peStartOfTheMonth (i INTEGER) RETURNS (L INTEGER, n INTEGER) AS DECLARE VARIABLE Y INTEGER; DECLARE VARIABLE M INTEGER; DECLARE VARIABLE D INTEGER; BEGIN EXECUTE PROCEDURE peDecodeDate (:i) RETURNING_VALUES :L,:Y,:M,:D; D = 1; EXECUTE PROCEDURE peEncodeDate(:Y,:M,:D) RETURNING_VALUES :L,:n; END CREATE PROCEDURE peEndOfTheMonth (i INTEGER) RETURNS (L INTEGER, n INTEGER) AS DECLARE VARIABLE Y INTEGER; DECLARE VARIABLE M INTEGER; DECLARE VARIABLE D INTEGER; BEGIN EXECUTE PROCEDURE peDecodeDate (:i) RETURNING_VALUES :L,:Y,:M,:D; EXECUTE PROCEDURE peDaysInLMonth (:L,:M) RETURNING_VALUES :D; EXECUTE PROCEDURE peEncodeDate(:Y,:M,:D) RETURNING_VALUES :L,:n; END CREATE PROCEDURE peIncMonth (i INTEGER, k INTEGER) RETURNS (L INTEGER, n INTEGER) AS DECLARE VARIABLE Y INTEGER; DECLARE VARIABLE M INTEGER; DECLARE VARIABLE D INTEGER; BEGIN EXECUTE PROCEDURE peDecodeDate (:i) RETURNING_VALUES :L,:Y,:M,:D; M = M - 1 + k; EXECUTE PROCEDURE peDiv2i (:M, 12) RETURNING_VALUES :n,:M; M = M + 1; Y = Y + n; EXECUTE PROCEDURE peEncodeYear (:Y) RETURNING_VALUES :L,:n; EXECUTE PROCEDURE peDaysInLMonth (:L,:M) RETURNING_VALUES :n; IF (D > n) THEN D = n; EXECUTE PROCEDURE peEncodeDate(:Y,:M,:D) RETURNING_VALUES :L,:n; END ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2004, 15:48:13 |
|
||
|
when sqlcode ... do Не желает компилить ХП
|
|||
|---|---|---|---|
|
#18+
ololТы ее в ХП обрабатывай... там ты и сделаешь с ней все что хош... Наверно, все таки UDF, а не ХП ? В таком случае присоединяюсь. Если все же нужно без UDF, тогда просьба Zmeishe выложить более подробный текст процедуры (с входными параметрами). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2004, 15:55:05 |
|
||
|
when sqlcode ... do Не желает компилить ХП
|
|||
|---|---|---|---|
|
#18+
Zmeishe А в FB 1.5 это все ужо есть ... Можно взять UDF и попробовать подключить к IB 7. Код: plaintext 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. Best regards, Dnico. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2004, 15:55:50 |
|
||
|
when sqlcode ... do Не желает компилить ХП
|
|||
|---|---|---|---|
|
#18+
>> olol Спасибо за набор процедур, но у меня всё в `одном флаконе` 35 строчек от первого до последнего символа (от create procedure до end). Код: plaintext 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. Всё работает, проблему обошёл. Но ответ на вопрос так и не получил. Если кто-то не уловил суть вопроса, формулирую иначе. Почему компилятор конкретно в этой процедуре не допускает никаких операторов после Код: plaintext 1. 2. 3. 4. В других-то процедурах допускает! Чем эта процедура заколдована??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2004, 15:58:57 |
|
||
|
when sqlcode ... do Не желает компилить ХП
|
|||
|---|---|---|---|
|
#18+
вызываю её Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2004, 16:05:05 |
|
||
|
when sqlcode ... do Не желает компилить ХП
|
|||
|---|---|---|---|
|
#18+
Zmeishe Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. end относится к первому begin , а не к when Сделай так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Т.е. добавь begin перед действием, ошибку которого ты обрабатываешь (по аналогии с try ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2004, 16:22:29 |
|
||
|
when sqlcode ... do Не желает компилить ХП
|
|||
|---|---|---|---|
|
#18+
Да, вспомнил. Такая же ситуация была и у меня до тех пор, пока не засунул блок "When do begin end" в конец цикла. Чей это глюк (мой, IBE, FB), не знаю, проверять влом было. Но ты говоришь, что в других процедурах у тебя подобная ситуация проходит ? А примерчик можно отлицезреть ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2004, 16:22:54 |
|
||
|
when sqlcode ... do Не желает компилить ХП
|
|||
|---|---|---|---|
|
#18+
To HVLAD: Не, речь идет о том, почему не компилится конструкция типа CREATE PROCEDURE SSP$DATE_INC RETURNS (OUT_DATE DATE) AS begin out_date = 0; when sqlcode -413 do out_date = 0; suspend; end ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2004, 16:30:00 |
|
||
|
when sqlcode ... do Не желает компилить ХП
|
|||
|---|---|---|---|
|
#18+
>> примерчик можно отлицезреть ? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2004, 16:32:22 |
|
||
|
when sqlcode ... do Не желает компилить ХП
|
|||
|---|---|---|---|
|
#18+
Смотрите внимательно синтаксис. Допустимая конструкция блока есть begin...[when...]end , поэтому блоки типа begin ... when ... end ... end синтаксически не корректны ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2004, 16:33:51 |
|
||
|
when sqlcode ... do Не желает компилить ХП
|
|||
|---|---|---|---|
|
#18+
AndriyKoTo HVLAD: Не, речь идет о том, почему не компилится конструкция типа CREATE PROCEDURE SSP$DATE_INC RETURNS (OUT_DATE DATE) AS begin out_date = 0; when sqlcode -413 do out_date = 0; ( * ) suspend; end Вот после (*) должен быть или when или end ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2004, 16:36:40 |
|
||
|
when sqlcode ... do Не желает компилить ХП
|
|||
|---|---|---|---|
|
#18+
Ну в общем вместо Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. hvlad дело подсказал. Но в моих help`ах синтаксис такой: WHEN {<error> [, <error> …] | ANY} DO <compound_statement> Про внешний, по отношению к when, begin end - впервый раз столкнулся. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2004, 16:47:37 |
|
||
|
when sqlcode ... do Не желает компилить ХП
|
|||
|---|---|---|---|
|
#18+
Не хочу быть занудой... а 31 марта 2001г - 1 месяц она тоже делает ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2004, 16:52:04 |
|
||
|
when sqlcode ... do Не желает компилить ХП
|
|||
|---|---|---|---|
|
#18+
автор Не поленился проверить... говорит: Conversion error from string "2001-2-30" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2004, 16:55:57 |
|
||
|
when sqlcode ... do Не желает компилить ХП
|
|||
|---|---|---|---|
|
#18+
ZmeisheНу в общем вместо ... Написал так (Втиснул ни к чему не обязывающий if) заработало А зачем if ? Чтобы написать begin ? ;))) Попробуй без него ZmeisheНо в моих help`ах синтаксис такой: WHEN {<error> [, <error> …] | ANY} DO <compound_statement> when - это часть блока, рассматривая его отдельно от блока, ты и получил свою ошибку. Может быть в доке это чётко не написано (лень сейчас искать ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2004, 17:04:32 |
|
||
|
when sqlcode ... do Не желает компилить ХП
|
|||
|---|---|---|---|
|
#18+
ololНе хочу быть занудой... а 31 марта 2001г - 1 месяц она тоже делает ? ... Conversion error from string "2001-2-30" hvladА зачем if ? Чтобы написать begin ? ;))) Попробуй без него Теперь разобравшись с begin when sqlcode do begin ... end end (Даже без if`a), я немного доработал так: Код: plaintext 1. 2. 3. 4. 5. 6. И полный текст процедуры такой: Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 07:59:55 |
|
||
|
when sqlcode ... do Не желает компилить ХП
|
|||
|---|---|---|---|
|
#18+
автор suspend; - специально поставил, чтобы делать select или как ? Выдает: Unknown error Statement: select * from SSP$DATE_INC ('31.03.01', 0,-1,0) Зато потом все таки выводит 28.02.2001 Если не секрет - то почему не юсаеш UDF ? /*28 месяцев вверх и 315 дней вниз */ Ума не приложу - где это может пригодиться одновременное "+" и "-" Лично мне не подуше обработка с перехватом ошибок когда можно обойтись и без них (хотя так конечно намного проще) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 09:04:13 |
|
||
|
when sqlcode ... do Не желает компилить ХП
|
|||
|---|---|---|---|
|
#18+
>> Unknown error >> Statement: select * from SSP$DATE_INC ('31.03.01', 0,-1,0) У меня не выдаёт никаких ошибок. Ни при execute procedure ни при select * from. Проверь у себя какие-нибудь настройки системы. >> Если не секрет - то почему не юсаеш UDF ? UDF юзаю, когда нет возможностей SQL или на SQL алгоритм будет слишком громоздким. >>/*28 месяцев вверх и 315 дней вниз */ >>Ума не приложу - где это может пригодиться одновременное "+" и "-" Я тоже не знаю где это сгодится, но сначала заказчик сформулировал требования к БД такими, что была необходимость расчитывать только целые месяцы. Я их кодировал первым числом месяца '01.01.2003', '01.02.2003' и т.д. И процедуру разработал под +/- месяцев. Потом заказчик захотел учитывать срок исковой давности 3 года. Пришлось доработать +/- годы. Теперь заказчику пришёл основательный аппетит... Да пошёл ты, сказал я, и доработал +/- всё, что хочешь, чтобы больше не возвращаться к этой ХП. Всего 35 строчек кода — нате ешьте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 09:22:05 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32651346&tid=1578062]: |
0ms |
get settings: |
5ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
157ms |
get topic data: |
8ms |
get forum data: |
4ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 195ms |
| total: | 444ms |

| 0 / 0 |
