Автоматизированное рабочее место регистрации и документирования комплекса средств автоматизации
void
initsearch(char *argv[],int *x,int p,int n); // выбор варианта поиска
void
recprint(int nformat); // расшифровка записи БД в строку и запись этой строки
в файл
char
sag[7][81]={
"
ДАТА ВРЕМЯ ТЕКСТ СООБЩЕНИЯ
\r\n",
"
ДАТА ВРЕМЯ НАПР-Е А N РР ИСТ ВС ТЕКСТ СООБЩЕНИЯ
\r\n",
"
ДАТА ВРЕМЯ НАПР-Е N РР ТЕКСТ СООБЩЕНИЯ
\r\n",
"
ДАТА ВРЕМЯ НАПР-Е К-ВО ВС 1СЛ 2СЛ 3СЛ 4СЛ ТЕКСТ СООБЩЕНИЯ
\r\n",
"
ДАТА ВРЕМЯ ТИП-У П ВС ТЕКСТ СООБЩЕНИЯ
\r\n",
"
ДАТА ВРЕМЯ КСУМ0 КСУМ1 КСУМ2 КСУМ3
\r\n",
"
ДАТА ВРЕМЯ КСУП1 КСУС1 КСУП2 КСУС2 КСУП3 КСУС3
\r\n"
};
// шапки таблиц
char
*inqstr; // строки запроса
/* строка
аргументов функции main:
argv[1] -
имя файла БД; или "!", означающий, что строка аргументов передается
через память;
argv[2] -
вариант поиска; 0 - поиск по всей БД, 1 - поиск в едином интервале по дате и
времени, 2 - поиск в интервале времени по каждому дню интервала дат, 3 - поиск
за один день в интервале времени;
argv[3] -
дата;
argv[4] -
время;
argv[5] и
далее - искомые значения полей БД ( argv[5] - третьего поля, argv[6] -
четвертого поля и т.д. ); "-" обоз-
начает
любое значение данного поля; в случае нескольких искомых значений по одному
полю (перечисление) они разделяются запятыми; пробелы в значениях заменены на
'_'. */
void
main(int argc,char *argv[])
{
int *x; //
x[i] - количество искомых значений по i-му полю
int n=0; //
количество полей, для которых заданы значения для поиска
int p=0; //
количество полей c перечислениями
//
значения x,n,p определяются без учета полей даты и времени
char
*name[]={"all_inf","opi","shk","sbkdg","fk","ksum","ksum0"};
// имена
баз данных
long
date1,date2; // граничные значения интервала дат
int a,i,j,k;
char *c;
char
**mem_args(void);
RECORDHANDLE
rech;
RECORDNUMBER
num;
// Получение
аргументов в случае их передачи через память
if(argv[1][0]=='!')
{
argv=mem_args();
for(argc=0;argv[argc]!=NULL;++argc);
}
//
определение формата записи для базы данных, к которой
//
произведен запрос
for(i=0;i<=6;++i)
if(!strcmp(name[i],argv[1])
|| !strcmp(name[i],argv[1]+5))
{
nformat=i;break;}
// открытие
файла результатов запроса (inquiry.res) и
// запись в
него строк запроса и шапки таблицы
for(i=argc-1;argv[i][0]=='-';--i)
argc--;
handle=open("inquiry.res",
O_CREAT |
O_TRUNC | O_WRONLY,S_IREAD | S_IWRITE );
for(i=1,j=0;i<argc;)
{
inqstr=(char
*)calloc(82,1);
memset(inqstr+1,'
',79);
inqstr[79]='\r';
inqstr[80]='\n';
inqstr[81]='\0';
for(c=inqstr;i<argc;++i)
{
if(strlen(inqstr)+strlen(argv[i])>78+j)
{
if(strlen(argv[i])>50 && (strlen(inqstr)<70 ||
strlen(argv[i])>78))
{
for(k=j+77-strlen(inqstr);argv[i][k]!=',';--k);
strcat(c," ");
strncat(c,argv[i]+j,k+1-j);
j=k+1;
}
break;
}
strcat(c," ");
strcat(c,argv[i]+j);
j=0;
}
inqstr[strlen(inqstr)]='
';
_write(handle,inqstr,81);
free(inqstr);
}
_write(handle,sag[nformat],81);
//
инициализация работы с БД
j=coreleft()/1024-50;
if(j>256)
j=256;
if(a=PXSetDefaults(j,1,30,MAXLOCKHANDLES,3,SortOrderAscii))
printf("\n%s",PXErrMsg(a));
if(a=PXInit())
printf("\n%s",PXErrMsg(a));
if(a=PXTblOpen(argv[1],&tblh,0,0))
printf("\n%s",PXErrMsg(a));
PXRecNFlds(tblh,&nflds);
x=(int
*)calloc(argc+1,sizeof(int));
// разбор
аргументов запроса
for(i=5;i<argc;++i)
{
if(argv[i][0]=='-')
continue;
++n;
for(c=argv[i],j=1;*c!='\0';++c)
{
if(*c==',')
++j;
if(*c=='_')
*c=' ';
}
x[i-2]=j;
if(j>1)++p;
}
// главный
блок
switch(argv[2][0])
{
case '0':
low=1;PXTblNRecs(tblh,&high);
initsearch(argv,x,p,n);
break;
case '1':
PXDateEncode(atoi(argv[3]),atoi(argv[3]+3),atoi(argv[3]+6),&date1);
PXDateEncode(atoi(argv[3]+11),atoi(argv[3]+14),atoi(argv[3]+17),&date2);
interval(date1,date2,argv[4],argv[4]+9);
initsearch(argv,x,p,n);
break;
case '2':
PXDateEncode(atoi(argv[3]),atoi(argv[3]+3),atoi(argv[3]+6),&date1);
PXDateEncode(atoi(argv[3]+11),atoi(argv[3]+14),atoi(argv[3]+17),&date2);
interval(date1,date2,argv[4],argv[4]+9);
if(low==1 && !high) break;
if(low==1)
{
PXRecBufOpen(tblh,&rech);
PXRecGet(tblh,rech);
PXGetDate(rech,1,&date1);
PXRecBufClose(rech);
}
PXTblNRecs(tblh,&num);
if(high==num)
{
PXRecBufOpen(tblh,&rech);
PXRecLast(tblh);
PXRecGet(tblh,rech);
PXGetDate(rech,1,&date2);
PXRecBufClose(rech);
}
for(;date1<=date2;++date1)
{
interval(date1,date1,argv[4],argv[4]+9);
if(low>high) continue;
initsearch(argv,x,p,n);
}
break;
case '3':
PXDateEncode(atoi(argv[3]),atoi(argv[3]+3),atoi(argv[3]+6),&date1);
interval(date1,date1,argv[4],argv[4]+9);
initsearch(argv,x,p,n);
}
free(x);
if(a=PXTblClose(tblh))
printf("\n%s",PXErrMsg(a));
PXExit();
close(handle);
}
//
initsearch
// выбор
функции поиска
void
initsearch(char *argv[],int *x,int p,int n)
{
if(low>high)
return;
if(p)
search3(argv+5,x);
else if(n)
search2(argv,x,n);
else
search1();
}
// Функция
mem_args возвращает адрес строки параметров в случае ее передачи через память
#include
"conn_mem.h"
char
**mem_args()
{
char ***dat;
dat=(char
***)conn_mem();
return
dat[ARGS_OFF/4];
}
//
bs2_inq.prj
//INQUIRY\interval.c
// interval()
//
определение граничных номеров интервала поиска
#include
<stdio.h>
#include
<stdlib.h>
#include
"pxengine.h"
#include
"def.h"
void
interval (long date1,long date2,char *time1,char *time2)
{
RECORDHANDLE
rech;
itoa(atoi(time2+6)+1,time2+6,10);
PXRecBufOpen(tblh,&rech);
PXPutDate(rech,1,date2);
PXPutAlpha(rech,2,time2);
if(PXRecInsert(tblh,rech))printf("error");
PXRecNum(tblh,&high);
--high;
PXRecDelete(tblh);
PXPutDate(rech,1,date1);
PXPutAlpha(rech,2,time1);
if(PXRecInsert(tblh,rech))printf("error");
if(PXRecNum(tblh,&low))printf("error");
PXRecDelete(tblh);
PXRecBufClose(rech);
}
//
inquiry.prj
//INQUIRY\recprint.c
//
recprint()
//
форматирование и запись в файл найденной строки
#include
<stdio.h>
#include
<mem.h>
#include
<io.h>
#include
<dos.h>
#include
"pxengine.h"
#include
"def.h"
#include
"disp.h"
void
recprint()
{
long date;
int
month,day,year;
int
format[7][7]= { {21,0,0,0,0,0,0},{21,28,30,35,38,42,46},
{21,29,34,37,0,0,0},{
21,29,35,38,43,48,53 },
{
21,27,29,33,0,0,0 },{ 21,28,35,42,49,0,0 },
{
21,28,35,42,49,56,63 } };
static char
string[82]; // результирующая строка
RECORDHANDLE
rech;
union REGS
r;
int a,i;
memset(string,'
',82);
PXRecBufOpen(tblh,&rech);
PXRecGet(tblh,rech);
PXGetDate(rech,1,&date);
PXDateDecode(date,&month,&day,&year);
sprintf(string,"%.02d\\%.02d\\%.04d ",month,day,year);
PXGetAlpha(rech,2,10,string+11);
for(i=3;i<=nflds;++i)
PXGetAlpha(rech,i,sizeof(string)-format[nformat][i-2],
string+format[nformat][i-3]-1);
for(i=0;i<=80;++i)
if(string[i]=='\0') string[i]=' ';
string[79]='\r';
string[80]='\n';
_write(handle,string,81);
PXRecBufClose(rech);
// передача
управления диспетчеру
// (только
для передачи cимвола на принтер!)
// после
каждой найденной записи
r.h.ah=1;
int86(DISP,&r,&r);
}
//
inquiry.prj
//INQUIRY\search12.c
//
search1(),search2(),(search3() см в файле search3.c)
// search1 -
все записи в заданном интервале
// search2 -
задано не более одного искомого значения по каждому полю
// search3 -
более одного искомого значения xотя бы по одному полю
/* исходные
данные:
int *x;
,где x[i] - количество искомых значений по i-му полю ( только для search2 )
char
*argv[] - см. комментарии в inquiry.c (только для search2)
RECORDNUMBER
low,high; - границы интервала поиска */
#include
<stdlib.h>
#include
"pxengine.h"
#include
"def.h"
void
search2(char *argv[],int *x,int n)
{
int
a,i,j=0,*y;
int yes;
char *c,*c2;
char
arg[10];
RECORDHANDLE
*rec;
RECORDNUMBER
*s,max=low;
s=(long
*)calloc(n,sizeof(RECORDNUMBER));
rec=(unsigned
int *)calloc(n,sizeof(RECORDHANDLE));
y=(int
*)calloc(n,sizeof(int));
for(i=3;j<n;++i)
{
if(!x[i])
continue;
PXRecBufOpen(tblh,rec+j);
PXPutAlpha(rec[j],i,argv[i+2]);
y[j++]=i;
}
while(1)
{
for(i=0;i<n;++i)
{
if(max==1)
{
if
(!(a=PXSrchFld(tblh,rec[i],y[i],SEARCHFIRST)))
PXRecNum(tblh,&s[i]);
}
else
if(s[i]<max)
{
PXRecGoto(tblh,max-1);
if(!(a=PXSrchFld(tblh,rec[i],y[i],SEARCHNEXT)))
PXRecNum(tblh,&s[i]);
}
if(a||s[i]>high)
{
free(s);free(rec);free(y);
return;
}
}
for(i=1,yes=1,max=s[0];i<n;++i)
{
if(s[i]!=max)
yes=0;
if(s[i]>max)
max=s[i];
}
if(yes) {
++max;recprint(); }
}
}
void
search1(void)
{
RECORDNUMBER
i;
for(i=low;i<=high;++i)
{
recprint();
PXRecNext(tblh);
}
}
//
inquiry.prj
//INQUIRY\search3.c
// search3()
// поиск
/* исходные
данные:
int *x;
,где x[i] - количество искомых значений по i-му полю
char
*args[] - искомые значения полей БД ( args[0] - третьего поля, argv[1] -
четвертого поля и т.д. );
RECORDNUMBER
low,high; - границы интервала поиска */
// search1 -
все записи в заданном интервале
// search2 -
не более одного искомого значения по каждому полю
// search3 -
более одного искомого значения xотя бы по одному полю
#include
<stdlib.h>
#include
<stdio.h>
#include
"pxengine.h"
#include
"def.h"
void
search3(char *args[],int *x)
{
/*
rec -
массив массивов буферов для поиска,его размерность равна количеству полей в
таблице. Размерность каждого из массивов rec[i] равна количеству искомых
значений по i-му полю таблицы (то есть == х[i]). В каждый буфер заносится одно
искомое значение ( например, в rec[3][0] - заносится первое искомое значение по
3-му полю таблицы).
Каждому
буферу ( rec[i][j] )соответствует элемент массива массивов z ( z[i][j] ), в
котором хранится текущий номер
найденной
записи по данному буферу (то есть записи, в соответствующем поле которой
находится значение, равное значению, занесенному в буфер).
В массиве s
хранятся текущие номера найденных строк по каждому полю ( s[i] минимум из всех
z[i][j] по этому i).
max -
текущий номер записи при поиске ( то есть записи с номерами меньше max уже
просмотрены ).
*/
RECORDHANDLE
**rec;
int i,j,k;
int yes;
char
*c1,*c2;
char
arg[10];
RECORDNUMBER
*s,**z,max=low;
int a;
// выделение
памяти под массивы rec,z,s
// и
открытие буферов
s=(long
*)calloc(nflds,sizeof(RECORDNUMBER));
rec=(unsigned
int **)calloc(nflds,sizeof(RECORDHANDLE *));
z=(long
**)calloc(nflds,sizeof(RECORDNUMBER *));
for(i=3;i<=nflds;++i)
if(x[i])
{
rec[i]=(unsigned int *)calloc(x[i],sizeof(RECORDHANDLE));
z[i]=(long
*)calloc(x[i],sizeof(RECORDNUMBER));
for(j=0;j<x[i];++j) PXRecBufOpen(tblh,rec[i]+j);
}
// заносим в
буфера значения из args
// (
значения для одного поля разделены в args запятыми )
for(i=3;i<=nflds;++i)
{
if(!x[i])
continue;
if(x[i]==1)
PXPutAlpha(rec[i][0],i,args[i-3]);
else
{
c1=args[i-3];
for(k=0;k<x[i];++k)
{
c2=arg;
while(*c1!=',' && *c1!='\0') *c2++=*c1++;
*c2='\0';
++c1;
PXPutAlpha(rec[i][k],i,arg);
}
}
}
// цикл
поиска
while(1) {
for(i=3;i<=nflds;++i)
{
// 1) Для
каждого буфера находим запись с значением равным занесенному в этот буфер и с
номером >= max.
//
Найденные номера заносим в соотвествующие z[i][k]
// Если
искомых записей по данному буферу нет, заносим в z[i][k] номер, превышающий
верхнюю
//
границу интервала поиска
if(!x[i])
continue;
for(k=0;k<x[i];++k)
{
if(max==1)
{
if(PXSrchFld(tblh,rec[i][k],i,SEARCHFIRST))z[i][k]=high+1;
else
PXRecNum(tblh,&z[i][k]);
}
else
if
(z[i][k]<max)
{
PXRecGoto(tblh,max-1);
if(PXSrchFld(tblh,rec[i][k],i,SEARCHNEXT)) z[i][k]=high+1;
else
PXRecNum(tblh,&z[i][k]);
}
}
// 2) Для
каждого поля определяем значение s[i]
// Если
хотя бы по одному полю произошел выход за пределы интервала поиска, значит
поиск закончен
s[i]=z[i][0];
for(k=1;k<x[i];++k)
if(s[i]>z[i][k]) s[i]=z[i][k];
if(s[i]>high)
{
for(i=3;i<=nflds;++i)
if(x[i])
{
for(j=0;j<x[i];++j) PXRecBufClose(rec[i][j]);
free(rec[i]); free(z[i]);
}
free(s);
free(rec); free(z);
return;
}
}
// 3), 4)
//
Проверяем совпадение значений s[i].
// Если
значения s[i] совпадают для всех полей по которым производится поиск, значит
найдена искомая
// ( т.е.
удовлетворяющая заданным условиям ) запись, в этом случае вызываем функцию
recprint
//
Определяем значение max для следующей итерации, это значение равно максимуму из
s[i].
for(i=3;!x[i];++i);
max=s[i];
for(++i,yes=1;i<nflds;++i)
{
if(!x[i])
continue;
if(s[i]!=max)
yes=0;
if(s[i]>max)
max=s[i];
}
if(yes) {
PXRecGoto(tblh,max);++max;recprint(); }
}
}
//
bs2_inq.prj
//
BS2_INQ\bs2_inq.c
// main()
// программа
обработки запросов для второй формы байтов состояний
#include
<stdio.h>
#include
<stdlib.h>
#include
<string.h>
#include
<fcntl.h>
#include
<sys/stat.h>
#include
<io.h>
#include
<alloc.h>
#include
"pxengine.h"
#include
"devices.h"
TABLEHANDLE
tblh; // дескриптор таблицы
RECORDNUMBER
low,high; // границы интервала поиска
int
nflds; // кол-во полей в таблице
int
handle; // дескриптор файла
void
interval(long date1,long date2,char *time1, char *time2); // определение
границ интервала поиска
void
search(char *type); // поиск
void
recprint(void); // расшифровка записи БД в строку и запись этой строки в файл
char
*sag; // шапкa таблицы
char
*sag2; // шапкa таблицы-вторая строка
char
*inqstr; // строка запроса
int
length; // длина строки в таблице
/* строка
аргументов функции main:
argv[1] -
не используется
argv[2] -
вариант поиска; 0 - поиск по всей БД, 1 - поиск в едином интервале по дате и
времени, 2 - поиск в интервале
времени
по каждому дню интервала дат, 3 - поиск за один день в интервале времени;
argv[3] -
дата;
argv[4] -
время;
argv[5] -
тип устройства */
void
main(int argc,char *argv[])
{
long
date1,date2; // граничные значения интервала дат
int a,i;
char *c;
RECORDHANDLE
rech;
RECORDNUMBER
num;
// открытие
файла результатов запроса (inquiry.res) и запись в него строки запроса и шапки
таблицы
handle=open("inquiry.res",
O_CREAT |
O_TRUNC | O_WRONLY,S_IREAD | S_IWRITE );
for(i=0;strcmp(devices[i].type,argv[5])
&& i<20;++i);
switch(i)
{
case 0:
//ШЭ-00
case 8:
//ШЭ-08
sag=(char
*)calloc(81,1);
strcpy(sag,"
ДАТА ВРЕМЯ ТИП_У П ВС СОСТОЯНИЕ_ШКАФА СЕТЬ1 СЕТЬ2
\r\n");
break;
case 1:
//ШП-01
case 9:
//ШП-09
sag=(char
*)calloc(81,1);
strcpy(sag,"
ДАТА ВРЕМЯ ТИП_У П ВС СОСТОЯНИЕ_ШКАФА
\r\n");
break;
case 4:
//ШК-04
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18
|