├── .dbconnection ├── .gitignore ├── DataDigger.i ├── DataDigger.p ├── DataDigger.pf ├── DataDigger.txt ├── DataDigger2.p ├── DataDiggerHelp.ini ├── DataDiggerLib.p ├── DataReader.p ├── DatePicker.w ├── Jenkinsfile ├── LICENSE ├── README.md ├── Sokodigger2.txt ├── build.i ├── build.xml ├── checkVersion.p ├── convertSettings.p ├── dCloneDatabase.w ├── dDumpDf.w ├── dEditGroup.w ├── dFilter.w ├── dNewGroup.w ├── dQueries.w ├── dQuestion.w ├── dSorting.w ├── frameLib.i ├── generate-Active-Record-Class.w ├── generate-Assign-Statement.w ├── generate-Bulk-Delete.w ├── generate-DumpLoad-Procedure.w ├── generate-TempTable-Include.w ├── generate-Your-Own-Code.w ├── getDataserver.p ├── getDummyScheme.p ├── getRemoteFile.p ├── getSchema.p ├── getVersionInfo.p ├── image ├── default_About.gif ├── default_Add.gif ├── default_Administration.gif ├── default_Ball.gif ├── default_Box-ok.gif ├── default_Box.gif ├── default_Clear.gif ├── default_Clipboard.gif ├── default_Clone.gif ├── default_Connections.gif ├── default_DataDigger.ico ├── default_DataDigger24x24.gif ├── default_DataDiggerLight.ico ├── default_DatePicker.gif ├── default_Delete.gif ├── default_Dictionary.gif ├── default_Down.gif ├── default_Dump.gif ├── default_Edit.gif ├── default_Editor.gif ├── default_Encode.gif ├── default_Excel.gif ├── default_Execute.gif ├── default_Filter.gif ├── default_FilterRed.gif ├── default_First.gif ├── default_Help.gif ├── default_Html.gif ├── default_Last.gif ├── default_LeftDown.gif ├── default_LeftUp.gif ├── default_List.gif ├── default_Load.gif ├── default_Next.gif ├── default_OpenFolder.gif ├── default_Player.gif ├── default_PopOut.gif ├── default_Prev.gif ├── default_Qtester.gif ├── default_Question.gif ├── default_Reset.gif ├── default_ResizeVer.gif ├── default_RightDown.gif ├── default_RightUp.gif ├── default_Save.gif ├── default_SavedQueries.gif ├── default_SavedQueries_small.gif ├── default_Settings.gif ├── default_Settings_txt.gif ├── default_SidebarCollapse.gif ├── default_SidebarExpand.gif ├── default_Sort.gif ├── default_SortGroups.gif ├── default_StarBlack.gif ├── default_StarWhite.gif ├── default_Stop.gif ├── default_Tab_Favourites_Active.gif ├── default_Tab_Favourites_Inactive.gif ├── default_Tab_Fields_Active.gif ├── default_Tab_Fields_Inactive.gif ├── default_Tab_Indexes_Active.gif ├── default_Tab_Indexes_Inactive.gif ├── default_Tab_Tables_Active.gif ├── default_Tab_Tables_Inactive.gif ├── default_Target.gif ├── default_Text.gif ├── default_Tools.gif ├── default_Up.gif ├── default_Upload_Ins.gif ├── default_View.gif └── default_Wall.gif ├── myDataDigger.txt ├── preCompile.p ├── query-data.w ├── query-tester.w ├── readme.txt ├── resizable_dict.i ├── showMessage.p ├── sokodigger.txt ├── sokodigger.w ├── sonar-project.properties ├── startDiggerLib.p ├── timerStart.i ├── timerStop.i ├── unitTest ├── test_correctFilterList.cls ├── test_createFolder.cls ├── test_getColorByRGB.cls ├── test_getMaxLength.cls ├── test_getOsErrorDesc.cls └── test_isValidCodepage.cls ├── version.i ├── wAbout.w ├── wAbout.wrx ├── wConnections.w ├── wDataDigger.w ├── wDataDigger.wrx ├── wDebugger.w ├── wDump.w ├── wEdit.w ├── wImportCheck.w ├── wImportLoad.w ├── wImportSel.w ├── wLister.w ├── wQueryEditor.w ├── wSettings.w ├── wSettingsTab1.w ├── wSettingsTab2.w ├── wSettingsTab3.w └── wViewAsEditor.w /.dbconnection: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .settings/ 2 | .proparse/ 3 | .scannerwork/ 4 | Backup/ 5 | BetaDigger/ 6 | Cache/ 7 | DB/ 8 | DelimiterFinder/ 9 | Docs/ 10 | Dump/ 11 | Experimenteel/ 12 | Help/ 13 | Kalender/ 14 | Presentatie/ 15 | Screenshots/ 16 | Start/ 17 | target/ 18 | *.bak 19 | *.bat 20 | *.lnk 21 | *.chm 22 | *.wrx 23 | *.r 24 | debugger.pref 25 | wDataDigger.wrx 26 | myDataDigger.p 27 | DataDigger-*.ini 28 | DataDigger.log 29 | DataDigger.ini 30 | image/Thumbs.db 31 | protrace* 32 | .project 33 | .propath 34 | empty_schema.df 35 | 36 | /results.xml 37 | /.vs 38 | -------------------------------------------------------------------------------- /DataDigger.p: -------------------------------------------------------------------------------- 1 | /*------------------------------------------------------------------------ 2 | 3 | File : DataDigger.p 4 | Desc : Launcher for DataDigger in Edit mode 5 | 6 | ----------------------------------------------------------------------*/ 7 | 8 | DEFINE VARIABLE cProgramDir AS CHARACTER NO-UNDO. 9 | DEFINE VARIABLE cDictDb AS CHARACTER NO-UNDO. 10 | 11 | /* Where are we running from? */ 12 | FILE-INFO:FILE-NAME = THIS-PROCEDURE:FILE-NAME. 13 | IF FILE-INFO:FULL-PATHNAME = ? THEN 14 | FILE-INFO:FILE-NAME = REPLACE(THIS-PROCEDURE:FILE-NAME, '.p', '.r'). 15 | 16 | cProgramDir = REPLACE(FILE-INFO:FULL-PATHNAME,"\","/"). 17 | cProgramDir = SUBSTRING(cProgramDir,1,R-INDEX(cProgramDir,'/')). 18 | 19 | /* Save dictdb alias */ 20 | IF NUM-DBS > 0 THEN cDictDb = LDBNAME('dictdb'). 21 | 22 | /* Start the actual DataDigger program */ 23 | RUN VALUE(cProgramDir + "DataDigger2.p") (INPUT FALSE). 24 | 25 | /* Restore dictdb to avoid ADM errors */ 26 | IF NUM-DBS > 0 THEN 27 | DO: 28 | IF cDictDb = ? THEN 29 | DELETE ALIAS dictdb. 30 | ELSE 31 | IF CONNECTED(cDictDb) THEN 32 | CREATE ALIAS dictdb FOR DATABASE VALUE(cDictDb). 33 | END. 34 | 35 | -------------------------------------------------------------------------------- /DataDigger.pf: -------------------------------------------------------------------------------- 1 | -s 1000 2 | -d dmy 3 | -E 4 | -rereadnolock 5 | -h 255 6 | -T c:\temp 7 | -Bt 4000 8 | -tmpbsize 8 9 | -p DataDigger.p 10 | 11 | #-cpstream UTF-8 12 | #-cpcase BASIC 13 | #-cpinternal UTF-8 14 | #-cplog UTF-8 15 | #-cpterm UTF-8 16 | #-cpcoll BASIC 17 | 18 | -------------------------------------------------------------------------------- /DataDiggerHelp.ini: -------------------------------------------------------------------------------- 1 | [DataDigger:Help] 2 | CannotCreateBackupFolder:canHide = FALSE 3 | CannotCreateBackupFolder:message = Cannot create folder &1. ~n~nPlease check your settings. 4 | CannotEditVst:message = You cannot edit or delete VST files 5 | ConfirmDelete:message = Delete the &1 record(s) selected? 6 | CouldNotDelete:message = Sorry, could not delete record. 7 | CreateDumpDir:message = Directory "&1" does not exist, do you want to create it? 8 | DataChanged:buttons = Yes,No,All,Cancel 9 | DataChanged:message = Field &1 has been changed by someone else~n~nExpected: &2~nActual : &3~n~nOverwrite values with yours? 10 | DataLoaded:message = Data loaded 11 | DataTooLarge:message = Too much data for clipboard. Data has been trimmed 12 | Disconnect:message = Are you sure you want to disconnect database "&1"? 13 | DisconnectGroup:buttons = Yes,No,Cancel 14 | DisconnectGroup:message = The following databases need to be disconnected first~nbecause their names are used in the param file:~n~n&1 15 | DumpAborted:message = Dumping table &1 aborted. 16 | DumpCompleted:message = Dump completed 17 | ExportToProgramdir:message = You cannot export or dump to the DataDigger program dir. 18 | FavouriteGroupEmpty:message = Your group is empty and will be removed 19 | FontsChanged:message = You seem to work with non-standard font settings, user interface might not be 100% 20 | FormatError:message = Error setting "&1" as format. Restoring original format "&2". 21 | JumpToFilter:message = Use CTRL-CURSOR-UP / DOWN to jump from filter fields to browse and back 22 | NoSelection:message = Warning: There are NO records to export. 23 | OverwriteDumpFile:message = File &1 already exists, do you want to overwrite it? 24 | ReadOnlyDigger:message = You are working with a READ-ONLY version of DataDigger. ~n~nSome features have been disabled. 25 | RecordGone:message = The record is gone. It might have been deleted. 26 | RereadNoLock:message = You have not set the -rereadnolock startup parameter. This setting may increase the usability of DataDigger.~n~nFrom the progress help file:~n~nUse Reread Nolock ( -rereadnolock) to tell Progress that when it attempts to find a record with NO-LOCK, to re-read the record from the database, even if the record is already in a buffer. You can use this parameter to resolve client-server currency conflicts. 27 | SchemaRestart:canHide = FALSE 28 | SchemaRestart:message = The schema for &1 was changed; DataDigger should be restarted. Restart now? 29 | StackSize:message = Your -s is set to &1. A higher value is recommended for DataDigger. 30 | TimerError:message = Cannot start the timer, automatic refreshes do not work. 31 | TooManyColumns:message = Only first &1 columns are shown. ~n~nYou can change this number in the "Behavior" tab of the settings. 32 | TooManyExtents:message = Only first &1 fields of an extent are shown. ~n~nYou can change this number in the "Behavior" tab of the settings. 33 | -------------------------------------------------------------------------------- /DataReader.p: -------------------------------------------------------------------------------- 1 | /*------------------------------------------------------------------------ 2 | 3 | Name: DataReader.p 4 | Desc: Launcher for DataDigger in ReadOnly mode 5 | 6 | ----------------------------------------------------------------------*/ 7 | DEFINE VARIABLE gcProgramDir AS CHARACTER NO-UNDO. 8 | 9 | /* Where are we running from? */ 10 | FILE-INFO:FILE-NAME = THIS-PROCEDURE:FILE-NAME. 11 | IF FILE-INFO:FULL-PATHNAME = ? THEN 12 | FILE-INFO:FILE-NAME = REPLACE(THIS-PROCEDURE:FILE-NAME, '.p', '.r'). 13 | 14 | gcProgramDir = REPLACE(FILE-INFO:FULL-PATHNAME,"\","/"). 15 | gcProgramDir = SUBSTRING(gcProgramDir,1,R-INDEX(gcProgramDir,'/')). 16 | 17 | /* Start the actual DataDigger program */ 18 | RUN VALUE(gcProgramDir + "DataDigger2.p") (INPUT TRUE). 19 | -------------------------------------------------------------------------------- /Jenkinsfile: -------------------------------------------------------------------------------- 1 | pipeline { 2 | agent { label 'windows' } 3 | options { 4 | buildDiscarder(logRotator(numToKeepStr:'5')) 5 | timeout(time: 10, unit: 'MINUTES') 6 | skipDefaultCheckout() 7 | } 8 | stages { 9 | stage ('Build') { 10 | steps { 11 | checkout([ $class: 'GitSCM', branches: scm.branches, extensions: scm.extensions + [[$class: 'CleanCheckout']], userRemoteConfigs: scm.userRemoteConfigs ]) 12 | withEnv(["DLC=${tool name: 'OpenEdge-12.2', type: 'openedge'}"]) { 13 | bat "%DLC%\\ant\\bin\\ant -DDLC=%DLC% -lib %DLC%\\pct\\pct.jar -lib C:\\Tools\\xmltask.jar init build test dist" 14 | } 15 | junit 'results.xml' 16 | archiveArtifacts artifacts: 'target/DataDigger.zip' 17 | } 18 | } 19 | 20 | stage ('Code analysis') { 21 | steps { 22 | script { 23 | withEnv(["PATH+SCAN=${tool name: 'SQScanner4', type: 'hudson.plugins.sonar.SonarRunnerInstallation'}/bin", "DLC=${tool name: 'OpenEdge-12.2', type: 'openedge'}"]) { 24 | withSonarQubeEnv('RSSW') { 25 | if (("master" == env.BRANCH_NAME) || ("develop" == env.BRANCH_NAME)) { 26 | bat "sonar-scanner -Dsonar.oe.dlc=%DLC% -Dsonar.branch.name=%BRANCH_NAME%" 27 | } else { 28 | bat "sonar-scanner -Dsonar.oe.dlc=%DLC% -Dsonar.branch.name=%BRANCH_NAME% -Dsonar.branch.target=develop" 29 | } 30 | } 31 | } 32 | } 33 | } 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Patrick Tingen 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DataDigger 2 | 3 | A dynamic, open source dataviewer for your Progress / OpenEdge databases 4 | 5 | ## Getting started 6 | 7 | - Download DataDigger.zip 8 | - Extract it to its own folder 9 | - Double-click DataDigger.pf 10 | 11 | If you cannot compile due to version restrictions, the .r files can be downloaded separately.
12 | Unzip the file with objects for your Progress version in the same folder as the sources. 13 | 14 | More info on the [wiki](https://github.com/patrickTingen/DataDigger/wiki/HowTo-InstallDataDigger) 15 | 16 | - For general info consult the [DataDigger blog]() 17 | - Download [stable]() or [develop]() version 18 | - All versions can be found at the [Releases page]() 19 | - Technical info is in the [wiki]() 20 | - Send your suggestions and bugreports via the [issue tracker]() or via [mail](mailto:patrick@tingen.net) 21 | - DataDigger is published under the [GPL v3.0]() license 22 | 23 | Special thanks to the members of the DataDigger testing team! 24 | 25 | ## Code quality 26 | Code quality of the develop branch is measured by [Sonar Cube](http://sonar.riverside-software.fr/dashboard?branch=develop&id=patrickTingen%3ADataDigger), hosted by Gilles Querret.
Current status is ![](http://sonar.riverside-software.fr/api/project_badges/measure?branch=develop&project=patrickTingen%3ADataDigger&metric=alert_status) ![](http://sonar.riverside-software.fr/api/project_badges/measure?branch=develop&project=patrickTingen%3ADataDigger&metric=bugs) 27 | 28 | ## History 29 | 30 | In 2008 I needed a tool like this and ended up with DataHack made by Richard Tardivon. Soon I started fiddling with the program and after a few months I decided to fork it under the name of DataDigger. Build 13 of 13 jan 2010 was the first that appeared on the OpenEdge Hive. Starting with v19 the home of the DataDigger is at GitHub. 31 | 32 | ## Version history: 33 | 34 | Full changelog can be found [here](https://raw.githubusercontent.com/patrickTingen/DataDigger/master/DataDigger.txt) 35 | 36 | - DataDigger 26 - 19 may 2022 (Iron Man) 37 | - DataDigger 25 - 24 dec 2020 (Rudolf) 38 | - DataDigger 24 - 3 oct 2018 (Pure Gold) 39 | - DataDigger 23 - 15 apr 2017 (Easter Egg Edition) 40 | - DataDigger 22 - 20 feb 2017 (Titanium) 41 | - DataDigger 21 - 8 nov 2016 (US Election Day Edition) 42 | - DataDigger 20 - 30 sep 2016 (Coffee Version) 43 | - DataDigger 19 - 30 jun 2014 (Straight A's) 44 | - DataDigger 18 - 31 may 2013 (Never grow up) 45 | - DataDigger 17 - 6 sep 2012 (Haiku) 46 | - DataDigger 16 - 18 mar 2011 (Sweet-16 edition) 47 | - DataDigger 15 - 18 mar 2010 (Bregje-15 Edition) 48 | - DataDigger 14 - 03 mar 2010 (Election Day Edition) 49 | - DataDigger 13 - 13 jan 2010 (Bad Luck Edition) 50 | - DataDigger 12 - 6 jan 2010 51 | - DataDigger 11 - 12 dec 2009 (Double Dozen Edition) 52 | - DataDigger 10 - 21 oct 2009 (Progression revisited Edition) 53 | - DataDigger 9 - 16 oct 2009 (Revolution nr 9 edition) 54 | - DataDigger 8 - 22 sep 2009 (Brand New Day edition) 55 | - DataDigger 7 - 18 sep 2009 (Mullerman edition) 56 | - DataDigger 6 - 9 sep 2009 (Triple-9 version) 57 | - DataDigger 5 - 16 jul 2009 (Bugleman edition) 58 | - DataDigger 4 - 14 jul 2009 (France Liberty Edition) 59 | - DataDigger 3 - 9 jul 2009 60 | - DataDigger 2 - 6 feb 2009 (Mother-in-law edition) 61 | - DataDigger 1 - jan 2009 62 | - DataDigger 0 - dec 2008 (DataHack) 63 | -------------------------------------------------------------------------------- /build.i: -------------------------------------------------------------------------------- 1 | 20220518 -------------------------------------------------------------------------------- /build.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /checkVersion.p: -------------------------------------------------------------------------------- 1 | /*------------------------------------------------------------------------ 2 | 3 | Name : checkVersion.p 4 | Desc : Check if there is a new version 5 | 6 | Notes: 7 | The version nr is increased when it is ready for production, the 8 | build nr is increased when something is ready for beta testing. 9 | 10 | Parameters: 11 | piChannel : 0=no check, 1=check stable, 2=check beta 12 | plManualCheck : TRUE when user presses 'Check Now' button 13 | ----------------------------------------------------------------------*/ 14 | 15 | DEFINE INPUT PARAMETER piChannel AS INTEGER NO-UNDO. 16 | DEFINE INPUT PARAMETER plManualCheck AS LOGICAL NO-UNDO. 17 | 18 | {DataDigger.i} 19 | 20 | DEFINE VARIABLE cLocalBuild AS CHARACTER NO-UNDO. 21 | DEFINE VARIABLE cRemoteBuild AS CHARACTER NO-UNDO. 22 | DEFINE VARIABLE cNewVersionUrl AS CHARACTER NO-UNDO. 23 | DEFINE VARIABLE lVisit AS LOGICAL NO-UNDO INITIAL TRUE. 24 | DEFINE VARIABLE cStableBuild AS CHARACTER NO-UNDO. 25 | 26 | &GLOBAL-DEFINE STABLE-RELEASES-URL https://github.com/patrickTingen/DataDigger/releases/latest 27 | &GLOBAL-DEFINE BETA-RELEASES-URL https://github.com/patrickTingen/DataDigger/releases/ 28 | 29 | /* Might be spaces in the include file */ 30 | cLocalBuild = TRIM('{build.i}'). 31 | 32 | /* If channel is set to manual, but this is not a manual check then return. */ 33 | IF piChannel = {&CHECK-MANUAL} AND NOT plManualCheck THEN RETURN. 34 | 35 | /* Get current stable build */ 36 | RUN getVersionInfo.p(INPUT 'master', OUTPUT cStableBuild). 37 | 38 | /* Get proper version info, depending on channel */ 39 | IF piChannel = {&CHECK-MANUAL} OR piChannel = {&CHECK-STABLE} THEN 40 | DO: 41 | /* If local build is newer than stable, set update channel to BETA */ 42 | IF cLocalBuild > cStableBuild THEN 43 | DO: 44 | setRegistry("DataDigger:Update","UpdateChannel", "{&CHECK-BETA}"). 45 | piChannel = {&CHECK-BETA}. 46 | END. 47 | ELSE 48 | cRemoteBuild = cStableBuild. 49 | END. 50 | 51 | IF piChannel = {&CHECK-BETA} THEN 52 | RUN getVersionInfo.p(INPUT 'develop', OUTPUT cRemoteBuild). 53 | 54 | /* If version cannot be determined then don't bother. Unless this is a manual check */ 55 | IF cRemoteBuild = '' OR cRemoteBuild = ? THEN 56 | DO: 57 | IF plManualCheck THEN MESSAGE 'Cannot reach the DataDigger website' VIEW-AS ALERT-BOX INFORMATION BUTTONS OK. 58 | RETURN. 59 | END. 60 | 61 | /* Save remote version / build */ 62 | setRegistry('DataDigger:Update', 'RemoteBuildNr', cRemoteBuild). 63 | 64 | /* Check build to detect new versions */ 65 | IF cRemoteBuild > cLocalBuild THEN 66 | DO: 67 | IF piChannel = {&CHECK-MANUAL} OR piChannel = {&CHECK-STABLE} THEN 68 | cNewVersionUrl = '{&STABLE-RELEASES-URL}'. 69 | ELSE 70 | cNewVersionUrl = '{&BETA-RELEASES-URL}'. 71 | 72 | IF plManualCheck THEN 73 | DO: 74 | MESSAGE 'A new version is available on the DataDigger website~n~nDo you want to check it?' VIEW-AS ALERT-BOX INFORMATION BUTTONS YES-NO-CANCEL UPDATE lVisit. 75 | IF lVisit = TRUE THEN 76 | DO: 77 | CASE cNewVersionUrl: 78 | WHEN '{&STABLE-RELEASES-URL}' THEN OS-COMMAND NO-WAIT "START {&STABLE-RELEASES-URL}". 79 | WHEN '{&BETA-RELEASES-URL}' THEN OS-COMMAND NO-WAIT "START {&BETA-RELEASES-URL}". 80 | END CASE. 81 | END. 82 | END. 83 | ELSE 84 | setRegistry('DataDigger:Update', 'NewVersionURL', cNewVersionUrl). 85 | END. 86 | 87 | ELSE 88 | /* Up to date */ 89 | DO: 90 | IF plManualCheck THEN 91 | MESSAGE 'No new version available, you are up to date.' VIEW-AS ALERT-BOX INFORMATION BUTTONS OK. 92 | ELSE 93 | setRegistry('DataDigger:Update', 'NewVersionURL', ''). 94 | END. 95 | 96 | -------------------------------------------------------------------------------- /convertSettings.p: -------------------------------------------------------------------------------- 1 | &ANALYZE-SUSPEND _VERSION-NUMBER AB_v10r12 2 | &ANALYZE-RESUME 3 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _DEFINITIONS Procedure 4 | /* convertSettings.p 5 | * 6 | * One-time conversions for new versions of DataDigger 7 | */ 8 | 9 | DEFINE INPUT PARAMETER piOldVersion AS INTEGER NO-UNDO. 10 | 11 | {DataDigger.i} 12 | 13 | /* _UIB-CODE-BLOCK-END */ 14 | &ANALYZE-RESUME 15 | 16 | 17 | &ANALYZE-SUSPEND _UIB-PREPROCESSOR-BLOCK 18 | 19 | /* ******************** Preprocessor Definitions ******************** */ 20 | 21 | &Scoped-define PROCEDURE-TYPE Procedure 22 | &Scoped-define DB-AWARE no 23 | 24 | 25 | 26 | /* _UIB-PREPROCESSOR-BLOCK-END */ 27 | &ANALYZE-RESUME 28 | 29 | 30 | 31 | /* *********************** Procedure Settings ************************ */ 32 | 33 | &ANALYZE-SUSPEND _PROCEDURE-SETTINGS 34 | /* Settings for THIS-PROCEDURE 35 | Type: Procedure 36 | Allow: 37 | Frames: 0 38 | Add Fields to: Neither 39 | Other Settings: CODE-ONLY COMPILE 40 | */ 41 | &ANALYZE-RESUME _END-PROCEDURE-SETTINGS 42 | 43 | /* ************************* Create Window ************************** */ 44 | 45 | &ANALYZE-SUSPEND _CREATE-WINDOW 46 | /* DESIGN Window definition (used by the UIB) 47 | CREATE WINDOW Procedure ASSIGN 48 | HEIGHT = 10.48 49 | WIDTH = 41.6. 50 | /* END WINDOW DEFINITION */ 51 | */ 52 | &ANALYZE-RESUME 53 | 54 | 55 | 56 | 57 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _MAIN-BLOCK Procedure 58 | 59 | 60 | /* *************************** Main Block *************************** */ 61 | 62 | SESSION:SET-WAIT-STATE("general"). 63 | 64 | RUN VALUE(SUBSTITUTE('ConvertFrom-&1', piOldVersion)) NO-ERROR. 65 | RUN flushRegistry. 66 | 67 | SESSION:SET-WAIT-STATE(""). 68 | 69 | /* _UIB-CODE-BLOCK-END */ 70 | &ANALYZE-RESUME 71 | 72 | 73 | /* ********************** Internal Procedures *********************** */ 74 | 75 | &IF DEFINED(EXCLUDE-convertFrom-19) = 0 &THEN 76 | 77 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE convertFrom-19 Procedure 78 | PROCEDURE convertFrom-19 : 79 | /* v19 -> 20 80 | */ 81 | DEFINE BUFFER bfConfig FOR ttConfig. 82 | 83 | /* Obsolete files */ 84 | OS-DELETE VALUE(SEARCH("getNewVersion.p")). 85 | OS-DELETE VALUE(SEARCH("getNewVersion.r")). 86 | OS-DELETE VALUE(SEARCH("frLoadMapping.w")). 87 | OS-DELETE VALUE(SEARCH("frLoadMapping.r")). 88 | OS-DELETE VALUE(SEARCH("DataDigger.chm")). 89 | OS-DELETE VALUE(SEARCH("image/default_ReleaseNotes.gif")). 90 | OS-DELETE VALUE(SEARCH("image/default_FilterCombo.gif")). 91 | OS-DELETE VALUE(SEARCH("image/default_FilterComboRed.gif")). 92 | OS-DELETE VALUE(SEARCH("image/default_Star.gif")). 93 | OS-DELETE VALUE(SEARCH("image/default_Tables.gif")). 94 | OS-DELETE VALUE(SEARCH("image/default_PrevQuery.gif")). 95 | OS-DELETE VALUE(SEARCH("image/default_NextQuery.gif")). 96 | OS-DELETE VALUE(SEARCH("image/default_ViewAsList.gif")). 97 | OS-DELETE VALUE(SEARCH("image/default_Pinned.gif")). 98 | OS-DELETE VALUE(SEARCH("image/default_Unpinned.gif")). 99 | OS-DELETE VALUE(SEARCH("image/default_Undock.gif")). 100 | OS-DELETE VALUE(SEARCH("image/default_Dock.gif")). 101 | OS-DELETE VALUE(SEARCH("image/default_Tab_Favorites_Active.gif")). 102 | OS-DELETE VALUE(SEARCH("image/default_Tab_Favorites_Inactive.gif")). 103 | 104 | /* Erase widths of table browse */ 105 | setRegistry('DataDigger','ColumnWidth:cTableName',?). 106 | setRegistry('DataDigger','ColumnWidth:cDatabase',?). 107 | setRegistry('DataDigger','ColumnWidth:iNumQueries',?). 108 | 109 | /* Setting for last active page not used anymore */ 110 | setRegistry("DataDigger", "ActivePage",?). 111 | 112 | /* Remove last used table from settings */ 113 | FOR EACH bfConfig WHERE bfConfig.cSection BEGINS 'DB:' BREAK BY bfConfig.cSection: 114 | IF FIRST-OF(bfConfig.cSection) THEN setRegistry(bfConfig.cSection,'table',?). 115 | END. 116 | 117 | /* Updates (are in the general .ini file */ 118 | USE 'DataDigger.ini' NO-ERROR. 119 | IF NOT ERROR-STATUS:ERROR THEN 120 | DO: 121 | PUT-KEY-VALUE SECTION "DataDigger:Update" KEY "UpdateCheck" VALUE ? NO-ERROR. 122 | PUT-KEY-VALUE SECTION "DataDigger:Update" KEY "UpdateUrl" VALUE ? NO-ERROR. 123 | PUT-KEY-VALUE SECTION "DataDigger:Update" KEY "UpdateChannel" VALUE ? NO-ERROR. 124 | PUT-KEY-VALUE SECTION "DataDigger:Update" KEY "UpdateLastCheck" VALUE ? NO-ERROR. 125 | PUT-KEY-VALUE SECTION "DataDigger:Update" KEY "" VALUE ? NO-ERROR. 126 | END. 127 | USE "". 128 | 129 | END PROCEDURE. /* 19 */ 130 | 131 | /* _UIB-CODE-BLOCK-END */ 132 | &ANALYZE-RESUME 133 | 134 | &ENDIF 135 | 136 | &IF DEFINED(EXCLUDE-convertFrom-20) = 0 &THEN 137 | 138 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE convertFrom-20 Procedure 139 | PROCEDURE convertFrom-20 : 140 | /* v20 -> 21 141 | */ 142 | OS-DELETE VALUE(SEARCH("wEdit.wrx")). 143 | 144 | END PROCEDURE. /* 20 */ 145 | 146 | /* _UIB-CODE-BLOCK-END */ 147 | &ANALYZE-RESUME 148 | 149 | &ENDIF 150 | 151 | &IF DEFINED(EXCLUDE-convertFrom-21) = 0 &THEN 152 | 153 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE convertFrom-21 Procedure 154 | PROCEDURE convertFrom-21 : 155 | /* v21 -> 22 156 | */ 157 | 158 | /* No conversions needed */ 159 | 160 | END PROCEDURE. /* 21 */ 161 | 162 | /* _UIB-CODE-BLOCK-END */ 163 | &ANALYZE-RESUME 164 | 165 | &ENDIF 166 | 167 | &IF DEFINED(EXCLUDE-convertFrom-22) = 0 &THEN 168 | 169 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE convertFrom-22 Procedure 170 | PROCEDURE convertFrom-22 : 171 | /* v22 -> 23 172 | */ 173 | 174 | OS-DELETE VALUE(SEARCH("dAbout.w")). 175 | OS-DELETE VALUE(SEARCH("dAbout.r")). 176 | OS-DELETE VALUE(SEARCH("image/default_Tab_About_Active.gif")). 177 | OS-DELETE VALUE(SEARCH("image/default_Tab_About_Inactive.gif")). 178 | OS-DELETE VALUE(SEARCH("image/default_Tab_Changes_Active.gif")). 179 | OS-DELETE VALUE(SEARCH("image/default_Tab_Changes_Inactive.gif")). 180 | 181 | END PROCEDURE. /* 22 */ 182 | 183 | /* _UIB-CODE-BLOCK-END */ 184 | &ANALYZE-RESUME 185 | 186 | &ENDIF 187 | 188 | &IF DEFINED(EXCLUDE-convertFrom-23) = 0 &THEN 189 | 190 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE convertFrom-23 Procedure 191 | PROCEDURE convertFrom-23 : 192 | /* v23 -> 24 193 | */ 194 | DEFINE VARIABLE cValue AS CHARACTER NO-UNDO. 195 | DEFINE BUFFER bfConfig FOR ttConfig. 196 | 197 | /* Settings removed */ 198 | setRegistry("DataDigger", "AddDataColumnForRecid", ?). 199 | setRegistry("DataDigger", "AddDataColumnForRowid", ?). 200 | setRegistry("DataDigger:Cache","Settings",?). 201 | setRegistry("DataDigger:Colors", "QueryCounter:FG", ?). 202 | setRegistry("DataDigger:Colors", "QueryInfo:FG", ?). 203 | 204 | /* DumpDf settings now in their own section */ 205 | setRegistry("DataDigger", "DumpDF:dir" , ?). 206 | setRegistry("DataDigger", "DumpDF:open", ?). 207 | 208 | /* Answer to confirm delete should not be saved when NO or CANCEL */ 209 | setRegistry("DataDigger:Help", "ConfirmDelete:hidden", ?). 210 | 211 | /* Table browse is now slightly wider, so erase old column widths */ 212 | setRegistry("DataDigger", "ColumnWidth:cTableName" , ?). 213 | setRegistry("DataDigger", "ColumnWidth:cDatabase" , ?). 214 | setRegistry("DataDigger", "ColumnWidth:iNumQueries", ?). 215 | 216 | /* dHint.w is not used */ 217 | OS-DELETE VALUE(SEARCH("dHint.w")). 218 | OS-DELETE VALUE(SEARCH("dHint.r")). 219 | 220 | /* A typo in previous versions prevented these from deletion */ 221 | /* DD19 */ 222 | OS-DELETE VALUE(SEARCH("getNewVersion.p")). 223 | OS-DELETE VALUE(SEARCH("getNewVersion.r")). 224 | OS-DELETE VALUE(SEARCH("frLoadMapping.w")). 225 | OS-DELETE VALUE(SEARCH("frLoadMapping.r")). 226 | OS-DELETE VALUE(SEARCH("DataDigger.chm")). 227 | OS-DELETE VALUE(SEARCH("image/default_ReleaseNotes.gif")). 228 | OS-DELETE VALUE(SEARCH("image/default_FilterCombo.gif")). 229 | OS-DELETE VALUE(SEARCH("image/default_FilterComboRed.gif")). 230 | OS-DELETE VALUE(SEARCH("image/default_Star.gif")). 231 | OS-DELETE VALUE(SEARCH("image/default_Tables.gif")). 232 | OS-DELETE VALUE(SEARCH("image/default_PrevQuery.gif")). 233 | OS-DELETE VALUE(SEARCH("image/default_NextQuery.gif")). 234 | OS-DELETE VALUE(SEARCH("image/default_ViewAsList.gif")). 235 | OS-DELETE VALUE(SEARCH("image/default_Pinned.gif")). 236 | OS-DELETE VALUE(SEARCH("image/default_Unpinned.gif")). 237 | OS-DELETE VALUE(SEARCH("image/default_Undock.gif")). 238 | OS-DELETE VALUE(SEARCH("image/default_Dock.gif")). 239 | OS-DELETE VALUE(SEARCH("image/default_Tab_Favorites_Active.gif")). 240 | OS-DELETE VALUE(SEARCH("image/default_Tab_Favorites_Inactive.gif")). 241 | 242 | /* DD20 */ 243 | OS-DELETE VALUE(SEARCH("wEdit.wrx")). 244 | 245 | /* DD22 */ 246 | OS-DELETE VALUE(SEARCH("dAbout.w")). 247 | OS-DELETE VALUE(SEARCH("dAbout.r")). 248 | OS-DELETE VALUE(SEARCH("image/default_Tab_About_Active.gif")). 249 | OS-DELETE VALUE(SEARCH("image/default_Tab_About_Inactive.gif")). 250 | OS-DELETE VALUE(SEARCH("image/default_Tab_Changes_Active.gif")). 251 | OS-DELETE VALUE(SEARCH("image/default_Tab_Changes_Inactive.gif")). 252 | 253 | /* Obsolete stuff */ 254 | OS-DELETE VALUE(SEARCH("image/default_ViewAsEditor.gif.jpg")). /* actually still from DD19 */ 255 | OS-DELETE VALUE(SEARCH("DataDiggerAbout.txt")). 256 | OS-DELETE VALUE(SEARCH("wAbout.wrx")). 257 | OS-DELETE VALUE(SEARCH("dChooseFont.w")). /* replaced with adecomm/_chsfont.p */ 258 | OS-DELETE VALUE(SEARCH("dChooseColor.w")). /* replaced with adecomm/_chscolr.p */ 259 | OS-DELETE VALUE(SEARCH("image/default_AboutTitle.gif")). 260 | OS-DELETE VALUE(SEARCH("image/default_AboutTitle2.gif")). 261 | OS-DELETE VALUE(SEARCH("image/default_AboutTitle3.gif")). 262 | OS-DELETE VALUE(SEARCH("image/default_Paddle.gif")). 263 | OS-DELETE VALUE(SEARCH("image/default_Download.gif")). 264 | OS-DELETE VALUE(SEARCH("image/default_Download_ins.gif")). 265 | OS-DELETE VALUE(SEARCH("image/default_Upload.gif")). 266 | OS-DELETE VALUE(SEARCH("image/default_ResizeHor.gif")). 267 | OS-DELETE VALUE(SEARCH("image/default_Ok.gif")). 268 | OS-DELETE VALUE(SEARCH("image/default_Back.gif")). 269 | OS-DELETE VALUE(SEARCH("image/default_Compare.gif")). 270 | OS-DELETE VALUE(SEARCH("image/default_DataDigger16x16.gif")). 271 | OS-DELETE VALUE(SEARCH("image/default_Forward.gif")). 272 | 273 | /* Setting '' renamed to '' */ 274 | cValue = getRegistry("DataDigger:Backup", "BackupDir"). 275 | setRegistry("DataDigger:Backup", "BackupDir", REPLACE(cValue,'', '')). 276 | 277 | cValue = getRegistry("DataDigger:Backup", "BackupFileTemplate"). 278 | setRegistry("DataDigger:Backup", "BackupFileTemplate", REPLACE(cValue,'', '')). 279 | 280 | cValue = getRegistry("DumpAndLoad", "DumpDir"). 281 | setRegistry("DumpAndLoad", "DumpDir", REPLACE(cValue,'', '')). 282 | 283 | cValue = getRegistry("DumpAndLoad", "DumpFileTemplate"). 284 | setRegistry("DumpAndLoad", "DumpFileTemplate", REPLACE(cValue,'', '')). 285 | 286 | /* Remove usage info, except for numUsed */ 287 | RUN getRegistryTable(OUTPUT TABLE bfConfig). 288 | FOR EACH bfConfig WHERE bfConfig.cSection = "DataDigger:Hints": 289 | IF NOT bfConfig.cSetting MATCHES '*' THEN 290 | setRegistry(bfConfig.cSection,bfConfig.cSetting,?). 291 | END. 292 | 293 | /* Move old favourites to group 'myFavourites' */ 294 | FOR EACH bfConfig WHERE bfConfig.cSection BEGINS 'DB:' 295 | AND bfConfig.cSetting MATCHES '*:favourite': 296 | RUN setFavourite(ENTRY(2,bfConfig.cSection,':'), ENTRY(1,bfConfig.cSetting,':'), 'myFavourites', TRUE). 297 | setRegistry(bfConfig.cSection,bfConfig.cSetting,?). 298 | END. 299 | EMPTY TEMP-TABLE bfConfig. 300 | 301 | /* Old setting got re-created due to bug in DD23 */ 302 | setRegistry("DumpAndLoad", "DumpFileDir", ?). 303 | 304 | END PROCEDURE. /* 23 */ 305 | 306 | /* _UIB-CODE-BLOCK-END */ 307 | &ANALYZE-RESUME 308 | 309 | &ENDIF 310 | 311 | &IF DEFINED(EXCLUDE-convertFrom-24) = 0 &THEN 312 | 313 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE convertFrom-24 Procedure 314 | PROCEDURE convertFrom-24 : 315 | /* v24 -> 25 316 | */ 317 | DEFINE BUFFER bfConfig FOR ttConfig. 318 | DEFINE BUFFER btFavGroup FOR ttFavGroup. 319 | 320 | DEFINE VARIABLE i AS INTEGER NO-UNDO. 321 | DEFINE VARIABLE cTableName AS CHARACTER NO-UNDO. 322 | DEFINE VARIABLE cGroupName AS CHARACTER NO-UNDO. 323 | 324 | /* Get all settings */ 325 | RUN getRegistryTable(OUTPUT TABLE bfConfig). 326 | 327 | /* Convert usage info */ 328 | FOR EACH bfConfig WHERE bfConfig.cSection = "DataDigger:Usage": 329 | IF NOT bfConfig.cSetting MATCHES '*' THEN 330 | DO: 331 | setRegistry("DataDigger:Hints", bfConfig.cSetting, "yes"). 332 | setRegistry(bfConfig.cSection, bfConfig.cSetting,?). 333 | END. 334 | END. 335 | 336 | /* Convert favourites */ 337 | EMPTY TEMP-TABLE ttFavGroup. 338 | FOR EACH bfConfig WHERE bfConfig.cSetting MATCHES '*:Favourites*': 339 | 340 | cTableName = ENTRY(1,bfConfig.cSetting,':'). 341 | 342 | /* Customer:Favourites=myFavourites,Cust-stuff */ 343 | DO i = 1 TO NUM-ENTRIES(bfConfig.cValue): 344 | 345 | cGroupName = ENTRY(i,bfConfig.cValue). 346 | 347 | FIND btFavGroup WHERE btFavGroup.cGroup = cGroupName NO-ERROR. 348 | IF NOT AVAILABLE btFavGroup THEN CREATE btFavGroup. 349 | ASSIGN btFavGroup.cGroup = cGroupName. 350 | 351 | IF LOOKUP(cTableName, btFavGroup.cTables) = 0 THEN 352 | ASSIGN btFavGroup.cTables = TRIM(SUBSTITUTE('&1,&2', btFavGroup.cTables, cTableName),','). 353 | END. 354 | 355 | setRegistry(bfConfig.cSection, bfConfig.cSetting, ?). /* remove old setting */ 356 | END. 357 | 358 | /* [DataDigger:Favourites] 359 | * myFavourites=Customer,Order-Line,Order,Salesrep 360 | * Cust-stuff=Customer,State 361 | */ 362 | FOR EACH btFavGroup: 363 | setRegistry('DataDigger:Favourites', btFavGroup.cGroup, btFavGroup.cTables). 364 | END. 365 | 366 | /* Obsolete files */ 367 | OS-DELETE VALUE(SEARCH("dEditGroup.wrx")). 368 | 369 | END PROCEDURE. /* 24 */ 370 | 371 | /* _UIB-CODE-BLOCK-END */ 372 | &ANALYZE-RESUME 373 | 374 | &ENDIF 375 | 376 | &IF DEFINED(EXCLUDE-convertFrom-25) = 0 &THEN 377 | 378 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE convertFrom-25 Procedure 379 | PROCEDURE convertFrom-25 : 380 | /* v25 -> 26 381 | */ 382 | DEFINE BUFFER bfConfig FOR ttConfig. 383 | 384 | /* Query editor is now default not expanded on startup */ 385 | setRegistry("DataDigger", "QueryEditorState", ?). 386 | 387 | /* Change of query separator */ 388 | RUN getRegistryTable(OUTPUT TABLE bfConfig). 389 | 390 | FOR EACH bfConfig 391 | WHERE bfConfig.cSection BEGINS "DB:" 392 | AND bfConfig.cSetting MATCHES "*:query:*": 393 | 394 | setRegistry( bfConfig.cSection 395 | , bfConfig.cSetting 396 | , REPLACE( bfConfig.cValue, CHR(1, SESSION:CPINTERNAL, "UTF-8") 397 | , CHR(2, SESSION:CPINTERNAL, "UTF-8") ) ). 398 | END. 399 | 400 | END PROCEDURE. /* 25 */ 401 | 402 | /* _UIB-CODE-BLOCK-END */ 403 | &ANALYZE-RESUME 404 | 405 | &ENDIF 406 | 407 | -------------------------------------------------------------------------------- /dCloneDatabase.w: -------------------------------------------------------------------------------- 1 | &ANALYZE-SUSPEND _VERSION-NUMBER AB_v10r12 GUI 2 | &ANALYZE-RESUME 3 | &Scoped-define WINDOW-NAME CURRENT-WINDOW 4 | &Scoped-define FRAME-NAME Dialog-Frame 5 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _DEFINITIONS Dialog-Frame 6 | /*------------------------------------------------------------------------ 7 | 8 | Name: dCloneDatabase.w 9 | Desc: Create an empty copy of a database 10 | 11 | ----------------------------------------------------------------------*/ 12 | /* This .W file was created with the Progress AppBuilder. */ 13 | /*----------------------------------------------------------------------*/ 14 | 15 | { DataDigger.i } 16 | 17 | DEFINE INPUT-OUTPUT PARAMETER pcDatabase AS CHARACTER NO-UNDO. 18 | DEFINE INPUT PARAMETER pcOptions AS CHARACTER NO-UNDO. 19 | DEFINE OUTPUT PARAMETER pcNewDatabase AS CHARACTER NO-UNDO. 20 | 21 | /* Local Variable Definitions --- */ 22 | 23 | /* _UIB-CODE-BLOCK-END */ 24 | &ANALYZE-RESUME 25 | 26 | 27 | &ANALYZE-SUSPEND _UIB-PREPROCESSOR-BLOCK 28 | 29 | /* ******************** Preprocessor Definitions ******************** */ 30 | 31 | &Scoped-define PROCEDURE-TYPE Dialog-Box 32 | &Scoped-define DB-AWARE no 33 | 34 | /* Name of designated FRAME-NAME and/or first browse and/or first query */ 35 | &Scoped-define FRAME-NAME Dialog-Frame 36 | 37 | /* Standard List Definitions */ 38 | &Scoped-Define ENABLED-OBJECTS RECT-1 fiDir Btn_OK Btn_Cancel tgConnect ~ 39 | btnChooseDumpFile fiLabel 40 | &Scoped-Define DISPLAYED-OBJECTS fiDir tgConnect fiLabel 41 | 42 | /* Custom List Definitions */ 43 | /* List-1,List-2,List-3,List-4,List-5,List-6 */ 44 | 45 | /* _UIB-PREPROCESSOR-BLOCK-END */ 46 | &ANALYZE-RESUME 47 | 48 | 49 | 50 | /* *********************** Control Definitions ********************** */ 51 | 52 | /* Define a dialog box */ 53 | 54 | /* Definitions of the field level widgets */ 55 | DEFINE BUTTON btnChooseDumpFile 56 | LABEL "..." 57 | SIZE-PIXELS 20 BY 21. 58 | 59 | DEFINE BUTTON Btn_Cancel AUTO-END-KEY 60 | LABEL "Cancel" 61 | SIZE-PIXELS 75 BY 24 62 | BGCOLOR 8 . 63 | 64 | DEFINE BUTTON Btn_OK AUTO-GO 65 | LABEL "OK" 66 | SIZE-PIXELS 75 BY 24 67 | BGCOLOR 8 . 68 | 69 | DEFINE VARIABLE fiDir AS CHARACTER FORMAT "X(256)":U 70 | VIEW-AS FILL-IN 71 | SIZE-PIXELS 362 BY 21 TOOLTIP "the dir where you want to create the clone database" NO-UNDO. 72 | 73 | DEFINE VARIABLE fiLabel AS CHARACTER FORMAT "X(256)":U 74 | VIEW-AS TEXT 75 | SIZE-PIXELS 358 BY 19 NO-UNDO. 76 | 77 | DEFINE RECTANGLE RECT-1 78 | EDGE-PIXELS 2 GRAPHIC-EDGE NO-FILL GROUP-BOX 79 | SIZE-PIXELS 410 BY 110. 80 | 81 | DEFINE VARIABLE tgConnect AS LOGICAL INITIAL yes 82 | LABEL "&Connect after cloning" 83 | VIEW-AS TOGGLE-BOX 84 | SIZE-PIXELS 213 BY 17 TOOLTIP "connect the database after cloning" NO-UNDO. 85 | 86 | 87 | /* ************************ Frame Definitions *********************** */ 88 | 89 | DEFINE FRAME Dialog-Frame 90 | fiDir AT Y 28 X 2 COLON-ALIGNED NO-LABEL 91 | Btn_OK AT Y 77 X 245 92 | Btn_Cancel AT Y 77 X 325 93 | tgConnect AT Y 52 X 12 94 | btnChooseDumpFile AT Y 28 X 380 95 | fiLabel AT Y 9 X 2 COLON-ALIGNED NO-LABEL 96 | RECT-1 AT Y 0 X 0 97 | WITH VIEW-AS DIALOG-BOX KEEP-TAB-ORDER 98 | SIDE-LABELS NO-UNDERLINE THREE-D 99 | SIZE-PIXELS 423 BY 146 100 | TITLE "Create an empty Clone Database" 101 | DEFAULT-BUTTON Btn_OK CANCEL-BUTTON Btn_Cancel. 102 | 103 | 104 | /* *********************** Procedure Settings ************************ */ 105 | 106 | &ANALYZE-SUSPEND _PROCEDURE-SETTINGS 107 | /* Settings for THIS-PROCEDURE 108 | Type: Dialog-Box 109 | Allow: Basic,Browse,DB-Fields,Query 110 | Other Settings: COMPILE 111 | */ 112 | &ANALYZE-RESUME _END-PROCEDURE-SETTINGS 113 | 114 | 115 | 116 | /* *********** Runtime Attributes and AppBuilder Settings *********** */ 117 | 118 | &ANALYZE-SUSPEND _RUN-TIME-ATTRIBUTES 119 | /* SETTINGS FOR DIALOG-BOX Dialog-Frame 120 | FRAME-NAME */ 121 | ASSIGN 122 | FRAME Dialog-Frame:SCROLLABLE = FALSE 123 | FRAME Dialog-Frame:HIDDEN = TRUE. 124 | 125 | /* _RUN-TIME-ATTRIBUTES-END */ 126 | &ANALYZE-RESUME 127 | 128 | 129 | 130 | 131 | 132 | /* ************************ Control Triggers ************************ */ 133 | 134 | &Scoped-define SELF-NAME Dialog-Frame 135 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL Dialog-Frame Dialog-Frame 136 | ON WINDOW-CLOSE OF FRAME Dialog-Frame /* Create an empty Clone Database */ 137 | DO: 138 | APPLY "END-ERROR":U TO SELF. 139 | END. 140 | 141 | /* _UIB-CODE-BLOCK-END */ 142 | &ANALYZE-RESUME 143 | 144 | 145 | &Scoped-define SELF-NAME btnChooseDumpFile 146 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL btnChooseDumpFile Dialog-Frame 147 | ON CHOOSE OF btnChooseDumpFile IN FRAME Dialog-Frame /* ... */ 148 | DO: 149 | DEFINE VARIABLE cDir AS CHARACTER NO-UNDO. 150 | 151 | cDir = fiDir:screen-value. 152 | 153 | SYSTEM-DIALOG GET-DIR cDir 154 | INITIAL-DIR cDir 155 | RETURN-TO-START-DIR. 156 | 157 | DO WITH FRAME {&frame-name}: 158 | fiDir:screen-value = cDir. 159 | END. 160 | 161 | END. 162 | 163 | /* _UIB-CODE-BLOCK-END */ 164 | &ANALYZE-RESUME 165 | 166 | 167 | &Scoped-define SELF-NAME Btn_OK 168 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL Btn_OK Dialog-Frame 169 | ON CHOOSE OF Btn_OK IN FRAME Dialog-Frame /* OK */ 170 | DO: 171 | 172 | /* Save settings */ 173 | setRegistry("DataDigger","CloneDB:dir" ,fiDir:screen-value). 174 | setRegistry("DataDigger","CloneDB:connect",STRING(tgConnect:checked)). 175 | 176 | /* Create full folder structure */ 177 | RUN createFolder(fiDir:SCREEN-VALUE). 178 | 179 | RUN cloneDatabase 180 | ( pcDatabase /* database to clone */ 181 | , fiDir:SCREEN-VALUE /* target folder */ 182 | , tgConnect:CHECKED /* connect after cloning */ 183 | , OUTPUT pcNewDatabase 184 | ). 185 | 186 | /* Clear cache files for the new database to avoid 187 | * messages about restarting DataDigger 188 | */ 189 | RUN clearCache(pcNewDatabase). 190 | 191 | END. 192 | 193 | /* _UIB-CODE-BLOCK-END */ 194 | &ANALYZE-RESUME 195 | 196 | 197 | &UNDEFINE SELF-NAME 198 | 199 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _MAIN-BLOCK Dialog-Frame 200 | 201 | 202 | /* *************************** Main Block *************************** */ 203 | 204 | /* Parent the dialog-box to the ACTIVE-WINDOW, if there is no parent. */ 205 | IF VALID-HANDLE(ACTIVE-WINDOW) AND FRAME {&FRAME-NAME}:PARENT EQ ? 206 | THEN FRAME {&FRAME-NAME}:PARENT = ACTIVE-WINDOW. 207 | 208 | /* Now enable the interface and wait for the exit condition. */ 209 | /* (NOTE: handle ERROR and END-KEY so cleanup code will always fire. */ 210 | MAIN-BLOCK: 211 | DO ON ERROR UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK 212 | ON END-KEY UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK: 213 | 214 | RUN initializeObject. 215 | RUN enable_UI. 216 | 217 | WAIT-FOR GO OF FRAME {&FRAME-NAME}. 218 | END. 219 | RUN disable_UI. 220 | 221 | /* _UIB-CODE-BLOCK-END */ 222 | &ANALYZE-RESUME 223 | 224 | 225 | /* ********************** Internal Procedures *********************** */ 226 | 227 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE clearCache Dialog-Frame 228 | PROCEDURE clearCache : 229 | /* Delete old cache files of the newly created database. 230 | * 231 | * Note: If you create a local db with a name that has been used before, DD 232 | * will see a difference in the schema. To avoid this, remove old cache 233 | */ 234 | DEFINE INPUT PARAMETER pcDbName AS CHARACTER NO-UNDO. 235 | 236 | DEFINE VARIABLE cFile AS CHARACTER NO-UNDO EXTENT 3. 237 | 238 | PUBLISH "debugInfo" (3, "Clearing disk cache"). 239 | 240 | INPUT FROM OS-DIR(getProgramdir() + "cache"). 241 | REPEAT: 242 | IMPORT cFile. 243 | IF cFile[1] MATCHES SUBSTITUTE('db.&1.*.xml', pcDbName) THEN OS-DELETE VALUE( cFile[2]). 244 | END. 245 | INPUT CLOSE. 246 | 247 | END PROCEDURE. /* clearCache */ 248 | 249 | /* _UIB-CODE-BLOCK-END */ 250 | &ANALYZE-RESUME 251 | 252 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE cloneDatabase Dialog-Frame 253 | PROCEDURE cloneDatabase : 254 | /* Clone the current database 255 | */ 256 | DEFINE INPUT PARAMETER pcDbName AS CHARACTER NO-UNDO. 257 | DEFINE INPUT PARAMETER pcFolder AS CHARACTER NO-UNDO. 258 | DEFINE INPUT PARAMETER plStayConnected AS LOGICAL NO-UNDO. 259 | DEFINE OUTPUT PARAMETER pcLogicalName AS CHARACTER NO-UNDO. 260 | 261 | DEFINE VARIABLE cCommand AS CHARACTER NO-UNDO EXTENT 5. 262 | DEFINE VARIABLE cCmd AS CHARACTER NO-UNDO. 263 | DEFINE VARIABLE cDlc AS CHARACTER NO-UNDO. 264 | DEFINE VARIABLE lDelete AS LOGICAL NO-UNDO. 265 | DEFINE VARIABLE cDf AS CHARACTER NO-UNDO. 266 | DEFINE VARIABLE hProc AS HANDLE NO-UNDO. 267 | 268 | IF NUM-DBS = 0 THEN DO: 269 | MESSAGE 'No databases connected' VIEW-AS ALERT-BOX INFORMATION BUTTONS OK. 270 | RETURN. 271 | END. 272 | 273 | IF CONNECTED(pcDbName) <> TRUE THEN DO: 274 | MESSAGE 'Database' pcDbName 'not connected' VIEW-AS ALERT-BOX INFORMATION BUTTONS OK. 275 | RETURN. 276 | END. 277 | 278 | &IF PROVERSION < "11" &THEN 279 | cDlc = OS-GETENV('DLC'). 280 | &ELSE 281 | cDlc = System.Environment:GetEnvironmentVariable('DLC'). 282 | &ENDIF 283 | 284 | IF cDlc = ? THEN 285 | ASSIGN cDlc = SEARCH('empty.db') 286 | cDlc = SUBSTRING(cDlc,1,LENGTH(cDlc,'CHARACTER') - 9,'CHARACTER'). 287 | 288 | /* Point to the proper database */ 289 | CREATE ALIAS 'dictdb' FOR DATABASE VALUE(pcDbName). 290 | 291 | /* Exist? */ 292 | IF SEARCH(SUBSTITUTE('&1\&2.db', pcFolder, pcDbName)) <> ? THEN 293 | DO: 294 | MESSAGE 'Database already exists. Replace?' 295 | VIEW-AS ALERT-BOX INFORMATION BUTTONS YES-NO-CANCEL UPDATE lDelete. 296 | IF lDelete <> TRUE THEN RETURN. 297 | 298 | /* Delete existing database */ 299 | cCommand[1] = SUBSTITUTE('cd /d &1', pcFolder). 300 | cCommand[2] = SUBSTITUTE('echo y|&1\bin\prodel &2', cDlc, pcDbName). 301 | cCmd = SUBSTITUTE('&1 && &2', cCommand[1], cCommand[2]). 302 | OS-COMMAND SILENT VALUE(cCmd). 303 | END. 304 | 305 | /* If the new db is already connected, disconnect it first, before 306 | * we are going to replace it. 307 | */ 308 | pcLogicalName = SUBSTITUTE('my&1&2', CAPS(SUBSTRING(pcDbName,1,1)), LOWER(SUBSTRING(pcDbName,2))). 309 | IF CONNECTED(pcLogicalName) THEN DISCONNECT VALUE(pcLogicalName). 310 | 311 | /* Create structure */ 312 | RUN createStructureFile(pcDbName,pcFolder). 313 | 314 | /* Create empty db */ 315 | cCommand[1] = SUBSTITUTE('cd /d &1', pcFolder). 316 | cCommand[2] = SUBSTITUTE('&1\bin\prostrct create &2', cDlc, pcDbName). 317 | cCommand[3] = SUBSTITUTE('&1\bin\procopy &1\empty &2', cDlc, pcDbName). 318 | cCmd = SUBSTITUTE('&1 && &2 && &3', cCommand[1], cCommand[2], cCommand[3]). 319 | OS-COMMAND SILENT VALUE(cCmd). 320 | 321 | /* Do a silent dump df of old db */ 322 | cDf = SUBSTITUTE('&1\&2.df', pcFolder, pcDbName). 323 | RUN prodict/dump_df.p PERSISTENT SET hProc (INPUT 'ALL', INPUT cDf, INPUT '1252'). 324 | RUN setSilent IN hProc(YES) NO-ERROR. /* setSilent not avail in all versions */ 325 | RUN doDump IN hProc. 326 | DELETE PROCEDURE hProc. 327 | 328 | /* Connect new db */ 329 | CONNECT VALUE(SUBSTITUTE('-db &1\&2.db -ld &3 -1', pcFolder, pcDbName, pcLogicalName)). 330 | 331 | /* Load in new db */ 332 | CREATE ALIAS 'dictdb' FOR DATABASE VALUE(pcLogicalName). 333 | RUN prodict/load_df.p (INPUT SUBSTITUTE('&1\&2.df', pcFolder, pcDbName)). 334 | 335 | /* Let it remain connected or not */ 336 | IF NOT plStayConnected THEN DISCONNECT VALUE(pcLogicalName). 337 | 338 | END PROCEDURE. /* cloneDatabase */ 339 | 340 | /* _UIB-CODE-BLOCK-END */ 341 | &ANALYZE-RESUME 342 | 343 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE createStructureFile Dialog-Frame 344 | PROCEDURE createStructureFile : 345 | /* Create a .st file for the currently connected database 346 | */ 347 | DEFINE INPUT PARAMETER pcDbName AS CHARACTER NO-UNDO. 348 | DEFINE INPUT PARAMETER pcFolder AS CHARACTER NO-UNDO. 349 | 350 | DEFINE VARIABLE hBuffer AS HANDLE NO-UNDO. 351 | DEFINE VARIABLE hQuery AS HANDLE NO-UNDO. 352 | 353 | CREATE BUFFER hBuffer FOR TABLE SUBSTITUTE('&1._Area',pcDbName). 354 | IF NOT VALID-HANDLE(hBuffer) THEN RETURN. 355 | 356 | CREATE QUERY hQuery. 357 | hQuery:SET-BUFFERS(hBuffer). 358 | hQuery:QUERY-PREPARE('FOR EACH _Area WHERE (_Area-type = 3 AND _Area-number > 1) OR (_Area-type = 6 AND _Area-number > 1)'). 359 | IF NOT hQuery:QUERY-OPEN THEN RETURN. 360 | 361 | OUTPUT TO VALUE(SUBSTITUTE('&1\&2.st',pcFolder, pcDbName)). 362 | PUT UNFORMATTED 363 | '#' SKIP 364 | '# Structure file for database ' pcDbName SKIP 365 | '# Generated from DataDigger on ' STRING(TODAY) SKIP 366 | . 367 | 368 | #Area: 369 | REPEAT: 370 | hQuery:GET-NEXT(NO-LOCK). 371 | IF hQuery:QUERY-OFF-END THEN LEAVE #Area. 372 | 373 | IF hBuffer::_Area-type = 3 THEN 374 | PUT UNFORMATTED '#' SKIP 375 | 'b .' SKIP. 376 | ELSE 377 | PUT UNFORMATTED '#' SKIP 378 | SUBSTITUTE( 'd "&1":&2,&3 .' 379 | , hBuffer::_Area-name 380 | , hBuffer::_Area-number 381 | , hBuffer::_Area-clustersize) 382 | SKIP. 383 | END. 384 | OUTPUT CLOSE. 385 | DELETE OBJECT hBuffer NO-ERROR. 386 | 387 | END PROCEDURE. /* createStructureFile */ 388 | 389 | /* _UIB-CODE-BLOCK-END */ 390 | &ANALYZE-RESUME 391 | 392 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE disable_UI Dialog-Frame _DEFAULT-DISABLE 393 | PROCEDURE disable_UI : 394 | /*------------------------------------------------------------------------------ 395 | Purpose: DISABLE the User Interface 396 | Parameters: 397 | Notes: Here we clean-up the user-interface by deleting 398 | dynamic widgets we have created and/or hide 399 | frames. This procedure is usually called when 400 | we are ready to "clean-up" after running. 401 | ------------------------------------------------------------------------------*/ 402 | /* Hide all frames. */ 403 | HIDE FRAME Dialog-Frame. 404 | END PROCEDURE. 405 | 406 | /* _UIB-CODE-BLOCK-END */ 407 | &ANALYZE-RESUME 408 | 409 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE enable_UI Dialog-Frame _DEFAULT-ENABLE 410 | PROCEDURE enable_UI : 411 | /*------------------------------------------------------------------------------ 412 | Purpose: ENABLE the User Interface 413 | Parameters: 414 | Notes: Here we display/view/enable the widgets in the 415 | user-interface. In addition, OPEN all queries 416 | associated with each FRAME and BROWSE. 417 | These statements here are based on the "Other 418 | Settings" section of the widget Property Sheets. 419 | ------------------------------------------------------------------------------*/ 420 | DISPLAY fiDir tgConnect fiLabel 421 | WITH FRAME Dialog-Frame. 422 | ENABLE RECT-1 fiDir Btn_OK Btn_Cancel tgConnect btnChooseDumpFile fiLabel 423 | WITH FRAME Dialog-Frame. 424 | VIEW FRAME Dialog-Frame. 425 | {&OPEN-BROWSERS-IN-QUERY-Dialog-Frame} 426 | END PROCEDURE. 427 | 428 | /* _UIB-CODE-BLOCK-END */ 429 | &ANALYZE-RESUME 430 | 431 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE initializeObject Dialog-Frame 432 | PROCEDURE initializeObject : 433 | /* Initialize global vars 434 | */ 435 | DEFINE VARIABLE iOption AS INTEGER NO-UNDO. 436 | DEFINE VARIABLE cOption AS CHARACTER NO-UNDO. 437 | DEFINE VARIABLE cSetting AS CHARACTER NO-UNDO. 438 | DEFINE VARIABLE cValue AS CHARACTER NO-UNDO. 439 | 440 | DO WITH FRAME {&FRAME-NAME}: 441 | 442 | /* Set default font */ 443 | FRAME {&frame-name}:font = getFont('Default'). 444 | 445 | /* set title */ 446 | fiLabel = SUBSTITUTE('Create an empty clone of database &1 in', pcDatabase). 447 | DISPLAY fiLabel. 448 | 449 | /* Process startup options */ 450 | DO iOption = 1 TO NUM-ENTRIES(pcOptions): 451 | cOption = ENTRY(iOption,pcOptions). 452 | cSetting = ENTRY(1,cOption,"="). 453 | cValue = ENTRY(2,cOption,"="). 454 | 455 | CASE cSetting: 456 | WHEN "x" THEN FRAME {&FRAME-NAME}:x = INTEGER(cValue). 457 | WHEN "y" THEN FRAME {&FRAME-NAME}:y = INTEGER(cValue). 458 | END CASE. 459 | END. 460 | 461 | fiDir = getRegistry("DataDigger","CloneDB:dir"). 462 | IF fiDir = ? THEN fiDir = SESSION:TEMP-DIRECTORY. 463 | 464 | cSetting = getRegistry("DataDigger","CloneDB:connect"). 465 | IF cSetting = ? THEN cSetting = "yes". 466 | tgConnect = LOGICAL(cSetting). 467 | END. 468 | 469 | END PROCEDURE. 470 | 471 | /* _UIB-CODE-BLOCK-END */ 472 | &ANALYZE-RESUME 473 | -------------------------------------------------------------------------------- /dDumpDf.w: -------------------------------------------------------------------------------- 1 | &ANALYZE-SUSPEND _VERSION-NUMBER AB_v10r12 GUI 2 | &ANALYZE-RESUME 3 | &Scoped-define WINDOW-NAME CURRENT-WINDOW 4 | &Scoped-define FRAME-NAME Dialog-Frame 5 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _DEFINITIONS Dialog-Frame 6 | /*------------------------------------------------------------------------ 7 | 8 | Name: dDumpDf.w 9 | Desc: Dump definitions of table or complete database 10 | 11 | ----------------------------------------------------------------------*/ 12 | /* This .W file was created with the Progress AppBuilder. */ 13 | /*----------------------------------------------------------------------*/ 14 | 15 | { DataDigger.i } 16 | 17 | DEFINE INPUT PARAMETER pcDatabase AS CHARACTER NO-UNDO. 18 | DEFINE INPUT PARAMETER pcTable AS CHARACTER NO-UNDO. 19 | DEFINE INPUT PARAMETER pcOptions AS CHARACTER NO-UNDO. 20 | 21 | /* _UIB-CODE-BLOCK-END */ 22 | &ANALYZE-RESUME 23 | 24 | 25 | &ANALYZE-SUSPEND _UIB-PREPROCESSOR-BLOCK 26 | 27 | /* ******************** Preprocessor Definitions ******************** */ 28 | 29 | &Scoped-define PROCEDURE-TYPE Dialog-Box 30 | &Scoped-define DB-AWARE no 31 | 32 | /* Name of designated FRAME-NAME and/or first browse and/or first query */ 33 | &Scoped-define FRAME-NAME Dialog-Frame 34 | 35 | /* Standard List Definitions */ 36 | &Scoped-Define ENABLED-OBJECTS RECT-1 fiDir Btn_OK Btn_Cancel tgOpenFile ~ 37 | btnChooseDumpFile rsDump 38 | &Scoped-Define DISPLAYED-OBJECTS fiDir tgOpenFile rsDump 39 | 40 | /* Custom List Definitions */ 41 | /* List-1,List-2,List-3,List-4,List-5,List-6 */ 42 | 43 | /* _UIB-PREPROCESSOR-BLOCK-END */ 44 | &ANALYZE-RESUME 45 | 46 | 47 | 48 | /* *********************** Control Definitions ********************** */ 49 | 50 | /* Define a dialog box */ 51 | 52 | /* Definitions of the field level widgets */ 53 | DEFINE BUTTON btnChooseDumpFile 54 | LABEL "..." 55 | SIZE-PIXELS 20 BY 21. 56 | 57 | DEFINE BUTTON Btn_Cancel AUTO-END-KEY 58 | LABEL "Cancel" 59 | SIZE-PIXELS 75 BY 24 60 | BGCOLOR 8 . 61 | 62 | DEFINE BUTTON Btn_OK AUTO-GO 63 | LABEL "OK" 64 | SIZE-PIXELS 75 BY 24 65 | BGCOLOR 8 . 66 | 67 | DEFINE VARIABLE fiDir AS CHARACTER FORMAT "X(256)":U 68 | LABEL "&Folder" 69 | VIEW-AS FILL-IN 70 | SIZE-PIXELS 320 BY 21 TOOLTIP "the dir where you want to dump the .df file to" NO-UNDO. 71 | 72 | DEFINE VARIABLE rsDump AS CHARACTER 73 | VIEW-AS RADIO-SET VERTICAL 74 | RADIO-BUTTONS 75 | "Table [table]", "table", 76 | "&Database [db]", "db", 77 | "&All connected Databases", "all" 78 | SIZE-PIXELS 307 BY 75 TOOLTIP "what should be dumped" NO-UNDO. 79 | 80 | DEFINE RECTANGLE RECT-1 81 | EDGE-PIXELS 2 GRAPHIC-EDGE NO-FILL GROUP-BOX 82 | SIZE-PIXELS 410 BY 205. 83 | 84 | DEFINE VARIABLE tgOpenFile AS LOGICAL INITIAL no 85 | LABEL "&Open DF after dump" 86 | VIEW-AS TOGGLE-BOX 87 | SIZE-PIXELS 195 BY 17 TOOLTIP "open the DF file right after dumping" NO-UNDO. 88 | 89 | 90 | /* ************************ Frame Definitions *********************** */ 91 | 92 | DEFINE FRAME Dialog-Frame 93 | fiDir AT Y 95 X 50 COLON-ALIGNED 94 | Btn_OK AT Y 166 X 245 95 | Btn_Cancel AT Y 166 X 325 96 | tgOpenFile AT Y 121 X 60 97 | btnChooseDumpFile AT Y 95 X 380 98 | rsDump AT Y 10 X 60 NO-LABEL 99 | "Dump:" VIEW-AS TEXT 100 | SIZE-PIXELS 40 BY 13 AT Y 15 X 13 101 | RECT-1 AT Y 0 X 0 102 | WITH VIEW-AS DIALOG-BOX KEEP-TAB-ORDER 103 | SIDE-LABELS NO-UNDERLINE THREE-D 104 | SIZE-PIXELS 425 BY 243 105 | TITLE "Dump Definitions" 106 | DEFAULT-BUTTON Btn_OK CANCEL-BUTTON Btn_Cancel. 107 | 108 | 109 | /* *********************** Procedure Settings ************************ */ 110 | 111 | &ANALYZE-SUSPEND _PROCEDURE-SETTINGS 112 | /* Settings for THIS-PROCEDURE 113 | Type: Dialog-Box 114 | Allow: Basic,Browse,DB-Fields,Query 115 | Other Settings: COMPILE 116 | */ 117 | &ANALYZE-RESUME _END-PROCEDURE-SETTINGS 118 | 119 | 120 | 121 | /* *********** Runtime Attributes and AppBuilder Settings *********** */ 122 | 123 | &ANALYZE-SUSPEND _RUN-TIME-ATTRIBUTES 124 | /* SETTINGS FOR DIALOG-BOX Dialog-Frame 125 | FRAME-NAME */ 126 | ASSIGN 127 | FRAME Dialog-Frame:SCROLLABLE = FALSE 128 | FRAME Dialog-Frame:HIDDEN = TRUE. 129 | 130 | /* _RUN-TIME-ATTRIBUTES-END */ 131 | &ANALYZE-RESUME 132 | 133 | 134 | 135 | 136 | 137 | /* ************************ Control Triggers ************************ */ 138 | 139 | &Scoped-define SELF-NAME Dialog-Frame 140 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL Dialog-Frame Dialog-Frame 141 | ON WINDOW-CLOSE OF FRAME Dialog-Frame /* Dump Definitions */ 142 | DO: 143 | APPLY "END-ERROR":U TO SELF. 144 | END. 145 | 146 | /* _UIB-CODE-BLOCK-END */ 147 | &ANALYZE-RESUME 148 | 149 | 150 | &Scoped-define SELF-NAME btnChooseDumpFile 151 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL btnChooseDumpFile Dialog-Frame 152 | ON CHOOSE OF btnChooseDumpFile IN FRAME Dialog-Frame /* ... */ 153 | DO: 154 | DEFINE VARIABLE cDir AS CHARACTER NO-UNDO. 155 | 156 | cDir = fiDir:screen-value. 157 | 158 | SYSTEM-DIALOG GET-DIR cDir 159 | INITIAL-DIR cDir 160 | RETURN-TO-START-DIR. 161 | 162 | DO WITH FRAME {&frame-name}: 163 | fiDir:screen-value = cDir. 164 | END. 165 | 166 | END. 167 | 168 | /* _UIB-CODE-BLOCK-END */ 169 | &ANALYZE-RESUME 170 | 171 | 172 | &Scoped-define SELF-NAME Btn_OK 173 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL Btn_OK Dialog-Frame 174 | ON CHOOSE OF Btn_OK IN FRAME Dialog-Frame /* OK */ 175 | DO: 176 | DEFINE VARIABLE cDir AS CHARACTER NO-UNDO. 177 | DEFINE VARIABLE cList AS CHARACTER NO-UNDO. 178 | DEFINE VARIABLE i AS INTEGER NO-UNDO. 179 | 180 | /* Create full folder structure */ 181 | RUN createFolder(fiDir:SCREEN-VALUE). 182 | cDir = RIGHT-TRIM(fiDir:SCREEN-VALUE,"\"). 183 | 184 | /* Do the dump, using built in procedure */ 185 | CASE rsDump:SCREEN-VALUE: 186 | WHEN 'table' THEN RUN DumpDF(pcTable, SUBSTITUTE('&1\&2.df',cDir,pcTable ), tgOpenFile:CHECKED, INPUT-OUTPUT cList). 187 | WHEN 'db' THEN RUN DumpDF('ALL' , SUBSTITUTE('&1\&2.df',cDir,pcDatabase), tgOpenFile:CHECKED, INPUT-OUTPUT cList). 188 | WHEN 'all' THEN DO i = 1 TO NUM-DBS: 189 | CREATE ALIAS dictdb FOR DATABASE VALUE(LDBNAME(i)). 190 | RUN DumpDF('ALL', SUBSTITUTE('&1\&2.df',cDir,LDBNAME(i)), tgOpenFile:CHECKED, INPUT-OUTPUT cList). 191 | END. 192 | END CASE. 193 | 194 | IF tgOpenFile:CHECKED THEN 195 | DO i = 1 TO NUM-ENTRIES(cList): 196 | OS-COMMAND NO-WAIT VALUE(SUBSTITUTE("START &1", ENTRY(i,cList))). 197 | END. 198 | 199 | /* Save settings */ 200 | setRegistry("DataDigger:DumpDF","WhatToDump",rsDump:SCREEN-VALUE). 201 | setRegistry("DataDigger:DumpDF","DumpDir" ,fiDir:SCREEN-VALUE). 202 | setRegistry("DataDigger:DumpDF","OpenFile",STRING(tgOpenFile:CHECKED)). 203 | 204 | RUN showHelp('DumpCompleted',''). 205 | END. 206 | 207 | /* _UIB-CODE-BLOCK-END */ 208 | &ANALYZE-RESUME 209 | 210 | 211 | &UNDEFINE SELF-NAME 212 | 213 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _MAIN-BLOCK Dialog-Frame 214 | 215 | 216 | /* *************************** Main Block *************************** */ 217 | 218 | /* Parent the dialog-box to the ACTIVE-WINDOW, if there is no parent. */ 219 | IF VALID-HANDLE(ACTIVE-WINDOW) AND FRAME {&FRAME-NAME}:PARENT EQ ? 220 | THEN FRAME {&FRAME-NAME}:PARENT = ACTIVE-WINDOW. 221 | 222 | /* Now enable the interface and wait for the exit condition. */ 223 | /* (NOTE: handle ERROR and END-KEY so cleanup code will always fire. */ 224 | MAIN-BLOCK: 225 | DO ON ERROR UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK 226 | ON END-KEY UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK: 227 | 228 | RUN initObject. 229 | 230 | WAIT-FOR GO OF FRAME {&FRAME-NAME}. 231 | END. 232 | RUN disable_UI. 233 | 234 | /* _UIB-CODE-BLOCK-END */ 235 | &ANALYZE-RESUME 236 | 237 | 238 | /* ********************** Internal Procedures *********************** */ 239 | 240 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE disable_UI Dialog-Frame _DEFAULT-DISABLE 241 | PROCEDURE disable_UI : 242 | /*------------------------------------------------------------------------------ 243 | Purpose: DISABLE the User Interface 244 | Parameters: 245 | Notes: Here we clean-up the user-interface by deleting 246 | dynamic widgets we have created and/or hide 247 | frames. This procedure is usually called when 248 | we are ready to "clean-up" after running. 249 | ------------------------------------------------------------------------------*/ 250 | /* Hide all frames. */ 251 | HIDE FRAME Dialog-Frame. 252 | END PROCEDURE. 253 | 254 | /* _UIB-CODE-BLOCK-END */ 255 | &ANALYZE-RESUME 256 | 257 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE dumpDF Dialog-Frame 258 | PROCEDURE dumpDF : 259 | /* Execute progress procedure for dumping 260 | */ 261 | DEFINE INPUT PARAMETER pcWhat AS CHARACTER NO-UNDO. 262 | DEFINE INPUT PARAMETER pcFile AS CHARACTER NO-UNDO. 263 | DEFINE INPUT PARAMETER plOpen AS LOGICAL NO-UNDO. 264 | DEFINE INPUT-OUTPUT PARAMETER pcList AS CHARACTER NO-UNDO. 265 | 266 | /* suppress 'Dump of definitions completed.' */ 267 | OUTPUT TO nul. 268 | 269 | RUN prodict/dump_df.p(pcWhat, pcFile, ''). 270 | 271 | OUTPUT CLOSE. 272 | IF plOpen THEN pcList = TRIM(SUBSTITUTE('&1,&2',pcList,pcFile),','). 273 | 274 | END PROCEDURE. /* DumpDF */ 275 | 276 | /* _UIB-CODE-BLOCK-END */ 277 | &ANALYZE-RESUME 278 | 279 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE enable_UI Dialog-Frame _DEFAULT-ENABLE 280 | PROCEDURE enable_UI : 281 | /*------------------------------------------------------------------------------ 282 | Purpose: ENABLE the User Interface 283 | Parameters: 284 | Notes: Here we display/view/enable the widgets in the 285 | user-interface. In addition, OPEN all queries 286 | associated with each FRAME and BROWSE. 287 | These statements here are based on the "Other 288 | Settings" section of the widget Property Sheets. 289 | ------------------------------------------------------------------------------*/ 290 | DISPLAY fiDir tgOpenFile rsDump 291 | WITH FRAME Dialog-Frame. 292 | ENABLE RECT-1 fiDir Btn_OK Btn_Cancel tgOpenFile btnChooseDumpFile rsDump 293 | WITH FRAME Dialog-Frame. 294 | VIEW FRAME Dialog-Frame. 295 | {&OPEN-BROWSERS-IN-QUERY-Dialog-Frame} 296 | END PROCEDURE. 297 | 298 | /* _UIB-CODE-BLOCK-END */ 299 | &ANALYZE-RESUME 300 | 301 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE initObject Dialog-Frame 302 | PROCEDURE initObject : 303 | /* initialize global vars 304 | */ 305 | DEFINE VARIABLE iOption AS INTEGER NO-UNDO. 306 | DEFINE VARIABLE cOption AS CHARACTER NO-UNDO. 307 | DEFINE VARIABLE cSetting AS CHARACTER NO-UNDO. 308 | DEFINE VARIABLE cValue AS CHARACTER NO-UNDO. 309 | 310 | DO WITH FRAME {&FRAME-NAME}: 311 | 312 | /* Set default font */ 313 | FRAME {&FRAME-NAME}:FONT = getFont('Default'). 314 | 315 | DO iOption = 1 TO NUM-ENTRIES(pcOptions): 316 | cOption = ENTRY(iOption,pcOptions). 317 | cSetting = ENTRY(1,cOption,"="). 318 | cValue = ENTRY(2,cOption,"="). 319 | 320 | CASE cSetting: 321 | WHEN "x" THEN FRAME {&FRAME-NAME}:X = INTEGER(cValue). 322 | WHEN "y" THEN FRAME {&FRAME-NAME}:Y = INTEGER(cValue). 323 | END CASE. 324 | END. 325 | 326 | /* Set name in radioset */ 327 | rsDump:RADIO-BUTTONS = REPLACE(rsDump:RADIO-BUTTONS,'[table]',pcTable). 328 | rsDump:RADIO-BUTTONS = REPLACE(rsDump:RADIO-BUTTONS,'[db]',pcDatabase). 329 | 330 | fiDir = getRegistry("DataDigger:DumpDF","DumpDir"). 331 | IF fiDir = ? THEN fiDir = SESSION:TEMP-DIRECTORY. 332 | 333 | cSetting = getRegistry("DataDigger:DumpDF","OpenFile"). 334 | IF cSetting = ? THEN cSetting = "yes". 335 | tgOpenFile = LOGICAL(cSetting). 336 | 337 | cSetting = getRegistry("DataDigger:DumpDF","WhatToDump"). 338 | IF cSetting = ? THEN cSetting = 'table'. 339 | rsDump:SCREEN-VALUE = cSetting. 340 | END. 341 | 342 | RUN enable_UI. 343 | 344 | END PROCEDURE. /* initObject */ 345 | 346 | /* _UIB-CODE-BLOCK-END */ 347 | &ANALYZE-RESUME 348 | 349 | -------------------------------------------------------------------------------- /dNewGroup.w: -------------------------------------------------------------------------------- 1 | &ANALYZE-SUSPEND _VERSION-NUMBER AB_v10r12 GUI 2 | &ANALYZE-RESUME 3 | &Scoped-define WINDOW-NAME CURRENT-WINDOW 4 | &Scoped-define FRAME-NAME Dialog-Frame 5 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _DEFINITIONS Dialog-Frame 6 | /*------------------------------------------------------------------------ 7 | 8 | Name: dNewGroup.w 9 | Desc: Ask name for new group of favourites 10 | 11 | ----------------------------------------------------------------------*/ 12 | /* This .W file was created with the Progress AppBuilder. */ 13 | /*----------------------------------------------------------------------*/ 14 | 15 | { DataDigger.i } 16 | 17 | &IF DEFINED(UIB_IS_RUNNING) = 0 &THEN 18 | DEFINE INPUT PARAMETER TABLE FOR ttFavGroup. 19 | DEFINE OUTPUT PARAMETER pcNewName AS CHARACTER NO-UNDO. 20 | &ELSE 21 | DEFINE VARIABLE pcNewName AS CHARACTER NO-UNDO. 22 | &ENDIF 23 | 24 | /* _UIB-CODE-BLOCK-END */ 25 | &ANALYZE-RESUME 26 | 27 | 28 | &ANALYZE-SUSPEND _UIB-PREPROCESSOR-BLOCK 29 | 30 | /* ******************** Preprocessor Definitions ******************** */ 31 | 32 | &Scoped-define PROCEDURE-TYPE Dialog-Box 33 | &Scoped-define DB-AWARE no 34 | 35 | /* Name of designated FRAME-NAME and/or first browse and/or first query */ 36 | &Scoped-define FRAME-NAME Dialog-Frame 37 | 38 | /* Standard List Definitions */ 39 | &Scoped-Define ENABLED-OBJECTS RECT-1 fiGroupname Btn_Cancel 40 | &Scoped-Define DISPLAYED-OBJECTS fiGroupname 41 | 42 | /* Custom List Definitions */ 43 | /* List-1,List-2,List-3,List-4,List-5,List-6 */ 44 | 45 | /* _UIB-PREPROCESSOR-BLOCK-END */ 46 | &ANALYZE-RESUME 47 | 48 | 49 | 50 | /* *********************** Control Definitions ********************** */ 51 | 52 | /* Define a dialog box */ 53 | 54 | /* Definitions of the field level widgets */ 55 | DEFINE BUTTON Btn_Cancel AUTO-END-KEY 56 | LABEL "Cancel" 57 | SIZE-PIXELS 75 BY 24 58 | BGCOLOR 8 . 59 | 60 | DEFINE BUTTON Btn_OK AUTO-GO 61 | LABEL "OK" 62 | SIZE-PIXELS 75 BY 24 63 | BGCOLOR 8 . 64 | 65 | DEFINE VARIABLE fiGroupname AS CHARACTER FORMAT "X(256)":U 66 | LABEL "&Group name" 67 | VIEW-AS FILL-IN 68 | SIZE-PIXELS 244 BY 21 TOOLTIP "enter the name of the group" NO-UNDO. 69 | 70 | DEFINE RECTANGLE RECT-1 71 | EDGE-PIXELS 2 GRAPHIC-EDGE NO-FILL GROUP-BOX 72 | SIZE-PIXELS 395 BY 135. 73 | 74 | 75 | /* ************************ Frame Definitions *********************** */ 76 | 77 | DEFINE FRAME Dialog-Frame 78 | fiGroupname AT Y 35 X 80 COLON-ALIGNED 79 | Btn_OK AT Y 90 X 230 80 | Btn_Cancel AT Y 90 X 310 81 | RECT-1 AT Y 0 X 0 82 | WITH VIEW-AS DIALOG-BOX KEEP-TAB-ORDER 83 | SIDE-LABELS NO-UNDERLINE THREE-D 84 | SIZE-PIXELS 405 BY 168 85 | TITLE "Favourites Group Name" 86 | DEFAULT-BUTTON Btn_OK CANCEL-BUTTON Btn_Cancel . 87 | 88 | 89 | /* *********************** Procedure Settings ************************ */ 90 | 91 | &ANALYZE-SUSPEND _PROCEDURE-SETTINGS 92 | /* Settings for THIS-PROCEDURE 93 | Type: Dialog-Box 94 | Allow: Basic,Browse,DB-Fields,Query 95 | Other Settings: COMPILE 96 | */ 97 | &ANALYZE-RESUME _END-PROCEDURE-SETTINGS 98 | 99 | 100 | 101 | /* *********** Runtime Attributes and AppBuilder Settings *********** */ 102 | 103 | &ANALYZE-SUSPEND _RUN-TIME-ATTRIBUTES 104 | /* SETTINGS FOR DIALOG-BOX Dialog-Frame 105 | FRAME-NAME */ 106 | ASSIGN 107 | FRAME Dialog-Frame:SCROLLABLE = FALSE 108 | FRAME Dialog-Frame:HIDDEN = TRUE. 109 | 110 | /* SETTINGS FOR BUTTON Btn_OK IN FRAME Dialog-Frame 111 | NO-ENABLE */ 112 | /* _RUN-TIME-ATTRIBUTES-END */ 113 | &ANALYZE-RESUME 114 | 115 | 116 | 117 | 118 | 119 | /* ************************ Control Triggers ************************ */ 120 | 121 | &Scoped-define SELF-NAME Dialog-Frame 122 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL Dialog-Frame Dialog-Frame 123 | ON GO OF FRAME Dialog-Frame /* Favourites Group Name */ 124 | DO: 125 | IF NOT btn_ok:SENSITIVE THEN RETURN NO-APPLY. 126 | 127 | IF CAN-FIND(ttFavGroup WHERE ttFavGroup.cGroup = fiGroupname:SCREEN-VALUE) THEN 128 | DO: 129 | MESSAGE 'This group already exists, please use another name' 130 | VIEW-AS ALERT-BOX INFORMATION BUTTONS OK. 131 | RETURN NO-APPLY. 132 | END. 133 | 134 | pcNewName = fiGroupname:SCREEN-VALUE. 135 | APPLY 'close' TO THIS-PROCEDURE. 136 | END. 137 | 138 | /* _UIB-CODE-BLOCK-END */ 139 | &ANALYZE-RESUME 140 | 141 | 142 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL Dialog-Frame Dialog-Frame 143 | ON WINDOW-CLOSE OF FRAME Dialog-Frame /* Favourites Group Name */ 144 | DO: 145 | APPLY "END-ERROR":U TO SELF. 146 | END. 147 | 148 | /* _UIB-CODE-BLOCK-END */ 149 | &ANALYZE-RESUME 150 | 151 | 152 | &Scoped-define SELF-NAME fiGroupname 153 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL fiGroupname Dialog-Frame 154 | ON VALUE-CHANGED OF fiGroupname IN FRAME Dialog-Frame /* Group name */ 155 | DO: 156 | Btn_OK:SENSITIVE = (SELF:SCREEN-VALUE <> ''). 157 | END. 158 | 159 | /* _UIB-CODE-BLOCK-END */ 160 | &ANALYZE-RESUME 161 | 162 | 163 | &UNDEFINE SELF-NAME 164 | 165 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _MAIN-BLOCK Dialog-Frame 166 | 167 | 168 | /* *************************** Main Block *************************** */ 169 | 170 | /* Parent the dialog-box to the ACTIVE-WINDOW, if there is no parent. */ 171 | IF VALID-HANDLE(ACTIVE-WINDOW) AND FRAME {&FRAME-NAME}:PARENT EQ ? 172 | THEN FRAME {&FRAME-NAME}:PARENT = ACTIVE-WINDOW. 173 | 174 | /* Now enable the interface and wait for the exit condition. */ 175 | /* (NOTE: handle ERROR and END-KEY so cleanup code will always fire. */ 176 | MAIN-BLOCK: 177 | DO ON ERROR UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK 178 | ON END-KEY UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK: 179 | 180 | RUN enable_UI. 181 | 182 | WAIT-FOR GO OF FRAME {&FRAME-NAME}. 183 | END. 184 | RUN disable_UI. 185 | 186 | /* _UIB-CODE-BLOCK-END */ 187 | &ANALYZE-RESUME 188 | 189 | 190 | /* ********************** Internal Procedures *********************** */ 191 | 192 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE disable_UI Dialog-Frame _DEFAULT-DISABLE 193 | PROCEDURE disable_UI : 194 | /*------------------------------------------------------------------------------ 195 | Purpose: DISABLE the User Interface 196 | Parameters: 197 | Notes: Here we clean-up the user-interface by deleting 198 | dynamic widgets we have created and/or hide 199 | frames. This procedure is usually called when 200 | we are ready to "clean-up" after running. 201 | ------------------------------------------------------------------------------*/ 202 | /* Hide all frames. */ 203 | HIDE FRAME Dialog-Frame. 204 | END PROCEDURE. 205 | 206 | /* _UIB-CODE-BLOCK-END */ 207 | &ANALYZE-RESUME 208 | 209 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE enable_UI Dialog-Frame _DEFAULT-ENABLE 210 | PROCEDURE enable_UI : 211 | /*------------------------------------------------------------------------------ 212 | Purpose: ENABLE the User Interface 213 | Parameters: 214 | Notes: Here we display/view/enable the widgets in the 215 | user-interface. In addition, OPEN all queries 216 | associated with each FRAME and BROWSE. 217 | These statements here are based on the "Other 218 | Settings" section of the widget Property Sheets. 219 | ------------------------------------------------------------------------------*/ 220 | DISPLAY fiGroupname 221 | WITH FRAME Dialog-Frame. 222 | ENABLE RECT-1 fiGroupname Btn_Cancel 223 | WITH FRAME Dialog-Frame. 224 | VIEW FRAME Dialog-Frame. 225 | {&OPEN-BROWSERS-IN-QUERY-Dialog-Frame} 226 | END PROCEDURE. 227 | 228 | /* _UIB-CODE-BLOCK-END */ 229 | &ANALYZE-RESUME 230 | -------------------------------------------------------------------------------- /dQuestion.w: -------------------------------------------------------------------------------- 1 | &ANALYZE-SUSPEND _VERSION-NUMBER UIB_v9r12 GUI 2 | &ANALYZE-RESUME 3 | &Scoped-define WINDOW-NAME CURRENT-WINDOW 4 | &Scoped-define FRAME-NAME Dialog-Frame 5 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _DEFINITIONS Dialog-Frame 6 | /*------------------------------------------------------------------------ 7 | 8 | Name: dQuestion.w 9 | Desc: Show window to user and give back which button was pressed 10 | 11 | ----------------------------------------------------------------------*/ 12 | /* This .W file was created with the Progress AppBuilder. */ 13 | /*----------------------------------------------------------------------*/ 14 | 15 | &IF DEFINED(UIB_is_Running) NE 0 &THEN 16 | DEFINE VARIABLE pcTitle AS CHARACTER NO-UNDO INITIAL 'Disconnect user'. 17 | DEFINE VARIABLE pcMessage AS CHARACTER NO-UNDO INITIAL 'Do you want to disconnect user "&1" from database "&2"?'. 18 | DEFINE VARIABLE pcButtons AS CHARACTER NO-UNDO INITIAL '&Yes,&No'. 19 | DEFINE VARIABLE plCanHide AS LOGICAL NO-UNDO INITIAL TRUE. 20 | DEFINE VARIABLE piButton AS INTEGER NO-UNDO INIT ?. 21 | DEFINE VARIABLE plDontShowAgain AS LOGICAL NO-UNDO INIT ?. 22 | &ELSE 23 | DEFINE INPUT PARAMETER pcTitle AS CHARACTER NO-UNDO INITIAL 'Disconnect user'. 24 | DEFINE INPUT PARAMETER pcMessage AS CHARACTER NO-UNDO INITIAL 'Do you want to disconnect user "&1" from database "&2"?'. 25 | DEFINE INPUT PARAMETER pcButtons AS CHARACTER NO-UNDO INITIAL '&Yes,&No'. 26 | DEFINE INPUT PARAMETER plCanHide AS LOGICAL NO-UNDO INITIAL TRUE. 27 | DEFINE OUTPUT PARAMETER piButton AS INTEGER NO-UNDO INITIAL ?. 28 | DEFINE OUTPUT PARAMETER plDontShowAgain AS LOGICAL NO-UNDO INITIAL ?. 29 | &ENDIF 30 | 31 | { DataDigger.i } 32 | 33 | /* Allow testing */ 34 | &IF DEFINED(UIB_is_running) <> 0 &THEN 35 | 36 | DEFINE VARIABLE hDiggerLib AS HANDLE NO-UNDO. 37 | RUN DataDiggerLib.p PERSISTENT SET hDiggerLib. 38 | SESSION:ADD-SUPER-PROCEDURE(hDiggerLib, SEARCH-TARGET). 39 | 40 | /* Load or create personalized ini files */ 41 | DEFINE VARIABLE cEnvironment AS CHARACTER NO-UNDO. 42 | DEFINE VARIABLE cProgDir AS CHARACTER NO-UNDO. 43 | 44 | cEnvironment = SUBSTITUTE('DataDigger-&1', getUserName()). 45 | OUTPUT to value(cProgDir + cEnvironment + '.ini') append. 46 | OUTPUT close. 47 | LOAD cEnvironment DIR cProgDir BASE-KEY 'ini' NO-ERROR. 48 | 49 | cEnvironment = 'DataDigger'. 50 | OUTPUT to value(cProgDir + cEnvironment + '.ini') append. 51 | OUTPUT close. 52 | LOAD cEnvironment DIR cProgDir BASE-KEY 'ini' NO-ERROR. 53 | 54 | &ENDIF 55 | 56 | /* _UIB-CODE-BLOCK-END */ 57 | &ANALYZE-RESUME 58 | 59 | 60 | &ANALYZE-SUSPEND _UIB-PREPROCESSOR-BLOCK 61 | 62 | /* ******************** Preprocessor Definitions ******************** */ 63 | 64 | &Scoped-define PROCEDURE-TYPE Dialog-Box 65 | &Scoped-define DB-AWARE no 66 | 67 | /* Name of designated FRAME-NAME and/or first browse and/or first query */ 68 | &Scoped-define FRAME-NAME Dialog-Frame 69 | 70 | /* Standard List Definitions */ 71 | &Scoped-Define ENABLED-OBJECTS EdMessage BtnYes 72 | &Scoped-Define DISPLAYED-OBJECTS tgDontShowAgain 73 | 74 | /* Custom List Definitions */ 75 | /* List-1,List-2,List-3,List-4,List-5,List-6 */ 76 | 77 | /* _UIB-PREPROCESSOR-BLOCK-END */ 78 | &ANALYZE-RESUME 79 | 80 | 81 | 82 | /* *********************** Control Definitions ********************** */ 83 | 84 | /* Define a dialog box */ 85 | 86 | /* Definitions of the field level widgets */ 87 | DEFINE BUTTON BtnCancel AUTO-END-KEY 88 | LABEL "Cancel" 89 | SIZE-PIXELS 75 BY 24 90 | BGCOLOR 8 . 91 | 92 | DEFINE BUTTON BtnNo AUTO-GO 93 | LABEL "&No" 94 | SIZE-PIXELS 75 BY 24 95 | BGCOLOR 8 . 96 | 97 | DEFINE BUTTON BtnYes AUTO-GO 98 | LABEL "&Yes" 99 | SIZE-PIXELS 75 BY 24 100 | BGCOLOR 8 . 101 | 102 | DEFINE VARIABLE EdMessage AS CHARACTER 103 | CONTEXT-HELP-ID 0 104 | VIEW-AS EDITOR NO-BOX 105 | SIZE-PIXELS 325 BY 74 NO-UNDO. 106 | 107 | DEFINE IMAGE imgQuestion TRANSPARENT 108 | SIZE-PIXELS 32 BY 36. 109 | 110 | DEFINE VARIABLE tgDontShowAgain AS LOGICAL INITIAL no 111 | LABEL "&Don't show this message again" 112 | VIEW-AS TOGGLE-BOX 113 | SIZE-PIXELS 215 BY 17 NO-UNDO. 114 | 115 | 116 | /* ************************ Frame Definitions *********************** */ 117 | 118 | DEFINE FRAME Dialog-Frame 119 | EdMessage AT Y 11 X 65 NO-LABEL NO-TAB-STOP 120 | BtnYes AT Y 115 X 145 121 | BtnNo AT Y 115 X 227 122 | BtnCancel AT Y 115 X 309 123 | tgDontShowAgain AT Y 145 X 5 124 | imgQuestion AT Y 11 X 10 125 | WITH VIEW-AS DIALOG-BOX KEEP-TAB-ORDER 126 | SIDE-LABELS NO-UNDERLINE THREE-D 127 | SIZE-PIXELS 402 BY 204 128 | TITLE "Question" 129 | DEFAULT-BUTTON BtnYes CANCEL-BUTTON BtnCancel. 130 | 131 | 132 | /* *********************** Procedure Settings ************************ */ 133 | 134 | &ANALYZE-SUSPEND _PROCEDURE-SETTINGS 135 | /* Settings for THIS-PROCEDURE 136 | Type: Dialog-Box 137 | Allow: Basic,Browse,DB-Fields,Query 138 | Other Settings: COMPILE 139 | */ 140 | &ANALYZE-RESUME _END-PROCEDURE-SETTINGS 141 | 142 | 143 | 144 | /* *********** Runtime Attributes and AppBuilder Settings *********** */ 145 | 146 | &ANALYZE-SUSPEND _RUN-TIME-ATTRIBUTES 147 | /* SETTINGS FOR DIALOG-BOX Dialog-Frame 148 | FRAME-NAME */ 149 | ASSIGN 150 | FRAME Dialog-Frame:SCROLLABLE = FALSE 151 | FRAME Dialog-Frame:HIDDEN = TRUE. 152 | 153 | /* SETTINGS FOR BUTTON BtnCancel IN FRAME Dialog-Frame 154 | NO-ENABLE */ 155 | /* SETTINGS FOR BUTTON BtnNo IN FRAME Dialog-Frame 156 | NO-ENABLE */ 157 | /* SETTINGS FOR EDITOR EdMessage IN FRAME Dialog-Frame 158 | NO-DISPLAY */ 159 | ASSIGN 160 | EdMessage:AUTO-RESIZE IN FRAME Dialog-Frame = TRUE 161 | EdMessage:READ-ONLY IN FRAME Dialog-Frame = TRUE. 162 | 163 | /* SETTINGS FOR IMAGE imgQuestion IN FRAME Dialog-Frame 164 | NO-ENABLE */ 165 | /* SETTINGS FOR TOGGLE-BOX tgDontShowAgain IN FRAME Dialog-Frame 166 | NO-ENABLE */ 167 | /* _RUN-TIME-ATTRIBUTES-END */ 168 | &ANALYZE-RESUME 169 | 170 | 171 | /* Setting information for Queries and Browse Widgets fields */ 172 | 173 | &ANALYZE-SUSPEND _QUERY-BLOCK DIALOG-BOX Dialog-Frame 174 | /* Query rebuild information for DIALOG-BOX Dialog-Frame 175 | _Options = "SHARE-LOCK" 176 | _Query is NOT OPENED 177 | */ /* DIALOG-BOX Dialog-Frame */ 178 | &ANALYZE-RESUME 179 | 180 | 181 | 182 | 183 | 184 | /* ************************ Control Triggers ************************ */ 185 | 186 | &Scoped-define SELF-NAME Dialog-Frame 187 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL Dialog-Frame Dialog-Frame 188 | ON WINDOW-CLOSE OF FRAME Dialog-Frame /* Question */ 189 | DO: 190 | APPLY "END-ERROR":U TO SELF. 191 | END. 192 | 193 | /* _UIB-CODE-BLOCK-END */ 194 | &ANALYZE-RESUME 195 | 196 | 197 | &Scoped-define SELF-NAME BtnCancel 198 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL BtnCancel Dialog-Frame 199 | ON CHOOSE OF BtnCancel IN FRAME Dialog-Frame /* Cancel */ 200 | DO: 201 | piButton = 3. 202 | plDontShowAgain = tgDontShowAgain:checked. 203 | END. 204 | 205 | /* _UIB-CODE-BLOCK-END */ 206 | &ANALYZE-RESUME 207 | 208 | 209 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL BtnCancel Dialog-Frame 210 | ON CURSOR-LEFT OF BtnCancel IN FRAME Dialog-Frame /* Cancel */ 211 | DO: 212 | APPLY "ENTRY" TO btnNo. 213 | END. 214 | 215 | /* _UIB-CODE-BLOCK-END */ 216 | &ANALYZE-RESUME 217 | 218 | 219 | &Scoped-define SELF-NAME BtnNo 220 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL BtnNo Dialog-Frame 221 | ON CHOOSE OF BtnNo IN FRAME Dialog-Frame /* No */ 222 | DO: 223 | piButton = 2. 224 | plDontShowAgain = tgDontShowAgain:checked. 225 | END. 226 | 227 | /* _UIB-CODE-BLOCK-END */ 228 | &ANALYZE-RESUME 229 | 230 | 231 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL BtnNo Dialog-Frame 232 | ON CURSOR-LEFT OF BtnNo IN FRAME Dialog-Frame /* No */ 233 | DO: 234 | APPLY "ENTRY" TO btnYes. 235 | END. 236 | 237 | /* _UIB-CODE-BLOCK-END */ 238 | &ANALYZE-RESUME 239 | 240 | 241 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL BtnNo Dialog-Frame 242 | ON CURSOR-RIGHT OF BtnNo IN FRAME Dialog-Frame /* No */ 243 | DO: 244 | APPLY "ENTRY" TO btnCancel. 245 | END. 246 | 247 | /* _UIB-CODE-BLOCK-END */ 248 | &ANALYZE-RESUME 249 | 250 | 251 | &Scoped-define SELF-NAME BtnYes 252 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL BtnYes Dialog-Frame 253 | ON CHOOSE OF BtnYes IN FRAME Dialog-Frame /* Yes */ 254 | DO: 255 | piButton = 1. 256 | plDontShowAgain = tgDontShowAgain:checked. 257 | END. 258 | 259 | /* _UIB-CODE-BLOCK-END */ 260 | &ANALYZE-RESUME 261 | 262 | 263 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL BtnYes Dialog-Frame 264 | ON CURSOR-RIGHT OF BtnYes IN FRAME Dialog-Frame /* Yes */ 265 | DO: 266 | APPLY "ENTRY" TO btnNo. 267 | END. 268 | 269 | /* _UIB-CODE-BLOCK-END */ 270 | &ANALYZE-RESUME 271 | 272 | 273 | &UNDEFINE SELF-NAME 274 | 275 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _MAIN-BLOCK Dialog-Frame 276 | 277 | 278 | /* *************************** Main Block *************************** */ 279 | /* Parent the dialog-box to the ACTIVE-WINDOW, if there is no parent. */ 280 | IF VALID-HANDLE(ACTIVE-WINDOW) AND FRAME {&FRAME-NAME}:PARENT EQ ? THEN 281 | FRAME {&FRAME-NAME}:PARENT = ACTIVE-WINDOW. 282 | 283 | 284 | DO ON ERROR UNDO, LEAVE 285 | ON END-KEY UNDO, LEAVE: 286 | 287 | RUN initializeObject. 288 | RUN enable_UI. 289 | 290 | /* Toggle for Don't Show Again is optional */ 291 | tgDontShowAgain:visible = plCanHide. 292 | tgDontShowAgain:sensitive = plCanHide. 293 | 294 | WAIT-FOR GO OF FRAME {&FRAME-NAME}. 295 | 296 | END. 297 | 298 | /* _UIB-CODE-BLOCK-END */ 299 | &ANALYZE-RESUME 300 | 301 | 302 | /* ********************** Internal Procedures *********************** */ 303 | 304 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE enable_UI Dialog-Frame _DEFAULT-ENABLE 305 | PROCEDURE enable_UI : 306 | /*------------------------------------------------------------------------------ 307 | Purpose: ENABLE the User Interface 308 | Parameters: 309 | Notes: Here we display/view/enable the widgets in the 310 | user-interface. In addition, OPEN all queries 311 | associated with each FRAME and BROWSE. 312 | These statements here are based on the "Other 313 | Settings" section of the widget Property Sheets. 314 | ------------------------------------------------------------------------------*/ 315 | DISPLAY tgDontShowAgain 316 | WITH FRAME Dialog-Frame. 317 | ENABLE EdMessage BtnYes 318 | WITH FRAME Dialog-Frame. 319 | VIEW FRAME Dialog-Frame. 320 | {&OPEN-BROWSERS-IN-QUERY-Dialog-Frame} 321 | END PROCEDURE. 322 | 323 | /* _UIB-CODE-BLOCK-END */ 324 | &ANALYZE-RESUME 325 | 326 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE initializeObject Dialog-Frame 327 | PROCEDURE initializeObject : 328 | /* 329 | * Init vars and frame 330 | */ 331 | DEFINE VARIABLE iNumButtons AS INTEGER NO-UNDO. 332 | DEFINE VARIABLE dMargin AS DECIMAL NO-UNDO. 333 | DEFINE VARIABLE iVertMargin AS INTEGER NO-UNDO. 334 | DEFINE VARIABLE cYesLabel AS CHARACTER NO-UNDO. 335 | DEFINE VARIABLE cNoLabel AS CHARACTER NO-UNDO. 336 | DEFINE VARIABLE cCancelLabel AS CHARACTER NO-UNDO. 337 | 338 | DO WITH FRAME {&FRAME-NAME}: 339 | 340 | /* Get fonts */ 341 | FRAME {&frame-name}:font = getFont('Default'). 342 | 343 | iNumButtons = NUM-ENTRIES(pcButtons). 344 | IF pcButtons = '' THEN pcButtons = 'OK'. 345 | 346 | /* Show Question-image or DD-logo */ 347 | IF pcMessage MATCHES "*?" THEN 348 | imgQuestion:load-image( getImagePath('Question.gif')) NO-ERROR. 349 | ELSE 350 | imgQuestion:load-image( getImagePath("DataDigger24x24.gif")) NO-ERROR. 351 | 352 | /* Replace fake NEWLINES with chr(10) */ 353 | pcMessage = REPLACE(pcMessage,'~~n',CHR(10)). 354 | 355 | /* Strip leading spaces */ 356 | pcMessage = TRIM(pcMessage). 357 | 358 | PUBLISH "debugInfo" (1, pcMessage). 359 | 360 | /* Make some room in the frame for moving around with widgets */ 361 | FRAME {&FRAME-NAME}:HEIGHT-PIXELS = FRAME {&FRAME-NAME}:HEIGHT-PIXELS * 2. 362 | 363 | ASSIGN 364 | FRAME {&FRAME-NAME}:TITLE = IF pcTitle > '' THEN pcTitle ELSE FRAME {&FRAME-NAME}:TITLE 365 | edMessage:SCREEN-VALUE = RIGHT-TRIM(pcMessage,CHR(10)) 366 | edMessage:INNER-LINES = edMessage:NUM-LINES 367 | dMargin = imgQuestion:COLUMN /* Use the editor Y as margin template */ 368 | iVertMargin = edMessage:Y 369 | btnYes:Y = edMessage:Y + edMessage:HEIGHT-PIXELS + iVertMargin 370 | btnNo:Y = btnYes:Y 371 | btnCancel:y = btnYes:Y 372 | . 373 | 374 | /* Toggle for Don't Show Again is optional */ 375 | IF plCanHide THEN 376 | DO: 377 | tgDontShowAgain:visible = plCanHide. 378 | tgDontShowAgain:sensitive = plCanHide. 379 | tgDontShowAgain:y = btnYes:Y + btnYes:height-pixels + iVertMargin. 380 | 381 | /* Add border top and bottom to ensure min heigth */ 382 | {&_proparse_ prolint-nowarn(overflow)} 383 | FRAME {&FRAME-NAME}:HEIGHT-PIXELS = tgDontShowAgain:Y + tgDontShowAgain:HEIGHT-PIXELS 384 | + FRAME {&FRAME-NAME}:BORDER-TOP-PIXELS 385 | + FRAME {&FRAME-NAME}:BORDER-BOTTOM-PIXELS 386 | + INTEGER(iVertMargin / 2) NO-ERROR. 387 | END. 388 | ELSE 389 | DO: 390 | tgDontShowAgain:visible = plCanHide. 391 | tgDontShowAgain:sensitive = plCanHide. 392 | tgDontShowAgain:y = 1. 393 | 394 | {&_proparse_ prolint-nowarn(overflow)} 395 | FRAME {&FRAME-NAME}:HEIGHT-PIXELS = btnYes:Y + btnYes:height-pixels 396 | + FRAME {&FRAME-NAME}:BORDER-TOP-PIXELS 397 | + FRAME {&FRAME-NAME}:BORDER-BOTTOM-PIXELS 398 | + INTEGER(iVertMargin / 2) NO-ERROR. 399 | 400 | END. 401 | 402 | ASSIGN 403 | btnNo:HIDDEN = iNumButtons < 2 404 | btnCancel:HIDDEN = iNumButtons < 3 405 | btnNo:SENSITIVE = NOT btnNo:HIDDEN 406 | btnCancel:SENSITIVE = NOT btnCancel:HIDDEN 407 | 408 | cYesLabel = ENTRY(1,pcButtons) 409 | cNoLabel = ENTRY(2,pcButtons) WHEN iNumButtons >= 2 410 | cCancelLabel = ENTRY(3,pcButtons) WHEN iNumButtons >= 3 411 | 412 | btnYes:LABEL = IF cYesLabel > '':U THEN cYesLabel 413 | ELSE IF iNumButtons = 1 THEN 'OK' ELSE btnYes:LABEL 414 | btnNo:LABEL = IF cNoLabel > '':U THEN cNoLabel ELSE btnNo:LABEL 415 | btnCancel:LABEL = IF cCancelLabel > '':U THEN cCancelLabel ELSE btnCancel:LABEL 416 | btnYes:width = MAX(btnYes:width,FONT-TABLE:GET-TEXT-WIDTH(btnYes:LABEL) + 1.5) 417 | btnNo:width = MAX(btnNo:width,FONT-TABLE:GET-TEXT-WIDTH(btnNo:LABEL) + 1.5) 418 | btnCancel:width = MAX(btnCancel:width,FONT-TABLE:GET-TEXT-WIDTH(btnCancel:LABEL) + 1.5) 419 | btnCancel:COLUMN = FRAME {&FRAME-NAME}:WIDTH - (btnCancel:width + dMargin) 420 | btnNo:COLUMN = IF btnCancel:HIDDEN 421 | THEN FRAME {&FRAME-NAME}:width - (btnNo:width + dMargin) 422 | ELSE btnCancel:COLUMN - (btnNo:width + (dMargin / 2)) 423 | btnYes:COLUMN = MAX(1, IF btnNo:HIDDEN 424 | THEN FRAME {&FRAME-NAME}:width - (btnYes:width + dMargin) 425 | ELSE btnNo:COLUMN - (btnYes:width + (dMargin / 2)) ). 426 | 427 | /* For some reasons, these #*$&# scrollbars keep coming back */ 428 | RUN showScrollBars(FRAME {&frame-name}:handle, NO, NO). /* KILL KILL KILL */ 429 | END. 430 | 431 | END PROCEDURE. 432 | 433 | /* _UIB-CODE-BLOCK-END */ 434 | &ANALYZE-RESUME 435 | 436 | -------------------------------------------------------------------------------- /frameLib.i: -------------------------------------------------------------------------------- 1 | &ANALYZE-SUSPEND _VERSION-NUMBER AB_v10r12 2 | &ANALYZE-RESUME 3 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _DEFINITIONS Include 4 | /*------------------------------------------------------------------------ 5 | 6 | Name: frameLib.i 7 | Desc: Generic code that is needed to reparent frames 8 | 9 | ------------------------------------------------------------------------*/ 10 | /* This .W file was created with the Progress AppBuilder. */ 11 | /*----------------------------------------------------------------------*/ 12 | 13 | /* *************************** Definitions ************************** */ 14 | 15 | /* _UIB-CODE-BLOCK-END */ 16 | &ANALYZE-RESUME 17 | 18 | 19 | &ANALYZE-SUSPEND _UIB-PREPROCESSOR-BLOCK 20 | 21 | /* ******************** Preprocessor Definitions ******************** */ 22 | 23 | 24 | 25 | /* _UIB-PREPROCESSOR-BLOCK-END */ 26 | &ANALYZE-RESUME 27 | 28 | 29 | 30 | /* *********************** Procedure Settings ************************ */ 31 | 32 | &ANALYZE-SUSPEND _PROCEDURE-SETTINGS 33 | /* Settings for THIS-PROCEDURE 34 | Type: Include 35 | Allow: 36 | Frames: 0 37 | Add Fields to: Neither 38 | Other Settings: INCLUDE-ONLY 39 | */ 40 | &ANALYZE-RESUME _END-PROCEDURE-SETTINGS 41 | 42 | /* ************************* Create Window ************************** */ 43 | 44 | &ANALYZE-SUSPEND _CREATE-WINDOW 45 | /* DESIGN Window definition (used by the UIB) 46 | CREATE WINDOW Include ASSIGN 47 | HEIGHT = 13.05 48 | WIDTH = 60. 49 | /* END WINDOW DEFINITION */ 50 | */ 51 | &ANALYZE-RESUME 52 | 53 | 54 | 55 | 56 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _MAIN-BLOCK Include 57 | 58 | 59 | /* *************************** Main Block *************************** */ 60 | 61 | RUN initFrames. 62 | 63 | /* _UIB-CODE-BLOCK-END */ 64 | &ANALYZE-RESUME 65 | 66 | 67 | /* ********************** Internal Procedures *********************** */ 68 | 69 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE initFrames Include 70 | PROCEDURE initFrames : 71 | /* Initialize frames 72 | */ 73 | DELETE WIDGET {&WINDOW-NAME}. 74 | {&WINDOW-NAME} = CURRENT-WINDOW. 75 | 76 | RUN reparentFrames(INPUT FRAME DEFAULT-FRAME:HANDLE, INPUT phParent). 77 | 78 | RUN enable_UI. 79 | 80 | /* Adjust the size of the frame to the rectange (if provided) */ 81 | IF VALID-HANDLE(phRectangle) THEN 82 | RUN setFrame ( INPUT phRectangle:X + 2 83 | , INPUT phRectangle:Y + 2 84 | , INPUT phRectangle:WIDTH-PIXELS - 4 85 | , INPUT phRectangle:HEIGHT-PIXELS - 4 86 | ). 87 | 88 | END PROCEDURE. /* initFrames */ 89 | 90 | /* _UIB-CODE-BLOCK-END */ 91 | &ANALYZE-RESUME 92 | 93 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE reparentFrames Include 94 | PROCEDURE reparentFrames : 95 | /* Reparent all frames 96 | */ 97 | DEFINE INPUT PARAMETER phOldParent AS HANDLE NO-UNDO. 98 | DEFINE INPUT PARAMETER phNewParent AS HANDLE NO-UNDO. 99 | 100 | /* Attach all frames on the main frame to the parent */ 101 | DEFINE VARIABLE hWidget AS HANDLE NO-UNDO. 102 | 103 | #FrameLoop: 104 | REPEAT: 105 | hWidget = phOldParent:FIRST-CHILD:FIRST-CHILD. 106 | IF NOT VALID-HANDLE(hWidget) THEN LEAVE #FrameLoop. 107 | IF hWidget:TYPE = 'FRAME' THEN hWidget:FRAME = phNewParent. 108 | END. 109 | 110 | END PROCEDURE. /* reparentFrames */ 111 | 112 | /* _UIB-CODE-BLOCK-END */ 113 | &ANALYZE-RESUME 114 | 115 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE setFrame Include 116 | PROCEDURE setFrame : 117 | /* Position the frame to a specified location with a specified size 118 | */ 119 | DEFINE INPUT PARAMETER piFrame-x AS INTEGER NO-UNDO. 120 | DEFINE INPUT PARAMETER piFrame-y AS INTEGER NO-UNDO. 121 | DEFINE INPUT PARAMETER piFrame-w AS INTEGER NO-UNDO. 122 | DEFINE INPUT PARAMETER piFrame-h AS INTEGER NO-UNDO. 123 | 124 | IF piFrame-w <> ? THEN 125 | DO: 126 | FRAME {&frame-name}:WIDTH-PIXELS = piFrame-w. 127 | FRAME {&frame-name}:VIRTUAL-WIDTH-PIXELS = piFrame-w. 128 | END. 129 | 130 | IF piFrame-h <> ? THEN 131 | DO: 132 | FRAME {&frame-name}:HEIGHT-PIXELS = piFrame-h. 133 | FRAME {&frame-name}:VIRTUAL-HEIGHT-PIXELS = piFrame-h. 134 | END. 135 | 136 | IF piFrame-x <> ? THEN FRAME {&frame-name}:X = piFrame-x. 137 | IF piFrame-y <> ? THEN FRAME {&frame-name}:Y = piFrame-y. 138 | 139 | END PROCEDURE. /* setFrame */ 140 | 141 | /* _UIB-CODE-BLOCK-END */ 142 | &ANALYZE-RESUME 143 | 144 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE viewFrame Include 145 | PROCEDURE viewFrame : 146 | /* Show or hide the frame 147 | */ 148 | DEFINE INPUT PARAMETER plView AS LOGICAL NO-UNDO. 149 | 150 | FRAME {&frame-name}:HIDDEN = NOT plView. 151 | IF plView THEN APPLY 'entry' TO FRAME {&frame-name}. 152 | 153 | END PROCEDURE. /* viewFrame */ 154 | 155 | /* _UIB-CODE-BLOCK-END */ 156 | &ANALYZE-RESUME 157 | 158 | -------------------------------------------------------------------------------- /generate-Your-Own-Code.w: -------------------------------------------------------------------------------- 1 | &ANALYZE-SUSPEND _VERSION-NUMBER AB_v10r12 GUI 2 | &ANALYZE-RESUME 3 | &Scoped-define WINDOW-NAME C-Win 4 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _DEFINITIONS C-Win 5 | /*------------------------------------------------------------------------ 6 | 7 | Name: generate-Your-Own-Code.w 8 | Desc: Show info on how to create your own generate procedure 9 | 10 | ----------------------------------------------------------------------*/ 11 | /* This .W file was created with the Progress AppBuilder. */ 12 | /*----------------------------------------------------------------------*/ 13 | 14 | CREATE WIDGET-POOL. 15 | { DataDigger.i } 16 | 17 | /* Parameters Definitions --- */ 18 | 19 | &IF DEFINED(UIB_IS_RUNNING) = 0 &THEN 20 | DEFINE INPUT PARAMETER pcDatabase AS CHARACTER NO-UNDO. 21 | DEFINE INPUT PARAMETER pcTable AS CHARACTER NO-UNDO. 22 | DEFINE INPUT PARAMETER TABLE FOR ttField. 23 | DEFINE INPUT PARAMETER TABLE FOR ttIndex. 24 | &ELSE 25 | DEFINE VARIABLE pcDatabase AS CHARACTER NO-UNDO INITIAL 'sports'. 26 | DEFINE VARIABLE pcTable AS CHARACTER NO-UNDO INITIAL 'sales-rep'. 27 | 28 | DEFINE VARIABLE hLib AS HANDLE NO-UNDO. 29 | RUN datadiggerlib.p PERSISTENT SET hLib. 30 | THIS-PROCEDURE:ADD-SUPER-PROCEDURE(hLib,SEARCH-TARGET). 31 | 32 | RUN getDummyScheme.p(OUTPUT TABLE ttField, OUTPUT TABLE ttIndex). 33 | &ENDIF 34 | 35 | /* _UIB-CODE-BLOCK-END */ 36 | &ANALYZE-RESUME 37 | 38 | 39 | &ANALYZE-SUSPEND _UIB-PREPROCESSOR-BLOCK 40 | 41 | /* ******************** Preprocessor Definitions ******************** */ 42 | 43 | &Scoped-define PROCEDURE-TYPE Window 44 | &Scoped-define DB-AWARE no 45 | 46 | /* Name of designated FRAME-NAME and/or first browse and/or first query */ 47 | &Scoped-define FRAME-NAME frMain 48 | 49 | /* Standard List Definitions */ 50 | &Scoped-Define ENABLED-OBJECTS edDefinition 51 | &Scoped-Define DISPLAYED-OBJECTS edDefinition 52 | 53 | /* Custom List Definitions */ 54 | /* List-1,List-2,List-3,List-4,List-5,List-6 */ 55 | 56 | /* _UIB-PREPROCESSOR-BLOCK-END */ 57 | &ANALYZE-RESUME 58 | 59 | 60 | 61 | /* *********************** Control Definitions ********************** */ 62 | 63 | /* Define the widget handle for the window */ 64 | DEFINE VAR C-Win AS WIDGET-HANDLE NO-UNDO. 65 | 66 | /* Definitions of the field level widgets */ 67 | DEFINE VARIABLE edDefinition AS CHARACTER 68 | VIEW-AS EDITOR NO-WORD-WRAP SCROLLBAR-HORIZONTAL SCROLLBAR-VERTICAL LARGE 69 | SIZE-PIXELS 625 BY 340 70 | FONT 0 NO-UNDO. 71 | 72 | 73 | /* ************************ Frame Definitions *********************** */ 74 | 75 | DEFINE FRAME frMain 76 | edDefinition AT Y 5 X 5 NO-LABEL 77 | WITH 1 DOWN NO-BOX KEEP-TAB-ORDER OVERLAY 78 | SIDE-LABELS NO-UNDERLINE THREE-D 79 | AT COL 1 ROW 1 80 | SIZE 127 BY 16.67 . 81 | 82 | 83 | /* *********************** Procedure Settings ************************ */ 84 | 85 | &ANALYZE-SUSPEND _PROCEDURE-SETTINGS 86 | /* Settings for THIS-PROCEDURE 87 | Type: Window 88 | Allow: Basic,Browse,DB-Fields,Window,Query 89 | Other Settings: COMPILE 90 | */ 91 | &ANALYZE-RESUME _END-PROCEDURE-SETTINGS 92 | 93 | /* ************************* Create Window ************************** */ 94 | 95 | &ANALYZE-SUSPEND _CREATE-WINDOW 96 | IF SESSION:DISPLAY-TYPE = "GUI":U THEN 97 | CREATE WINDOW C-Win ASSIGN 98 | HIDDEN = YES 99 | TITLE = "Generate Your own code" 100 | HEIGHT = 16.71 101 | WIDTH = 127.6 102 | MAX-HEIGHT = 40 103 | MAX-WIDTH = 320 104 | VIRTUAL-HEIGHT = 40 105 | VIRTUAL-WIDTH = 320 106 | RESIZE = no 107 | SCROLL-BARS = no 108 | STATUS-AREA = no 109 | BGCOLOR = ? 110 | FGCOLOR = ? 111 | KEEP-FRAME-Z-ORDER = yes 112 | THREE-D = yes 113 | MESSAGE-AREA = no 114 | SENSITIVE = yes. 115 | ELSE {&WINDOW-NAME} = CURRENT-WINDOW. 116 | /* END WINDOW DEFINITION */ 117 | &ANALYZE-RESUME 118 | 119 | 120 | 121 | /* *********** Runtime Attributes and AppBuilder Settings *********** */ 122 | 123 | &ANALYZE-SUSPEND _RUN-TIME-ATTRIBUTES 124 | /* SETTINGS FOR WINDOW C-Win 125 | VISIBLE,,RUN-PERSISTENT */ 126 | /* SETTINGS FOR FRAME frMain 127 | FRAME-NAME */ 128 | ASSIGN 129 | edDefinition:READ-ONLY IN FRAME frMain = TRUE. 130 | 131 | IF SESSION:DISPLAY-TYPE = "GUI":U AND VALID-HANDLE(C-Win) 132 | THEN C-Win:HIDDEN = no. 133 | 134 | /* _RUN-TIME-ATTRIBUTES-END */ 135 | &ANALYZE-RESUME 136 | 137 | 138 | 139 | 140 | 141 | /* ************************ Control Triggers ************************ */ 142 | 143 | &Scoped-define SELF-NAME C-Win 144 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL C-Win C-Win 145 | ON END-ERROR OF C-Win /* Generate Your own code */ 146 | OR ENDKEY OF {&WINDOW-NAME} ANYWHERE DO: 147 | /* This case occurs when the user presses the "Esc" key. 148 | In a persistently run window, just ignore this. If we did not, the 149 | application would exit. */ 150 | IF THIS-PROCEDURE:PERSISTENT THEN RETURN NO-APPLY. 151 | END. 152 | 153 | /* _UIB-CODE-BLOCK-END */ 154 | &ANALYZE-RESUME 155 | 156 | 157 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL C-Win C-Win 158 | ON WINDOW-CLOSE OF C-Win /* Generate Your own code */ 159 | DO: 160 | /* This event will close the window and terminate the procedure. */ 161 | APPLY "CLOSE":U TO THIS-PROCEDURE. 162 | RETURN NO-APPLY. 163 | END. 164 | 165 | /* _UIB-CODE-BLOCK-END */ 166 | &ANALYZE-RESUME 167 | 168 | 169 | &UNDEFINE SELF-NAME 170 | 171 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _MAIN-BLOCK C-Win 172 | 173 | 174 | /* *************************** Main Block *************************** */ 175 | 176 | /* Set CURRENT-WINDOW: this will parent dialog-boxes and frames. */ 177 | ASSIGN CURRENT-WINDOW = {&WINDOW-NAME} 178 | THIS-PROCEDURE:CURRENT-WINDOW = {&WINDOW-NAME}. 179 | 180 | /* The CLOSE event can be used from inside or outside the procedure to */ 181 | /* terminate it. */ 182 | ON CLOSE OF THIS-PROCEDURE 183 | RUN disable_UI. 184 | 185 | /* Best default for GUI applications is... */ 186 | PAUSE 0 BEFORE-HIDE. 187 | 188 | /* Now enable the interface and wait for the exit condition. */ 189 | /* (NOTE: handle ERROR and END-KEY so cleanup code will always fire. */ 190 | MAIN-BLOCK: 191 | DO ON ERROR UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK 192 | ON END-KEY UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK: 193 | 194 | SESSION:DEBUG-ALERT = YES. 195 | 196 | RUN enable_UI. 197 | RUN initObject. 198 | 199 | IF NOT THIS-PROCEDURE:PERSISTENT THEN 200 | WAIT-FOR CLOSE OF THIS-PROCEDURE. 201 | END. 202 | 203 | /* _UIB-CODE-BLOCK-END */ 204 | &ANALYZE-RESUME 205 | 206 | 207 | /* ********************** Internal Procedures *********************** */ 208 | 209 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE disable_UI C-Win _DEFAULT-DISABLE 210 | PROCEDURE disable_UI : 211 | /*------------------------------------------------------------------------------ 212 | Purpose: DISABLE the User Interface 213 | Parameters: 214 | Notes: Here we clean-up the user-interface by deleting 215 | dynamic widgets we have created and/or hide 216 | frames. This procedure is usually called when 217 | we are ready to "clean-up" after running. 218 | ------------------------------------------------------------------------------*/ 219 | /* Delete the WINDOW we created */ 220 | IF SESSION:DISPLAY-TYPE = "GUI":U AND VALID-HANDLE(C-Win) 221 | THEN DELETE WIDGET C-Win. 222 | IF THIS-PROCEDURE:PERSISTENT THEN DELETE PROCEDURE THIS-PROCEDURE. 223 | END PROCEDURE. 224 | 225 | /* _UIB-CODE-BLOCK-END */ 226 | &ANALYZE-RESUME 227 | 228 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE enable_UI C-Win _DEFAULT-ENABLE 229 | PROCEDURE enable_UI : 230 | /*------------------------------------------------------------------------------ 231 | Purpose: ENABLE the User Interface 232 | Parameters: 233 | Notes: Here we display/view/enable the widgets in the 234 | user-interface. In addition, OPEN all queries 235 | associated with each FRAME and BROWSE. 236 | These statements here are based on the "Other 237 | Settings" section of the widget Property Sheets. 238 | ------------------------------------------------------------------------------*/ 239 | DISPLAY edDefinition 240 | WITH FRAME frMain IN WINDOW C-Win. 241 | ENABLE edDefinition 242 | WITH FRAME frMain IN WINDOW C-Win. 243 | {&OPEN-BROWSERS-IN-QUERY-frMain} 244 | VIEW C-Win. 245 | END PROCEDURE. 246 | 247 | /* _UIB-CODE-BLOCK-END */ 248 | &ANALYZE-RESUME 249 | 250 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE initObject C-Win 251 | PROCEDURE initObject : 252 | /*------------------------------------------------------------------------------ 253 | Purpose: 254 | Parameters: 255 | Notes: 256 | ------------------------------------------------------------------------------*/ 257 | 258 | DO WITH FRAME frMain: 259 | 260 | /* Prepare window and frame */ 261 | FRAME {&FRAME-NAME}:FONT = getFont('Default'). 262 | edDefinition:FONT = getFont('Fixed'). 263 | 264 | edDefinition:INSERT-STRING(SUBSTITUTE('Create your own code for table &1.&2', pcDatabase, pcTable)). 265 | edDefinition:INSERT-STRING('~n'). 266 | edDefinition:INSERT-STRING('~nYou can create your own code-creation program by creating a program in the DataDigger'). 267 | edDefinition:INSERT-STRING('~nfolder that has a name that starts with "generate-" and a signature that looks like:'). 268 | edDefinition:INSERT-STRING('~n'). 269 | edDefinition:INSERT-STRING('~nDEFINE INPUT PARAMETER pcDatabase AS CHARACTER NO-UNDO. '). 270 | edDefinition:INSERT-STRING('~nDEFINE INPUT PARAMETER pcTable AS CHARACTER NO-UNDO. '). 271 | edDefinition:INSERT-STRING('~nDEFINE INPUT PARAMETER TABLE FOR ttField. '). 272 | edDefinition:INSERT-STRING('~nDEFINE INPUT PARAMETER TABLE FOR ttIndex. '). 273 | edDefinition:INSERT-STRING('~n'). 274 | edDefinition:INSERT-STRING('~nThe easiest way to create your own is by looking at the shipped programs. Just copy '). 275 | edDefinition:INSERT-STRING('~none of those and adjust to your needs. '). 276 | edDefinition:INSERT-STRING('~n'). 277 | edDefinition:INSERT-STRING('~nThe temp-tables you receive as parameters are defined in DataDigger.i so take '). 278 | edDefinition:INSERT-STRING('~na look there to see which fields they hold'). 279 | edDefinition:INSERT-STRING('~n'). 280 | edDefinition:INSERT-STRING('~n'). 281 | edDefinition:INSERT-STRING('~nGood luck and happy Digging!'). 282 | edDefinition:INSERT-STRING('~n'). 283 | edDefinition:INSERT-STRING('~n'). 284 | edDefinition:INSERT-STRING('~nPS: If you created a really useful generate routine, feel free to mail it to '). 285 | edDefinition:INSERT-STRING('~n me for inclusion in a next version of DataDigger'). 286 | 287 | END. 288 | 289 | END PROCEDURE. /* initObject */ 290 | 291 | /* _UIB-CODE-BLOCK-END */ 292 | &ANALYZE-RESUME 293 | 294 | 295 | -------------------------------------------------------------------------------- /getDataserver.p: -------------------------------------------------------------------------------- 1 | /*------------------------------------------------------------------------ 2 | 3 | Name: getDataserver.p 4 | Desc: Fetch dataserver info and connect 5 | 6 | ------------------------------------------------------------------------*/ 7 | 8 | { DataDigger.i } 9 | 10 | /* If set to YES, then support >1 dataservers per schemaholder */ 11 | &scoped-define support-more-dataservers yes 12 | 13 | DEFINE INPUT PARAMETER pcLDbNameSchema AS CHARACTER NO-UNDO. 14 | DEFINE INPUT-OUTPUT PARAMETER piDataserverNr AS INTEGER NO-UNDO. 15 | DEFINE INPUT-OUTPUT PARAMETER TABLE FOR ttDataserver. 16 | 17 | DEFINE VARIABLE cDbComm AS CHARACTER NO-UNDO. 18 | DEFINE VARIABLE cUserName AS CHARACTER NO-UNDO. 19 | DEFINE VARIABLE cPassword AS CHARACTER NO-UNDO. 20 | DEFINE VARIABLE cForceUserName AS CHARACTER NO-UNDO. 21 | DEFINE VARIABLE cForcePassword AS CHARACTER NO-UNDO. 22 | DEFINE VARIABLE cLogNameDS AS CHARACTER NO-UNDO. 23 | DEFINE VARIABLE cPhysNameDS AS CHARACTER NO-UNDO. 24 | DEFINE VARIABLE cDatabaseType AS CHARACTER NO-UNDO. 25 | DEFINE VARIABLE cStatus AS CHARACTER NO-UNDO. 26 | DEFINE VARIABLE cAddParams AS CHARACTER NO-UNDO. 27 | DEFINE VARIABLE cConnectedDatabases AS CHARACTER NO-UNDO. 28 | DEFINE VARIABLE cDontShow AS CHARACTER NO-UNDO. 29 | DEFINE VARIABLE lDontShowSchemaHr AS LOGICAL NO-UNDO. 30 | DEFINE VARIABLE hWindow AS HANDLE NO-UNDO. 31 | DEFINE VARIABLE iStartTime AS INT64 NO-UNDO. 32 | DEFINE VARIABLE iDataserverCount AS INTEGER NO-UNDO. 33 | DEFINE VARIABLE iItem AS INTEGER NO-UNDO. 34 | 35 | DEFINE BUFFER bDb FOR dictdb._db. 36 | 37 | #GetDataserverInfo: 38 | FOR EACH bDb 39 | WHERE bDb._db-slave = YES NO-LOCK 40 | BY bDb._db-name: 41 | 42 | /* Avoid error: "Could not create buffer object for table TPROGRESS._Db. (7334)" */ 43 | FIND FIRST ttDataserver WHERE ttDataserver.cLDbNameDataserver = bDb._db-name NO-ERROR. 44 | 45 | IF AVAILABLE ttDataserver 46 | AND NOT ttDataserver.lConnected 47 | AND CONNECTED(ttDataserver.cLDbNameDataserver) THEN ttDataserver.lConnected = YES. 48 | 49 | IF AVAILABLE ttDataserver 50 | AND ttDataserver.lConnected = YES THEN RETURN. 51 | 52 | ASSIGN 53 | iDataserverCount = iDataserverCount + 1 54 | cUserName = "" 55 | cPassword = "" 56 | cLogNameDS = bDb._db-name 57 | cPhysNameDS = bDb._db-addr 58 | cDatabaseType = bDb._db-type 59 | cDbComm = bDb._db-comm 60 | lDontShowSchemaHr = NO. 61 | 62 | RUN removeWhiteSpace(INPUT-OUTPUT cDbComm). 63 | RUN getParameter(INPUT "-db", INPUT cDbComm, INPUT-OUTPUT cPhysNameDS). 64 | RUN getParameter(INPUT "-ld", INPUT cDbComm, INPUT-OUTPUT cLogNameDS). 65 | RUN getParameter(INPUT "-U" , INPUT cDbComm, INPUT-OUTPUT cUserName). 66 | RUN getParameter(INPUT "-P" , INPUT cDbComm, INPUT-OUTPUT cPassword). 67 | 68 | IF cUserName = "" THEN 69 | ASSIGN 70 | cUserName = getUserName() 71 | cUserName = (IF CAN-DO("AS400", cDatabaseType) THEN /* AS400 can only connect with userid in caps */ 72 | CAPS(cUserName) 73 | ELSE 74 | cUserName). 75 | 76 | USE "DataDigger". 77 | GET-KEY-VALUE SECTION "DataDigger:dataservers" KEY pcLDbNameSchema + ":username" VALUE cForceUserName. 78 | GET-KEY-VALUE SECTION "DataDigger:dataservers" KEY pcLDbNameSchema + ":password" VALUE cForcePassword. 79 | GET-KEY-VALUE SECTION "DataDigger:dataservers" KEY pcLDbNameSchema + ":addparms" VALUE cAddParams. 80 | GET-KEY-VALUE SECTION "DataDigger:dataservers" KEY pcLDbNameSchema + ":dontshow" VALUE cDontShow. 81 | USE "". 82 | 83 | IF cForceUserName <> ? AND cForceUserName <> "" THEN cUserName = cForceUserName. 84 | IF cForcePassword <> ? AND cForcePassword <> "" THEN cPassword = cForcePassword. 85 | 86 | IF cAddParams = ? THEN cAddParams = "". 87 | 88 | IF LOOKUP(cDontShow, "yes,true") > 0 THEN lDontShowSchemaHr = YES. 89 | 90 | RUN removeParameter(INPUT "-db", INPUT YES, INPUT-OUTPUT cDbComm). 91 | RUN removeParameter(INPUT "-ld", INPUT YES, INPUT-OUTPUT cDbComm). 92 | RUN removeParameter(INPUT "-U" , INPUT YES, INPUT-OUTPUT cDbComm). 93 | RUN removeParameter(INPUT "-P" , INPUT YES, INPUT-OUTPUT cDbComm). 94 | 95 | FIND ttDataserver 96 | WHERE ttDataserver.cLDbNameSchema = pcLDbNameSchema 97 | AND ttDataserver.cLDbNameDataserver = cLogNameDS NO-ERROR. 98 | 99 | IF NOT AVAILABLE ttDataserver THEN 100 | DO: 101 | CREATE ttDataserver. 102 | ASSIGN 103 | piDataserverNr = piDataserverNr + 1 104 | ttDataserver.iServerNr = piDataserverNr 105 | ttDataserver.cLDbNameSchema = pcLDbNameSchema 106 | ttDataserver.cLDbNameDataserver = cLogNameDS 107 | ttDataserver.cPDbNameDataserver = cPhysNameDS 108 | ttDataserver.cDbType = cDatabaseType 109 | ttDataserver.cConnectString = TRIM(SUBSTITUTE( "-db &1 -ld &2 &3 -U &4 -P &5 &6" 110 | , cPhysNameDS 111 | , cLogNameDS 112 | , cDbComm 113 | , cUserName 114 | , cPassword 115 | , cAddParams 116 | )) 117 | ttDataserver.lDontShowSchemaHr = lDontShowSchemaHr 118 | . 119 | END. /* IF NOT AVAILABLE ttDataserver */ 120 | END. /* FOR EACH bDb */ 121 | 122 | &if "{&support-more-dataservers}" <> "yes" &then 123 | IF iDataserverCount > 1 THEN 124 | DO: 125 | FOR EACH ttDataserver WHERE ttDataserver.iServerNr <> 1: 126 | DELETE ttDataserver. 127 | END. 128 | 129 | FIND ttDataserver WHERE ttDataserver.iServerNr = 1. /* Die is er */ 130 | 131 | MESSAGE 132 | SUBSTITUTE( TRIM( 133 | "For schemaholder '&1' are &2 dataservers defined." + "~n" + 134 | "Currently there is support for max 1 dataserver per" + "~n" + 135 | "schemaholder. The first dataserver (alphabetically)" + "~n" + 136 | "will be used, which is '&3'." + "~n" + 137 | "", "~n") 138 | , pcLDbNameSchema 139 | , iDataserverCount 140 | , ttDataserver.cLDbNameDataserver 141 | ) 142 | VIEW-AS ALERT-BOX WARNING BUTTONS OK. 143 | END. 144 | &endif 145 | 146 | FOR EACH ttDataserver BY ttDataserver.iServerNr: 147 | IF NOT CONNECTED(ttDataserver.cLDbNameDataserver) THEN 148 | DO: 149 | ASSIGN 150 | cStatus = SUBSTITUTE( "Connecting &1 (&2) ..." 151 | , ttDataserver.cLDbNameDataserver 152 | , ttDataserver.cDbType 153 | ). 154 | 155 | RUN showMessage.p("DataDigger", cStatus, OUTPUT hWindow). 156 | 157 | /* Enforce small delay */ 158 | iStartTime = ETIME. 159 | REPEAT WHILE ETIME < iStartTime + 1000: /* small delay */ END. 160 | 161 | CONNECT VALUE(ttDataserver.cConnectString) NO-ERROR. 162 | 163 | IF ERROR-STATUS:GET-MESSAGE(1) <> ? 164 | AND ERROR-STATUS:GET-MESSAGE(1) <> "" 165 | AND (IF ERROR-STATUS:GET-NUMBER(1) = 43 AND program-name(3) BEGINS "btnDisconnectChoose " THEN 166 | NO 167 | ELSE 168 | YES) 169 | THEN 170 | DO: 171 | MESSAGE 172 | SUBSTITUTE( TRIM( 173 | "For schemaholder '&1' &2 dataserver '&3'" + "~n" + 174 | "could not be connected. Error returned:" + "~n" + 175 | "" + "~n" + 176 | ERROR-STATUS:GET-MESSAGE(1) + "~n" + 177 | "" + "~n" + 178 | "Dataserver connection string:" + "~n" + 179 | "" + "~n" + 180 | "&4" + "~n" + 181 | "", "~n") 182 | , pcLDbNameSchema 183 | , ttDataserver.cDbType 184 | , ttDataserver.cLDbNameDataserver 185 | , ttDataserver.cConnectString 186 | ) 187 | VIEW-AS ALERT-BOX WARNING BUTTONS OK. 188 | END. 189 | 190 | DELETE WIDGET hWindow. 191 | END. 192 | 193 | ttDataserver.lConnected = CONNECTED(ttDataserver.cLDbNameDataserver). 194 | END. /* FOR EACH */ 195 | 196 | if program-name(3) begins "btnDisconnectChoose " then 197 | do: 198 | do iItem = 1 to num-dbs: 199 | cConnectedDatabases = trim(cConnectedDatabases + "," + ldbname(iItem), ","). 200 | end. 201 | 202 | for each ttDataserver by ttDataserver.iServerNr: 203 | if not can-do(cConnectedDatabases, ttDataserver.cLDbNameSchema) then 204 | do: 205 | piDataserverNr = piDataserverNr - 1. 206 | delete ttDataserver. 207 | end. 208 | end. 209 | end. 210 | 211 | PROCEDURE removeParameter: 212 | DEFINE INPUT PARAMETER pcParam AS CHARACTER NO-UNDO. 213 | DEFINE INPUT PARAMETER plCheckFirst AS LOGICAL NO-UNDO. 214 | DEFINE INPUT-OUTPUT PARAMETER pcDbComm AS CHARACTER NO-UNDO. 215 | 216 | IF plCheckFirst AND LOOKUP(pcParam, pcDbComm, " ") = 0 THEN RETURN. 217 | 218 | BLOCKLoopRemove: 219 | REPEAT: 220 | IF LOOKUP(pcParam, pcDbComm, " ") > 0 THEN 221 | DO: 222 | ENTRY(LOOKUP(pcParam, pcDbComm, " ") + 1, pcDbComm, " ") = "". 223 | ENTRY(LOOKUP(pcParam, pcDbComm, " "), pcDbComm, " ") = "". 224 | END. 225 | ELSE 226 | LEAVE BLOCKLoopRemove. 227 | END. 228 | 229 | RUN removeWhiteSpace (INPUT-OUTPUT pcDbComm). 230 | 231 | END PROCEDURE. /* removeParameter */ 232 | 233 | 234 | PROCEDURE getParameter: 235 | DEFINE INPUT PARAMETER pcParam AS CHARACTER NO-UNDO. 236 | DEFINE INPUT PARAMETER pcDbComm AS CHARACTER NO-UNDO. 237 | DEFINE INPUT-OUTPUT PARAMETER pcVar AS CHARACTER NO-UNDO. 238 | 239 | DEFINE VARIABLE iPos AS INTEGER NO-UNDO. 240 | 241 | iPos = LOOKUP(pcParam, pcDbComm, " "). 242 | IF iPos > 0 THEN pcVar = ENTRY(iPos + 1, pcDbComm, " "). 243 | 244 | END PROCEDURE. /* getParameter */ 245 | 246 | 247 | PROCEDURE removeWhiteSpace: 248 | DEFINE INPUT-OUTPUT PARAMETER pcDbComm AS CHARACTER NO-UNDO. 249 | 250 | pcDbComm = TRIM(pcDbComm). 251 | 252 | BLOCKLoopDouble: 253 | REPEAT: 254 | IF INDEX(pcDbComm, " ") > 0 THEN 255 | pcDbComm = REPLACE(pcDbComm, " ", " "). 256 | ELSE 257 | LEAVE BLOCKLoopDouble. 258 | END. 259 | END PROCEDURE. /* removeWhiteSpace */ -------------------------------------------------------------------------------- /getDummyScheme.p: -------------------------------------------------------------------------------- 1 | /*------------------------------------------------------------------------ 2 | 3 | Name: getDummyScheme.p 4 | Desc: Generate some dummy data for testing generate procedures 5 | 6 | ----------------------------------------------------------------------*/ 7 | 8 | { DataDigger.i } 9 | 10 | DEFINE OUTPUT PARAMETER TABLE FOR ttField. 11 | DEFINE OUTPUT PARAMETER TABLE FOR ttIndex. 12 | 13 | RUN createFields. 14 | RUN createIndexes. 15 | 16 | PROCEDURE createFields: 17 | 18 | CREATE ttField. 19 | ASSIGN 20 | ttField.cFieldName = 'rep-nr' 21 | ttField.lShow = TRUE 22 | ttField.cDataType = 'INTEGER' 23 | ttField.cFormat = '>>>9' 24 | ttField.cLabel = 'Rep nr'. 25 | 26 | CREATE ttField. 27 | ASSIGN 28 | ttField.cFieldName = 'rep-name' 29 | ttField.lShow = TRUE 30 | ttField.cDataType = 'CHARACTER' 31 | ttField.cFormat = 'x(30)' 32 | ttField.cLabel = 'Rep name'. 33 | 34 | CREATE ttField. 35 | ASSIGN 36 | ttField.cFieldName = 'region' 37 | ttField.lShow = FALSE 38 | ttField.cDataType = 'CHARACTER' 39 | ttField.cFormat = 'x(8)' 40 | ttField.cLabel = 'Region'. 41 | 42 | CREATE ttField. 43 | ASSIGN 44 | ttField.cFieldName = 'month-quota' 45 | ttField.lShow = FALSE 46 | ttField.cDataType = 'INTEGER' 47 | ttField.cFormat = '->,>>>,>>9' 48 | ttField.cLabel = 'Rep name' 49 | ttField.iExtent = 12. 50 | 51 | END PROCEDURE. /* createFields */ 52 | 53 | 54 | PROCEDURE createIndexes: 55 | 56 | CREATE ttIndex. 57 | ASSIGN 58 | ttIndex.cIndexName = 'iPrim' 59 | ttIndex.cIndexFlags = 'P U' 60 | ttIndex.cFieldList = 'rep-nr'. 61 | 62 | CREATE ttIndex. 63 | ASSIGN 64 | ttIndex.cIndexName = 'iRegion' 65 | ttIndex.cIndexFlags = '' 66 | ttIndex.cFieldList = 'region,rep-name'. 67 | 68 | END PROCEDURE. /* createIndexes */ 69 | -------------------------------------------------------------------------------- /getRemoteFile.p: -------------------------------------------------------------------------------- 1 | /*------------------------------------------------------------------------ 2 | 3 | Name: getRemoteFile.p 4 | Desc: Return a remotely hosted file as longchar 5 | 6 | ------------------------------------------------------------------------*/ 7 | 8 | DEFINE INPUT PARAMETER pcRemoteFile AS CHARACTER NO-UNDO. 9 | DEFINE OUTPUT PARAMETER pcContents AS LONGCHAR NO-UNDO. 10 | 11 | {&_proparse_prolint-nowarn(varusage)} 12 | DEFINE VARIABLE iResult AS INT64 NO-UNDO. 13 | DEFINE VARIABLE cTempFile AS CHARACTER NO-UNDO. 14 | 15 | /* Figure out a temp name */ 16 | #GetName: 17 | REPEAT: 18 | cTempFile = SUBSTITUTE('&1_remote-file-&2.txt', SESSION:TEMP-DIRECTORY, ETIME). 19 | IF SEARCH(cTempFile) = ? THEN LEAVE #GetName. 20 | END. 21 | 22 | /* Download */ 23 | RUN DeleteURLCacheEntry (INPUT pcRemoteFile). 24 | 25 | {&_proparse_prolint-nowarn(varusage)} 26 | IF SESSION:CPINTERNAL = 'UTF8' 27 | THEN RUN urlDownloadToFileW (0, pcRemoteFile, cTempFile, 0, 0, OUTPUT iResult). 28 | ELSE RUN urlDownloadToFileA (0, pcRemoteFile, cTempFile, 0, 0, OUTPUT iResult). 29 | 30 | /* Read */ 31 | IF SEARCH(cTempFile) <> ? THEN COPY-LOB FILE cTempFile TO pcContents. 32 | pcContents = TRIM(pcContents). 33 | 34 | /* Cleanup */ 35 | OS-DELETE VALUE(cTempFile). 36 | -------------------------------------------------------------------------------- /getSchema.p: -------------------------------------------------------------------------------- 1 | /*------------------------------------------------------------------------ 2 | Name : getSchema.p 3 | Desc : Get the schema of the dictdb database 4 | 5 | Notes: 6 | This is in a separate .p because the alias is set for the dictdb. 7 | The reason this is done is because reading the schema statically 8 | is much faster than reading it via a dynamic query (factor 4 or 5) 9 | 10 | Input parameter ttTable should be passed BY-REFERENCE 11 | ----------------------------------------------------------------------*/ 12 | 13 | {DataDigger.i} 14 | 15 | DEFINE INPUT PARAMETER TABLE FOR ttTable. 16 | 17 | DEFINE BUFFER bDb FOR dictdb._Db. 18 | DEFINE BUFFER bFile FOR dictdb._File. 19 | DEFINE BUFFER bField FOR dictdb._Field. 20 | DEFINE BUFFER bTable FOR ttTable. 21 | 22 | FIND FIRST bTable NO-ERROR. 23 | FIND FIRST bDb NO-LOCK NO-ERROR. 24 | 25 | FOR EACH bDb NO-LOCK 26 | , EACH bFile NO-LOCK 27 | WHERE bFile._Db-recid = RECID(bDb) 28 | AND bFile._File-Number < 32768 29 | AND (IF bDb._Db-slave THEN bFile._For-Type = 'TABLE' ELSE TRUE) 30 | : 31 | 32 | CREATE bTable. 33 | ASSIGN 34 | bTable.cSchemaHolder = (IF bDb._Db-slave THEN LDBNAME('dictdb') ELSE '') /* [JAG 01-11-2019] */ 35 | bTable.cDatabase = (IF bDb._Db-slave THEN bDb._Db-name ELSE LDBNAME('dictdb')) 36 | bTable.cTableName = bFile._file-name 37 | bTable.cTableDesc = TRIM( (IF bFile._file-label <> ? AND bFile._file-label <> '' THEN bFile._file-label + ', ' ELSE '') 38 | + (IF bFile._desc <> ? AND bFile._desc <> '' AND bFile._desc <> bFile._file-label THEN bFile._desc ELSE '') 39 | , ' ,') 40 | bTable.cTableLabel = bFile._file-label 41 | bTable.lHidden = bFile._hidden 42 | bTable.lFrozen = bFile._frozen 43 | bTable.cCrc = STRING(bFile._crc) 44 | bTable.cCacheId = SUBSTITUTE('&1.&2.&3', bTable.cDatabase, bFile._file-name, bFile._crc) 45 | bTable.iFileNumber = bFile._file-number 46 | . 47 | 48 | /* Based on table name and -number, return the category for a table 49 | * 50 | * Application tables : _file-number > 0 AND _file-number < 32000 51 | * Schema tables : _file-number > -80 AND _file-number < 0 52 | * Virtual system tables: _file-number < -16384 53 | * SQL catalog tables : _file-name BEGINS "_sys" 54 | * Other tables : _file-number >= -16384 AND _file-number <= -80 55 | */ 56 | IF bFile._file-name BEGINS '_sys' THEN bTable.cCategory = 'SQL'. 57 | ELSE IF bFile._file-number > 0 AND bFile._file-number < 32000 THEN bTable.cCategory = 'Normal'. 58 | ELSE IF bFile._file-number > -80 AND bFile._file-number < 0 THEN bTable.cCategory = 'Schema'. 59 | ELSE IF bFile._file-number >= -16384 AND bFile._file-number <= -80 THEN bTable.cCategory = 'Other'. 60 | ELSE IF bFile._file-number < -16384 THEN bTable.cCategory = 'VST'. 61 | 62 | FOR EACH bField 63 | WHERE bField._File-recid = RECID(bFile) NO-LOCK: 64 | bTable.cFields = bTable.cFields + ',' + bField._Field-name. 65 | END. 66 | bTable.cFields = TRIM(bTable.cFields,','). 67 | END. 68 | -------------------------------------------------------------------------------- /getVersionInfo.p: -------------------------------------------------------------------------------- 1 | /*------------------------------------------------------------------------ 2 | 3 | Name: getVersionInfo.p 4 | Desc: Give back latest buildnr from DataDigger on GitHub 5 | 6 | ------------------------------------------------------------------------*/ 7 | 8 | DEFINE INPUT PARAMETER pcBranch AS CHARACTER NO-UNDO. 9 | DEFINE OUTPUT PARAMETER pcBuildNr AS CHARACTER NO-UNDO. 10 | 11 | IF LOOKUP(pcBranch,'master,develop') = 0 THEN RETURN. 12 | 13 | RUN getRemoteFile.p 14 | ( INPUT SUBSTITUTE('https://raw.githubusercontent.com/patrickTingen/DataDigger/&1/build.i', pcBranch) 15 | , OUTPUT pcBuildNr 16 | ). 17 | -------------------------------------------------------------------------------- /image/default_About.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_About.gif -------------------------------------------------------------------------------- /image/default_Add.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Add.gif -------------------------------------------------------------------------------- /image/default_Administration.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Administration.gif -------------------------------------------------------------------------------- /image/default_Ball.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Ball.gif -------------------------------------------------------------------------------- /image/default_Box-ok.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Box-ok.gif -------------------------------------------------------------------------------- /image/default_Box.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Box.gif -------------------------------------------------------------------------------- /image/default_Clear.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Clear.gif -------------------------------------------------------------------------------- /image/default_Clipboard.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Clipboard.gif -------------------------------------------------------------------------------- /image/default_Clone.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Clone.gif -------------------------------------------------------------------------------- /image/default_Connections.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Connections.gif -------------------------------------------------------------------------------- /image/default_DataDigger.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_DataDigger.ico -------------------------------------------------------------------------------- /image/default_DataDigger24x24.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_DataDigger24x24.gif -------------------------------------------------------------------------------- /image/default_DataDiggerLight.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_DataDiggerLight.ico -------------------------------------------------------------------------------- /image/default_DatePicker.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_DatePicker.gif -------------------------------------------------------------------------------- /image/default_Delete.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Delete.gif -------------------------------------------------------------------------------- /image/default_Dictionary.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Dictionary.gif -------------------------------------------------------------------------------- /image/default_Down.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Down.gif -------------------------------------------------------------------------------- /image/default_Dump.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Dump.gif -------------------------------------------------------------------------------- /image/default_Edit.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Edit.gif -------------------------------------------------------------------------------- /image/default_Editor.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Editor.gif -------------------------------------------------------------------------------- /image/default_Encode.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Encode.gif -------------------------------------------------------------------------------- /image/default_Excel.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Excel.gif -------------------------------------------------------------------------------- /image/default_Execute.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Execute.gif -------------------------------------------------------------------------------- /image/default_Filter.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Filter.gif -------------------------------------------------------------------------------- /image/default_FilterRed.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_FilterRed.gif -------------------------------------------------------------------------------- /image/default_First.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_First.gif -------------------------------------------------------------------------------- /image/default_Help.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Help.gif -------------------------------------------------------------------------------- /image/default_Html.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Html.gif -------------------------------------------------------------------------------- /image/default_Last.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Last.gif -------------------------------------------------------------------------------- /image/default_LeftDown.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_LeftDown.gif -------------------------------------------------------------------------------- /image/default_LeftUp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_LeftUp.gif -------------------------------------------------------------------------------- /image/default_List.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_List.gif -------------------------------------------------------------------------------- /image/default_Load.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Load.gif -------------------------------------------------------------------------------- /image/default_Next.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Next.gif -------------------------------------------------------------------------------- /image/default_OpenFolder.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_OpenFolder.gif -------------------------------------------------------------------------------- /image/default_Player.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Player.gif -------------------------------------------------------------------------------- /image/default_PopOut.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_PopOut.gif -------------------------------------------------------------------------------- /image/default_Prev.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Prev.gif -------------------------------------------------------------------------------- /image/default_Qtester.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Qtester.gif -------------------------------------------------------------------------------- /image/default_Question.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Question.gif -------------------------------------------------------------------------------- /image/default_Reset.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Reset.gif -------------------------------------------------------------------------------- /image/default_ResizeVer.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_ResizeVer.gif -------------------------------------------------------------------------------- /image/default_RightDown.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_RightDown.gif -------------------------------------------------------------------------------- /image/default_RightUp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_RightUp.gif -------------------------------------------------------------------------------- /image/default_Save.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Save.gif -------------------------------------------------------------------------------- /image/default_SavedQueries.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_SavedQueries.gif -------------------------------------------------------------------------------- /image/default_SavedQueries_small.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_SavedQueries_small.gif -------------------------------------------------------------------------------- /image/default_Settings.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Settings.gif -------------------------------------------------------------------------------- /image/default_Settings_txt.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Settings_txt.gif -------------------------------------------------------------------------------- /image/default_SidebarCollapse.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_SidebarCollapse.gif -------------------------------------------------------------------------------- /image/default_SidebarExpand.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_SidebarExpand.gif -------------------------------------------------------------------------------- /image/default_Sort.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Sort.gif -------------------------------------------------------------------------------- /image/default_SortGroups.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_SortGroups.gif -------------------------------------------------------------------------------- /image/default_StarBlack.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_StarBlack.gif -------------------------------------------------------------------------------- /image/default_StarWhite.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_StarWhite.gif -------------------------------------------------------------------------------- /image/default_Stop.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Stop.gif -------------------------------------------------------------------------------- /image/default_Tab_Favourites_Active.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Tab_Favourites_Active.gif -------------------------------------------------------------------------------- /image/default_Tab_Favourites_Inactive.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Tab_Favourites_Inactive.gif -------------------------------------------------------------------------------- /image/default_Tab_Fields_Active.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Tab_Fields_Active.gif -------------------------------------------------------------------------------- /image/default_Tab_Fields_Inactive.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Tab_Fields_Inactive.gif -------------------------------------------------------------------------------- /image/default_Tab_Indexes_Active.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Tab_Indexes_Active.gif -------------------------------------------------------------------------------- /image/default_Tab_Indexes_Inactive.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Tab_Indexes_Inactive.gif -------------------------------------------------------------------------------- /image/default_Tab_Tables_Active.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Tab_Tables_Active.gif -------------------------------------------------------------------------------- /image/default_Tab_Tables_Inactive.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Tab_Tables_Inactive.gif -------------------------------------------------------------------------------- /image/default_Target.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Target.gif -------------------------------------------------------------------------------- /image/default_Text.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Text.gif -------------------------------------------------------------------------------- /image/default_Tools.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Tools.gif -------------------------------------------------------------------------------- /image/default_Up.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Up.gif -------------------------------------------------------------------------------- /image/default_Upload_Ins.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Upload_Ins.gif -------------------------------------------------------------------------------- /image/default_View.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_View.gif -------------------------------------------------------------------------------- /image/default_Wall.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/image/default_Wall.gif -------------------------------------------------------------------------------- /preCompile.p: -------------------------------------------------------------------------------- 1 | /************************************************************************* 2 | File : preCompile.p 3 | Purpose : Perform actions that must be done prior to recompile 4 | 5 | When new features are implemented, sometimes files become obsolete. 6 | They should be removed to avoid compilation problems but this must 7 | be done BEFORE DataDigger recompiles itself. 8 | 9 | The DataDigger.p programs takes this into account and when it decides 10 | it should recompile, it deletes the old version of preCompile.r and 11 | then runs the uncompiled version. This is needed, because at the time 12 | the program runs, the OLD .r files are still in place, but the NEW 13 | source files are there. 14 | 15 | *************************************************************************/ 16 | 17 | /* No actions required for this version */ 18 | 19 | -------------------------------------------------------------------------------- /query-data.w: -------------------------------------------------------------------------------- 1 | &ANALYZE-SUSPEND _VERSION-NUMBER UIB_v9r12 GUI 2 | &ANALYZE-RESUME 3 | &Scoped-define WINDOW-NAME C-Win 4 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _DEFINITIONS C-Win 5 | /*------------------------------------------------------------------------ 6 | 7 | Name: query-data.w 8 | Desc: View on the data from query-tester.w 9 | 10 | Author: M.C. Fiere (fiere1@zonnet.nl) 11 | ----------------------------------------------------------------------*/ 12 | /* This .W file was created with the Progress AppBuilder. */ 13 | /*----------------------------------------------------------------------*/ 14 | 15 | CREATE WIDGET-POOL. 16 | 17 | /* Local Variable Definitions --- */ 18 | &IF DEFINED(AppBuilder_is_Running) NE 0 19 | &THEN 20 | DEFINE VARIABLE pcTitle AS CHARACTER INITIAL "titel":U NO-UNDO. 21 | DEFINE VARIABLE pcDataString AS CHARACTER INITIAL "bla die blaa~ndie blabla":U NO-UNDO. 22 | &ELSE 23 | DEFINE INPUT PARAMETER pcTitle AS CHARACTER NO-UNDO. 24 | DEFINE INPUT PARAMETER pcDataString AS CHARACTER NO-UNDO. 25 | &ENDIF 26 | 27 | { DataDigger.i } 28 | 29 | /* _UIB-CODE-BLOCK-END */ 30 | &ANALYZE-RESUME 31 | 32 | 33 | &ANALYZE-SUSPEND _UIB-PREPROCESSOR-BLOCK 34 | 35 | /* ******************** Preprocessor Definitions ******************** */ 36 | 37 | &Scoped-define PROCEDURE-TYPE Window 38 | &Scoped-define DB-AWARE no 39 | 40 | /* Name of designated FRAME-NAME and/or first browse and/or first query */ 41 | &Scoped-define FRAME-NAME DEFAULT-FRAME 42 | 43 | /* Standard List Definitions */ 44 | &Scoped-Define ENABLED-OBJECTS edQuery 45 | &Scoped-Define DISPLAYED-OBJECTS edQuery 46 | 47 | /* Custom List Definitions */ 48 | /* List-1,List-2,List-3,List-4,List-5,List-6 */ 49 | 50 | /* _UIB-PREPROCESSOR-BLOCK-END */ 51 | &ANALYZE-RESUME 52 | 53 | 54 | 55 | /* *********************** Control Definitions ********************** */ 56 | 57 | /* Define the widget handle for the window */ 58 | DEFINE VAR C-Win AS WIDGET-HANDLE NO-UNDO. 59 | 60 | /* Menu Definitions */ 61 | DEFINE MENU MENU-BAR-C-Win MENUBAR 62 | MENU-ITEM m_Print LABEL "Print":U . 63 | 64 | 65 | /* Definitions of the field level widgets */ 66 | DEFINE VARIABLE edQuery AS CHARACTER 67 | VIEW-AS EDITOR SCROLLBAR-VERTICAL 68 | SIZE 94 BY 20.71 69 | BGCOLOR 15 NO-UNDO. 70 | 71 | 72 | /* ************************ Frame Definitions *********************** */ 73 | 74 | DEFINE FRAME DEFAULT-FRAME 75 | edQuery AT ROW 1 COL 1 NO-LABEL 76 | WITH 1 DOWN NO-BOX KEEP-TAB-ORDER OVERLAY 77 | SIDE-LABELS NO-UNDERLINE THREE-D 78 | AT COL 1 ROW 1 79 | SIZE 94.6 BY 20.91. 80 | 81 | 82 | /* *********************** Procedure Settings ************************ */ 83 | 84 | &ANALYZE-SUSPEND _PROCEDURE-SETTINGS 85 | /* Settings for THIS-PROCEDURE 86 | Type: Window 87 | Allow: Basic,Browse,DB-Fields,Window,Query 88 | Other Settings: COMPILE 89 | */ 90 | &ANALYZE-RESUME _END-PROCEDURE-SETTINGS 91 | 92 | /* ************************* Create Window ************************** */ 93 | 94 | &ANALYZE-SUSPEND _CREATE-WINDOW 95 | IF SESSION:DISPLAY-TYPE = "GUI":U THEN 96 | CREATE WINDOW C-Win ASSIGN 97 | HIDDEN = YES 98 | TITLE = "" 99 | HEIGHT = 20.91 100 | WIDTH = 94.6 101 | MAX-HEIGHT = 320 102 | MAX-WIDTH = 320 103 | VIRTUAL-HEIGHT = 320 104 | VIRTUAL-WIDTH = 320 105 | RESIZE = YES 106 | SCROLL-BARS = NO 107 | STATUS-AREA = NO 108 | BGCOLOR = ? 109 | FGCOLOR = ? 110 | KEEP-FRAME-Z-ORDER = YES 111 | THREE-D = YES 112 | MESSAGE-AREA = NO 113 | SENSITIVE = YES. 114 | ELSE {&WINDOW-NAME} = CURRENT-WINDOW. 115 | 116 | ASSIGN {&WINDOW-NAME}:MENUBAR = MENU MENU-BAR-C-Win:HANDLE. 117 | /* END WINDOW DEFINITION */ 118 | &ANALYZE-RESUME 119 | 120 | 121 | 122 | /* *********** Runtime Attributes and AppBuilder Settings *********** */ 123 | 124 | &ANALYZE-SUSPEND _RUN-TIME-ATTRIBUTES 125 | /* SETTINGS FOR WINDOW C-Win 126 | VISIBLE,,RUN-PERSISTENT */ 127 | /* SETTINGS FOR FRAME DEFAULT-FRAME 128 | FRAME-NAME */ 129 | ASSIGN 130 | edQuery:READ-ONLY IN FRAME DEFAULT-FRAME = TRUE. 131 | 132 | IF SESSION:DISPLAY-TYPE = "GUI":U AND VALID-HANDLE(C-Win) 133 | THEN C-Win:HIDDEN = NO. 134 | 135 | /* _RUN-TIME-ATTRIBUTES-END */ 136 | &ANALYZE-RESUME 137 | 138 | 139 | 140 | 141 | 142 | /* ************************ Control Triggers ************************ */ 143 | 144 | &Scoped-define SELF-NAME C-Win 145 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL C-Win C-Win 146 | ON END-ERROR OF C-Win /* */ 147 | OR ENDKEY OF {&WINDOW-NAME} ANYWHERE DO: 148 | /* This case occurs when the user presses the "Esc" key. 149 | In a persistently run window, just ignore this. If we did not, the 150 | application would exit. */ 151 | IF THIS-PROCEDURE:PERSISTENT THEN RETURN NO-APPLY. 152 | END. 153 | 154 | /* _UIB-CODE-BLOCK-END */ 155 | &ANALYZE-RESUME 156 | 157 | 158 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL C-Win C-Win 159 | ON WINDOW-CLOSE OF C-Win /* */ 160 | DO: 161 | /* This event will close the window and terminate the procedure. */ 162 | APPLY "CLOSE":U TO THIS-PROCEDURE. 163 | RETURN NO-APPLY. 164 | END. 165 | 166 | /* _UIB-CODE-BLOCK-END */ 167 | &ANALYZE-RESUME 168 | 169 | 170 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL C-Win C-Win 171 | ON WINDOW-RESIZED OF C-Win /* */ 172 | DO: 173 | DEFINE VARIABLE iNewFrameWidth AS INTEGER NO-UNDO. 174 | DEFINE VARIABLE iNewFrameHeight AS INTEGER NO-UNDO. 175 | 176 | DO WITH FRAME {&FRAME-NAME}: 177 | ASSIGN iNewFrameWidth = SELF:WIDTH-PIXELS - 2 178 | iNewFrameHeight = SELF:HEIGHT-PIXELS - 2 179 | . 180 | 181 | IF iNewFrameWidth GT FRAME {&FRAME-NAME}:WIDTH-PIXELS 182 | THEN ASSIGN FRAME {&FRAME-NAME}:WIDTH-PIXELS = iNewFrameWidth. 183 | 184 | IF iNewFrameHeight GT FRAME {&FRAME-NAME}:HEIGHT-PIXELS 185 | THEN ASSIGN FRAME {&FRAME-NAME}:HEIGHT-PIXELS = iNewFrameHeight. 186 | 187 | ASSIGN 188 | 189 | edQuery:X = 1 190 | edQuery:Y = 1 191 | edQuery:WIDTH-PIXELS = iNewFrameWidth - edQuery:X - 2 192 | edQuery:HEIGHT-PIXELS = iNewFrameHeight - 2 193 | . 194 | END. 195 | 196 | END. 197 | 198 | /* _UIB-CODE-BLOCK-END */ 199 | &ANALYZE-RESUME 200 | 201 | 202 | &Scoped-define SELF-NAME m_Print 203 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL m_Print C-Win 204 | ON CHOOSE OF MENU-ITEM m_Print /* Print */ 205 | DO: 206 | RUN print-editor. 207 | END. 208 | 209 | /* _UIB-CODE-BLOCK-END */ 210 | &ANALYZE-RESUME 211 | 212 | 213 | &UNDEFINE SELF-NAME 214 | 215 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _MAIN-BLOCK C-Win 216 | 217 | 218 | /* *************************** Main Block *************************** */ 219 | 220 | /* Set CURRENT-WINDOW: this will parent dialog-boxes and frames. */ 221 | ASSIGN CURRENT-WINDOW = {&WINDOW-NAME} 222 | THIS-PROCEDURE:CURRENT-WINDOW = {&WINDOW-NAME}. 223 | 224 | /* The CLOSE event can be used from inside or outside the procedure to */ 225 | /* terminate it. */ 226 | ON CLOSE OF THIS-PROCEDURE 227 | RUN disable_UI. 228 | 229 | /* Best default for GUI applications is... */ 230 | PAUSE 0 BEFORE-HIDE. 231 | 232 | /* Now enable the interface and wait for the exit condition. */ 233 | /* (NOTE: handle ERROR and END-KEY so cleanup code will always fire. */ 234 | MAIN-BLOCK: 235 | DO ON ERROR UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK 236 | ON END-KEY UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK: 237 | RUN enable_UI. 238 | 239 | /* Datadigger */ 240 | FRAME {&frame-name}:font = getFont("Default"). 241 | edQuery:font = getFont("Fixed"). 242 | 243 | RUN initialize-window. 244 | 245 | SUBSCRIBE TO "killquerywindow" ANYWHERE. 246 | 247 | IF NOT THIS-PROCEDURE:PERSISTENT THEN 248 | WAIT-FOR CLOSE OF THIS-PROCEDURE. 249 | END. 250 | 251 | /* _UIB-CODE-BLOCK-END */ 252 | &ANALYZE-RESUME 253 | 254 | 255 | /* ********************** Internal Procedures *********************** */ 256 | 257 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE disable_UI C-Win _DEFAULT-DISABLE 258 | PROCEDURE disable_UI : 259 | /*------------------------------------------------------------------------------ 260 | Purpose: DISABLE the User Interface 261 | Parameters: 262 | Notes: Here we clean-up the user-interface by deleting 263 | dynamic widgets we have created and/or hide 264 | frames. This procedure is usually called when 265 | we are ready to "clean-up" after running. 266 | ------------------------------------------------------------------------------*/ 267 | /* Delete the WINDOW we created */ 268 | IF SESSION:DISPLAY-TYPE = "GUI":U AND VALID-HANDLE(C-Win) 269 | THEN DELETE WIDGET C-Win. 270 | IF THIS-PROCEDURE:PERSISTENT THEN DELETE PROCEDURE THIS-PROCEDURE. 271 | END PROCEDURE. 272 | 273 | /* _UIB-CODE-BLOCK-END */ 274 | &ANALYZE-RESUME 275 | 276 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE enable_UI C-Win _DEFAULT-ENABLE 277 | PROCEDURE enable_UI : 278 | /*------------------------------------------------------------------------------ 279 | Purpose: ENABLE the User Interface 280 | Parameters: 281 | Notes: Here we display/view/enable the widgets in the 282 | user-interface. In addition, OPEN all queries 283 | associated with each FRAME and BROWSE. 284 | These statements here are based on the "Other 285 | Settings" section of the widget Property Sheets. 286 | ------------------------------------------------------------------------------*/ 287 | DISPLAY edQuery 288 | WITH FRAME DEFAULT-FRAME IN WINDOW C-Win. 289 | ENABLE edQuery 290 | WITH FRAME DEFAULT-FRAME IN WINDOW C-Win. 291 | {&OPEN-BROWSERS-IN-QUERY-DEFAULT-FRAME} 292 | VIEW C-Win. 293 | END PROCEDURE. 294 | 295 | /* _UIB-CODE-BLOCK-END */ 296 | &ANALYZE-RESUME 297 | 298 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE initialize-window C-Win 299 | PROCEDURE initialize-window : 300 | /*------------------------------------------------------------------------------ 301 | Purpose: 302 | Parameters: 303 | Notes: 304 | ------------------------------------------------------------------------------*/ 305 | 306 | ASSIGN 307 | {&WINDOW-NAME}:TITLE = pcTitle 308 | edQuery:SCREEN-VALUE IN FRAME {&FRAME-NAME} = pcDataString. 309 | 310 | END PROCEDURE. 311 | 312 | /* _UIB-CODE-BLOCK-END */ 313 | &ANALYZE-RESUME 314 | 315 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE killquerywindow C-Win 316 | PROCEDURE killquerywindow : 317 | /* Close it 318 | */ 319 | APPLY "close":U TO THIS-PROCEDURE. 320 | END PROCEDURE. 321 | 322 | /* _UIB-CODE-BLOCK-END */ 323 | &ANALYZE-RESUME 324 | 325 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE print-editor C-Win 326 | PROCEDURE print-editor : 327 | /* Output to printer 328 | */ 329 | DEFINE VARIABLE liLine AS INTEGER NO-UNDO. 330 | DEFINE VARIABLE liNumLines AS INTEGER NO-UNDO. 331 | 332 | DO WITH FRAME {&FRAME-NAME}: 333 | ASSIGN liNumLines = NUM-ENTRIES(pcDataString,"~n"). 334 | OUTPUT TO PRINTER PAGED. 335 | DO liLine = 1 TO liNumLines: 336 | PUT UNFORMATTED ENTRY(liLine,pcDataString,"~n") SKIP. 337 | END. 338 | OUTPUT CLOSE. 339 | END. 340 | 341 | END PROCEDURE. 342 | 343 | /* _UIB-CODE-BLOCK-END */ 344 | &ANALYZE-RESUME -------------------------------------------------------------------------------- /readme.txt: -------------------------------------------------------------------------------- 1 | DataDigger 2 | ========== 3 | Welcome to DataDigger, a tool to manage the data in your databases. 4 | 5 | With DataDigger you can: 6 | - Look at the tables in your database 7 | - Display the data in those tables 8 | - Select which fields to display 9 | - Easily dump your data to standard dump files, xml or excel 10 | - Load data from .d files and xml using an advanced wizard 11 | - Edit one or more records at the same time 12 | 13 | In addition, DataDigger was designed to have an attractive and pleasant user interface. 14 | Almost all actions can be performed by either mouse or keyboard. 15 | 16 | DataDigger saves your personal preferences in a settings file so you need to define them once. 17 | 18 | 19 | HOW TO INSTALL 20 | ============== 21 | Installing DataDigger is just as simple as 1-2-3: 22 | 23 | 1. Create a directory called DataDigger 24 | 2. Extract the zipfile in this dir 25 | 3. Create a shortcut to prowin32.exe, and use -basekey "INI" -p DataDigger.p 26 | (set the "start in" path to the one you used in step 2) 27 | 28 | Ready you are. 29 | 30 | In addition you might like to add one or more of these: 31 | -s 1000000 Increase the amount of memory (see also MaxColumns) 32 | -param "My Title" Title for your DataDigger window. Handy if you have more than one shortcut. 33 | -pf filename.pf Use the pf file you use for your normal development (or production) session. DataDigger recognizes db's when they are connected at startup 34 | -rereadnolock Force Progress to re-read the record from the database, even if the record is already in another active record buffer. 35 | -h 100 The maximum number of databases that can be connected during an OpenEdge session. Default value is 5. 36 | 37 | 38 | FEEDBACK 39 | ======== 40 | If you have trouble installing DataDigger, want to report a bug or request a feature, feel free to contact me at: 41 | patrick@tingen.net 42 | -------------------------------------------------------------------------------- /resizable_dict.i: -------------------------------------------------------------------------------- 1 | /*------------------------------------------------------------------------ 2 | Name : resizable_dict.i 3 | Description : Find the dictionary window and make it resizable. 4 | 5 | Note: This code comes from AbHack, a fine tool made by 6 | Sebastien Lacroix. He donated this code for the DataDigger. 7 | Many thanks to Sebastien and you should really try AbHack! 8 | 9 | ----------------------------------------------------------------------*/ 10 | 11 | DEFINE VARIABLE hDictFrame AS HANDLE NO-UNDO. 12 | DEFINE VARIABLE hs_Browse_Stat AS HANDLE NO-UNDO. 13 | DEFINE VARIABLE hs_btn_Create AS HANDLE NO-UNDO. 14 | DEFINE VARIABLE hs_btn_Delete AS HANDLE NO-UNDO. 15 | DEFINE VARIABLE hs_btn_Flds AS HANDLE NO-UNDO. 16 | DEFINE VARIABLE hs_btn_Idxs AS HANDLE NO-UNDO. 17 | DEFINE VARIABLE hs_btn_Props AS HANDLE NO-UNDO. 18 | DEFINE VARIABLE hs_btn_Seqs AS HANDLE NO-UNDO. 19 | DEFINE VARIABLE hs_btn_Tbls AS HANDLE NO-UNDO. 20 | DEFINE VARIABLE hs_fil_Dbs AS HANDLE NO-UNDO. 21 | DEFINE VARIABLE hs_fil_Flds AS HANDLE NO-UNDO. 22 | DEFINE VARIABLE hs_fil_Idxs AS HANDLE NO-UNDO. 23 | DEFINE VARIABLE hs_fil_Seqs AS HANDLE NO-UNDO. 24 | DEFINE VARIABLE hs_fil_Tbls AS HANDLE NO-UNDO. 25 | DEFINE VARIABLE hs_lst_Dbs AS HANDLE NO-UNDO. 26 | DEFINE VARIABLE hs_lst_Flds AS HANDLE NO-UNDO. 27 | DEFINE VARIABLE hs_lst_Idxs AS HANDLE NO-UNDO. 28 | DEFINE VARIABLE hs_lst_Seqs AS HANDLE NO-UNDO. 29 | DEFINE VARIABLE hs_lst_Tbls AS HANDLE NO-UNDO. 30 | DEFINE VARIABLE hs_txt_DBs AS HANDLE NO-UNDO. 31 | DEFINE VARIABLE hs_txt_Flds AS HANDLE NO-UNDO. 32 | DEFINE VARIABLE hs_txt_Tbls AS HANDLE NO-UNDO. 33 | DEFINE VARIABLE hwDict AS HANDLE NO-UNDO. 34 | 35 | 36 | PROCEDURE resizeDictWindow: 37 | DEFINE VARIABLE cActiveWindowTitle AS CHARACTER NO-UNDO. 38 | 39 | /* Find the dictionary window */ 40 | cActiveWindowTitle = ACTIVE-WINDOW:TITLE NO-ERROR. 41 | 42 | IF VALID-HANDLE(hwDict) AND hwDict:TITLE BEGINS "Data Dictionary " THEN DO: 43 | /* 05-DEC-2006 sla: get rid off scrollbar that may come when choosing index/field or buttons */ 44 | {&_proparse_ prolint-nowarn(varusage)} 45 | DEFINE VARIABLE iDontCare AS INTEGER NO-UNDO. 46 | IF VALID-HANDLE(hDictFrame) THEN RUN ShowScrollBar (hDictFrame:HWND, 3, 0, OUTPUT iDontCare). 47 | RETURN. 48 | END. 49 | 50 | IF cActiveWindowTitle = "Data Dictionary" THEN DO: 51 | /* 06-DEC-2006 sla: Error if not connected to any database => wait until we leave the dialog-box */ 52 | DEFINE VARIABLE hDictionaryDialog AS HANDLE NO-UNDO. 53 | hDictionaryDialog = FOCUS:FRAME NO-ERROR. 54 | IF VALID-HANDLE(hDictionaryDialog) 55 | AND hDictionaryDialog:TYPE = "DIALOG-BOX" 56 | THEN RETURN. 57 | hwDict = ACTIVE-WINDOW. 58 | RUN refineDictWidget. 59 | RETURN. 60 | END. 61 | IF hwDict <> ? THEN ASSIGN hwDict = ?. 62 | END PROCEDURE. /* resizeDictWindow */ 63 | 64 | 65 | PROCEDURE DictResized : 66 | /* Event that happens when the Dictionary is resized 67 | */ 68 | DEFINE VARIABLE iDiffHeight AS INTEGER NO-UNDO. 69 | DEFINE VARIABLE iDiffWidth AS INTEGER NO-UNDO. 70 | 71 | iDiffWidth = ( hwDict:WIDTH-PIXELS - hDictFrame:WIDTH-PIXELS ) / 3. 72 | iDiffHeight = hwDict:HEIGHT-PIXELS - hDictFrame:HEIGHT-PIXELS. 73 | hDictFrame:SCROLLABLE = YES. 74 | 75 | IF iDiffHeight > 0 THEN ASSIGN 76 | hDictFrame:HEIGHT-PIXELS = hwDict:HEIGHT-PIXELS 77 | hDictFrame:VIRTUAL-HEIGHT-PIXELS = hwDict:HEIGHT-PIXELS. 78 | 79 | IF iDiffHeight <> 0 THEN ASSIGN 80 | hs_lst_Dbs:HEIGHT-PIXELS = hs_lst_Dbs:HEIGHT-PIXELS + iDiffHeight 81 | hs_lst_Tbls:HEIGHT-PIXELS = hs_lst_Tbls:HEIGHT-PIXELS + iDiffHeight 82 | hs_lst_Seqs:HEIGHT-PIXELS = hs_lst_Seqs:HEIGHT-PIXELS + iDiffHeight 83 | hs_lst_Flds:HEIGHT-PIXELS = hs_lst_Flds:HEIGHT-PIXELS + iDiffHeight 84 | hs_lst_Idxs:HEIGHT-PIXELS = hs_lst_Idxs:HEIGHT-PIXELS + iDiffHeight 85 | 86 | hs_btn_Create:Y = hs_btn_Create:Y + iDiffHeight 87 | hs_btn_Props:Y = hs_btn_Props:Y + iDiffHeight 88 | hs_btn_Delete:Y = hs_btn_Delete:Y + iDiffHeight 89 | hs_Browse_Stat:Y = hs_Browse_Stat:Y + iDiffHeight. 90 | 91 | IF iDiffHeight < 0 THEN ASSIGN 92 | hDictFrame:VIRTUAL-HEIGHT-PIXELS = hwDict:HEIGHT-PIXELS 93 | hDictFrame:HEIGHT-PIXELS = hwDict:HEIGHT-PIXELS. 94 | 95 | IF iDiffWidth > 0 THEN ASSIGN 96 | hDictFrame:WIDTH-PIXELS = hwDict:WIDTH-PIXELS 97 | hDictFrame:VIRTUAL-WIDTH-PIXELS = hwDict:WIDTH-PIXELS. 98 | 99 | IF iDiffWidth <> 0 THEN ASSIGN 100 | hs_lst_Dbs:WIDTH-PIXELS = hs_lst_Dbs:WIDTH-PIXELS + iDiffWidth 101 | hs_txt_Dbs:WIDTH-PIXELS = hs_lst_Dbs:WIDTH-PIXELS 102 | hs_fil_Dbs:WIDTH-PIXELS = hs_lst_Dbs:WIDTH-PIXELS 103 | 104 | hs_lst_Tbls:X = hs_lst_Tbls:X + iDiffWidth 105 | hs_lst_Tbls:WIDTH-PIXELS = hs_lst_Tbls:WIDTH-PIXELS + iDiffWidth 106 | hs_txt_Tbls:X = hs_lst_Tbls:X 107 | hs_fil_Tbls:X = hs_lst_Tbls:X 108 | hs_txt_Tbls:WIDTH-PIXELS = hs_lst_Tbls:WIDTH-PIXELS 109 | hs_fil_Tbls:WIDTH-PIXELS = hs_lst_Tbls:WIDTH-PIXELS 110 | 111 | hs_lst_Seqs:X = hs_lst_Seqs:X + iDiffWidth 112 | hs_lst_Seqs:WIDTH-PIXELS = hs_lst_Seqs:WIDTH-PIXELS + iDiffWidth 113 | hs_lst_Seqs:X = hs_lst_Tbls:X 114 | hs_fil_Seqs:X = hs_lst_Tbls:X 115 | hs_lst_Seqs:WIDTH-PIXELS = hs_lst_Tbls:WIDTH-PIXELS 116 | hs_fil_Seqs:WIDTH-PIXELS = hs_lst_Tbls:WIDTH-PIXELS 117 | 118 | hs_lst_Flds:X = hs_lst_Flds:X + 2 * iDiffWidth 119 | hs_lst_Flds:WIDTH-PIXELS = hs_lst_Tbls:WIDTH-PIXELS 120 | hs_txt_Flds:X = hs_lst_Flds:X 121 | hs_fil_Flds:X = hs_lst_Flds:X 122 | hs_txt_Flds:WIDTH-PIXELS = hs_lst_Flds:WIDTH-PIXELS 123 | hs_fil_Flds:WIDTH-PIXELS = hs_lst_Flds:WIDTH-PIXELS 124 | 125 | hs_lst_Idxs:X = hs_lst_Flds:X 126 | hs_lst_Idxs:WIDTH-PIXELS = hs_lst_Tbls:WIDTH-PIXELS 127 | hs_fil_Idxs:X = hs_lst_Flds:X 128 | hs_fil_Idxs:WIDTH-PIXELS = hs_lst_Tbls:WIDTH-PIXELS 129 | 130 | hs_btn_Tbls:X = hs_lst_Tbls:X 131 | hs_btn_Seqs:X = hs_lst_Tbls:X + hs_btn_Tbls:WIDTH-PIXELS + 10 132 | hs_btn_Flds:X = hs_lst_Flds:X 133 | hs_btn_Idxs:X = hs_lst_Flds:X + hs_btn_Flds:WIDTH-PIXELS + 10 134 | 135 | hs_btn_Create:X = hs_btn_Create:X + ( iDiffWidth * 3 ) / 2 136 | hs_btn_Props:X = hs_btn_Create:X + hs_btn_Create:WIDTH-PIXELS + 5 137 | hs_btn_Delete:X = hs_btn_Props:X + hs_btn_Props:WIDTH-PIXELS + 5 138 | hs_Browse_Stat:X = hs_btn_Delete:X + hs_btn_Delete:WIDTH-PIXELS + 5. 139 | 140 | IF iDiffWidth < 0 THEN ASSIGN 141 | hDictFrame:VIRTUAL-WIDTH-PIXELS = hwDict:WIDTH-PIXELS 142 | hDictFrame:WIDTH-PIXELS = hwDict:WIDTH-PIXELS. 143 | 144 | 145 | /* no scrollbar when sizing down plzzz */ 146 | hDictFrame:SCROLLABLE = NO. 147 | hDictFrame:VIRTUAL-HEIGHT-PIXELS = hDictFrame:HEIGHT-PIXELS. 148 | hDictFrame:VIRTUAL-WIDTH-PIXELS = hDictFrame:WIDTH-PIXELS. 149 | 150 | END PROCEDURE. /* DictResized */ 151 | 152 | PROCEDURE refineDictWidget : 153 | /* Additional tweaking to the Dictionary widget 154 | */ 155 | DEFINE VARIABLE hfg AS HANDLE NO-UNDO. 156 | DEFINE VARIABLE h AS HANDLE NO-UNDO. 157 | 158 | hDictFrame = hwDict:FIRST-CHILD. /* 1st frame */ 159 | hfg = hDictFrame:FIRST-CHILD. /* 1st field group */ 160 | 161 | hwDict:RESIZABLE = YES. 162 | hwDict:MAX-WIDTH-PIXELS = SESSION:WORK-AREA-WIDTH-PIXELS. 163 | hwDict:MIN-WIDTH-PIXELS = hwDict:WIDTH-PIXELS. 164 | hwDict:MAX-HEIGHT-PIXELS = SESSION:WORK-AREA-HEIGHT-PIXELS. 165 | hwDict:MIN-HEIGHT-PIXELS = hwDict:HEIGHT-PIXELS. /* that should have been done at the very beginning */ 166 | ON 'WINDOW-RESIZED':U OF hwDict PERSISTENT RUN DictResized IN THIS-PROCEDURE. 167 | 168 | h = hfg:FIRST-CHILD. 169 | DO WHILE h <> ?: 170 | CASE h:NAME: 171 | WHEN "s_DbLbl2" THEN hs_txt_Dbs = h. 172 | WHEN "s_DbFill" THEN hs_fil_Dbs = h. 173 | WHEN "s_lst_Dbs" THEN hs_lst_Dbs = h. 174 | 175 | WHEN "s_Lvl1Lbl" THEN hs_txt_Tbls = h. 176 | WHEN "s_TblFill" THEN hs_fil_Tbls = h. 177 | WHEN "s_lst_Tbls" THEN hs_lst_Tbls = h. 178 | 179 | WHEN "s_SeqFill" THEN hs_fil_Seqs = h. 180 | WHEN "s_lst_Seqs" THEN hs_lst_Seqs = h. 181 | 182 | WHEN "s_FldFill" THEN hs_fil_Flds = h. 183 | WHEN "s_Lvl2Lbl" THEN hs_txt_Flds = h. 184 | WHEN "s_lst_Flds" THEN hs_lst_Flds = h. 185 | 186 | WHEN "s_IdxFill" THEN hs_fil_Idxs = h. 187 | WHEN "s_lst_Idxs" THEN hs_lst_Idxs = h. 188 | 189 | WHEN "s_icn_Tbls" THEN hs_btn_Tbls = h. 190 | WHEN "s_icn_Seqs" THEN hs_btn_Seqs = h. 191 | WHEN "s_icn_Flds" THEN hs_btn_Flds = h. 192 | WHEN "s_icn_Idxs" THEN hs_btn_Idxs = h. 193 | 194 | WHEN "s_btn_Create" THEN hs_btn_Create = h. 195 | WHEN "s_btn_Props" THEN hs_btn_Props = h. 196 | WHEN "s_btn_Delete" THEN hs_btn_Delete = h. 197 | WHEN "s_Browse_Stat" THEN hs_Browse_Stat = h. 198 | END CASE. 199 | h = h:NEXT-SIBLING. 200 | END. 201 | 202 | /* show that there is something new... */ 203 | APPLY 'MOUSE-SELECT-DOWN' TO hs_btn_Flds. 204 | hwDict:HEIGHT-PIXELS = hwDict:HEIGHT-PIXELS + 200. 205 | hwDict:WIDTH-PIXELS = hwDict:WIDTH-PIXELS + 50. 206 | APPLY 'WINDOW-RESIZED' TO hwDict. 207 | 208 | hwDict:TITLE = hwDict:TITLE + " (made resizable by Seb's ABHack)". 209 | 210 | END PROCEDURE. /* refineDictWidget */ -------------------------------------------------------------------------------- /showMessage.p: -------------------------------------------------------------------------------- 1 | /*------------------------------------------------------------------------ 2 | 3 | File : ShowMessage.p 4 | Desc : Show a user defined message in a new window. 5 | 6 | ----------------------------------------------------------------------*/ 7 | 8 | &IF "{&file-name}" MATCHES "*.cmp" &THEN 9 | DEFINE VARIABLE pcTitle AS CHARACTER NO-UNDO. 10 | DEFINE VARIABLE pcMessage AS CHARACTER NO-UNDO. 11 | DEFINE VARIABLE phWindow AS HANDLE NO-UNDO. 12 | &ELSE 13 | DEFINE INPUT PARAMETER pcTitle AS CHARACTER NO-UNDO. 14 | DEFINE INPUT PARAMETER pcMessage AS CHARACTER NO-UNDO. 15 | DEFINE OUTPUT PARAMETER phWindow AS HANDLE NO-UNDO. 16 | &ENDIF 17 | 18 | DEFINE VARIABLE cMessage AS CHARACTER NO-UNDO FORMAT "x(256)". 19 | DEFINE VARIABLE iFont AS INTEGER NO-UNDO. 20 | DEFINE VARIABLE iWidth AS INTEGER NO-UNDO. 21 | DEFINE VARIABLE winMessage AS HANDLE NO-UNDO. 22 | 23 | DEFINE IMAGE imgMessage SIZE 4.8 BY 1.14. 24 | DEFINE FRAME infoFrame 25 | imgMessage AT ROW 1.3 COL 2 26 | cMessage VIEW-AS FILL-IN SIZE 1 BY 1 AT ROW 1.4 COLUMN 1.5 NO-LABEL 27 | WITH 1 DOWN NO-BOX OVERLAY SIDE-LABELS THREE-D AT COLUMN 1 ROW 1 SIZE-PIXELS 50 BY 40. 28 | 29 | /* ************************* Create Window ************************** */ 30 | CREATE WINDOW winMessage ASSIGN 31 | TITLE = pcTitle 32 | WIDTH-PIXELS = 260 33 | HEIGHT-PIXELS = 40 34 | STATUS-AREA = NO 35 | MESSAGE-AREA = NO 36 | MIN-BUTTON = NO 37 | MAX-BUTTON = NO 38 | SENSITIVE = YES. 39 | 40 | winMessage:LOAD-ICON("image\default_DataDigger.ico"). 41 | 42 | /* Set CURRENT-WINDOW: this will parent dialog-boxes and frames. */ 43 | ASSIGN 44 | CURRENT-WINDOW = winMessage. 45 | THIS-PROCEDURE:CURRENT-WINDOW = winMessage. 46 | DEFAULT-WINDOW = winMessage. 47 | 48 | /* Find a decent font */ 49 | #FindFont: 50 | DO iFont = 0 TO FONT-TABLE:NUM-ENTRIES - 1: 51 | IF FONT-TABLE:GET-TEXT-WIDTH-PIXELS('DataDigger',iFont) = 54 52 | AND FONT-TABLE:GET-TEXT-HEIGHT-PIXELS(iFont) = 13 THEN 53 | DO: 54 | FRAME infoFrame:font = iFont. 55 | LEAVE #FindFont. 56 | END. 57 | END. 58 | 59 | /* How wide should the text be? */ 60 | cMessage = pcMessage. 61 | iWidth = FONT-TABLE:GET-TEXT-WIDTH-PIXELS(cMessage,iFont) + cMessage:x + 10. 62 | iWidth = MAXIMUM(iWidth,150). 63 | 64 | imgMessage:LOAD-IMAGE('image\default_DataDigger24x24.gif'). 65 | cMessage:X = imgMessage:X + imgMessage:WIDTH-PIXELS + 5. 66 | winMessage:WIDTH-PIXELS = cMessage:X + iWidth + 5. 67 | cMessage:WIDTH-PIXELS = iWidth. 68 | cMessage:SCREEN-VALUE = cMessage. 69 | FRAME infoFrame:WIDTH-PIXELS = winMessage:WIDTH-PIXELS. 70 | 71 | /* Center the window */ 72 | {&_proparse_ prolint-nowarn(overflow)} 73 | ASSIGN 74 | winMessage:X = (SESSION:WORK-AREA-WIDTH-PIXELS - winMessage:WIDTH-PIXELS ) / 2 75 | winMessage:Y = (SESSION:WORK-AREA-HEIGHT-PIXELS - winMessage:HEIGHT-PIXELS) / 2. 76 | 77 | /* Showtime! */ 78 | VIEW FRAME infoFrame IN WINDOW winMessage. 79 | VIEW winMessage. 80 | 81 | /* Avoid input blocking error */ 82 | IF PROGRAM-NAME(2) <> "getDataserver.p" THEN PROCESS EVENTS. 83 | 84 | phWindow = winMessage:HANDLE. 85 | 86 | -------------------------------------------------------------------------------- /sokodigger.w: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/sokodigger.w -------------------------------------------------------------------------------- /sonar-project.properties: -------------------------------------------------------------------------------- 1 | sonar.projectKey=patrickTingen:DataDigger 2 | sonar.projectName=DataDigger 3 | sonar.projectVersion=1.0 4 | sonar.projectDescription=DataDigger 5 | sonar.sources=. 6 | sonar.exclusions=unitTest/* 7 | sonar.tests=unitTest 8 | sonar.sourceEncoding=utf-8 9 | sonar.oe.binaries=target/build 10 | sonar.oe.propath=. 11 | sonar.oe.propath.dlc=true 12 | sonar.oe.databases=empty_schema.df:dictdb 13 | sonar.oe.coverage.profiler.dirs=profiler 14 | sonar.testExecutionReportPaths=sonar.xml 15 | 16 | -------------------------------------------------------------------------------- /startDiggerLib.p: -------------------------------------------------------------------------------- 1 | /*------------------------------------------------------------------------ 2 | 3 | Name: startDiggerLib.p 4 | Desc: Start DiggerLib if it has not already been started 5 | 6 | ----------------------------------------------------------------------*/ 7 | 8 | DEFINE VARIABLE hDiggerLib AS HANDLE NO-UNDO. 9 | DEFINE VARIABLE hCustomLib AS HANDLE NO-UNDO. 10 | 11 | /* Call out to see if the libraries have been started 12 | */ 13 | PUBLISH 'DataDiggerLib' (OUTPUT hDiggerLib). 14 | 15 | IF NOT VALID-HANDLE(hDiggerLib) THEN 16 | DO: 17 | /* Start main library 18 | */ 19 | RUN DataDiggerLib.p PERSISTENT SET hDiggerLib. 20 | SESSION:ADD-SUPER-PROCEDURE(hDiggerLib,SEARCH-TARGET). 21 | 22 | /* Populate the ttConfig table. Must only be done when the lib is started 23 | ** because it is persistent. A second run would overwrite them. 24 | */ 25 | RUN loadSettings. 26 | 27 | /* Start customizations in myDataDigger.p 28 | */ 29 | IF SEARCH('myDataDigger.p') <> ? THEN 30 | DO: 31 | RUN myDataDigger.p PERSISTENT SET hCustomLib. 32 | SESSION:ADD-SUPER-PROCEDURE(hCustomLib, SEARCH-TARGET). 33 | 34 | /* Register all hooks */ 35 | SUBSCRIBE PROCEDURE hCustomLib TO "customBorderColor" ANYWHERE. 36 | SUBSCRIBE PROCEDURE hCustomLib TO "customDump" ANYWHERE. 37 | SUBSCRIBE PROCEDURE hCustomLib TO "customFormat" ANYWHERE. 38 | SUBSCRIBE PROCEDURE hCustomLib TO "customFrameColor" ANYWHERE. 39 | SUBSCRIBE PROCEDURE hCustomLib TO "customGetFilterValue" ANYWHERE. 40 | SUBSCRIBE PROCEDURE hCustomLib TO "customQuery" ANYWHERE. 41 | SUBSCRIBE PROCEDURE hCustomLib TO "customSaveFilterValue" ANYWHERE. 42 | SUBSCRIBE PROCEDURE hCustomLib TO "customShowField" ANYWHERE. 43 | SUBSCRIBE PROCEDURE hCustomLib TO "DataDigger" ANYWHERE. 44 | SUBSCRIBE PROCEDURE hCustomLib TO "query" ANYWHERE RUN-PROCEDURE "QueryOpen". 45 | SUBSCRIBE PROCEDURE hCustomLib TO "setWindowTitle" ANYWHERE. 46 | END. 47 | 48 | END. 49 | -------------------------------------------------------------------------------- /timerStart.i: -------------------------------------------------------------------------------- 1 | /* 2 | ** Name: timerStart.i 3 | ** Desc: Statement for debugging DataDigger. 4 | ** In separate include to keep Sonar from complaining 5 | */ 6 | PUBLISH "DD:Timer" ("start", ENTRY(1,PROGRAM-NAME(1)," ")). -------------------------------------------------------------------------------- /timerStop.i: -------------------------------------------------------------------------------- 1 | /* 2 | ** Name: timerStop.i 3 | ** Desc: Statement for debugging DataDigger. 4 | ** In separate include to keep Sonar from complaining 5 | */ 6 | FINALLY: 7 | PUBLISH "DD:Timer" ("stop", ENTRY(1,PROGRAM-NAME(1)," ")). 8 | END FINALLY. 9 | -------------------------------------------------------------------------------- /unitTest/test_correctFilterList.cls: -------------------------------------------------------------------------------- 1 | /*------------------------------------------------------------------------ 2 | File : test_correctFilterList.cls 3 | Purpose : Test procedure correctFilterList in DataDiggerLib.p 4 | 5 | Author(s) : Patrick.Tingen 6 | Created : Thu Oct 17 15:19:49 CEST 2019 7 | ----------------------------------------------------------------------*/ 8 | 9 | USING Progress.Lang.*. 10 | USING OpenEdge.Core.*. 11 | BLOCK-LEVEL ON ERROR UNDO, THROW. 12 | 13 | CLASS test_correctFilterList: 14 | 15 | DEFINE VARIABLE ghLib AS HANDLE NO-UNDO. 16 | 17 | @Before. 18 | METHOD PUBLIC VOID setUp( ): 19 | RUN datadiggerlib.p PERSISTENT SET ghLib. 20 | END METHOD. 21 | 22 | 23 | @Test. 24 | METHOD PUBLIC VOID justPositiveEntries(): 25 | /* Move negative entries from positive list to negative 26 | */ 27 | DEFINE VARIABLE cPositive AS CHARACTER NO-UNDO. 28 | DEFINE VARIABLE cNegative AS CHARACTER NO-UNDO. 29 | 30 | cPositive = 'Alpha,Bravo,Charlie,Delta'. 31 | cNegative = ''. 32 | RUN correctFilterList IN ghLib (INPUT-OUTPUT cPositive, INPUT-OUTPUT cNegative). 33 | 34 | Assert:Equals('Alpha,Bravo,Charlie,Delta', cPositive). 35 | Assert:Equals('', cNegative). 36 | END METHOD. 37 | 38 | 39 | @Test. 40 | METHOD PUBLIC VOID negativeEntriesInPositiveList(): 41 | /* Move negative entries from positive list to negative 42 | */ 43 | DEFINE VARIABLE cPositive AS CHARACTER NO-UNDO. 44 | DEFINE VARIABLE cNegative AS CHARACTER NO-UNDO. 45 | 46 | cPositive = '!Alpha,!Bravo,!Charlie,!Delta'. 47 | cNegative = ''. 48 | RUN correctFilterList IN ghLib (INPUT-OUTPUT cPositive, INPUT-OUTPUT cNegative). 49 | 50 | Assert:Equals('', cPositive). 51 | Assert:Equals('Alpha,Bravo,Charlie,Delta', cNegative). 52 | END METHOD. 53 | 54 | 55 | @Test. 56 | METHOD PUBLIC VOID justNegativeEntries(): 57 | /* Move negative entries from positive list to negative 58 | */ 59 | DEFINE VARIABLE cPositive AS CHARACTER NO-UNDO. 60 | DEFINE VARIABLE cNegative AS CHARACTER NO-UNDO. 61 | 62 | cPositive = ''. 63 | cNegative = 'Alpha,Bravo,Charlie,Delta'. 64 | RUN correctFilterList IN ghLib (INPUT-OUTPUT cPositive, INPUT-OUTPUT cNegative). 65 | 66 | Assert:Equals('', cPositive). 67 | Assert:Equals('Alpha,Bravo,Charlie,Delta', cNegative). 68 | END METHOD. 69 | 70 | 71 | @Test. 72 | METHOD PUBLIC VOID mixedEntries(): 73 | /* Move negative entries from positive list to negative 74 | */ 75 | DEFINE VARIABLE cPositive AS CHARACTER NO-UNDO. 76 | DEFINE VARIABLE cNegative AS CHARACTER NO-UNDO. 77 | 78 | cPositive = 'Alpha,!Bravo,!Charlie,Delta'. 79 | cNegative = 'Foo,Bar'. 80 | RUN correctFilterList IN ghLib (INPUT-OUTPUT cPositive, INPUT-OUTPUT cNegative). 81 | 82 | Assert:Equals('Alpha,Delta', cPositive). 83 | Assert:Equals('Foo,Bar,Bravo,Charlie', cNegative). 84 | END METHOD. 85 | 86 | 87 | @After. 88 | METHOD PUBLIC VOID tearDown(): 89 | DELETE OBJECT ghLib NO-ERROR. 90 | END METHOD. 91 | 92 | END CLASS. -------------------------------------------------------------------------------- /unitTest/test_createFolder.cls: -------------------------------------------------------------------------------- 1 | /*------------------------------------------------------------------------ 2 | File : test_createFolder.cls 3 | Purpose : Test procedure createFolder in DataDiggerLib.p 4 | 5 | Author(s) : Patrick.Tingen 6 | Created : Thu Oct 17 15:19:49 CEST 2019 7 | ----------------------------------------------------------------------*/ 8 | 9 | USING Progress.Lang.*. 10 | USING OpenEdge.Core.*. 11 | 12 | BLOCK-LEVEL ON ERROR UNDO, THROW. 13 | 14 | CLASS test_createFolder: 15 | 16 | DEFINE VARIABLE ghLib AS HANDLE NO-UNDO. 17 | DEFINE VARIABLE gcMainFolder AS CHARACTER NO-UNDO. 18 | DEFINE VARIABLE gcSubFolder AS CHARACTER NO-UNDO. 19 | DEFINE VARIABLE gcTempFolder AS CHARACTER NO-UNDO. 20 | 21 | @Before. 22 | METHOD PUBLIC VOID setUp( ): 23 | RUN datadiggerlib.p PERSISTENT SET ghLib. 24 | 25 | REPEAT: 26 | gcTempFolder = RIGHT-TRIM(SESSION:TEMP-DIRECTORY,'\'). 27 | gcMainFolder = RIGHT-TRIM(SUBSTITUTE('&1\test-&2', gcTempFolder, RANDOM(1,100)) ,'\'). 28 | gcSubFolder = RIGHT-TRIM(SUBSTITUTE('&1\test-&2', gcMainFolder, RANDOM(1,100)) ,'\'). 29 | 30 | FILE-INFORMATION:FILE-NAME = gcSubFolder. 31 | IF FILE-INFORMATION:FULL-PATHNAME = ? THEN LEAVE. 32 | END. 33 | END METHOD. 34 | 35 | 36 | @Test. 37 | METHOD PUBLIC VOID createSingleFolder( ): 38 | 39 | RUN createFolder IN ghLib (gcMainFolder). 40 | FILE-INFORMATION:FILE-NAME = gcMainFolder. 41 | Assert:Equals(gcMainFolder, FILE-INFORMATION:FULL-PATHNAME). 42 | 43 | END METHOD. 44 | 45 | 46 | @Test. 47 | METHOD PUBLIC VOID createSubFolder( ): 48 | 49 | RUN createFolder IN ghLib (gcSubFolder). 50 | FILE-INFORMATION:FILE-NAME = gcSubFolder. 51 | Assert:Equals(gcSubFolder, FILE-INFORMATION:FULL-PATHNAME). 52 | 53 | END METHOD. 54 | 55 | @After. 56 | METHOD PUBLIC VOID tearDown(): 57 | DELETE OBJECT ghLib NO-ERROR. 58 | OS-DELETE VALUE(gcMainFolder) RECURSIVE. 59 | END METHOD. 60 | 61 | END CLASS. -------------------------------------------------------------------------------- /unitTest/test_getColorByRGB.cls: -------------------------------------------------------------------------------- 1 | /*------------------------------------------------------------------------ 2 | File : test_getColorByRGB.cls 3 | Purpose : Test function getColorByRGB in DataDiggerLib.p 4 | 5 | Author(s) : Patrick.Tingen 6 | Created : Thu Oct 17 15:19:49 CEST 2019 7 | ----------------------------------------------------------------------*/ 8 | 9 | USING Progress.Lang.*. 10 | USING OpenEdge.Core.*. 11 | BLOCK-LEVEL ON ERROR UNDO, THROW. 12 | 13 | CLASS test_getColorByRGB: 14 | 15 | FUNCTION getColorByRGB RETURNS INTEGER 16 | ( piRed AS INTEGER 17 | , piGreen AS INTEGER 18 | , piBlue AS INTEGER 19 | ) IN SUPER. 20 | 21 | DEFINE VARIABLE ghLib AS HANDLE NO-UNDO. 22 | 23 | @Before. 24 | METHOD PUBLIC VOID setUp( ): 25 | RUN datadiggerlib.p PERSISTENT SET ghLib. 26 | SESSION:ADD-SUPER-PROCEDURE(ghLib, SEARCH-TARGET). 27 | END METHOD. 28 | 29 | @Test. 30 | METHOD PUBLIC VOID findBlack( ): 31 | Assert:Equals(0, getColorByRGB(0,0,0)). 32 | END METHOD. 33 | 34 | @Test. 35 | METHOD PUBLIC VOID findRed( ): 36 | Assert:Equals(12, getColorByRGB(255,0,0)). 37 | END METHOD. 38 | 39 | @Test. 40 | METHOD PUBLIC VOID findGreen( ): 41 | Assert:Equals(10, getColorByRGB(0,255,0)). 42 | END METHOD. 43 | 44 | @Test. 45 | METHOD PUBLIC VOID findBlue( ): 46 | Assert:Equals(9, getColorByRGB(0,0,255)). 47 | END METHOD. 48 | 49 | @Test. 50 | METHOD PUBLIC VOID findGray( ): 51 | Assert:Equals(8, getColorByRGB(192,192,192)). 52 | END METHOD. 53 | 54 | @Test. 55 | METHOD PUBLIC VOID addWrongColor( ): 56 | DEFINE VARIABLE iNumColors AS INTEGER NO-UNDO. 57 | iNumColors = COLOR-TABLE:NUM-ENTRIES. 58 | Assert:Equals(iNumColors, getColorByRGB(999,999,999)). 59 | END METHOD. 60 | 61 | @Test. 62 | METHOD PUBLIC VOID addNewColor( ): 63 | DEFINE VARIABLE iRed AS INTEGER NO-UNDO. 64 | DEFINE VARIABLE iGreen AS INTEGER NO-UNDO. 65 | DEFINE VARIABLE iBlue AS INTEGER NO-UNDO. 66 | DEFINE VARIABLE i AS INTEGER NO-UNDO. 67 | DEFINE VARIABLE iColor AS INTEGER NO-UNDO. 68 | 69 | #FindColor: 70 | REPEAT: 71 | iRed = RANDOM(0,255). 72 | iGreen = RANDOM(0,255). 73 | iBlue = RANDOM(0,255). 74 | 75 | /* See if already exists */ 76 | DO i = 0 TO COLOR-TABLE:NUM-ENTRIES - 1: 77 | IF COLOR-TABLE:GET-RED-VALUE(i) = iRed 78 | AND COLOR-TABLE:GET-GREEN-VALUE(i) = iGreen 79 | AND COLOR-TABLE:GET-BLUE-VALUE(i) = iBlue THEN NEXT #FindColor. 80 | END. 81 | 82 | LEAVE #FindColor. 83 | END. 84 | 85 | /* Create the new color */ 86 | iColor = COLOR-TABLE:NUM-ENTRIES. 87 | Assert:Equals(iColor, getColorByRGB(iRed, iGreen, iBlue)). 88 | END METHOD. 89 | 90 | @After. 91 | METHOD PUBLIC VOID tearDown(): 92 | DELETE OBJECT ghLib NO-ERROR. 93 | END METHOD. 94 | 95 | END CLASS. -------------------------------------------------------------------------------- /unitTest/test_getMaxLength.cls: -------------------------------------------------------------------------------- 1 | /*------------------------------------------------------------------------ 2 | File : test_etMaxLength.cls 3 | Purpose : Test function getMaxLength in DataDiggerLib.p 4 | 5 | Author(s) : Patrick.Tingen 6 | Created : Thu Oct 17 15:19:49 CEST 2019 7 | ----------------------------------------------------------------------*/ 8 | 9 | USING Progress.Lang.*. 10 | USING OpenEdge.Core.*. 11 | BLOCK-LEVEL ON ERROR UNDO, THROW. 12 | 13 | CLASS test_getMaxLength: 14 | 15 | FUNCTION getMaxLength RETURNS INTEGER 16 | ( cFieldList AS CHARACTER ) IN SUPER. 17 | 18 | DEFINE VARIABLE ghLib AS HANDLE NO-UNDO. 19 | 20 | @Before. 21 | METHOD PUBLIC VOID setUp( ): 22 | RUN datadiggerlib.p PERSISTENT SET ghLib. 23 | SESSION:ADD-SUPER-PROCEDURE(ghLib, SEARCH-TARGET). 24 | END METHOD. 25 | 26 | @Test. 27 | METHOD PUBLIC VOID emptyString( ): 28 | Assert:Equals(0, getMaxLength('')). 29 | END METHOD. 30 | 31 | @Test. 32 | METHOD PUBLIC VOID equalLengths( ): 33 | Assert:Equals(5, getMaxLength('alpha,bravo')). 34 | END METHOD. 35 | 36 | @Test. 37 | METHOD PUBLIC VOID oneLongest( ): 38 | Assert:Equals(7, getMaxLength('alpha,charlie,bravo')). 39 | END METHOD. 40 | 41 | @Test. 42 | METHOD PUBLIC VOID unknownValue( ): 43 | Assert:Equals(0, getMaxLength(?)). 44 | END METHOD. 45 | 46 | @Test. 47 | METHOD PUBLIC VOID longString( ): 48 | Assert:Equals(1000, getMaxLength( FILL('x',1000) )). 49 | END METHOD. 50 | 51 | 52 | @After. 53 | METHOD PUBLIC VOID tearDown(): 54 | DELETE OBJECT ghLib NO-ERROR. 55 | END METHOD. 56 | 57 | END CLASS. -------------------------------------------------------------------------------- /unitTest/test_getOsErrorDesc.cls: -------------------------------------------------------------------------------- 1 | /*------------------------------------------------------------------------ 2 | File : test_getOsErrorDesc.cls 3 | Purpose : Test function getOsErrorDesc in DataDiggerLib.p 4 | 5 | Author(s) : Patrick.Tingen 6 | Created : Thu Oct 17 15:19:49 CEST 2019 7 | ----------------------------------------------------------------------*/ 8 | 9 | USING Progress.Lang.*. 10 | USING OpenEdge.Core.*. 11 | BLOCK-LEVEL ON ERROR UNDO, THROW. 12 | 13 | CLASS test_getOsErrorDesc: 14 | 15 | FUNCTION getOsErrorDesc RETURNS CHARACTER 16 | ( piOsError AS INTEGER ) IN SUPER. 17 | 18 | DEFINE VARIABLE ghLib AS HANDLE NO-UNDO. 19 | 20 | @Before. 21 | METHOD PUBLIC VOID setUp( ): 22 | RUN datadiggerlib.p PERSISTENT SET ghLib. 23 | SESSION:ADD-SUPER-PROCEDURE(ghLib, SEARCH-TARGET). 24 | END METHOD. 25 | 26 | @Test. 27 | METHOD PUBLIC VOID noNumber( ): 28 | Assert:Equals('No error', getOsErrorDesc(0)). 29 | END METHOD. 30 | 31 | @Test. 32 | METHOD PUBLIC VOID unknownValue( ): 33 | Assert:Equals('Unmapped error', getOsErrorDesc(?)). 34 | END METHOD. 35 | 36 | @Test. 37 | METHOD PUBLIC VOID negativeNumber( ): 38 | Assert:Equals('Unmapped error', getOsErrorDesc(-1)). 39 | END METHOD. 40 | 41 | @Test. 42 | METHOD PUBLIC VOID highNumber( ): 43 | Assert:Equals('Unmapped error', getOsErrorDesc(9999)). 44 | END METHOD. 45 | 46 | @Test. 47 | METHOD PUBLIC VOID fileExists( ): 48 | Assert:Equals('File exists', getOsErrorDesc(10)). 49 | END METHOD. 50 | 51 | @After. 52 | METHOD PUBLIC VOID tearDown(): 53 | DELETE OBJECT ghLib NO-ERROR. 54 | END METHOD. 55 | 56 | END CLASS. -------------------------------------------------------------------------------- /unitTest/test_isValidCodepage.cls: -------------------------------------------------------------------------------- 1 | /*------------------------------------------------------------------------ 2 | File : test_isValidCodepage.cls 3 | Purpose : Test function isValidCodepage in DataDiggerLib.p 4 | 5 | Author(s) : Patrick.Tingen 6 | Created : Thu Oct 17 15:19:49 CEST 2019 7 | ----------------------------------------------------------------------*/ 8 | 9 | USING Progress.Lang.*. 10 | USING OpenEdge.Core.*. 11 | BLOCK-LEVEL ON ERROR UNDO, THROW. 12 | 13 | CLASS test_isValidCodepage: 14 | 15 | FUNCTION isValidCodePage RETURNS LOGICAL 16 | (pcCodepage AS CHARACTER) IN SUPER. 17 | 18 | DEFINE VARIABLE ghLib AS HANDLE NO-UNDO. 19 | 20 | @Before. 21 | METHOD PUBLIC VOID setUp( ): 22 | RUN datadiggerlib.p PERSISTENT SET ghLib. 23 | SESSION:ADD-SUPER-PROCEDURE(ghLib, SEARCH-TARGET). 24 | END METHOD. 25 | 26 | @Test. 27 | METHOD PUBLIC VOID emptyString( ): 28 | Assert:IsTrue(isValidCodepage('')). 29 | END METHOD. 30 | 31 | @Test. 32 | METHOD PUBLIC VOID windowsCodepage( ): 33 | Assert:IsTrue(isValidCodepage('1252')). 34 | END METHOD. 35 | 36 | @Test. 37 | METHOD PUBLIC VOID unknownValue( ): 38 | Assert:IsTrue(isValidCodepage(?)). 39 | END METHOD. 40 | 41 | @Test. 42 | METHOD PUBLIC VOID strangeValue( ): 43 | Assert:isFalse(isValidCodepage('penguin')). 44 | END METHOD. 45 | 46 | @After. 47 | METHOD PUBLIC VOID tearDown(): 48 | DELETE OBJECT ghLib NO-ERROR. 49 | END METHOD. 50 | 51 | END CLASS. -------------------------------------------------------------------------------- /version.i: -------------------------------------------------------------------------------- 1 | 26 2 | -------------------------------------------------------------------------------- /wAbout.wrx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/wAbout.wrx -------------------------------------------------------------------------------- /wDataDigger.wrx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickTingen/DataDigger/6ce9ff25d90cc879f4afea029841089f3d8e15d9/wDataDigger.wrx -------------------------------------------------------------------------------- /wImportSel.w: -------------------------------------------------------------------------------- 1 | &ANALYZE-SUSPEND _VERSION-NUMBER AB_v10r12 GUI 2 | &ANALYZE-RESUME 3 | &Scoped-define WINDOW-NAME wImportSel 4 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _DEFINITIONS wImportSel 5 | /*------------------------------------------------------------------------ 6 | 7 | Name : wImportSel.w 8 | Desc : Select files to import 9 | 10 | ----------------------------------------------------------------------*/ 11 | /* This .W file was created with the Progress AppBuilder. */ 12 | /*----------------------------------------------------------------------*/ 13 | 14 | CREATE WIDGET-POOL. 15 | 16 | { DataDigger.i } 17 | 18 | /* Parameters Definitions --- */ 19 | DEFINE {&invar} plReadOnlyDigger AS LOGICAL NO-UNDO. 20 | DEFINE {&invar} picDatabase AS CHARACTER NO-UNDO. 21 | DEFINE {&invar} picTableName AS CHARACTER NO-UNDO. 22 | 23 | &IF DEFINED(UIB_is_Running) = 0 &THEN 24 | DEFINE {&invar} TABLE FOR ttField. 25 | DEFINE {&invar} TABLE FOR ttColumn. 26 | &ENDIF 27 | 28 | DEFINE {&outvar} polSuccess AS LOGICAL NO-UNDO INITIAL ?. 29 | DEFINE {&outvar} porRepositionId AS ROWID NO-UNDO. 30 | 31 | 32 | /* Local Variable Definitions --- */ 33 | 34 | /* _UIB-CODE-BLOCK-END */ 35 | &ANALYZE-RESUME 36 | 37 | 38 | &ANALYZE-SUSPEND _UIB-PREPROCESSOR-BLOCK 39 | 40 | /* ******************** Preprocessor Definitions ******************** */ 41 | 42 | &Scoped-define PROCEDURE-TYPE Window 43 | &Scoped-define DB-AWARE no 44 | 45 | /* Name of designated FRAME-NAME and/or first browse and/or first query */ 46 | &Scoped-define FRAME-NAME frMain 47 | 48 | /* Standard List Definitions */ 49 | &Scoped-Define ENABLED-OBJECTS fcFilename btnGetFile btnAddFile edFileList ~ 50 | btnBack BtnNext fiText 51 | &Scoped-Define DISPLAYED-OBJECTS fcFilename edFileList fiText 52 | 53 | /* Custom List Definitions */ 54 | /* List-1,List-2,List-3,List-4,List-5,List-6 */ 55 | 56 | /* _UIB-PREPROCESSOR-BLOCK-END */ 57 | &ANALYZE-RESUME 58 | 59 | 60 | 61 | /* *********************** Control Definitions ********************** */ 62 | 63 | /* Define the widget handle for the window */ 64 | DEFINE VAR wImportSel AS WIDGET-HANDLE NO-UNDO. 65 | 66 | /* Definitions of the field level widgets */ 67 | DEFINE BUTTON btnAddFile 68 | LABEL "+" 69 | SIZE-PIXELS 25 BY 21 TOOLTIP "add file". 70 | 71 | DEFINE BUTTON btnBack DEFAULT 72 | LABEL "&Back" 73 | SIZE-PIXELS 75 BY 24 TOOLTIP "cancel load data" 74 | BGCOLOR 8 . 75 | 76 | DEFINE BUTTON btnGetFile 77 | LABEL "..." 78 | SIZE-PIXELS 25 BY 21 TOOLTIP "add one or more files". 79 | 80 | DEFINE BUTTON BtnNext 81 | LABEL "&Next" 82 | SIZE-PIXELS 75 BY 24 TOOLTIP "analyze files" 83 | BGCOLOR 8 . 84 | 85 | DEFINE VARIABLE edFileList AS CHARACTER 86 | VIEW-AS EDITOR NO-WORD-WRAP SCROLLBAR-HORIZONTAL SCROLLBAR-VERTICAL 87 | SIZE 100 BY 7.14 TOOLTIP "the files to load" NO-UNDO. 88 | 89 | DEFINE VARIABLE fcFilename AS CHARACTER FORMAT "X(256)":U 90 | LABEL "File" 91 | VIEW-AS FILL-IN 92 | SIZE-PIXELS 415 BY 21 TOOLTIP "the name of the file to load" NO-UNDO. 93 | 94 | DEFINE VARIABLE fiText AS CHARACTER FORMAT "X(256)":U INITIAL "Select the files you want to load or drag them onto this window" 95 | VIEW-AS TEXT 96 | SIZE-PIXELS 380 BY 19 NO-UNDO. 97 | 98 | 99 | /* ************************ Frame Definitions *********************** */ 100 | 101 | DEFINE FRAME frMain 102 | fcFilename AT Y 30 X 25 COLON-ALIGNED 103 | btnGetFile AT Y 30 X 450 104 | btnAddFile AT Y 30 X 475 105 | edFileList AT ROW 3.62 COL 1 NO-LABEL 106 | btnBack AT Y 213 X 340 107 | BtnNext AT Y 213 X 423 108 | fiText AT Y 6 X 9 NO-LABEL 109 | WITH 1 DOWN NO-BOX KEEP-TAB-ORDER OVERLAY 110 | SIDE-LABELS NO-UNDERLINE THREE-D 111 | AT X 0 Y 0 112 | SIZE-PIXELS 500 BY 239 113 | CANCEL-BUTTON btnBack DROP-TARGET . 114 | 115 | 116 | /* *********************** Procedure Settings ************************ */ 117 | 118 | &ANALYZE-SUSPEND _PROCEDURE-SETTINGS 119 | /* Settings for THIS-PROCEDURE 120 | Type: Window 121 | Allow: Basic,Browse,DB-Fields,Window,Query 122 | Other Settings: COMPILE 123 | */ 124 | &ANALYZE-RESUME _END-PROCEDURE-SETTINGS 125 | 126 | /* ************************* Create Window ************************** */ 127 | 128 | &ANALYZE-SUSPEND _CREATE-WINDOW 129 | IF SESSION:DISPLAY-TYPE = "GUI":U THEN 130 | CREATE WINDOW wImportSel ASSIGN 131 | HIDDEN = YES 132 | TITLE = "Load Data - Select Files" 133 | HEIGHT-P = 240 134 | WIDTH-P = 500 135 | MAX-HEIGHT-P = 1000 136 | MAX-WIDTH-P = 1400 137 | VIRTUAL-HEIGHT-P = 1000 138 | VIRTUAL-WIDTH-P = 1400 139 | RESIZE = yes 140 | SCROLL-BARS = no 141 | STATUS-AREA = no 142 | BGCOLOR = ? 143 | FGCOLOR = ? 144 | KEEP-FRAME-Z-ORDER = yes 145 | THREE-D = yes 146 | MESSAGE-AREA = no 147 | SENSITIVE = yes. 148 | ELSE {&WINDOW-NAME} = CURRENT-WINDOW. 149 | /* END WINDOW DEFINITION */ 150 | &ANALYZE-RESUME 151 | 152 | 153 | 154 | /* *********** Runtime Attributes and AppBuilder Settings *********** */ 155 | 156 | &ANALYZE-SUSPEND _RUN-TIME-ATTRIBUTES 157 | /* SETTINGS FOR WINDOW wImportSel 158 | NOT-VISIBLE,,RUN-PERSISTENT */ 159 | /* SETTINGS FOR FRAME frMain 160 | NOT-VISIBLE FRAME-NAME */ 161 | /* SETTINGS FOR FILL-IN fiText IN FRAME frMain 162 | ALIGN-L */ 163 | IF SESSION:DISPLAY-TYPE = "GUI":U AND VALID-HANDLE(wImportSel) 164 | THEN wImportSel:HIDDEN = no. 165 | 166 | /* _RUN-TIME-ATTRIBUTES-END */ 167 | &ANALYZE-RESUME 168 | 169 | 170 | 171 | 172 | 173 | /* ************************ Control Triggers ************************ */ 174 | 175 | &Scoped-define SELF-NAME wImportSel 176 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL wImportSel wImportSel 177 | ON END-ERROR OF wImportSel /* Load Data - Select Files */ 178 | OR ENDKEY OF {&WINDOW-NAME} ANYWHERE DO: 179 | /* This case occurs when the user presses the "Esc" key. 180 | In a persistently run window, just ignore this. If we did not, the 181 | application would exit. */ 182 | IF THIS-PROCEDURE:PERSISTENT THEN RETURN NO-APPLY. 183 | END. 184 | 185 | /* _UIB-CODE-BLOCK-END */ 186 | &ANALYZE-RESUME 187 | 188 | 189 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL wImportSel wImportSel 190 | ON WINDOW-CLOSE OF wImportSel /* Load Data - Select Files */ 191 | DO: 192 | /* This event will close the window and terminate the procedure. */ 193 | APPLY "CLOSE":U TO THIS-PROCEDURE. 194 | RETURN NO-APPLY. 195 | END. 196 | 197 | /* _UIB-CODE-BLOCK-END */ 198 | &ANALYZE-RESUME 199 | 200 | 201 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL wImportSel wImportSel 202 | ON WINDOW-RESIZED OF wImportSel /* Load Data - Select Files */ 203 | DO: 204 | RUN LockWindow (INPUT wImportSel:HANDLE, INPUT YES). 205 | 206 | DO WITH FRAME frMain: 207 | 208 | /* Make 'em small so we don't get errors on resizing the window */ 209 | btnNext:X = 1. 210 | btnNext:Y = 1. 211 | btnBack:X = 1. 212 | btnBack:Y = 1. 213 | btnAddFile:X = 1. 214 | edFileList:WIDTH-PIXELS = 10. 215 | edFileList:HEIGHT-PIXELS = 10. 216 | 217 | /* Set frame width */ 218 | FRAME frMain:WIDTH-PIXELS = wImportSel:WIDTH-PIXELS NO-ERROR. 219 | FRAME frMain:HEIGHT-PIXELS = wImportSel:HEIGHT-PIXELS NO-ERROR. 220 | 221 | /* Adjust the editor */ 222 | edFileList:WIDTH-PIXELS = FRAME frMain:WIDTH-PIXELS - 3. 223 | edFileList:HEIGHT-PIXELS = FRAME frMain:HEIGHT-PIXELS - 90. 224 | btnAddFile:X = edFileList:X + edFileList:WIDTH-PIXELS - btnAddFile:WIDTH-PIXELS. 225 | btnGetFile:X = btnAddFile:X - btnGetFile:WIDTH-PIXELS. 226 | fcFileName:WIDTH-PIXELS = FRAME frMain:WIDTH-PIXELS - 90. 227 | 228 | btnNext:X = edFileList:X + edFileList:WIDTH-PIXELS - btnNext:WIDTH-PIXELS. 229 | btnNext:Y = FRAME frMain:HEIGHT-PIXELS - 27. 230 | btnBack:X = btnNext:X - btnBack:WIDTH-PIXELS - 10. 231 | btnBack:Y = btnNext:Y. 232 | 233 | /* Save settings */ 234 | RUN saveWindowPos(wImportSel:HANDLE,"DataDigger:ImportSel"). 235 | END. 236 | 237 | RUN showScrollBars(FRAME frMain:HANDLE, NO, NO). 238 | RUN LockWindow (INPUT wImportSel:HANDLE, INPUT NO). 239 | 240 | END. 241 | 242 | /* _UIB-CODE-BLOCK-END */ 243 | &ANALYZE-RESUME 244 | 245 | 246 | &Scoped-define SELF-NAME frMain 247 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL frMain wImportSel 248 | ON DROP-FILE-NOTIFY OF FRAME frMain 249 | DO: 250 | DEFINE VARIABLE iFile AS INTEGER NO-UNDO. 251 | {&_proparse_prolint-nowarn(varusage)} 252 | DEFINE VARIABLE lAdded AS LOGICAL NO-UNDO. 253 | 254 | DO iFile = 1 TO SELF:NUM-DROPPED-FILES: 255 | 256 | {&_proparse_prolint-nowarn(varusage)} 257 | RUN addFile(SELF:GET-DROPPED-FILE(iFile),OUTPUT lAdded). 258 | 259 | END. 260 | END. 261 | 262 | /* _UIB-CODE-BLOCK-END */ 263 | &ANALYZE-RESUME 264 | 265 | 266 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL frMain wImportSel 267 | ON GO OF FRAME frMain 268 | DO: 269 | APPLY "CHOOSE" TO btnNext. 270 | END. 271 | 272 | /* _UIB-CODE-BLOCK-END */ 273 | &ANALYZE-RESUME 274 | 275 | 276 | &Scoped-define SELF-NAME btnAddFile 277 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL btnAddFile wImportSel 278 | ON CHOOSE OF btnAddFile IN FRAME frMain /* + */ 279 | OR "RETURN" OF fcFileName 280 | DO: 281 | DEFINE VARIABLE lAdded AS LOGICAL NO-UNDO. 282 | RUN addFile(fcFileName:SCREEN-VALUE,OUTPUT lAdded). 283 | IF lAdded THEN fcFileName:SCREEN-VALUE = "". 284 | 285 | END. 286 | 287 | /* _UIB-CODE-BLOCK-END */ 288 | &ANALYZE-RESUME 289 | 290 | 291 | &Scoped-define SELF-NAME btnBack 292 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL btnBack wImportSel 293 | ON CHOOSE OF btnBack IN FRAME frMain /* Back */ 294 | OR ENDKEY OF {&WINDOW-NAME} ANYWHERE 295 | DO: 296 | polSuccess = FALSE. 297 | APPLY "CLOSE" TO THIS-PROCEDURE. 298 | END. 299 | 300 | /* _UIB-CODE-BLOCK-END */ 301 | &ANALYZE-RESUME 302 | 303 | 304 | &Scoped-define SELF-NAME btnGetFile 305 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL btnGetFile wImportSel 306 | ON CHOOSE OF btnGetFile IN FRAME frMain /* ... */ 307 | DO: 308 | 309 | DEFINE VARIABLE lOKpressed AS LOGICAL NO-UNDO. 310 | {&_proparse_prolint-nowarn(varusage)} 311 | DEFINE VARIABLE lAdded AS LOGICAL NO-UNDO. 312 | DEFINE VARIABLE cDataFile AS CHARACTER NO-UNDO. 313 | 314 | SYSTEM-DIALOG GET-FILE cDataFile 315 | TITLE "Choose File to load ..." 316 | FILTERS "XML files (*.xml)" "*.xml", 317 | "All files (*.*)" "*.*" 318 | MUST-EXIST 319 | USE-FILENAME 320 | UPDATE lOKpressed. 321 | 322 | IF lOKpressed THEN 323 | DO: 324 | {&_proparse_prolint-nowarn(varusage)} 325 | RUN addFile(cDataFile,OUTPUT lAdded). 326 | END. 327 | 328 | END. 329 | 330 | /* _UIB-CODE-BLOCK-END */ 331 | &ANALYZE-RESUME 332 | 333 | 334 | &Scoped-define SELF-NAME BtnNext 335 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL BtnNext wImportSel 336 | ON CHOOSE OF BtnNext IN FRAME frMain /* Next */ 337 | DO: 338 | DEFINE VARIABLE cFileList AS CHARACTER NO-UNDO. 339 | DEFINE VARIABLE lOldVisibility AS LOGICAL NO-UNDO. 340 | 341 | cFileList = edFileList:SCREEN-VALUE. 342 | 343 | IF cFileList <> "" THEN 344 | DO: 345 | lOldVisibility = wImportSel:VISIBLE. 346 | wImportSel:VISIBLE = FALSE. 347 | 348 | RUN VALUE(getProgramDir() + 'wImportCheck.w') 349 | ( INPUT plReadOnlyDigger 350 | , INPUT cFileList 351 | , INPUT picDatabase 352 | , INPUT picTableName 353 | , INPUT TABLE ttField /* do not use by-reference */ 354 | , INPUT TABLE ttColumn /* do not use by-reference */ 355 | , OUTPUT polSuccess 356 | , OUTPUT porRepositionId 357 | ). 358 | 359 | wImportSel:VISIBLE = lOldVisibility. 360 | 361 | IF polSuccess THEN 362 | APPLY 'close' TO THIS-PROCEDURE. 363 | END. 364 | 365 | END. 366 | 367 | /* _UIB-CODE-BLOCK-END */ 368 | &ANALYZE-RESUME 369 | 370 | 371 | &UNDEFINE SELF-NAME 372 | 373 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _MAIN-BLOCK wImportSel 374 | 375 | 376 | /* *************************** Main Block *************************** */ 377 | 378 | /* Set CURRENT-WINDOW: this will parent dialog-boxes and frames. */ 379 | ASSIGN CURRENT-WINDOW = {&WINDOW-NAME} 380 | THIS-PROCEDURE:CURRENT-WINDOW = {&WINDOW-NAME}. 381 | 382 | /* The CLOSE event can be used from inside or outside the procedure to */ 383 | /* terminate it. */ 384 | ON CLOSE OF THIS-PROCEDURE 385 | DO: 386 | /* Save settings */ 387 | RUN saveWindowPos(wImportSel:HANDLE,"DataDigger:ImportSel"). 388 | RUN disable_UI. 389 | END. 390 | 391 | /* Best default for GUI applications is... */ 392 | PAUSE 0 BEFORE-HIDE. 393 | 394 | /* Now enable the interface and wait for the exit condition. */ 395 | /* (NOTE: handle ERROR and END-KEY so cleanup code will always fire. */ 396 | MAIN-BLOCK: 397 | DO ON ERROR UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK 398 | ON END-KEY UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK: 399 | 400 | /* Get fonts */ 401 | FRAME {&FRAME-NAME}:FONT = getFont('Default'). 402 | 403 | RUN enable_UI. 404 | RUN initializeObject. 405 | VIEW wImportSel. 406 | 407 | IF NOT THIS-PROCEDURE:PERSISTENT THEN 408 | WAIT-FOR CLOSE OF THIS-PROCEDURE. 409 | END. 410 | 411 | /* _UIB-CODE-BLOCK-END */ 412 | &ANALYZE-RESUME 413 | 414 | 415 | /* ********************** Internal Procedures *********************** */ 416 | 417 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE addFile wImportSel 418 | PROCEDURE addFile : 419 | /* Add a file to the queue of files to load 420 | */ 421 | DEFINE INPUT PARAMETER pcFileName AS CHARACTER NO-UNDO. 422 | DEFINE OUTPUT PARAMETER plAdded AS LOGICAL NO-UNDO. 423 | 424 | DO WITH FRAME frMain: 425 | /* Only accept valid file names */ 426 | FILE-INFO:FILE-NAME = pcFileName. 427 | IF FILE-INFO:FULL-PATHNAME = ? THEN 428 | DO: 429 | MESSAGE SUBSTITUTE("Cannot find file '&1', please retry.",pcFilename) 430 | VIEW-AS ALERT-BOX INFORMATION BUTTONS OK. 431 | RETURN. 432 | END. 433 | 434 | /* Only accept regular files */ 435 | IF NOT FILE-INFO:FILE-TYPE BEGINS "F" THEN 436 | DO: 437 | MESSAGE "This is not a regular file, please retry." VIEW-AS ALERT-BOX INFORMATION BUTTONS OK. 438 | RETURN. 439 | END. 440 | 441 | IF LOOKUP(FILE-INFO:FULL-PATHNAME,edFileList:SCREEN-VALUE) = 0 THEN 442 | DO: 443 | edFileList:SCREEN-VALUE = TRIM(edFileList:SCREEN-VALUE,"~n"). 444 | edFileList:SCREEN-VALUE = edFileList:SCREEN-VALUE + "~n" + FILE-INFO:FULL-PATHNAME. 445 | edFileList:SCREEN-VALUE = TRIM(edFileList:SCREEN-VALUE,"~n"). 446 | END. 447 | plAdded = TRUE. 448 | END. 449 | 450 | END PROCEDURE. 451 | 452 | /* _UIB-CODE-BLOCK-END */ 453 | &ANALYZE-RESUME 454 | 455 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE disable_UI wImportSel _DEFAULT-DISABLE 456 | PROCEDURE disable_UI : 457 | /*------------------------------------------------------------------------------ 458 | Purpose: DISABLE the User Interface 459 | Parameters: 460 | Notes: Here we clean-up the user-interface by deleting 461 | dynamic widgets we have created and/or hide 462 | frames. This procedure is usually called when 463 | we are ready to "clean-up" after running. 464 | ------------------------------------------------------------------------------*/ 465 | /* Delete the WINDOW we created */ 466 | IF SESSION:DISPLAY-TYPE = "GUI":U AND VALID-HANDLE(wImportSel) 467 | THEN DELETE WIDGET wImportSel. 468 | IF THIS-PROCEDURE:PERSISTENT THEN DELETE PROCEDURE THIS-PROCEDURE. 469 | END PROCEDURE. 470 | 471 | /* _UIB-CODE-BLOCK-END */ 472 | &ANALYZE-RESUME 473 | 474 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE enable_UI wImportSel _DEFAULT-ENABLE 475 | PROCEDURE enable_UI : 476 | /*------------------------------------------------------------------------------ 477 | Purpose: ENABLE the User Interface 478 | Parameters: 479 | Notes: Here we display/view/enable the widgets in the 480 | user-interface. In addition, OPEN all queries 481 | associated with each FRAME and BROWSE. 482 | These statements here are based on the "Other 483 | Settings" section of the widget Property Sheets. 484 | ------------------------------------------------------------------------------*/ 485 | DISPLAY fcFilename edFileList fiText 486 | WITH FRAME frMain IN WINDOW wImportSel. 487 | ENABLE fcFilename btnGetFile btnAddFile edFileList btnBack BtnNext fiText 488 | WITH FRAME frMain IN WINDOW wImportSel. 489 | {&OPEN-BROWSERS-IN-QUERY-frMain} 490 | END PROCEDURE. 491 | 492 | /* _UIB-CODE-BLOCK-END */ 493 | &ANALYZE-RESUME 494 | 495 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE initializeObject wImportSel 496 | PROCEDURE initializeObject : 497 | /* Setup 498 | */ 499 | DO WITH FRAME {&FRAME-NAME}: 500 | 501 | /* Get fonts */ 502 | FRAME {&FRAME-NAME}:FONT = getFont('Default'). 503 | edFileList:FONT = getFont('Fixed'). 504 | 505 | /* Window position and size */ 506 | /* Set title of the window */ 507 | wImportSel:TITLE = SUBSTITUTE('Load Data For &1.&2 - Select Files', picDatabase, picTableName). 508 | 509 | /* Set minimum size of the window */ 510 | wImportSel:MIN-WIDTH-PIXELS = 400. 511 | wImportSel:MIN-HEIGHT-PIXELS = 200. 512 | 513 | /* to avoid scrollbars on the frame */ 514 | FRAME {&FRAME-NAME}:SCROLLABLE = FALSE. 515 | 516 | /* Set window back to last known pos */ 517 | RUN restoreWindowPos(wImportSel:HANDLE, "DataDigger:ImportSel"). 518 | END. 519 | 520 | END PROCEDURE. /* initializeObject */ 521 | 522 | /* _UIB-CODE-BLOCK-END */ 523 | &ANALYZE-RESUME 524 | -------------------------------------------------------------------------------- /wViewAsEditor.w: -------------------------------------------------------------------------------- 1 | &ANALYZE-SUSPEND _VERSION-NUMBER AB_v10r12 GUI 2 | &ANALYZE-RESUME 3 | &Scoped-define WINDOW-NAME wEditor 4 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _DEFINITIONS wEditor 5 | /*------------------------------------------------------------------------ 6 | 7 | Name: wViewAsEditor.w 8 | Desc: Show text in editor widget 9 | 10 | ----------------------------------------------------------------------*/ 11 | /* This .W file was created with the Progress AppBuilder. */ 12 | /*----------------------------------------------------------------------*/ 13 | 14 | CREATE WIDGET-POOL. 15 | { DataDigger.i } 16 | 17 | /* Parameters Definitions --- */ 18 | &IF DEFINED(UIB_IS_RUNNING) = 0 &THEN 19 | DEFINE INPUT-OUTPUT PARAMETER pcValue AS LONGCHAR NO-UNDO. 20 | &ELSE 21 | DEFINE VARIABLE pcValue AS LONGCHAR NO-UNDO. 22 | &ENDIF 23 | 24 | /* _UIB-CODE-BLOCK-END */ 25 | &ANALYZE-RESUME 26 | 27 | 28 | &ANALYZE-SUSPEND _UIB-PREPROCESSOR-BLOCK 29 | 30 | /* ******************** Preprocessor Definitions ******************** */ 31 | 32 | &Scoped-define PROCEDURE-TYPE Window 33 | &Scoped-define DB-AWARE no 34 | 35 | /* Name of designated FRAME-NAME and/or first browse and/or first query */ 36 | &Scoped-define FRAME-NAME DEFAULT-FRAME 37 | 38 | /* Standard List Definitions */ 39 | &Scoped-Define ENABLED-OBJECTS edValue btnOk btnCancel 40 | &Scoped-Define DISPLAYED-OBJECTS edValue 41 | 42 | /* Custom List Definitions */ 43 | /* List-1,List-2,List-3,List-4,List-5,List-6 */ 44 | 45 | /* _UIB-PREPROCESSOR-BLOCK-END */ 46 | &ANALYZE-RESUME 47 | 48 | 49 | 50 | /* *********************** Control Definitions ********************** */ 51 | 52 | /* Define the widget handle for the window */ 53 | DEFINE VAR wEditor AS WIDGET-HANDLE NO-UNDO. 54 | 55 | /* Definitions of the field level widgets */ 56 | DEFINE BUTTON btnCancel AUTO-END-KEY 57 | LABEL "Cancel" 58 | SIZE-PIXELS 75 BY 24 59 | BGCOLOR 8 . 60 | 61 | DEFINE BUTTON btnOk AUTO-GO 62 | LABEL "OK" 63 | SIZE-PIXELS 75 BY 24 64 | BGCOLOR 8 . 65 | 66 | DEFINE VARIABLE edValue AS CHARACTER 67 | VIEW-AS EDITOR SCROLLBAR-VERTICAL LARGE 68 | SIZE-PIXELS 400 BY 130 NO-UNDO. 69 | 70 | 71 | /* ************************ Frame Definitions *********************** */ 72 | 73 | DEFINE FRAME DEFAULT-FRAME 74 | edValue AT Y 0 X 0 NO-LABEL 75 | btnOk AT Y 140 X 234 76 | btnCancel AT Y 140 X 314 77 | WITH 1 DOWN NO-BOX KEEP-TAB-ORDER OVERLAY 78 | SIDE-LABELS NO-UNDERLINE THREE-D 79 | AT X 0 Y 0 80 | SIZE-PIXELS 400 BY 170. 81 | 82 | 83 | /* *********************** Procedure Settings ************************ */ 84 | 85 | &ANALYZE-SUSPEND _PROCEDURE-SETTINGS 86 | /* Settings for THIS-PROCEDURE 87 | Type: Window 88 | Allow: Basic,Browse,DB-Fields,Window,Query 89 | Other Settings: COMPILE 90 | */ 91 | &ANALYZE-RESUME _END-PROCEDURE-SETTINGS 92 | 93 | /* ************************* Create Window ************************** */ 94 | 95 | &ANALYZE-SUSPEND _CREATE-WINDOW 96 | IF SESSION:DISPLAY-TYPE = "GUI":U THEN 97 | CREATE WINDOW wEditor ASSIGN 98 | HIDDEN = YES 99 | TITLE = "Edit Field Value" 100 | HEIGHT-P = 173 101 | WIDTH-P = 400 102 | MAX-HEIGHT-P = 6720 103 | MAX-WIDTH-P = 1600 104 | VIRTUAL-HEIGHT-P = 6720 105 | VIRTUAL-WIDTH-P = 1600 106 | RESIZE = yes 107 | SCROLL-BARS = no 108 | STATUS-AREA = no 109 | BGCOLOR = ? 110 | FGCOLOR = ? 111 | KEEP-FRAME-Z-ORDER = yes 112 | THREE-D = yes 113 | MESSAGE-AREA = no 114 | SENSITIVE = yes. 115 | ELSE {&WINDOW-NAME} = CURRENT-WINDOW. 116 | /* END WINDOW DEFINITION */ 117 | &ANALYZE-RESUME 118 | 119 | 120 | 121 | /* *********** Runtime Attributes and AppBuilder Settings *********** */ 122 | 123 | &ANALYZE-SUSPEND _RUN-TIME-ATTRIBUTES 124 | /* SETTINGS FOR WINDOW wEditor 125 | VISIBLE,,RUN-PERSISTENT */ 126 | /* SETTINGS FOR FRAME DEFAULT-FRAME 127 | FRAME-NAME */ 128 | IF SESSION:DISPLAY-TYPE = "GUI":U AND VALID-HANDLE(wEditor) 129 | THEN wEditor:HIDDEN = no. 130 | 131 | /* _RUN-TIME-ATTRIBUTES-END */ 132 | &ANALYZE-RESUME 133 | 134 | 135 | 136 | 137 | 138 | /* ************************ Control Triggers ************************ */ 139 | 140 | &Scoped-define SELF-NAME wEditor 141 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL wEditor wEditor 142 | ON END-ERROR OF wEditor /* Edit Field Value */ 143 | OR ENDKEY OF {&WINDOW-NAME} ANYWHERE DO: 144 | /* This case occurs when the user presses the "Esc" key. 145 | In a persistently run window, just ignore this. If we did not, the 146 | application would exit. */ 147 | IF THIS-PROCEDURE:PERSISTENT THEN RETURN NO-APPLY. 148 | END. 149 | 150 | /* _UIB-CODE-BLOCK-END */ 151 | &ANALYZE-RESUME 152 | 153 | 154 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL wEditor wEditor 155 | ON LEAVE OF wEditor /* Edit Field Value */ 156 | OR "LEAVE" OF wEditor 157 | DO: 158 | /* This event will close the window and terminate the procedure. */ 159 | APPLY "CLOSE":U TO THIS-PROCEDURE. 160 | RETURN NO-APPLY. 161 | END. 162 | 163 | /* _UIB-CODE-BLOCK-END */ 164 | &ANALYZE-RESUME 165 | 166 | 167 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL wEditor wEditor 168 | ON WINDOW-CLOSE OF wEditor /* Edit Field Value */ 169 | DO: 170 | /* This event will close the window and terminate the procedure. */ 171 | APPLY "CLOSE":U TO THIS-PROCEDURE. 172 | RETURN NO-APPLY. 173 | END. 174 | 175 | /* _UIB-CODE-BLOCK-END */ 176 | &ANALYZE-RESUME 177 | 178 | 179 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL wEditor wEditor 180 | ON WINDOW-RESIZED OF wEditor /* Edit Field Value */ 181 | DO: 182 | 183 | /* Sanity checks */ 184 | IF wEditor:WIDTH-PIXELS < 100 185 | OR wEditor:HEIGHT-PIXELS < 100 THEN RETURN. 186 | 187 | RUN LockWindow (INPUT wEditor:HANDLE, INPUT YES). 188 | 189 | DO WITH FRAME {&FRAME-NAME}: 190 | 191 | /* Make everything small so we don't get errors on resizing the window */ 192 | btnOk:X = 0. 193 | btnOk:Y = 0. 194 | btnCancel:X = 0. 195 | btnCancel:Y = 0. 196 | edValue:X = 0. 197 | edValue:Y = 0. 198 | edValue:WIDTH-PIXELS = 10. 199 | edValue:HEIGHT-PIXELS = 10. 200 | 201 | /* Set frame width */ 202 | FRAME {&FRAME-NAME}:WIDTH-PIXELS = wEditor:WIDTH-PIXELS NO-ERROR. 203 | FRAME {&FRAME-NAME}:HEIGHT-PIXELS = wEditor:HEIGHT-PIXELS NO-ERROR. 204 | 205 | /* Adjust the browse */ 206 | edValue:WIDTH-PIXELS = FRAME {&FRAME-NAME}:WIDTH-PIXELS. 207 | edValue:HEIGHT-PIXELS = FRAME {&FRAME-NAME}:HEIGHT-PIXELS - 40. 208 | btnOk:X = FRAME {&FRAME-NAME}:WIDTH-PIXELS - 165. 209 | btnOk:Y = FRAME {&FRAME-NAME}:HEIGHT-PIXELS - 30. 210 | btnCancel:X = FRAME {&FRAME-NAME}:WIDTH-PIXELS - 85. 211 | btnCancel:Y = FRAME {&FRAME-NAME}:HEIGHT-PIXELS - 30. 212 | 213 | /* Save settings */ 214 | setRegistry("DataDigger:ViewAsEditor", "Window:x", STRING(wEditor:X) ). 215 | setRegistry("DataDigger:ViewAsEditor", "Window:y", STRING(wEditor:Y) ). 216 | setRegistry("DataDigger:ViewAsEditor", "Window:height", STRING(wEditor:HEIGHT-PIXELS) ). 217 | setRegistry("DataDigger:ViewAsEditor", "Window:width", STRING(wEditor:WIDTH-PIXELS) ). 218 | END. 219 | 220 | RUN showScrollBars(FRAME {&FRAME-NAME}:HANDLE, NO, NO). 221 | RUN LockWindow (INPUT wEditor:HANDLE, INPUT NO). 222 | 223 | END. 224 | 225 | /* _UIB-CODE-BLOCK-END */ 226 | &ANALYZE-RESUME 227 | 228 | 229 | &Scoped-define SELF-NAME btnOk 230 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL btnOk wEditor 231 | ON CHOOSE OF btnOk IN FRAME DEFAULT-FRAME /* OK */ 232 | OR "F2" OF edValue 233 | DO: 234 | pcValue = edValue:SCREEN-VALUE. 235 | APPLY "CLOSE" TO THIS-PROCEDURE. 236 | END. 237 | 238 | /* _UIB-CODE-BLOCK-END */ 239 | &ANALYZE-RESUME 240 | 241 | 242 | &Scoped-define SELF-NAME edValue 243 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL edValue wEditor 244 | ON CTRL-A OF edValue IN FRAME DEFAULT-FRAME 245 | DO: 246 | edValue:SET-SELECTION(1,LENGTH(edValue:SCREEN-VALUE) + 1). 247 | END. 248 | 249 | /* _UIB-CODE-BLOCK-END */ 250 | &ANALYZE-RESUME 251 | 252 | 253 | &UNDEFINE SELF-NAME 254 | 255 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _MAIN-BLOCK wEditor 256 | 257 | 258 | /* *************************** Main Block *************************** */ 259 | 260 | /* Set CURRENT-WINDOW: this will parent dialog-boxes and frames. */ 261 | ASSIGN CURRENT-WINDOW = {&WINDOW-NAME} 262 | THIS-PROCEDURE:CURRENT-WINDOW = {&WINDOW-NAME}. 263 | 264 | /* The CLOSE event can be used from inside or outside the procedure to */ 265 | /* terminate it. */ 266 | ON CLOSE OF THIS-PROCEDURE 267 | DO: 268 | /* Save settings */ 269 | setRegistry("DataDigger:ViewAsEditor", "Window:x", STRING(wEditor:X) ). 270 | setRegistry("DataDigger:ViewAsEditor", "Window:y", STRING(wEditor:Y) ). 271 | setRegistry("DataDigger:ViewAsEditor", "Window:height", STRING(wEditor:HEIGHT-PIXELS) ). 272 | setRegistry("DataDigger:ViewAsEditor", "Window:width", STRING(wEditor:WIDTH-PIXELS) ). 273 | 274 | RUN disable_UI. 275 | END. 276 | 277 | /* Best default for GUI applications is... */ 278 | PAUSE 0 BEFORE-HIDE. 279 | 280 | /* Now enable the interface and wait for the exit condition. */ 281 | /* (NOTE: handle ERROR and END-KEY so cleanup code will always fire. */ 282 | MAIN-BLOCK: 283 | DO ON ERROR UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK 284 | ON END-KEY UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK: 285 | 286 | ASSIGN edValue = SUBSTRING(pcValue,1,{&field-maxLength}). 287 | edValue:MAX-CHARS = {&field-maxLength}. 288 | 289 | RUN enable_UI. 290 | RUN initializeObject. 291 | 292 | IF NOT THIS-PROCEDURE:PERSISTENT THEN 293 | WAIT-FOR CLOSE OF THIS-PROCEDURE. 294 | END. 295 | 296 | /* _UIB-CODE-BLOCK-END */ 297 | &ANALYZE-RESUME 298 | 299 | 300 | /* ********************** Internal Procedures *********************** */ 301 | 302 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE disable_UI wEditor _DEFAULT-DISABLE 303 | PROCEDURE disable_UI : 304 | /*------------------------------------------------------------------------------ 305 | Purpose: DISABLE the User Interface 306 | Parameters: 307 | Notes: Here we clean-up the user-interface by deleting 308 | dynamic widgets we have created and/or hide 309 | frames. This procedure is usually called when 310 | we are ready to "clean-up" after running. 311 | ------------------------------------------------------------------------------*/ 312 | /* Delete the WINDOW we created */ 313 | IF SESSION:DISPLAY-TYPE = "GUI":U AND VALID-HANDLE(wEditor) 314 | THEN DELETE WIDGET wEditor. 315 | IF THIS-PROCEDURE:PERSISTENT THEN DELETE PROCEDURE THIS-PROCEDURE. 316 | END PROCEDURE. 317 | 318 | /* _UIB-CODE-BLOCK-END */ 319 | &ANALYZE-RESUME 320 | 321 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE enable_UI wEditor _DEFAULT-ENABLE 322 | PROCEDURE enable_UI : 323 | /*------------------------------------------------------------------------------ 324 | Purpose: ENABLE the User Interface 325 | Parameters: 326 | Notes: Here we display/view/enable the widgets in the 327 | user-interface. In addition, OPEN all queries 328 | associated with each FRAME and BROWSE. 329 | These statements here are based on the "Other 330 | Settings" section of the widget Property Sheets. 331 | ------------------------------------------------------------------------------*/ 332 | DISPLAY edValue 333 | WITH FRAME DEFAULT-FRAME IN WINDOW wEditor. 334 | ENABLE edValue btnOk btnCancel 335 | WITH FRAME DEFAULT-FRAME IN WINDOW wEditor. 336 | {&OPEN-BROWSERS-IN-QUERY-DEFAULT-FRAME} 337 | VIEW wEditor. 338 | END PROCEDURE. 339 | 340 | /* _UIB-CODE-BLOCK-END */ 341 | &ANALYZE-RESUME 342 | 343 | &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE initializeObject wEditor 344 | PROCEDURE initializeObject : 345 | /* Init frame and font 346 | */ 347 | DEFINE VARIABLE iValue AS INTEGER NO-UNDO. 348 | 349 | DO WITH FRAME {&FRAME-NAME}: 350 | 351 | /* Set default font */ 352 | FRAME {&FRAME-NAME}:FONT = getFont('Default'). 353 | edValue:FONT = getFont('Fixed'). 354 | 355 | /* Restore window */ 356 | iValue = INTEGER(getRegistry('DataDigger:ViewAsEditor', 'Window:x' )). 357 | IF iValue > 0 THEN ASSIGN wEditor:X = iValue NO-ERROR. 358 | 359 | iValue = INTEGER(getRegistry('DataDigger:ViewAsEditor', 'Window:y' )). 360 | IF iValue > 0 THEN ASSIGN wEditor:Y = iValue NO-ERROR. 361 | 362 | iValue = INTEGER(getRegistry('DataDigger:ViewAsEditor', 'Window:height' )). 363 | IF iValue > 0 THEN ASSIGN wEditor:HEIGHT-PIXELS = iValue NO-ERROR. 364 | 365 | iValue = INTEGER(getRegistry('DataDigger:ViewAsEditor', 'Window:width' )). 366 | IF iValue > 0 THEN ASSIGN wEditor:WIDTH-PIXELS = iValue NO-ERROR. 367 | 368 | END. 369 | 370 | APPLY "window-resized" TO wEditor. 371 | 372 | END PROCEDURE. /* initializeObject */ 373 | 374 | /* _UIB-CODE-BLOCK-END */ 375 | &ANALYZE-RESUME 376 | 377 | --------------------------------------------------------------------------------