Универсальная транзакция импорт данных из dbf файла

Больше
03 март 2017 13:00 - 03 март 2017 13:03 #1 от m_2602
COM_KUNENA_MESSAGE_CREATED_NEW
Можно ли создать транзакцию, которая берет значения из дбф файла и создает проводки?
Или написать процедуру, которая запускают существующею транзакцию и передает ему значения?
Last edit: 03 март 2017 13:03 by m_2602.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
03 март 2017 15:27 #2 от alex_sar
COM_KUNENA_MESSAGE_REPLIED_NEW
Конечно можно собственно тут есть ряд статей по этому поводу:
1 вариант. Процедура + Универсальная транзакция (процедура читает dbf-файл и вызывает универсальную транзакцию) - progress-abl.ru/ibs-biskvit/29-standartn...-ut-iz-protsedur-abl;
2 вариант. Стандартная транзакция - progress-abl.ru/ibs-biskvit/29-standartn...mi-import-dokumentov
3 вариант. Универсальная транзакция. Тут придется немного самостоятельно разбираться (еще не дописана статья до конца) - progress-abl.ru/ibs-biskvit/29-standartn...port-eksport-dannykh
Спасибо сказали: m_2602

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
09 март 2017 13:28 #3 от m_2602
COM_KUNENA_MESSAGE_REPLIED_NEW
Иду по 1 варианту. Есть ошибки
You cannot define a TEMP-TABLE inside a function or method. (6411)
** /qbis/quit41d/main/tty/src/topkind.def Could not understand line 33. (196

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
09 март 2017 13:33 - 09 март 2017 13:34 #4 от m_2602
COM_KUNENA_MESSAGE_REPLIED_NEW
вот отрывок кода, может где-то что-то пропустил:
{topkind.def}
DEF VAR vSumm AS DEC NO-UNDO. /* Сумма операции */
DEF VAR vPodr AS SHAR NO-UNDO. /* Код подразделения */
DEF VAR vParamOk AS LOG NO-UNDO. /* Результат заполнения таблицы */
DEF VAR vTransOK AS LOG NO-UNDO. /* Результат выполнения транзакции */
DEF VAR iOpKind AS CHAR NO-UNDO. /* Код вызываемой транзакции */
DEF VAR iOpDate AS DATE NO-UNDO. /* Дата опер. дня */
DEF VAR vAcctDb AS CHAR NO-UNDO. /* Счет дебета */
DEF VAR vAcctCr AS CHAR NO-UNDO. /* Счет кредита */

if vsum_nach <> "" then do:
ASSIGN
vSumm = DEC(vsum_nach)
vPodr = vsps_podr
NO-ERROR.
find acct.acct where acct.bal-acct eq 53501 and acct.branch-id eq vPodr no-lock no-error.
if avail acct then vAcctDb = acct.acct .
find acct.acct where acct.bal-acct eq 26226 and acct.branch-id eq vPodr and acct.contract eq 'ЗП' no-lock no-error.
if avail acct then vAcctCr = acct.acct .
vParamOk = TDAddParam("mAcctDb", vAcctDb) AND TDAddParam("mAcctCr", vAcctCr) AND TDAddParam("mAmt", STRING(vSumm)).
iOpKind = "MEM3". /* назв. транзакции */
iOpDate = TODAY.
RUN ex-trans.p (iOpKind, iOpDate, TABLE tOpKindParams, OUTPUT vTransOk, OUTPUT vMessErr).
end.
Last edit: 09 март 2017 13:34 by m_2602.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
09 март 2017 13:41 #5 от alex_sar
COM_KUNENA_MESSAGE_REPLIED_NEW
Видимо вы осуществили подключение topkind.def, в котором объявляется временная таблица, внутри функции или метода.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
09 март 2017 13:44 #6 от alex_sar
COM_KUNENA_MESSAGE_REPLIED_NEW
Этот кусок кода именно процедуры, или он внутри функции например?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
09 март 2017 13:55 #7 от m_2602
COM_KUNENA_MESSAGE_REPLIED_NEW
Да это кусок кода процедуры. Вот весь код процедуры:
DEFINE VAR vCount AS INT64 NO-UNDO.
DEFINE VAR vHead AS CHAR NO-UNDO.
DEFINE VAR vRecord AS CHAR NO-UNDO.
DEFINE VAR vField AS CHAR NO-UNDO.
DEFINE VAR vError AS INT64 NO-UNDO.
DEFINE VAR h_dbf AS HANDLE NO-UNDO.
DEFINE VAR i AS INT NO-UNDO.

def var vsps_podr as char no-undo.
def var vsum_nach as char no-undo.
def var vpen_fond as char no-undo.
def var vpod_nalg as char no-undo.
def var vsum_prof as char no-undo.
def var vsum_avan as char no-undo.
def var vsum_naru as char no-undo.


/*осуществим персистентный вызов процедуры dbfread.p:*/
RUN dbfread.p persistent SET h_dbf NO-ERROR.

/*Откроем интересующий нас DBF файл (MYFILE.DBF) на чтение с помощью процедуры:*/
RUN DBFOpenRead IN h_dbf ("/home/bis/zarplata.dbf", OUTPUT vError).

/*Определим сколько строк (записей) содержит DBF-файл:*/
RUN DBFGetCount IN h_dbf (OUTPUT vCount, OUTPUT vError).

MESSAGE STRING(vCount) VIEW-AS ALERT-BOX.

/*Определим поля таблицы и их формат:*/
RUN DBFGetHead IN h_dbf (OUTPUT vHead, OUTPUT vError).


/*Для получения значений отдельного поля используется процедура DBFGetField:*/


DO i = 1 TO vCount:
RUN DBFRead IN h_dbf (OUTPUT vError).
RUN DBFGetField IN h_dbf ("SPS_PODR",OUTPUT vsps_podr,OUTPUT vError).
RUN DBFGetField IN h_dbf ("SUM_NACH",OUTPUT vsum_nach,OUTPUT vError).
IF vError = 0 THEN RUN prov.
END.



/*По завершению работы с DBF-файлом его необходимо закрыть:*/
RUN DBFCloseRead IN h_dbf.


PROCEDURE prov .
{topkind.def}
DEF VAR vSumm AS DEC NO-UNDO. /* Сумма операции */
DEF VAR vPodr AS SHAR NO-UNDO. /* Код подразделения */
DEF VAR vParamOk AS LOG NO-UNDO. /* Результат заполнения таблицы */
DEF VAR vTransOK AS LOG NO-UNDO. /* Результат выполнения транзакции */
DEF VAR iOpKind AS CHAR NO-UNDO. /* Код вызываемой транзакции */
DEF VAR iOpDate AS DATE NO-UNDO. /* Дата опер. дня */
DEF VAR vAcctDb AS CHAR NO-UNDO. /* Счет дебета */
DEF VAR vAcctCr AS CHAR NO-UNDO. /* Счет кредита */

if vsum_nach <> "" then do:
ASSIGN
vSumm = DEC(vsum_nach)
vPodr = vsps_podr
NO-ERROR.
find acct.acct where acct.bal-acct eq 53501 and acct.branch-id eq vPodr no-lock no-error.
if avail acct then vAcctDb = acct.acct .
find acct.acct where acct.bal-acct eq 26226 and acct.branch-id eq vPodr and acct.contract eq 'ЗП' no-lock no-error.
if avail acct then vAcctCr = acct.acct .
vParamOk = TDAddParam("mAcctDb", vAcctDb) AND TDAddParam("mAcctCr", vAcctCr) AND TDAddParam("mAmt", STRING(vSumm)).
iOpKind = "MEM3". /* назв. транзакции */
iOpDate = TODAY.
RUN ex-trans.p (iOpKind, iOpDate, TABLE tOpKindParams, OUTPUT vTransOk, OUTPUT vMessErr).
end.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
09 март 2017 14:02 #8 от alex_sar
COM_KUNENA_MESSAGE_REPLIED_NEW
Перенесите объявление {topkind.def} из процедуры prov в начало файла.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
10 март 2017 09:11 #9 от m_2602
COM_KUNENA_MESSAGE_REPLIED_NEW
Все получилось. Спасибо! Вот только с одной проблемой не могу разобраться, почему то транзакция берет только первое (одно) значение. В самой процедуре с помощью функции message проверял, вроде все хорошо, цикл проходит по каждому значению.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
14 март 2017 07:30 #10 от m_2602
COM_KUNENA_MESSAGE_REPLIED_NEW
Основной цикл и запуск процедуры создания транзакции
DO i = 1 TO vCount:
RUN DBFRead IN h_dbf (OUTPUT vError).
RUN DBFGetField IN h_dbf ("SPS_PODR",OUTPUT vsps_podr,OUTPUT vError).
RUN DBFGetField IN h_dbf ("SUM_NACH",OUTPUT vsum_nach,OUTPUT vError).
ASSIGN
vSumm = vsum_nach
vPodr = vsps_podr
NO-ERROR.
if vSumm <> "" then do:
RUN prov.
end. /* if vSumm ... */
END. /* DO i = 1 ... */
Процедура транзакции
Procedure prov.
find first acct where acct.bal-acct eq 53501 and acct.branch-id eq vPodr no-lock no-error.
if avail acct then vAcctDb = acct.acct .
find first acct where acct.bal-acct eq 26226 and acct.branch-id eq vPodr and acct.contract eq 'ЗП' no-lock no-error.
if avail acct then vAcctCr = acct.acct .
/****--- Заполняем временную таблицу tOpKindParams(pname=mAmt...,pvalue=vSumm...) значиниями из дбф ---*****/
vParamOk = TDAddParam("mAcctDb", vAcctDb) AND
TDAddParam("mAcctCr", vAcctCr) AND
TDAddParam("mAmt", vSumm).
/****--- Запускаем транзакцию и передаем ей значения из временной таблицы tOpKindParams ---*****/
iOpKind = "MEM3". /* назв. транзакции */
iOpDate = TODAY.
RUN ex-trans.p (iOpKind, iOpDate, TABLE tOpKindParams, OUTPUT vTransOk, OUTPUT vMessErr).
End procedure.
Я хочу чтобы на каждом шагу временная таблица создалась и удалилась. В моем случае Временная таблица создается, принимает первые значения и все на каждом шагу те же данные. Проверял передаваемые значения переменных vSumm = vsum_nach vPodr = vsps_podr они на каждом шагу меняются.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Время создания страницы: 0.208 секунд
Вы здесь: Главная Форум Программирование Программирование - ИБС "Бисквит" Универсальная транзакция импорт данных из dbf файла