From 0502d1c87aef2ad1a0facc26cc784dfbd5b59281 Mon Sep 17 00:00:00 2001 From: angelo Date: Mon, 1 Sep 1997 14:10:47 +0000 Subject: [PATCH] Corretta ricerca sorgenti dati e variabile d'ambiente. Ora ricerca prima la definizione della sorgente dati in ODBC, in caso negativo utilizza CodeBase (se esiste la variabile d'ambiente SPPROOT) per leggere il file. git-svn-id: svn://10.65.10.50/trunk@5146 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ce/sesa.cpp | 202 +++++++++++++++++++-- ce/sesa.h | 2 + ce/sesadump.def | 461 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 648 insertions(+), 17 deletions(-) diff --git a/ce/sesa.cpp b/ce/sesa.cpp index dc8773778..1115cd101 100755 --- a/ce/sesa.cpp +++ b/ce/sesa.cpp @@ -9,6 +9,12 @@ static CDatabase _db; static CString _strWorkDir; +#define S4DLL +#include + +static CODE4 _codebase; +static DATA4 *_dbdata; + /////////////////////////////////////////////////////////// // SESA field info /////////////////////////////////////////////////////////// @@ -319,6 +325,8 @@ SESA_Recordset::SESA_Recordset(CDatabase* pDatabase) // SESA functions /////////////////////////////////////////////////////////// +inline BOOL is_space(char c) { return c >= '\t' && c <= ' '; } + static BOOL UpdateODBCIni(LPCSTR szEntry, LPCSTR szDefault, BOOL bForce = FALSE) { BOOL bWrite = bForce; @@ -337,25 +345,24 @@ static BOOL UpdateODBCIni(LPCSTR szEntry, LPCSTR szDefault, BOOL bForce = FALSE) } BOOL SESA_OpenDatabase(const char* lpszDSN, const char* lpszConnect) -{ +{ if (lpszDSN == NULL || *lpszDSN == '\0') - { lpszDSN = "SIGLAPP"; - const char* SIGLAPP = getenv(lpszDSN); - if (SIGLAPP) - { - UpdateODBCIni("Driver", "simba.dll"); - UpdateODBCIni("Description", "Dati Comuni Sigla++"); - UpdateODBCIni("FileType", "FoxPro 2.5"); - UpdateODBCIni("DataDirectory", SIGLAPP, TRUE); - UpdateODBCIni("SingleUser", "False"); - } - } if (lpszConnect == NULL || *lpszConnect == '\0') lpszConnect = "ODBC;"; - - // DataSrc Excl ReadOnly ConnectString - BOOL ok = _db.Open(lpszDSN, FALSE, TRUE, lpszConnect); + + BOOL ok; + TRY + { + // DataSrc Excl ReadOnly ConnectString + ok = _db.Open(lpszDSN, FALSE, TRUE, lpszConnect); + } + CATCH_ALL(e) + { + ok = FALSE; + } + END_CATCH_ALL + if (!ok) { CString msg; @@ -375,8 +382,8 @@ BOOL SESA_CloseDatabase() return TRUE; } -BOOL SESA_DumpTable(const char* lpszTableName) -{ +BOOL SESA_DumpTableODBC(const char* lpszTableName) +{ const BOOL bWasOpen = _db.IsOpen(); if (!bWasOpen) { @@ -430,6 +437,167 @@ BOOL SESA_DumpTable(const char* lpszTableName) return ok; } +BOOL SESA_DumpTableCODEBASE(const char* SIGLAPP, const char* lpszTableName) +{ + BOOL ok; + CString filename; + CString msg; + + d4init(&_codebase); + _dbdata = NULL; + _codebase.read_lock=0; + _codebase.default_unique_error=e4unique; + _codebase.safety=0; + _codebase.lock_attempts=1; + u4ncpy(_codebase.date_format,"CCYYMMDD",sizeof(_codebase.date_format)); + + filename = SIGLAPP; + if (filename.Right(1) != "\\" && filename.Right(1) != "/") + filename += "\\"; + filename += lpszTableName; + _codebase.error_code=0; + _dbdata=d4open(&_codebase,(char*)(const char*)filename); + if (_dbdata != NULL) + { + CString strName = _strWorkDir; + CString fld_name,fld_val; + CStringArray field_list; + strName += lpszTableName; + strName += ".ini"; + + if (access(strName, 0x00) == 0) + { + // Legge la lista dei campi dal .ini se esiste gia' + + char szField[16]; + char szName[16]; + char szFile[32]; + + // Mette .\ davanti al nome per cercare nella directory corrente, + // altrimenti lo cerca nella directory di Windows + sprintf(szFile, ".\\%s", strName); + + for (int num = 0; ; num++) + { + sprintf(szField, "NAME(%d)", num); + GetPrivateProfileString("RECORD", szField, "", szName, sizeof(szName), szFile); + if (*szName) + field_list.Add(szName); + else + break; + } + } + else + { + // Scarica il tracciato dei campi + ofstream out(strName); + out << "[MAIN]" << endl + << "TYPEFIELD=-1" << endl + << "DECSEP=." << endl + << "FIELDSEP=|" << endl + << endl; + + out << "[RECORD]" << endl; + FIELD4INFO *field_info = d4field_info(_dbdata); + if (field_info != NULL) + { + const int num_fields = d4num_fields(_dbdata); + for (int num=0; num < num_fields; num++) + { + out << "NAME(" << num << ") = " << field_info[num].name << endl + << endl; + field_list.Add(field_info[num].name); + } + u4free(field_info); + } + else + { + msg = "Can't get file header."; + AfxMessageBox(msg, MB_OK | MB_ICONEXCLAMATION); + ok = FALSE; + } + } + + if (ok) + { + strName = _strWorkDir; + strName += lpszTableName; + strName += ".txt"; + ofstream out(strName); + d4top(_dbdata); // No tag is required + while (!d4eof(_dbdata) && ok) + { + if (!d4deleted(_dbdata)) // Dump only undeleted records + { + const int items = field_list.GetSize(); + for (int num = 0; num < items && ok; num++) + { + fld_name = field_list.GetAt(num); + if (num) + out << '|'; + FIELD4* fldfld = d4field(_dbdata,(char*)(const char*)fld_name); + if (fldfld != NULL) + { + fld_val = f4str(fldfld); + char * v = fld_val.GetBuffer(80); + // Trims leading & trailing spaces + { + char* last = v; + + // Salta spazi iniziali + for (const char* s = v; *s && is_space(*s); s++); + + // Copia stringa + for(char* c = v; *s; s++) + { + *c++ = *s; + if (!is_space(*s)) last = c; + } + // Elimina spazi finali + *last = '\0'; + } + out << v; + fld_val.ReleaseBuffer(); + } + else + { + msg = "Can't get field "; + msg += fld_val; + AfxMessageBox(msg, MB_OK | MB_ICONEXCLAMATION); + ok = FALSE; + } + } + out << endl; + } + d4skip(_dbdata,1L); // Skip next + } + } + + d4close(_dbdata); + } + else + { + msg = "Can't open file "; + msg += filename; + AfxMessageBox(msg, MB_OK | MB_ICONEXCLAMATION); + ok = FALSE; + } + + d4init_undo(&_codebase); + + return ok; +} + +BOOL SESA_DumpTable(const char* lpszTableName) +{ + if (!SESA_DumpTableODBC(lpszTableName)) + { + const char *SIGLAPP = getenv("SPPROOT"); + return SIGLAPP ? SESA_DumpTableCODEBASE(SIGLAPP, lpszTableName) : FALSE; + } + return TRUE; +} + BOOL SESA_WorkDir(const char* strDir) { _strWorkDir = strDir; diff --git a/ce/sesa.h b/ce/sesa.h index a7026eb84..2d6ced3d0 100755 --- a/ce/sesa.h +++ b/ce/sesa.h @@ -1,4 +1,6 @@ BOOL SESA_WorkDir(const char* strDir); BOOL SESA_OpenDatabase(const char* strDSN = NULL, const char* strConnect = NULL); BOOL SESA_DumpTable(const char* strTableName); +BOOL SESA_DumpTableODBC(const char* strTableName); +BOOL SESA_DumpTableCODEBASE(const char* SIGLAPP, const char* strTableName); BOOL SESA_CloseDatabase(); diff --git a/ce/sesadump.def b/ce/sesadump.def index 467fc3bca..5efbe6834 100755 --- a/ce/sesadump.def +++ b/ce/sesadump.def @@ -11,3 +11,464 @@ HEAPSIZE 1024 ; initial heap size ; Stack size is passed as argument to linker's /STACK option +IMPORTS + C4ATOD = CB5.1 + C4ATOI = CB5.2 + C4ATOL = CB5.3 + C4DESCEND = CB5.4 + C4DESCEND_DATE = CB5.5 + C4DESCEND_NUM = CB5.6 + C4DESCEND_STR = CB5.7 + C4ENCODE = CB5.8 + CODE4ALLOC = CB5.9 + + D4ALIAS = CB5.10 + D4ALIAS_SET = CB5.11 + D4APPEND = CB5.12 + D4APPEND_BLANK = CB5.13 + D4APPEND_DATA = CB5.14 + D4APPEND_START = CB5.15 + D4BLANK = CB5.16 + D4BOF = CB5.17 + D4BOTTOM = CB5.18 + D4CHANGED = CB5.19 + D4CHECK = CB5.20 + D4CLOSE = CB5.21 + D4CLOSE_ALL = CB5.22 + D4CREATE = CB5.23 + D4DATA = CB5.24 + D4DELETE = CB5.25 + D4DELETED = CB5.26 + D4EOF = CB5.27 + D4FIELD = CB5.28 + D4FIELD_INFO = CB5.29 + D4FIELD_J = CB5.30 + D4FIELD_NUMBER = CB5.31 + D4FLUSH = CB5.32 + D4FLUSH_DATA = CB5.33 + D4FLUSH_FILES = CB5.34 + D4FREE_BLOCKS = CB5.35 + D4GO = CB5.36 + D4GO_DATA = CB5.37 + D4GO_EOF = CB5.38 + D4INDEX = CB5.39 + D4INIT = CB5.40 + D4INIT_UNDO = CB5.41 + D4LOCK = CB5.42 + D4LOCK_ALL = CB5.43 + D4LOCK_APPEND = CB5.44 + D4LOCK_FILE = CB5.45 + D4LOCK_GROUP = CB5.46 + D4LOCK_INDEX = CB5.47 + D4LOCK_TEST = CB5.48 + D4LOCK_TEST_APPEND = CB5.49 + D4LOCK_TEST_FILE = CB5.50 + D4LOCK_TEST_INDEX = CB5.51 + D4MEMO_COMPRESS = CB5.52 + D4NUM_FIELDS = CB5.53 + D4OPEN = CB5.54 + D4OPT_START = CB5.55 + D4OPT_SUSPEND = CB5.56 + D4OPTIMIZE = CB5.57 + D4OPTIMIZE_WRITE = CB5.58 + D4PACK = CB5.59 + D4PACK_DATA = CB5.60 + D4POSITION = CB5.61 + D4POSITION_SET = CB5.62 + D4READ = CB5.63 + D4READ_OLD = CB5.64 + D4RECALL = CB5.65 + D4RECCOUNT = CB5.66 + D4RECNO = CB5.67 + D4RECORD = CB5.68 + D4RECORD_POSITION = CB5.69 + D4RECORD_WIDTH = CB5.70 + D4REFRESH = CB5.71 + D4REFRESH_RECORD = CB5.72 + D4REINDEX = CB5.73 + D4SEEK = CB5.74 + D4SEEK_DOUBLE = CB5.75 + D4SKIP = CB5.76 + D4TAG = CB5.77 + D4TAG_DEFAULT = CB5.78 + D4TAG_NEXT = CB5.79 + D4TAG_PREV = CB5.80 + D4TAG_SELECT = CB5.81 + D4TAG_SELECTED = CB5.82 + D4TOP = CB5.83 + D4UNLOCK = CB5.84 + D4UNLOCK_FILES = CB5.85 + D4VALIDATE_MEMO_IDS = CB5.86 + D4WRITE = CB5.87 + D4WRITE_DATA = CB5.88 + D4WRITE_KEYS = CB5.89 + D4ZAP = CB5.90 + D4ZAP_DATA = CB5.91 + + DATE4ASSIGN = CB5.92 + DATE4CDOW = CB5.93 + DATE4CMONTH = CB5.94 + DATE4DAY = CB5.95 + DATE4DOW = CB5.96 + DATE4FORMAT = CB5.97 + DATE4FORMAT_MDX = CB5.98 + DATE4INIT = CB5.99 + DATE4LONG = CB5.100 + DATE4MONTH = CB5.101 + DATE4TIME_NOW = CB5.102 + DATE4TODAY = CB5.103 + DATE4YEAR = CB5.104 + + E4 = CB5.105 + E4CODE = CB5.106 + E4DESCRIBE = CB5.107 + E4EXIT = CB5.108 + E4EXIT_TEST = CB5.109 + E4HOOK = CB5.110 + E4SET = CB5.111 + E4SEVERE = CB5.112 + E4TEXT = CB5.113 + + EXPR4CALC_CREATE = CB5.114 + EXPR4DOUBLE = CB5.115 + EXPR4FREE = CB5.116 + EXPR4KEY = CB5.117 + EXPR4KEY_LEN = CB5.118 + EXPR4LEN = CB5.119 + EXPR4PARSE = CB5.120 + EXPR4SOURCE = CB5.121 + EXPR4TRUE = CB5.122 + EXPR4TYPE = CB5.123 + EXPR4VARY = CB5.124 + + F4ASSIGN = CB5.125 + F4ASSIGN_CHAR = CB5.126 + F4ASSIGN_DOUBLE = CB5.127 + F4ASSIGN_FIELD = CB5.128 + F4ASSIGN_INT = CB5.129 + F4ASSIGN_LONG = CB5.130 + F4ASSIGN_N = CB5.131 + F4ASSIGN_PTR = CB5.132 + F4BLANK = CB5.133 + F4CHAR = CB5.134 + F4DATA = CB5.135 + F4DECIMALS = CB5.136 + F4DOUBLE = CB5.137 + F4INT = CB5.138 + F4LEN = CB5.139 + F4LONG = CB5.140 + F4MEMO_ASSIGN = CB5.150 + F4MEMO_ASSIGN_N = CB5.151 + F4MEMO_FREE = CB5.152 + F4MEMO_LEN = CB5.153 + F4MEMO_NCPY = CB5.154 + F4MEMO_PTR = CB5.155 + F4MEMO_STR = CB5.156 + F4NAME = CB5.157 + F4NCPY = CB5.158 + F4PTR = CB5.159 + F4STR = CB5.160 + F4TRUE = CB5.161 + F4TYPE = CB5.162 + + FILE4CLOSE = CB5.163 + FILE4CREATE = CB5.164 + FILE4FLUSH = CB5.165 + FILE4LEN = CB5.166 + FILE4LEN_SET = CB5.167 + FILE4LOCK = CB5.168 + FILE4LOCK_HOOK = CB5.169 + FILE4OPEN = CB5.170 + FILE4OPTIMIZE = CB5.171 + FILE4OPTIMIZE_WRITE = CB5.172 + FILE4READ = CB5.173 + FILE4READ_ALL = CB5.174 + FILE4READ_ERROR = CB5.175 + FILE4REFRESH = CB5.176 + FILE4REPLACE = CB5.177 + FILE4TEMP = CB5.178 + FILE4UNLOCK = CB5.179 + FILE4WRITE = CB5.180 + FILE4SEQ_READ = CB5.181 + FILE4SEQ_READ_ALL = CB5.182 + FILE4SEQ_READ_INIT = CB5.183 + FILE4SEQ_WRITE = CB5.184 + FILE4SEQ_WRITE_FLUSH = CB5.185 + FILE4SEQ_WRITE_INIT = CB5.186 + FILE4SEQ_WRITE_REPEAT = CB5.187 + + I4CLOSE = CB5.188 + I4CREATE = CB5.189 + I4LOCK = CB5.190 + I4OPEN = CB5.191 + I4REINDEX = CB5.192 + I4TAG = CB5.193 + I4TAG_INFO = CB5.194 + I4UNLOCK = CB5.195 + + L4ADD = CB5.196 + L4ADD_AFTER = CB5.197 + L4ADD_BEFORE = CB5.198 + L4FIRST = CB5.199 + L4LAST = CB5.200 + L4NEXT = CB5.201 + L4POP = CB5.202 + L4PREV = CB5.203 + L4REMOVE = CB5.204 + + MEM4ALLOC = CB5.205 + MEM4CREATE = CB5.206 + MEM4FREE = CB5.207 + MEM4RELEASE = CB5.208 + MEM4RESET = CB5.209 + + RELATE4BOTTOM = CB5.210 + RELATE4CHANGED = CB5.211 + RELATE4CREATE_SLAVE = CB5.212 + RELATE4DO = CB5.213 + RELATE4DO_ONE = CB5.214 + RELATE4ERROR_ACTION = CB5.215 + RELATE4FREE = CB5.216 + RELATE4INIT = CB5.217 + RELATE4LOCK = CB5.218 + RELATE4MATCH_LEN = CB5.219 + RELATE4NEXT = CB5.220 + RELATE4QUERY_SET = CB5.221 + RELATE4SKIP = CB5.222 + RELATE4SKIP_ENABLE = CB5.223 + RELATE4SORT_SET = CB5.224 + RELATE4TOP = CB5.225 + RELATE4TYPE = CB5.226 + RELATE4UNLOCK = CB5.227 + + SORT4FREE = CB5.229 + SORT4GET = CB5.230 + SORT4GET_INIT = CB5.231 + SORT4INIT = CB5.232 + SORT4PUT = CB5.233 + + T4ADD = CB5.234 + T4ADD_CALC = CB5.235 + T4BOTTOM = CB5.236 + T4DOWN = CB5.237 + T4DUMP = CB5.238 + T4EOF = CB5.239 + T4FLUSH = CB5.240 + T4FREE_ALL = CB5.241 + T4GO = CB5.242 + T4KEY = CB5.243 + T4OPEN = CB5.244 + T4POSITION = CB5.245 + T4POSITION_SET = CB5.246 + T4RECNO = CB5.247 + T4REMOVE = CB5.248 + T4REMOVE_CALC = CB5.249 + T4SEEK = CB5.250 + T4SKIP = CB5.251 + T4TOP = CB5.252 + T4UP = CB5.253 + T4UP_TO_ROOT = CB5.254 + + U4ALLOC = CB5.255 + U4ALLOC_AGAIN = CB5.256 + U4ALLOC_ER = CB5.257 + U4ALLOC_FREE = CB5.258 + U4FREE = CB5.259 + U4NAME_CHAR = CB5.260 + U4NAME_EXT = CB5.261 + U4NAME_PIECE = CB5.262 + U4NCPY = CB5.263 + U4YYMMDD = CB5.264 + + EXPR4CALC_LOOKUP = CB5.265 + C4TRIM_N = CB5.266 + EXPR4FUNCTIONS = CB5.267 + C4DTOA45 = CB5.268 + EXPR4CALC_DELETE = CB5.269 + E4LOOKUP = CB5.270 + C4UPPER = CB5.271 + EXPR4CALC_NAME_CHANGE = CB5.272 + EXPR4CALC_MODIFY = CB5.273 + RELATE4FREE_RELATE = CB5.274 + EXPR4CALC_MASSAGE = CB5.275 + D4UPDATE_HEADER = CB5.276 + U4SWITCH = CB5.277 + DATE4FORMAT_MDX2 = CB5.278 + EXPR4DOUBLE2 = CB5.279 + D4POSITION2 = CB5.280 + F4DOUBLE2 = CB5.281 + T4POSITION2 = CB5.282 + F4MEMO_SET_LEN = CB5.283 + C4LTOA45 = CB5.284 + I4ADD_TAG = CB5.285 + EXPR4CALC_RESET = CB5.286 + T4IS_DESCENDING = CB5.287 + I4IS_PRODUCTION = CB5.288 + T4UNIQUE = CB5.289 + D4SEEK_N = CB5.290 + C4DLL_INST = CB5.291 + C4ATOD2 = CB5.292 + F4MEMO_CHECK = CB5.293 + D4UNLOCK_APPEND = CB5.294 + D4UNLOCK_DATA = CB5.295 + D4UNLOCK_FILE = CB5.296 + D4UNLOCK_RECORDS = CB5.297 + C4LOWER = CB5.298 + I4CHECK = CB5.299 + U4REMOVE = CB5.300 + + AREA4CREATE = CB5.301 + AREA4FREE = CB5.302 + AREA4NUMOBJECTS = CB5.303 + AREA4OBJFIRST = CB5.304 + AREA4OBJLAST = CB5.305 + AREA4OBJNEXT = CB5.306 + AREA4OBJPREV = CB5.307 + AREA4PAGEBREAK = CB5.308 + GROUP4CREATE = CB5.309 + GROUP4FOOTERFIRST = CB5.310 + GROUP4FOOTERNEXT = CB5.311 + GROUP4FOOTERPREV = CB5.312 + GROUP4FREE = CB5.313 + GROUP4HEADERFIRST = CB5.314 + GROUP4HEADERNEXT = CB5.315 + GROUP4HEADERPREV = CB5.316 + GROUP4NUMFOOTERS = CB5.317 + GROUP4NUMHEADERS = CB5.318 + GROUP4REPEATHEADER = CB5.319 + GROUP4RESETEXPRSET = CB5.320 + GROUP4RESETPAGE = CB5.321 + GROUP4RESETPAGENUM = CB5.322 + GROUP4SWAPFOOTER = CB5.323 + GROUP4SWAPHEADER = CB5.324 + OBJ4BITMAPSTATICCREATE = CB5.325 + OBJ4BITMAPSTATICFREE = CB5.326 + OBJ4BITMAPFILECREATE = CB5.327 + OBJ4BITMAPFILEFREE = CB5.328 + OBJ4BITMAPFIELDCREATE = CB5.329 + OBJ4BITMAPFIELDFREE = CB5.330 + OBJ4BRACKETS = CB5.331 + OBJ4CALCCREATE = CB5.332 + OBJ4CALCFREE = CB5.333 + OBJ4DATEFORMAT = CB5.334 + OBJ4DECIMALS = CB5.335 + OBJ4DELETE = CB5.336 + OBJ4DISPLAYONCE = CB5.337 + OBJ4DISPLAYZERO = CB5.338 + OBJ4EXPRCREATE = CB5.339 + OBJ4EXPRFREE = CB5.340 + OBJ4FIELDCREATE = CB5.341 + OBJ4FIELDFREE = CB5.342 + OBJ4FRAMECORNERS = CB5.343 + OBJ4FRAMECREATE = CB5.344 + OBJ4FRAMEFILL = CB5.345 + OBJ4FRAMEFREE = CB5.346 + OBJ4JUSTIFY = CB5.347 + OBJ4LEADINGZERO = CB5.348 + OBJ4LINECREATE = CB5.349 + OBJ4LINEFREE = CB5.350 + OBJ4LINEWIDTH = CB5.351 + OBJ4LOOKAHEAD = CB5.352 + OBJ4NUMERICTYPE = CB5.353 + OBJ4STYLE = CB5.354 + OBJ4TEXTCREATE = CB5.355 + OBJ4TEXTFREE = CB5.356 + OBJ4TOTALCREATE = CB5.357 + OBJ4TOTALFREE = CB5.358 + RELATE4RETRIEVE = CB5.359 + RELATE4SAVE = CB5.360 + REPORT4CAPTION = CB5.361 + REPORT4CURRENCY = CB5.362 + REPORT4DATEFORMAT = CB5.363 + REPORT4DECIMAL = CB5.364 + REPORT4DO = CB5.365 + REPORT4FREE = CB5.366 + REPORT4GENERATEPAGE = CB5.367 + REPORT4GROUPFIRST = CB5.368 + REPORT4GROUPLAST = CB5.369 + REPORT4GROUPLOOKUP = CB5.370 + REPORT4GROUPNEXT = CB5.371 + REPORT4GROUPPREV = CB5.372 + REPORT4GROUPHARDRESETS = CB5.373 + REPORT4INIT = CB5.374 + REPORT4MARGINS = CB5.375 + REPORT4NUMGROUPS = CB5.376 + REPORT4NUMSTYLES = CB5.377 + REPORT4OUTPUT = CB5.378 + REPORT4PAGEFREE = CB5.379 + REPORT4PAGEHEADERFOOTER = CB5.380 + REPORT4PAGEINIT = CB5.381 + REPORT4PAGEMARGINSGET = CB5.382 + REPORT4PAGEOBJFIRST = CB5.383 + REPORT4PAGEOBJNEXT = CB5.384 + REPORT4PAGESIZE = CB5.385 + REPORT4PAGESIZEGET = CB5.386 + REPORT4PARENT = CB5.387 + REPORT4PRINTERSELECT = CB5.388 + REPORT4PRINTERDC = CB5.389 + REPORT4QUERYSET = CB5.390 + REPORT4RETRIEVE = CB5.391 + REPORT4SAVE = CB5.392 + REPORT4SEPARATOR = CB5.393 + REPORT4SORTSET = CB5.394 + REPORT4STYLEFIRST = CB5.395 + REPORT4STYLELAST = CB5.396 + REPORT4STYLENEXT = CB5.397 + REPORT4STYLESELECT = CB5.398 + REPORT4STYLESELECTED = CB5.399 + REPORT4STYLESHEETLOAD = CB5.400 + REPORT4STYLESHEETSAVE = CB5.401 + REPORT4TITLEPAGE = CB5.402 + REPORT4TITLESUMMARY = CB5.403 + REPORT4TOSCREEN = CB5.404 + STYLE4COLOR = CB5.405 + STYLE4CREATE = CB5.406 + STYLE4DELETE = CB5.407 + STYLE4FREE = CB5.408 + STYLE4INDEX = CB5.409 + STYLE4LOOKUP = CB5.410 + TOTAL4CREATE = CB5.411 + TOTAL4FREE = CB5.412 + REPORT4DATADO = CB5.413 + TOTAL4ADDCONDITION = CB5.414 + REPORT4DATAFILESET = CB5.415 + REPORT4DATAGROUP = CB5.416 + OBJ4DATAFIELDSET = CB5.417 + WRITEDIB = CB5.418 + GETDIB = CB5.419 + PALETTESIZE = CB5.420 + FINDDIBBITS = CB5.421 + REPORT4INDEX_TYPE = CB5.422 + AREA4ADD_OBJECT = CB5.423 + OBJ4REMOVE = CB5.424 + GROUP4POSITIONSET = CB5.425 + REPORT4GET_PRINTERIC = CB5.426 + TOTAL4LOOKUP = CB5.427 + AREA4SORT_OBJ_TREE = CB5.428 + RELATE4LOOKUP_DATA = CB5.429 + REPORT4RETRIEVE2 = CB5.430 + RELATE4SAVE2 = CB5.431 + RELATE4RETRIEVE2 = CB5.432 + U4DELAY_SEC = CB5.433 + + T4BLOCK = CB5.451 + T4CHECK = CB5.452 + + CTRL4ADDCODE = CB5.500 + CTRL4CODELISTINIT = CB5.501 + CTRL4FREECTRLNODE = CB5.502 + CTRL4FREECODELIST = CB5.503 + CTRL4GETCTRLCODE = CB5.504 + CTRL4INITVBX = CB5.505 + CTRL4INITVBXUNDO = CB5.506 + + + X4BOTTOM = CB5.600 + X4INIT_WORK = CB5.601 + X4FILTER_TEST = CB5.602 + X4GO = CB5.603 + X4SEEK = CB5.604 + X4SEEK_DOUBLE = CB5.605 + X4SKIP = CB5.606 + X4TOP = CB5.607 + I4CHANGED = CB5.608 \ No newline at end of file