Тук са показани разликите между избраната и текущата версия на страницата.
Both sides previous revisionПредходна версияСледваща версия | Предходна версия | ||
kak_da:spravki_scriptove [2019/01/02 15:32] – t.lalova | kak_da:spravki_scriptove [2020/07/31 10:59] (текуща) – [Системна процедура SYS$SLEEP] t.lalova | ||
---|---|---|---|
Ред 1266: | Ред 1266: | ||
2. Всичко трябва да е заградено в < | 2. Всичко трябва да е заградено в < | ||
3. Какво свойства има: \\ | 3. Какво свойства има: \\ | ||
- | * - name - име на поле | + | * name - име на поле |
- | * - displaylabel - Наименование на полето в таблицата (изгледа) - използва се " | + | * |
- | * - displaywidth - Размер на полето в таблицата (цяло число) | + | * |
- | * - readonly - Ако " | + | * |
- | * - focusing - Ако " | + | * |
- | * - visible - Ако е " | + | * |
- | * - is_checkbox - Ако " | + | * |
- | * - is_memo - Ако " | + | * |
- | * - is_icon_index - Ако " | + | * |
- | * - is_picture - Ако " | + | * |
- | * - displayformat - ако има такова свойство се поставя като формат на показване на полето | + | * |
- | * - display_format - аналогично на displayformat | + | * |
- | * - group_level - кое ниво на групране е полето (цяло число). Ако има такова свойство се търси и до кое ниво има разпънатост | + | * |
- | * - expand_level - до кое ниво да се разпъва - зависи от конкретното поле - очаква " | + | * |
- | * - aggregate_type - възможни стойности: | + | * |
- | * - aggregate_postion - Основните са 1, 2 и 4. 1 - Поставя се в Тотала, | + | * |
- | * 1 - TOTAL, 2 - GROUP TOTAL, 3 - GROUP TOTAL & TOTAL 4 - GROUP HEADER, 5 - 1 + 4, 6 - 2 + 4, 7 - 1 + 2 + 4 | + | * |
- | * - freezing - очаква " | + | |
| | ||
Забележка (" | Забележка (" | ||
Ред 1290: | Ред 1289: | ||
Дейтасет с Колони (по ТД): GROUP_LEVEL_1, | Дейтасет с Колони (по ТД): GROUP_LEVEL_1, | ||
Искаме да групираме по GROUP_LEVEL_1 и да сложим сума на двете числови полета \\ | Искаме да групираме по GROUP_LEVEL_1 и да сложим сума на двете числови полета \\ | ||
+ | <code xml> | ||
< | < | ||
< | < | ||
Ред 1299: | Ред 1299: | ||
< | < | ||
</ | </ | ||
+ | </ | ||
+ | ===== Системна процедура SYS$SLEEP ===== | ||
+ | |||
+ | Функция **SYS$SLEEP** служи за прекъсване на изпълнението на процедура, | ||
+ | Може да се използва в случай на заключване на записи и изчакване за последващото освобождаване. | ||
+ | |||
+ | Пример 1: Използване на процедурата в стейтмънт за извличане на номер от автоматична номерация (кочан). | ||
+ | |||
+ | <code pascal> | ||
+ | | ||
+ | if (DOC_NUM_GENERATOR_REF is not null) then | ||
+ | begin | ||
+ | STMT = ' | ||
+ | ( | ||
+ | WRH_DOC_TYPE_REF DM_REF = : | ||
+ | DOC_NUM_GENERATOR_REF DM_REF = : | ||
+ | WRH_DOC_DATE DM_DATE = : | ||
+ | ) | ||
+ | returns | ||
+ | ( | ||
+ | NEW_DOC_NUMBER DM_REF | ||
+ | ) | ||
+ | as | ||
+ | declare variable MIN_RANGE DM_BIGINT; | ||
+ | declare variable MAX_RANGE DM_BIGINT; | ||
+ | declare variable CHECK_LAST_INVOICES_DATE DM_INT; | ||
+ | declare variable LAST_INVOICE_DATE DM_DATE; | ||
+ | declare variable LAST_INVOICE_YEAR DM_INT; | ||
+ | declare variable LAST_INVOICE_MONTH DM_INT; | ||
+ | declare variable LAST_INVOICE_DAY DM_INT; | ||
+ | declare variable repeat_count DM_123; | ||
+ | begin | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | from | ||
+ | | ||
+ | join NOM$DOC_NUM_GENERATOR_TYPES DNGT on DNGT.DOC_NUM_GENERATORS_REF = DNG.ID | ||
+ | join CONFIG C on C.CURRENT_COM_ID = DNG.CURRENT_COM_REF | ||
+ | where | ||
+ | | ||
+ | | ||
+ | | ||
+ | into :MIN_RANGE, :MAX_RANGE; | ||
+ | |||
+ | | ||
+ | | ||
+ | while ((repeat_count < 5) and (NEW_DOC_NUMBER is null)) do | ||
+ | begin | ||
+ | repeat_count = repeat_count + 1; | ||
+ | NEW_DOC_NUMBER = null; | ||
+ | update | ||
+ | NOM$DOC_NUM_GENERATORS G | ||
+ | set | ||
+ | G.CURRENT_VALUE = G.CURRENT_VALUE + 1 | ||
+ | where | ||
+ | G.ID = : | ||
+ | returning | ||
+ | G.CURRENT_VALUE - 1 | ||
+ | into | ||
+ | : | ||
+ | when any do | ||
+ | begin | ||
+ | execute procedure SYS$SLEEP(200); | ||
+ | NEW_DOC_NUMBER = null; | ||
+ | end | ||
+ | end | ||
+ | if (NEW_DOC_NUMBER is null) then | ||
+ | exception CLEAN_TEXT_ERROR '' | ||
+ | | ||
+ | if (((MAX_RANGE is not null) and (NEW_DOC_NUMBER >= MAX_RANGE)) or | ||
+ | | ||
+ | begin | ||
+ | -- exausted range of the generator | ||
+ | execute procedure SYS$EXCEPTION_CLEAN(64); | ||
+ | end | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | from | ||
+ | | ||
+ | where | ||
+ | | ||
+ | into | ||
+ | : | ||
+ | |||
+ | if ((CHECK_LAST_INVOICES_DATE is not null) and (CHECK_LAST_INVOICES_DATE > 0)) then | ||
+ | begin | ||
+ | -- check if the date of the previous invoice is not past the date of the current invoice | ||
+ | | ||
+ | | ||
+ | first 1 | ||
+ | | ||
+ | | ||
+ | from | ||
+ | | ||
+ | where | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | order by | ||
+ | | ||
+ | into | ||
+ | : | ||
+ | |||
+ | if ((LAST_INVOICE_DATE is not null) and | ||
+ | (LAST_INVOICE_DATE > : | ||
+ | begin | ||
+ | | ||
+ | '' | ||
+ | end | ||
+ | end | ||
+ | | ||
+ | end'; | ||
+ | | ||
+ | | ||
+ | execute statement (STMT) (WRH_DOC_TYPE_REF := WRH_DOC_TYPE_REF, | ||
+ | into | ||
+ | : | ||
+ | |||
+ | </ | ||
+ | |||
+ | Пример 2: Показва изпълнението само в случая за изтегляне на номер и изчакването за следващ опит. Този пример е част от горната процедура. | ||
+ | |||
+ | При изтегляне на номер на фактура от кочан се извършва ъпдейт и изтегляне на номера в една транзакция. Ако транзакцията продължи около 1 секунда, | ||
+ | |||
+ | В този случай при грешка можем да изчакаме определено време (колкото преценим, | ||
+ | Пример за точно такова изчакване е в следващия пример: | ||
+ | |||
+ | <code pascal> | ||
+ | | ||
+ | | ||
+ | while ((repeat_count < 5) and (NEW_DOC_NUMBER is null)) do | ||
+ | begin | ||
+ | repeat_count = repeat_count + 1; | ||
+ | NEW_DOC_NUMBER = null; | ||
+ | update | ||
+ | NOM$DOC_NUM_GENERATORS G | ||
+ | set | ||
+ | G.CURRENT_VALUE = G.CURRENT_VALUE + 1 | ||
+ | where | ||
+ | G.ID = : | ||
+ | returning | ||
+ | G.CURRENT_VALUE - 1 | ||
+ | into | ||
+ | : | ||
+ | when any do | ||
+ | begin | ||
+ | execute procedure SYS$SLEEP(200); | ||
+ | NEW_DOC_NUMBER = null; | ||
+ | end | ||
+ | end | ||
+ | if (NEW_DOC_NUMBER is null) then | ||
+ | exception CLEAN_TEXT_ERROR '' | ||
+ | |||
+ | </ |