├── .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  
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 |
--------------------------------------------------------------------------------