Запрос progress 4gl для экспорта количества записей во всей таблице, доступной в БД

Я пытаюсь экспортировать количество всех таблиц в excel или текстовый файл.

if any program or any query will help me ? 

Я пытаюсь закодировать количество экспорта данных, доступных в каждой таблице.

код:

  define stream table t1.
    output stream t1 to t1.csv.

    &scope-define display-fields count(*)

    select count(*) from emp.

    export starem t1 delimiter ",".

Этот код создает excel с пустым значением, но отображает результат на экране. я в экселе.


person user3668036    schedule 30.10.2017    source источник
comment
Я пытаюсь закодировать количество экспорта данных, доступных в каждой таблице. код: определить таблицу потоков t1. выходной поток t1 в t1.csv. &scope-define display-fields count(*) select count(*0 from emp. export starem t1 delimiter. Этот код создает excel с пустым значением, но отображает результат на экране. i out in excel.   -  person user3668036    schedule 30.10.2017


Ответы (1)


Не уверен, что ты хочешь делать. Что-то вроде этого, если вы хотите подсчитать количество таблиц в базе данных:

DEFINE VARIABLE icount AS INTEGER NO-UNDO.
FOR each _file NO-LOCK WHERE _file._owner = "PUB":

    /* Skip "hidden" virtual system tables */
    IF _file._file-name BEGINS "_" THEN NEXT.

    iCount = iCount + 1.
END.

MESSAGE iCount "tables in the database"
    VIEW-AS ALERT-BOX INFORMATION.

Если у вас подключено несколько баз данных, вам необходимо добавить к таблице _file имя базы данных, т.е. database._file.

Однако: поскольку вы говорите «экспортировать в Excel», возможно, вы имеете в виду, что хотите знать количество записей для каждой таблицы?

Чтобы подсчитать количество записей в таблице, вы можете использовать FOR или SELECT.

SELECT COUNT(*) FROM tablename.

or

DEFINE VARIABLE iCount AS INTEGER NO-UNDO.  
FOR EACH tablename NO-LOCK TABLE-SCAN:
    iCount = iCount + 1.
END.
DISPLAY iCount.

Если вы не хотите кодировать это для каждой таблицы, вам нужно объединить его с динамическим запросом, подсчитывающим все записи.

DEFINE VARIABLE hQuery  AS HANDLE    NO-UNDO.
DEFINE VARIABLE hBuffer AS HANDLE    NO-UNDO.
DEFINE VARIABLE iCount  AS INTEGER   NO-UNDO.
DEFINE VARIABLE cTable  AS CHARACTER NO-UNDO.

/* Insert tablename here */
cTable = "TableName".

CREATE QUERY hQuery.
CREATE BUFFER hBuffer FOR TABLE cTable.

hQuery:SET-BUFFERS(hBuffer).

hQuery:QUERY-PREPARE(SUBSTITUTE("FOR EACH &1", cTable)).

hQuery:QUERY-OPEN.

queryLoop:
REPEAT:

    hQuery:GET-NEXT().

    IF hQUery:QUERY-OFF-END THEN LEAVE queryLoop.

    iCount = iCount + 1.
END.

DELETE OBJECT hQuery.
DELETE OBJECT hBuffer.

MESSAGE iCount "records in the table".

Объедините эти два, и у вас есть решение. Однако это может быть медленным, поскольку будут подсчитываться все записи всех таблиц.

Быстрый и грязный способ — запустить «tabanalys» в базе данных, если у вас есть доступ к ней через приглашение:

proutil DatabaseName -C tabanalys > tabanalys.txt

Это может быть запущено онлайн и может повлиять на файловый ввод-вывод и т. д., поэтому запускайте его в первый раз в нерабочие часы, просто чтобы убедиться. Затем загляните в этот файл, вы увидите количество записей, размеры и т. д. для всех таблиц: как системных, так и пользовательских.

Proutil, запущенный онлайн, может быть не на 100% правильным, но, скорее всего, «достаточно хорошим».

person Jensd    schedule 30.10.2017
comment
Я хочу подсчитать данные в таблице? - person user3668036; 30.10.2017
comment
Я обновил пример того, как это сделать (а также, возможно, более разумный способ сделать это). - person Jensd; 30.10.2017
comment
просто хочу спросить, я добавил некоторый код в вопросе, но это создает пустой Excel .. что-нибудь, что вы можете добавить? - person user3668036; 30.10.2017
comment
Этот код на самом деле не имеет никакого смысла ... Определение области ничего не делает в вашем случае. Поток определения не принимает никаких атрибутов таблицы. И т. д. Вам необходимо иметь базовое представление о Progress ABL. - person Jensd; 30.10.2017