Цитата:
CASE step OF rbuBDC_CONNECT:
strcpy(ADR(ErrMsg), ADR(''));
codi.enable:= TRUE;
codi.DBCD:= DBCDCurr;
step:= rbuBDC_CONNECT_r;
rbuBDC_CONNECT_r:
codi();
step:= CheckDbConnected(codi.status, step, rbuBDC_CONNECT_DONE, rbuBDC_ERROR);
rbuBDC_CONNECT_DONE:
step:= rbuDB_RD_BU_COMP;
(********************************************************************
* Чтение компонентов бункеров
********************************************************************)
rbuDB_RD_BU_COMP:
rbuDBUBuSQL(ADR(vSQL), PlantID, GLine1.ID);
dbs.enable:= TRUE;
dbs.connectionIdent:= codi.ident;
dbs.pSqlStatement:= ADR(vSQL);
step:= rbuDB_RD_BU_COMP_r;
rbuDB_RD_BU_COMP_r:
dbs();
I:= 1;
step:= CheckDbStatus(dbs.status, step, rbuDB_RD_BU_COMP_FNR, rbuBDC_ERROR);
rbuDB_RD_BU_COMP_FNR: // Получение следующей записи
bunker_id:= 0;
component_id:= 0;
fnr.enable:= TRUE;
fnr.connectionIdent:= codi.ident;
step:= rbuDB_RD_BU_COMP_FNR_r;
rbuDB_RD_BU_COMP_FNR_r:
fnr();
step:= CheckDbStatus(fnr.status, step, rbuDB_RD_BU_COMP_GD, rbuDB_RD_BU_COMP);
rbuDB_RD_BU_COMP_GD: // получение упакованых данных (поле dat)
gd(enable:= TRUE, connectionIdent:= codi.ident,
columnIdx:= 1,
dataType:= DB_SQL_CHAR,
pData:= ADR(s1),
dataSize:= SIZEOF(s1)
);
step:= CheckDbStatus(gd.status, step, rbuDB_RD_BU_COMP_GD_Parse, rbuBDC_ERROR);
rbuDB_RD_BU_COMP_GD_Parse: // рапаковка строки по полям
n:= toktoud(ADR(s1), ADR(bunker_id), DEF_DELIM);
n:= strtok(n, ADR(bun), DEF_DELIM, SIZEOF(bun));
n:= toktoud(n, ADR(component_id), DEF_DELIM);
n:= strtok(n, ADR(bucn), DEF_DELIM, SIZEOF(bun));
step:= rbuDB_RD_BU_COMP_GD_DONE;
rbuDB_RD_BU_COMP_GD_DONE: // Запись считана (если 10, выходим, иначе снова в цикл)
IF IDXValid(bunker_id, BUNKER_COUNT) THEN
BUParams[bunker_id].CoID:= component_id;
BUParams[bunker_id].Name:= bun;
BUParams[bunker_id].CoN:= bucn;
I:= I + 1;
IF (I <= BUNKER_COUNT) THEN
step:= rbuDB_RD_BU_COMP_FNR;
ELSE
step:= rbuDB_RD_TICKET;
END_IF
ELSE
step:= rbuBDC_ERROR;
END_IF
rbuBDC_ERROR:
I:= 0;
ErrMsg:= 'Unknown DB error!';
gem.enable:= TRUE;
gem.connectionIdent:= codi.ident;
gem.pErrorMessage:= ADR(ErrMsg);
gem.errorMessageSize:= SIZEOF(ErrMsg);
step:= rbuBDC_ERROR_r;
rbuBDC_ERROR_r:
gem();
IF I < 20 THEN
step:= CheckDbStatus(gem.status, step, rbuBDC_ERROR_DONE, rbuBDC_ERROR_r);
ELSE
step:= rbuBDC_ERROR_DONE;
END_IF
I:= I + 1;
rbuBDC_ERROR_DONE:
DBError[0]:= TRUE;
IF TEP.Q THEN
step:= rbuBDC_DISCONNECT;
END_IF
rbuBDC_DISCONNECT:
codi.done:= TRUE;
step:= rbuBDC_DISCONNECT_r;
rbuBDC_DISCONNECT_r:
codi();
IF (codi.status = 0) AND (codi.ident = 0) THEN
step:= rbuBDC_CONNECT;
END_IF
END_CASE;
Выполняется он около 5 сек (порядка 50 раз вызывается по кругу, пока не дойдет до конца). А там у меня 20*16 записей. Да на каждую по 2 запроса, если новый id читать следом другим запросом.
Цитата:
SELECT id FROM insert_fields_to_table1(@id, @f1, @f2, @f3)