Тук са показани разликите между избраната и текущата версия на страницата.
Both sides previous revisionПредходна версияСледваща версия | Предходна версия | ||
kak_da:spravki_scriptove [2018/09/13 07:56] – [Промяна формата на текстов документ от .XLS(.XLSX) в .CSV] t.lalova | kak_da:spravki_scriptove [2020/07/31 10:59] (текуща) – [Системна процедура SYS$SLEEP] t.lalova | ||
---|---|---|---|
Ред 23: | Ред 23: | ||
begin | begin | ||
- | ------- ЗАРЕЖДЕАНЕ НА ПРЕВОДИ -------------- | + | ------- ЗАРЕЖДАНЕ НА ПРЕВОДИ -------------- |
LANG_1=null; | LANG_1=null; | ||
LANG_2=null; | LANG_2=null; | ||
Ред 1237: | Ред 1237: | ||
Важно е, че функцията работи за промяна на документи само в формат **.XLS** или **.XLSX**. Новия файл винаги ще бъде във **.CSV** формат. | Важно е, че функцията работи за промяна на документи само в формат **.XLS** или **.XLSX**. Новия файл винаги ще бъде във **.CSV** формат. | ||
- | Един пример: | + | Пример: |
- | + | ||
- | ibec_Progress(' | + | |
Всички елементи в скобите са разделени с въпросителни знаци. | Всички елементи в скобите са разделени с въпросителни знаци. | ||
Можем да заменим и директориите с параметри по следния начин : \\ | Можем да заменим и директориите с параметри по следния начин : \\ | ||
- | Ibec_Progress(' | + | **Ibec_Progress(' |
<code pascal> | <code pascal> | ||
Ред 1260: | Ред 1258: | ||
end | end | ||
</ | </ | ||
+ | |||
+ | |||
+ | ===== Свойства на колони в динамични справки ===== | ||
+ | |||
+ | Какво може да се поставя като свойство на динамичните справки: | ||
+ | 1. Формата трябва да е XML < | ||
+ | 2. Всичко трябва да е заградено в < | ||
+ | 3. Какво свойства има: \\ | ||
+ | * name - име на поле | ||
+ | * | ||
+ | * | ||
+ | * | ||
+ | * | ||
+ | * | ||
+ | * | ||
+ | * | ||
+ | * | ||
+ | * | ||
+ | * | ||
+ | * | ||
+ | * | ||
+ | * | ||
+ | * | ||
+ | * | ||
+ | * | ||
+ | | ||
+ | Забележка (" | ||
+ | | ||
+ | Примери: | ||
+ | Дейтасет с Колони (по ТД): GROUP_LEVEL_1, | ||
+ | Искаме да групираме по GROUP_LEVEL_1 и да сложим сума на двете числови полета \\ | ||
+ | <code xml> | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ===== Системна процедура 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 '' | ||
+ | |||
+ | </ |