不确定你想做什么。如果你想计算数据库中表的数量,这样的事情:
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-table 前面加上数据库名称,即 database._file。
但是:既然您说“导出到 excel”,也许您的意思是您想知道每个表的记录数?
要计算表中的记录数,您可以使用FOR 或SELECT。
SELECT COUNT(*) FROM tablename.
或
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
这可以在线运行,并且可能会对文件 io 等产生影响,因此请在非高峰时间第一次运行以确保。然后查看该文件,您将看到所有表的记录数、大小等:系统表和用户表。
Proutil 在线运行可能不是 100% 正确,但很可能“足够好”。