![]() |
![]() APPX Utility | |||||||
APPX is a state-of-the-art, platform-independent, database-independent Rapid Application Development (RAD) and runtime environment that is unsurpassed for the design and deployment of business application software.
| ||||||||
Subcategories:![]() ![]() ![]() ![]() ![]() | ||||||||
[New Answer in "APPX Utility"] | ||||||||
2005-Jun-02 11:04am | ||||||||
![]() |
![]() ![]() APPX Development Environment | |||||||
This category contains a variety of subcategories for FAQ's relating to APPX Application Design.
| ||||||||
Subcategories:![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | ||||||||
[New Answer in "APPX Development Environment"] | ||||||||
2007-Mar-08 1:43pm | ||||||||
![]() |
![]() ![]() ![]() Tips & Techniques | |||||||
Tips & Techniques relating to APPX design.
| ||||||||
Subcategories:
Answers in this category: | ||||||||
[New Answer in "Tips & Techniques"] | ||||||||
2008-May-13 2:38pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How can my APPX process tell if a user is running the GUI client? | |||||||
Is there a way in ILF to determine what type of client the user is using to run APPX? For example, if a user is running a "text" client, we want to display a text menu. But, if the user is running a GUI client we want to display a GUI menu. | ||||||||
GOSUB --- CHECK GUI CLIENT IF --- RETURN CODE EQ 1 T * Running with a GUI client F * Running with a character client | ||||||||
[Append to This Answer] | ||||||||
2003-Nov-06 6:17am | ||||||||
![]() |
![]() ![]() ![]() ![]() Is it possible to suppress the binoculars on a field that has a DLU defined? | |||||||
The APPX GUI Client automatically creates a binoculars icon that is attached to the right-hand side of any field that has a DLU (data look-up) defined. Is there any way to suppress this auto-GUI feature?
| ||||||||
There isn't a design specification or runtime "preference" to control whether or not the APPX GUI Client appends the binocular icon to a data lookup (DLU) field. The client doesn't use an external picture file but rather has the binocular icon compiled into the Java code. This means that you cannot simply swap one icon file with another.
However, APPX will only append the icon if there are two blank spaces immediately to the right of the DLU field. So, an indirect method of eliminating the icon would be to make sure that one of the two fields is not blank. Type a "." or "*" or place a MODIFIABLE field immediately to the right of the field to suppress the binoculars. If you had your own icon you wished to display or wanted to display the non-modifiable look up value (field), create that widget on the screen and then drag it over the "*".
While overriding this “standard behavior” is possible, there are serious program maintenance issues that should be considered.
| ||||||||
[Append to This Answer] | ||||||||
2007-Oct-05 5:00pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to build a UNIX script to run an APPX process (cron job). | |||||||
To run a background process (cron job) in UNIX, build a script as follows; export APPXPATH=/appx/appx350/data export TERM=ibm3151 su - xxx -c "/appx/appx350/appx -s -d=ddd -a=TRN -t=JOB -p=BATCH_CYCLE" 1>/dev/null 2>/dev/null The first export command is the APPXPATH directory for your APPX installation. Example: /appx/appx350/data The second export command defines the terminal type. Example: ibm3151. Even thought the process is running in the background, the terminal type must be defined. The su command line parameters: xxx is the o/s userid of who is running this process -c " then the APPX application path -s tells APPX to automatically pass through any entry screens like sort and disposition that might be encountered. -d ddd is the database id of the APPX application -a application id -t process type, most likely a JOB -p the name of your process followed by ". The underscore maintains the space you may have in the APPX process name. 1> and 2> tells appx to send interactive message to the null device. These two parameters are to be included in the su line. Of course you would have one script for each process you wanted to run in background. | ||||||||
[Append to This Answer] | ||||||||
2004-Jan-27 3:11pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to refresh parent screen after a child process. | |||||||
APPX 4.1 If a child process is invoked from an input process and the child process modifies a displayed data element from the PCF, you can instruct APPX to redisplay the parent screen by putting a DISPLAY statement (no Application Id or Field name) in the Post Invocation of the child process. The data processed in the child may have to be re-written depending on the type of child being invoked.
APPX 4.2 | ||||||||
[Append to This Answer] | ||||||||
2004-Jan-15 5:52am | ||||||||
![]() |
![]() ![]() ![]() ![]() How do I send a file to a client PC and open the file with a client side App? (i.e. Excel) | |||||||
The following code sends the file from the server to the Windows client PC and runs a command on the client. You need the Java client for this to work. This example sends a spreadsheet file and launches Microsoft Excel to open the file on the client.
| ||||||||
* * Send the file to the client * SET --- TEMP 80 = /tmp/info.csv SET --- TEMP 132 = c:\temp\info.csv PASS --- TEMP 80 FIELD SHARE? Y PASS --- TEMP 132 FIELD SHARE? Y CALL ,RT_SEND_FILE RESIDENT? N END? N FAIL 0 * * Run Excel and open the file * SET --- TEMP 256 = @ APPEND --- TEMP 256 0 "C:\Program Files\Micr APPEND --- TEMP 256 0 osoft Office\Office\EX APPEND --- TEMP 256 0 CEL.EXE" * APPEND --- TEMP 256 1 c:\temp\info.csv * SET --- LI = 256 PASS --- TEMP 256 FIELD SHARE? Y PASS --- LI FIELD SHARE? Y CALL ,RT_LOAD_URL RESIDENT? N END? N FAIL 0 * | ||||||||
See also: ![]() _ | ||||||||
[Append to This Answer] | ||||||||
2003-Dec-09 4:24pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How can I import consecutive (flat) files into APPX? | |||||||
APPX users often find the need to import data from external sources into APPX. What methods can be used to bring consecutive (flat) data files into the APPX database files?
| ||||||||
Here are three approaches:
1. If the file is "columnar" (all the data lines up into columns, and all the records have the same fixed length), define an APPX Data Dictionary file and fields corresponding to the columns for the fields, and read it directly. Have a 2-byte alpha field at the end, the 'absorb' the hex(0d0a) that Windows apps usually put on the end of each of the line, to denote end of line. See "to import a flat file" below. 2. Create an APPX consecutive file with a single 1-byte alpha field. Use it to read the text file into APPX, one byte at a time. Build a record buffer, testing for hex(0d0a) to determine the end of each record, and then writing it out to the file. 3. Using the ",RT_" commands to read the file. 'RT' commands are unsupported and subject to modification, but are often used for these sorts of tasks. We use them in the UPDATE process generated by our "Comma Delimited Update" process within Utilities/Toolbox. You might look at an UPDATE generated by this utility, to get a feel for how the commands work. To import Tab delimited variable length files into APPX, check this document from "Sparky and Spike" at CANSYS West: http://www.cansyswest.com/importin.htm
-------------------------------------------------------------------------------- 1. Export the file from Excel into a fixed length format. 2. Define a Consecutive file in APPX, with all Alpha fields, matching the column widths of each Excel column, as exported. 3. Add a 2 byte alpha at the end of the APPX DD, to receive the hex(0d0a) that Excel and other Windows applications append to records to denote record boundaries. 4. Design Transfer the design for the Consecutive file defined above into a 2nd APPX file. 5. Change the field types you want to be other than Alpha, into their other field type. (Numeric, Date, or whatever.) Add indices. 6. Run 'Create Files' on both the Consecutive and Indexed files. 7. FTP the file to your Unix box in ASCII format. 8. Move the FTP'd file into your Data directory as the name of the Consecutive f ile. (Filename is all upper case, with a lower case .dat suffix.) 9. Write an OUTPUT that reads the Consecutive file and reports on its contents. Within the 'Select Image' event point, write ILF that moves field contents from the Consecutive file into the Indexed file. Write the new record. If you try to write two records with the same Primary or Unique Key, the WRITE will fail. Check the False condition on a WRITE to catch that and handle it accordingly. Set --- ALTERNATE IMAGE NUMBER in Select Image to selectively display/print records of interest. Date fields will require special manipulation. Use SET TEMP commands, to get them into APPX date format.
Run the above OUTPUT on this FTP'd file, converting it from Consecutive into Indexed format. Examine the resulting files. Modify your OUTPUT as needed.
| ||||||||
[Append to This Answer] | ||||||||
2003-Nov-18 3:07pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Checking return code after a Stream Write. | |||||||
In 4.1.a under Windows, the Stream Write always returns a failed (False) condition. You can't test the return code, you can only assume it worked.
| ||||||||
[Append to This Answer] | ||||||||
2003-Nov-20 11:19am | ||||||||
![]() |
![]() ![]() ![]() ![]() How can I run a constrained input process via ILF? | |||||||
APPX does not provide a direct method of running a constrained INPUT process via ILF. However, you can define a JOB process that runs the INPUT process constrained and you can run the JOB process via ILF. Be sure to run the JOB process with an invocation type of SUBPROCESS so that the constraint fields will be available within the JOB.
| ||||||||
[Append to This Answer] | ||||||||
2003-Nov-22 10:24am | ||||||||
![]() |
![]() ![]() ![]() ![]() Is it possible to get APPX to automatically convert Gregorian date fields to Julian dates? | |||||||
A display mask of 555 will display the Julian day number. A mask like "8807 - 555" would display a date as 2004-247 for example.
| ||||||||
[Append to This Answer] | ||||||||
2003-Nov-24 9:19am | ||||||||
![]() |
![]() ![]() ![]() ![]() How to determine IO mode (READ,WRITE,HOLD) within a FLEP | |||||||
Is it possible to tell inside a FLEP whether it is being called from a READ or a READ w/ Hold? Or whether it's being called from a WRITE or REWRITE?
| ||||||||
The --- MODE PDF should tell you this information. READ with HOLD sets MODE = CHANGE, without HOLD sets MODE = INQUIRE. On the PCF update event points it sets MODE = ADD for a WRITE and MODE = CHANGE for a REWRITE, MODE = DELETE for a DELETE.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-07 2:14pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to create dynamic rollover tool-tips. | |||||||
To create rollover tooltips dynamically from ILF at runtime, get (or create) the WIDGET record, populate it’s WIDGET TOOLTIP (text 60) field with the desired text, and WRITE it to the widget file.
| ||||||||
[Append to This Answer] | ||||||||
2003-Nov-24 9:34am | ||||||||
![]() |
![]() ![]() ![]() ![]() How to play sounds. | |||||||
APPX 4.2 The --- PLAY SOUND command ( audio subroutine ) in ILF will support .wav, .au, and .aiff file formats. Examples; SET --- TEMP 512 = /home/pete/test.wav PASS --- TEMP 512 FIELD SHARE? N GOSUB --- PLAY SOUND SET --- TEMP 512 = file:///home/pete/test APPEND --- TEMP 512 0 .wav PASS --- TEMP 512 FIELD SHARE? N GOSUB --- PLAY SOUND SET --- TEMP 512 = http://www.wavsite.com APPEND --- TEMP 512 0 /sounds/62369/grail22. APPEND --- TEMP 512 0 wav PASS --- TEMP 512 FIELD SHARE? N GOSUB --- PLAY SOUND | ||||||||
[Append to This Answer] | ||||||||
2003-Dec-01 4:26pm | ||||||||
![]() |
![]() ![]() ![]() ![]() What is pdf "---ENTRY SELECTED PATH" used for? | |||||||
"--- ENTRY SELECTED PATH" is not documented because it's really for
internal use only (and it will change, so don't use it). You can use the "--- ACCESS PATH" pdf to determine which key field is currently in use. Unfortunately, that's a read-only PDF so you can't conveniently change back just by setting it again. | ||||||||
[Append to This Answer] | ||||||||
2003-Dec-08 9:42am | ||||||||
![]() |
![]() ![]() ![]() ![]() How do you create a vertical or horizontal line on an input image? | |||||||
APPX 4.2 Appx doesn’t have a Line widget however starting in release 4.2 you can create lines using the following techniques. To get a horizontal line, add a box widget to the screen and set the height adjustment parameter to -90. To produce a vertical line, create a label widget with the height adjustment set to -80. Note that the use of negative values are supported in release 4.2 (and up) only. | ||||||||
[Append to This Answer] | ||||||||
2003-Dec-18 2:58pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How do I keep production applications from accidentally being changed? | |||||||
Go to:
Appx main menu > System Administration > Databases/Applications > Applications. Select the application you want to protect from changes. Press ENTER to go to the popup continuation window. Turn off the flag in the lower right of that window called "Allow Design?". This makes that application "Inquire Mode Only" from within application design.
Release 4.2 was change to have the default mode in Application Design be Inquire rather than Change mode. Part of the reasoning behind that decision was to assist in protecting applications from accidentally being changed.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-15 5:59am | ||||||||
![]() |
![]() ![]() ![]() ![]() Scope of cached files! | |||||||
When you create a cached version of a file, the contents are treated as a temporary detached memory file. You still have to choose whether each stream is attached to the cache file or the base file (see the topic, “What is the difference between file content and file stream?”).
You create the cache once, but you use OPEN-CACHE?=Y to control each stream. You can switch a given stream back and forth between the cached and base files by executing OPEN statements. When Appx creates a file stream, it uses the base. If you have file A open in a process, and then invoke a subprocess child, we don't open file A again (and we don't create a new stream). The child shares the parent's stream. You can prove that to yourself by putting a TRAP in the File-level Open event point for file A - it won't get hit when you invoke the child process. In the case of cached files, the file contents are always created in the first stack frame (i.e. the cached file contents are detached). The file stream always has a subprocess scope.
Here's a test scenario to illustrate how this works. I defined a simple permanent index file with two fields, TESTSCOP NUMBER and TESTSCOP NAME. Then I created a simple scrolling input process (TESTSCOP as the PDF) and entered five test records. I painted --- CHILD ID on the header frame to make it easier to see which input process was running. Next, I wrote a job that invoked the input process six times: CHILD ID Invocation Type Pre-invocation Open? -------- ---------------- -------------------- 1ST Subprocess No 2ND Subprocess Yes - open cached 3RD Subprocess No 4TH Related No 5TH Subprocess No 6TH Subprocess Yes - open baseHere are the steps and results: When the job runs, the first child displays data in the base file (PDF). In the pre-invocation event point of the 2ND child, I CREATE the cache (type = LOAD), then OPEN the cache, then looped thru each record and appended the word CACHED to each name field. So now the base file is unchanged, but the cache file has the word CACHED in every record. When the 2ND child process runs, it displays the cached file. When the 3RD child runs, I see the cached records because the stream is shared between the parent and children 2 and 3 (and 5 and 6). The 4TH child is invoked related. Stream objects are not shared with related invocations, so the base PDF records are displayed. The 5TH child is invoked subprocess and is identical to the 3RD. I added this child to illustrate that the file contents are persistent. The 5TH child shows the cached records.
In the pre-invocation event point of the 6TH child, I OPEN the CUST file, this time with CACHE set to NONE. The 6TH child displays the base records, as expected.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-15 5:41am | ||||||||
![]() |
![]() ![]() ![]() ![]() How data sharing is accomplished in APPX! | |||||||
Each process refers to a list of objects (we call them areas internally). An object is a record buffer, a work field, file contents, or a file stream. (There are a few other object types, but we'll ignore them for now).
When you invoke a process, APPX pushes a stack frame onto the process execution stack. A stack frame contains a set of objects. Important point: a process (actually an EM) contains a set of references, a stack frame contains a set of objects. Data sharing matches each reference to the appropriate object. When a process is invoked, APPX walks through the list of references and determines which stack frame should contain the corresponding object. If a process has no parent (i.e. it is the first process), all objects are created in the first stack frame. If a process has a parent, we look at the sharing characteristics of the object and of the ancestor processes. If the object is shared with subprocesses, we stop traversing the stack as soon as we encounter a related or detached invocation. If the object is shared with related processes, we stop traversing the stack as soon as we find a detached invocation. If the object is shared with detached processes, we stop when we find the first stack frame.
For example: Process A | detached | Process B | related | Process C | subprocess | Process D | subprocess | Process ELet's say that you have just invoked process E (which is a subprocess child of process D, which is a subprocess child of C, which is a related child of B...). We now process the list of references in process E's EM. If we find a reference to a private object (i.e., one that should never be shared, such as --- PROCESS TYPE), we create the object in process E's stack frame. If we find a reference to an object that should be shared with subprocesses, we look back up the stack until we find the most recently invoked related or detached process; in this case, process C. We create any subprocess-scoped objects in the stack frame for process C. If we find a reference to a related object, we look back until we find the most recently invoked detached process (in this case process B) and create related-scope objects in that stack frame. If we find a reference to an object when should be shared with detached invocations (such as --- USER ID), we create them in the first stack frame. As we process each reference, we locate the desired object (creating it required) and point the reference to the object. That means that the references for a particular invocation can point into four different stack frames (private, subprocess, related, and detached). Looking back at the stack frame above, consider what will happen when process E ends. All objects private to E are destroyed, but what about other objects? Any subprocess-scoped objects were created in the stack frame for process C so they are not destroyed until process C ends. There are some interesting consequences to this. First, the stack frame for any given invocation can contain objects that are not referenced by that process.
For example, if process E refers to a field named WORK TOTAL (subprocess-scoped), that object is created in C's stack frame even if process C does not refer to WORK TOTAL. Now when process E ends, WORK TOTAL is not destroyed - it lives in C's stack frame until C ends. Let's say that, after process E ends, process D invokes process F (so E and F are siblings even though E dies before F was born). If process F refers to WORK TOTAL, it will find that object in process C's stack frame - in fact, WORK TOTAL will reflect the last value assigned by process D.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-15 6:03am | ||||||||
![]() |
![]() ![]() ![]() ![]() What is the difference between file content and file stream? | |||||||
There are two parts to a file: the file contents, and the file stream. File contents can be permanent or temporary. If temporary, the contents can be scoped as subprocess, related, or detached. The file stream is always subprocess.
That means that if you have a stream positioned at record 10, and invoke a child as a subprocess, and READNEXT within the child, you will be sharing the stream with the parent and the parent will now be positioned at record 11. On the other hand, if you invoke the child as related or detached, the child has its own stream and a READNEXT will not affect the parent's stream. A stream has four components: - readnext position (record number/key value plus key path) - an optional record lock - a record buffer - pointer to cached or base file | ||||||||
[Append to This Answer] | ||||||||
2004-Jan-15 6:04am | ||||||||
![]() |
![]() ![]() ![]() ![]() What does scope refer to? | |||||||
Please go to http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=656 for a detailed explanation of scoping as it applied to APPX.
| ||||||||
[Append to This Answer] | ||||||||
2003-Dec-22 3:35pm | ||||||||
![]() |
![]() ![]() ![]() ![]() What is the scope of a work field? | |||||||
Input#1 calls Input#2 with a 'scope' of Subprocess, Related, or Detached.
Work fields (and work files) are also defined with scopes of Subprocess,
Related, or Detached.
The following rules apply: A Subprocess work field will only survive a Subprocess level of Process Invocation. A Related work field survives both Subprocess and Related Process Invocations. A Detached work field survives all Invocations (and in general survives until the user exits Appx).
Input Process Invocation Type ------------------------------------------------------------ | Invocation Type | SubProcess | Detached | Related | |-------------------|------------|------------|------------| | | | | | | SubProcess | Yes | No | No | Work Field | | | | | Invocation | Detached | Yes | Yes | Yes | Type | | | | | | Related | Yes | No | Yes | | | | | | ------------------------------------------------------------ | ||||||||
[Append to This Answer] | ||||||||
2004-Jan-15 6:09am | ||||||||
![]() |
![]() ![]() ![]() ![]() Can I change the date and time APPX uses for testing date/time sensitive applications? | |||||||
Yes, there is an environment variable called APPX FAKE TIME that you set to what looks like a starting date/time. Then run APPX and it uses this as the starting date/time for the session (i.e. the clock ticks forward from that date time as time rolls forward).
If you ... export APPX_FAKE_TIME="2001061510000000" appx
... you get a date/time of ... 6/15/2001 8:00am
... and the clock ticks forward from there as time goes by. | ||||||||
[Append to This Answer] | ||||||||
2004-Jan-15 6:11am | ||||||||
![]() |
![]() ![]() ![]() ![]() How can I read the USER list? | |||||||
The following code will traverse the USER list.
BEG READ 0SA USER HOLD 0 KEY IS SET 0SA USER ID = 0SA USER ID SET 0SA USER NAM = 0SA USER NAM END READ 0SA USER When you enter the BEG READ into the ILF editor, it will give you a message "WARNING - File not found", which you can ignore (option 88).
Be very careful what you do with these techniques, as THEY ARE NOT SUPPORTED
BY APPX SOFTWARE, and may change without notice.
| ||||||||
[Append to This Answer] | ||||||||
2003-Dec-31 8:57am | ||||||||
![]() |
![]() ![]() ![]() ![]() How to make a negative sign appear in front of the number (instead of behind) | |||||||
First, go to the Data Dictionary for the numeric source field, and enter a
default display mask with the minus sign whenever you want it. Note: You
can also put currency symbols, commas, and anything else you might need.
Then, in the process where you want to move it to an alpha, you just say:
CNV TEXT <alpha field> = <numeric field> The CNV TEXT field will honor the default display mask, and put the minus sign where you want. If you put currency symbols, commas, etc, they will also be formatted into the alpha field. The same thing applies if you use a date field as the source, APPX will format the date according to the date mask, so you don't get '20010517--------', you get '5/17/2001'.
APPX will use your default mask in other places as well, which may or may
not be a good thing (inputs and outputs that use the numeric field will be
affected). If you are concerned about that, you can create a new numeric
field with the default mask you want, SET the original field into the new
one, and then use CNV TEXT.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-07 2:16pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to display high ASCII characters. | |||||||
To get the degree symbol (ASCII 176), for example, onto APPX OUTPUT and INPUT screens.
Depending on what version of APPX you are using and how you are accessing it, you may be able to hold down ALT, use the numeric keypad to type the ascii code value in decimal, and release ALT, to enter that ASCII char. Or you can do it with ILF code;
SET OWN WF ASCII CODE = 176 CNV BIN OWN WF ALPHA 1
... where WF ALPHA 1 is painted on the report or screen. The other variable is a three-digit numeric field. | ||||||||
[Append to This Answer] | ||||||||
2003-Dec-31 1:13pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to get User Security Codes using ILF. | |||||||
Is there a general way for the Application designer to manually control process behavior, based on Security? For example I would like to 'hide' optional children, if the user does not have the required security. Can I determine the security key of the process in ILF? You can read the 0AD PROCESS file to find out the security class that might be assigned to a process. You can then set up a memory indexed file with a single field of Alpha(4). Define it as the Record Access security field. Then, from ILF set the field to the security code you want to test, write it, and then try to read it back. If you can't read it back, then you don't have access to that security code. Details: 1) Create a memory file with one field designated as the RECORD PROTECT field, as follows: 2) Make sure that you set the Record Access field for the file as follows: Record Protection Fields Delete Protection = blank Key Protection = blank Record Access = SECURITY_CODE 3) The following ILF code will create and populate the memory file and test for a specific code. The READ returns a true if the user has access to the specified code. The READ returns a false is the user does not have access to the specified code. SCRATCH SPF SECURITY FAIL 0 CACHE? N CREATE SPF SECURITY SHARE? Y FAIL 0 CACHE NONE * The write will always succeed SET SPF SECURITY CODE = 0001 WRITE SPF SECURITY FAIL 0 * The read will fail if the user does not have access to code 0001 SET SPF SECURITY CODE = 0001 READ SPF SECURITY HOLD 0 FT 0 BY SECURITY CODE F ERROR User Doesn't Have Access To Code 0001 | ||||||||
[Append to This Answer] | ||||||||
2004-Jan-02 10:54am | ||||||||
![]() |
![]() ![]() ![]() ![]() How to QUERY/INPUT via Cache! | |||||||
When you want a QUERY to constrain an INPUT process (the regular INPUT Child Constraints can't be satisfied using CC's 'EQ' comparison operator only), you can use the following technique: Create a JOB with Job Steps: QUERY UPDATE (uq=query) INPUT All three processes use the same PCF. The UPDATE's Start of Process is: SCRATCH AAA FILENAME CACHE? Y CREATE AAA FILENAME SHARE? Y CACHE? NOLOAD OPEN AAA FILENAME SHARE? Y CACHE? N The UPDATE's Record frame contains only: OPEN AAA FILENAME SHARE? Y CACHE? Y WRITE AAA FILENAME OPEN AAA FILENAME SHARE? Y CACHE? N The INPUT's JobStep's Pre-Invocation sets the following detached workfield: SET AAA WORK USE-CACHED-PCF = 1 The INPUT's Start of Process contains: IF AAA WORK USE-CACHED-PCF EQ 1 T OPEN AAA FILENAME SHARE? Y CACHE? Y The INPUT's Post-Invocation sets: SET AAA WORK USE CACHED PCF = 0 This example does not pass changes to the CACHEed version on to the disk version. You'd have to put code in the INPUT's End of Process for that. | ||||||||
[Append to This Answer] | ||||||||
2004-Jan-02 11:22am | ||||||||
![]() |
![]() ![]() ![]() ![]() How to get the name of the Parent Process. | |||||||
There is an internal APPX subroutine which can be used to retrieve the name of the parent process to the current process.
GOSUB --- GET PARENT PROCESS
... then check the values of:
0AD WORK PROC TYPE 0AD WORK PROC NAM 0AD WORK AP | ||||||||
[Append to This Answer] | ||||||||
2005-May-03 11:40am | ||||||||
![]() |
![]() ![]() ![]() ![]() GUI themes via ILF! | |||||||
If you want theme-like behavior, you can implement at least a portion of it yourself, so that you can get a consistent look and feel for your buttons (or other gui elements).
What you would do is create a standard subroutine that reads all WIDGET records, looking for widgets of X type (like button). When it finds a widget of that type, it could set the font, text, rollover colors, etc. Then, call this subr in Pre-Display of any process you want to have the consistent look and feel. One enhancement you could do is put all the attrs in a one-rec param file, so that you can change them on the fly at run-time without having to touch the code.
This works only for setting attributes for existing GUI elements, and doesn't let you create new elements and add them to processes on the fly (for example, if you want a standard button to always appear on the bottom line of all INPUT processes).
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-02 4:07pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Example of a random number generator using ILF! | |||||||
The follow sample will work for any range of numbers where the total numbers in the range is a maximum of 10,000 (eg., 1 - 10000, 50000 - 60000, 1678 -11678). If you use a larger range, you will need to increase the generating time (TI) by some factor to allow at least one full pass through the range of numbers. * Set start and end of desired number range. SET --- AI = 1 SET --- ZI = 10000 * Use current time to get random number of seconds & hundredths * (WORK RGEN TIME SS defined as date field with seconds only) * (WORK RGEN TIME TH defined as date field with hundredths only) SET DATE 1EX WORK RGEN TIME SS SET --- SI = 1EX WORK RGEN TIME SS SET DATE 1EX WORK RGEN TIME TH SET --- TI = 1EX WORK RGEN TIME TH * Add number of seconds to number of hundredths COMPUTE --- TI + --- SI IF --- TI LT 1 T SET --- TI = 1 * Set Number counter to one less than specified start of range. SET --- NI = --- AI COMPUTE --- NI - 1 * Calculate time to stop generator by starting at current time * and increasing it by adding the value in TI to the th's part. * (WORK RGEN RUN END defined as date field with YY thru th) SET DATE 1EX WORK RGEN RUN END DATE ADD 1EX WORK RGEN RUN END 1 --- TI * Start infinite loop that will exit when end time is reached. BEG LOOP LI = 001 TO 001 STEP 000 COMPUTE --- NI + 1 * If number count reaches end of range, go back to start. IF --- NI GT --- ZI T SET --- NI = --- AI * If current time has reached end time, exit loop. * (WORK RGEN RUN START defined as date field with YY thru th) SET DATE 1EX WORK RGEN RUN START IF 1EX WORK RGEN RUN START GE 1EX WORK RGEN RUN END F END LOOP LI * ==> Resulting generated number is in ---NI | ||||||||
[Append to This Answer] | ||||||||
2004-Jan-02 4:14pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to retrieve an occurrence number with ILF! | |||||||
Retrieve and occurrence example: TRN WORK DATE occurs 66 times (DD) . . . SET --- TEMP 30 = WORK DATE (note this is a literal) SET 0AD ELEMENT NAM = --- TEMP 30 READ 0AD ELEMENT HOLD 0 FT 0 BY ELEMENT NAM SET --- AI = 0AD ELEMENT OCC AI will contain 66 in this example. | ||||||||
Now in 4.2 you can use the two new PDFs --- CURSOR AT APPLICATION and --- CURSOR AT FIELD just in case the user happened to be sitting on the field of interest. ... SET --- NEXT APPLICATION = --- CURSOR AT APPLICATION OPEN 0AD ELEMENT T SET --- TEMP 30 = --- CURSOR AT FIELD T SET 0AD ELEMENT NAM = --- TEMP 30 TT READ 0AD ELEMENT HOLD 0 FT 0 BY ELEMENT NAM ... I haven't tested this to see if it really works and I'm not sure if the T SET --- TEMP 30 = --- CURSOR AT FIELD would really be required. | ||||||||
[Append to This Answer] | ||||||||
2004-Jan-14 6:21pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to see a trace of executed process | |||||||
There is a very useful utility to examine the 'stack' of Appx Processes you invoked, to get down to the currently executing Appx Process:
--- Input STACK (EDIT) This ILF must be coded within an image level EP. Run against any Database.
This is most convenient if you define it as your SysAdmin 'Direct Process 1', or if you put it on a Direct Process 1 menu. Then, in a trapped routine, you can invoke direct process one, cntl+1. This will display the process stack which shows the process name, process type and invocation type. For a detailed description of the process stack see http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=171 .
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-07 2:19pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Use of --- DEFAULT MODE | |||||||
Setting PDF (--- DEFAULT MODE) before invoking an INPUT process, specifies the initial mode of the INPUT process. In addition to setting the desired value into the PDF, you must ...
1) Ensure that the INPUT process does not specify a "Default Mode" (which it always does)
2) Ensure that the child spec does not specify an "Override Default Mode" (which it normally doesn't)
3) Invoke the INPUT process with an invocation type of SUBPROCESS. (--- DEFAULT MODE has a share class of SUBPROCESS.) Think of INPUT Additional Attribute field "Default Mode" as "Initial Mode". Specifying "Default Mode" tells APPX to run the INPUT with that mode as the Initial Mode. APPX then ignores any value you might have set into the PDF. If a parent INPUT process is running in Inquire or Change mode and you set the PDF to ADD mode before invoking a child INPUT, APPX runs the child INPUT process in Inquire or Change mode instead.
You can control the INPUT process mode by setting the desired mode into --- DEFAULT MODE in the child INPUT's Start of Process.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-06 4:13pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to determine a leap year! | |||||||
Create a work date field as CC-DD, in the example below this work field is WORK DATE and the year I am checking is in WORK YEAR. Using ILF: SET TRN WORK DATE = TRN WORK YEAR SET TRN WORK DATE = ----0229-------- IF TRN WORK DATE EQ ------29-------- T (the year in WORK YEAR is a leap year) When 0229 is put in a date field that contains a year, APPX will determine if 0229 is valid for that year. If it is, 0229 will remain. If not, APPX date logic will convert the 0229 to 0301. In the example above, the first SET puts the year in the CC-DD date field. The second set puts Feb 29 into that year. The IF checks to see if the day is still 29. If it is, then this is a leap year. | ||||||||
[Append to This Answer] | ||||||||
2004-Jan-07 2:20pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How can I position a widget exactly where I want it? | |||||||
Hold the shift key down when positioning something on the image using your mouse. This is a fairly common Windows key combination in various image editors, allowing exact positioning of objects, as opposed to the 'snap to grid' that APPX does by default.
The row and column position on the widget will still be the nearest row/col intersection, but the micro adjustment field will be filled in with the percentage adjustment away from that row/col. The same thing applies to drawing buttons, etc. - without the shift key you get 'snap to grid', but if you use the shift key, you can make it any size.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-20 10:18am | ||||||||
![]() |
![]() ![]() ![]() ![]() Can we colorize the "auto gui" widgets by ILF in order to adapt them to color schemes? | |||||||
The "auto-GUI" capabilities of APPX come from two sources. Part of the auto-GUI is created by the "engine" in the form of WIDGET records that are modifiable. Another part of the auto-GUI is created by the client. The client part is not modifiable since there are no WIDGET records for that part. Future releases of APPX will shift more of the auto-gui to the engine leaving less for the client to synthesize.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-13 8:48am | ||||||||
![]() |
![]() ![]() ![]() ![]() Help in debugging AppxIO | |||||||
If you're using AppxIO to store data, you can get a complete log of all file I/O by setting the following env. variables:
APPX_IO_LOG=filename APPX_FMT_IO_LOG=1 The first will tell Appx to log all AppxIO actions to filename. The second will tell Appx to format the log so that mere mortals can read it. The log file will show all reads, readnexts, writes, deletes, and rewrites. Each entry will show a complete dump of the data being read, written, or deleted. For read operations, the log will show the key number and key value being retrieved.
You'll also see log entries for each process that runs so you can tell which process caused each I/O.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-19 4:29pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to put multiple of lines of text on a button or label widget. | |||||||
Buttons and Labels on input screens and menus can use html to enhance the text. Enter the html code in the Label or Button text field in the object property(ies). Example; <html>Request<br>Ship Date will be displayed on two lines. ---------------- | | | Request | | Ship Date | | | ---------------- The caveat is that the individual lines delineated by the <br> formatting may not obey all the label's gui settings, CENTER for example. In the case of CENTER the justification is applied to all lines at though there all the length of the longest segement. You can revised the html tag to center each line of the label as follows; <html><p align="center">Request<br>Ship Date | ||||||||
[Append to This Answer] | ||||||||
2004-Jul-07 2:15pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to add pulldown menu entries with ILF | |||||||
Here is a sample menu structure to create: Daily -- Transactions ----- Enter Transactions ----- Print Journal Monthly -- Postings ----- Balancing Report ----- Post Transactions To create this, enter the following in pre-display: * * Restore and set defaults for creating CHILD widget records * RESTORE --- WIDGET DEFAULT RECORD SET --- WIDGET PARENT TYPE = CHILD SET --- WIDGET POSITION ROW = 0 SET --- WIDGET POSITION COLUMN = * * Create the "Daily" top level pulldown * SET --- WIDGET LABEL = Daily SET --- WIDGET GROUP NAME = SET --- WIDGET OPTION = USER 1 SET --- WIDGET SHORTCUT = D SET --- WIDGET ADD TO MENU = Y GOSUB :WRITE CHILD WIDGET * * Create the "Transactions" pullout menu and attach to "Daily" * SET --- WIDGET LABEL = Transactions SET --- WIDGET GROUP NAME = Daily SET --- WIDGET OPTION = USER 2 SET --- WIDGET SHORTCUT = T SET --- WIDGET ADD TO MENU = Y GOSUB :WRITE CHILD WIDGET * * Create the "Enter Transactions" item and attach to "Transacti.." * SET --- WIDGET LABEL = Enter Transactions SET --- WIDGET GROUP NAME = Transactions SET --- WIDGET OPTION = USER 3 SET --- WIDGET SHORTCUT = E SET --- WIDGET ADD TO MENU = Y GOSUB :WRITE CHILD WIDGET * * Create the "Print Journal" item and attach to "Transactions" * SET --- WIDGET LABEL = Print Journal SET --- WIDGET GROUP NAME = Transactions SET --- WIDGET OPTION = USER 4 SET --- WIDGET SHORTCUT = P SET --- WIDGET ADD TO MENU = Y GOSUB :WRITE CHILD WIDGET * * Create the "Monthly" top level pulldown * SET --- WIDGET LABEL = Monthly SET --- WIDGET GROUP NAME = SET --- WIDGET OPTION = USER 11 SET --- WIDGET SHORTCUT = M SET --- WIDGET ADD TO MENU = Y GOSUB :WRITE CHILD WIDGET * * Create the "Postings" pullout menu and attach to "Monthly" * SET --- WIDGET LABEL = Postings SET --- WIDGET GROUP NAME = Monthly SET --- WIDGET OPTION = USER 12 SET --- WIDGET SHORTCUT = P SET --- WIDGET ADD TO MENU = Y GOSUB :WRITE CHILD WIDGET * * Create the "Balancing Report" item and attach to "Postings" * SET --- WIDGET LABEL = Balancing Report SET --- WIDGET GROUP NAME = Postings SET --- WIDGET OPTION = USER 12 SET --- WIDGET SHORTCUT = B SET --- WIDGET ADD TO MENU = Y GOSUB :WRITE CHILD WIDGET * * Create the "Post Transactions" item and attach to "Postings" * SET --- WIDGET LABEL = Post Transactions SET --- WIDGET GROUP NAME = Postings SET --- WIDGET OPTION = USER 14 SET --- WIDGET SHORTCUT = P SET --- WIDGET ADD TO MENU = Y GOSUB :WRITE CHILD WIDGET * END * * Write WIDGET and increment POSITION ROW to create unique keys * LABEL :WRITE CHILD WIDGET WRITE --- WIDGET FAIL 0 - COMPUTE --- WIDGET POSITION ROW + 1 F GOTO :WRITE CHILD WIDGET RETURN | ||||||||
[Append to This Answer] | ||||||||
2004-Feb-20 10:38am | ||||||||
![]() |
![]() ![]() ![]() ![]() How to close an external ASCII file (RT_CLOSE_STREAM)? | |||||||
Please refer to;
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=693
| ||||||||
The information above is incorrect. See the STREAM FILE (EXAMPLE) subroutine in the 1EX/00 application.
| ||||||||
[Append to This Answer] | ||||||||
2004-Oct-05 10:09am | ||||||||
![]() |
![]() ![]() ![]() ![]() How to read data to an external ASCII file (RT_READ_STREAM)? | |||||||
Please refer to;
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=693
| ||||||||
The information above is incorrect. See the STREAM FILE (EXAMPLE) subroutine in the 1EX/00 application.
| ||||||||
[Append to This Answer] | ||||||||
2004-Oct-05 10:10am | ||||||||
![]() |
![]() ![]() ![]() ![]() How to write data to an external ASCII file (RT_WRITE_STREAM)? | |||||||
Please refer to;
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=693
| ||||||||
The information above is incorrect. See the STREAM FILE (EXAMPLE) subroutine in the 1EX/00 application.
| ||||||||
The information above is incorrect. See the STREAM FILE (EXAMPLE) subroutine in the 1EX/00 application.
| ||||||||
[Append to This Answer] | ||||||||
2004-Oct-05 10:11am | ||||||||
![]() |
![]() ![]() ![]() ![]() How to open an external ASCII file (RT_OPEN_STREAM)? | |||||||
Please refer to;
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=693
| ||||||||
The information above is incorrect. See the STREAM FILE (EXAMPLE) subroutine in the 1EX/00 application.
| ||||||||
[Append to This Answer] | ||||||||
2004-Oct-05 10:11am | ||||||||
![]() |
![]() ![]() ![]() ![]() How to put APPX in sleep (pause) mode (RT_SLEEP)? | |||||||
Please refer to;
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=693 | ||||||||
[Append to This Answer] | ||||||||
2005-Apr-15 8:42am | ||||||||
![]() |
![]() ![]() ![]() ![]() How to get the current process parent name (RT_GET_PROC_NAM)? | |||||||
Please refer to;
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=693
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-02 9:13am | ||||||||
![]() |
![]() ![]() ![]() ![]() How to get the APPX runtime parameters (RT_GETPARAM)? | |||||||
Please refer to;
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=693
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-02 9:14am | ||||||||
![]() |
![]() ![]() ![]() ![]() How to get the environment variables (RT_GETENV)? | |||||||
Please refer to;
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=693
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-02 9:14am | ||||||||
![]() |
![]() ![]() ![]() ![]() Dynamic linking using the CALL statement. | |||||||
Please refer to:
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=649
| ||||||||
http://www.appx.com/ftp/appx/conference/presentations/InterfacingWithExtSubrs.doc
| ||||||||
[Append to This Answer] | ||||||||
2005-Oct-13 11:42am | ||||||||
![]() |
![]() ![]() ![]() ![]() How to access APPX Query parameters. | |||||||
Please refer to;
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=647
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-02 9:18am | ||||||||
![]() |
![]() ![]() ![]() ![]() How do you call a window API function? | |||||||
Please refer to;
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=628
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-02 9:18am | ||||||||
![]() |
![]() ![]() ![]() ![]() How do you copy from one application database to another within APPX. | |||||||
To copy all CUSTOMER records from one database to another:
SET --- NEXT DATABASE = DB1 OPEN TAR CUSTOMER SHARE? Y FAIL 0 * BEG READ TAR CUSTOMER Hold? N * * The DB1 Customer file is currently accessible * through the CUSTOMER file name - we just read * a record from the DB1 Customer file. Now we * Want to write this record to the DB2 Customer * file - have to open it first * SET --- NEXT DATABASE = DB2 OPEN TAR CUSTOMER SHARE? Y FAIL 0 WRITE TAR CUSTOMER FAIL 0 F CANCEL unexpected error (duplicate key?) WRITEing CUSTOMER * * Now we have to switch databases again before we * do the END READ * OPEN TAR CUSTOMER SHARE? Y FAIL 0 END READ TAR CUSTOMERNo CLOSE statement is needed - APPX simply switches the internal data structures between databases with each OPEN statement. This turns out to be much faster than the SPEED II method which required physically closing the file and reopening it for each database switch. Of course you have more files open with the APPX method. When APPX needs to open a file, it does so in two phases... a logical open and a physical open. The logical open takes place when APPX opens the file automatically OR when you open the file with an OPEN statement - this phase sets up internal memory structures to keep track of the file - the structure files are also verified during the logical open (this is expensive). The physical open only takes place when you actually do the first I/O to the file (a read, write, etc.).
A file name (use "CUSTOMER" as an example) actually acts as a file multiplexor - you can get to multiple CUSTOMER files using the same
file name. You do this by setting --- NEXT DATABASE and executing an
OPEN statement to open a CUSTOMER file in a different database.
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-02 9:22am | ||||||||
![]() |
![]() ![]() ![]() ![]() How to display detailed data from a scrolling input. | |||||||
I have a scrolling INPUT on a set of data. I would like the Automatic Child to jump to a full screen display of the full set of data. I have an existing INQUIRY that has the exact look and feel of what I want, and the users are familiar with this screen. How can I reuse this existing INQUIRY? (A simple Automatic Child doesn't work.)
| ||||||||
Before invoking the INQUIRY, set --- PROCESS CODE to "DISP".
In the Key Entry frame's Global Pre-Display event point, execute:
* * RETURN to Display, 1st time thru * IF --- PROCESS CODE EQ DISP T SET --- OPTION = RETURN T SET --- PROCESS CODE = DONE * * END to go back to INPUT, 2nd time thru * F IF --- PROCESS CODE EQ DONE FT SET --- OPTION = END (All this can be done in a SUBR, called from Key Entry's Global Pre-Display event point.) When the INQUIRY starts, PROCESS CODE is DISP, so the KEY ENTRY frame is skipped. Since the INQUIRY is constrained to one record, it displays only that record from the INPUT.
When the user presses ENTER or END after viewing the data, Key Entry executes again, but since PROCESS CODE is now DONE, it sets OPTION to END. INQUIRY ends, and control is returned to the parent.
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-02 9:24am | ||||||||
![]() |
![]() ![]() ![]() ![]() How to read EXCEL files from Appx. | |||||||
Please refer to;
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=785
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-02 9:26am | ||||||||
![]() |
![]() ![]() ![]() ![]() How do I search the electronic APPX manual(s) for multiple keywords? | |||||||
On the Search tab in the search text box, ‘Type in the keyword to find:’, use AND between the keywords. Example, “menu AND job AND input” would return topic pages that contain menu, job, and input. Likewise, typing “cnv AND text”, returns the occurrences of the CNV TEXT command.
| ||||||||
[Append to This Answer] | ||||||||
2005-Jun-02 11:13am | ||||||||
![]() |
![]() ![]() ![]() ![]() The underline character is not displayed under the shortcut letter! | |||||||
There is a setting on the desktop that controls whether the underline character appears when the Alt key is pressed (default for Windows XP) or if the underline character should always be displayed. Right click on the desktop, Properties > Appearance Tab > Effects > uncheck Hide underline letters for keyboard navigation until I press the Alt key. The underline character should now be displayed under your shortcut letter(s).
| ||||||||
[Append to This Answer] | ||||||||
2004-May-18 3:45pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to get printer friendly pages from the APPX web site. | |||||||
On every page there is a little icon of a printer at the top/right corner. Click this to get a printable version of the page.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jul-09 4:43pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How do you run an os command and pipe the results through a stream read? | |||||||
SET --- STREAM OPEN TYPE = r SET --- TEMP 256 = |ls -la /usr1/appx/ APPEND --- TEMP 256 0 data/C01/AGP/Files/ APPEND --- TEMP 256 0 AGP FILES NAME SET --- STREAM FILE PATHNAME = --- TEMP 256 GOSUB --- STREAM OPEN IF --- STREAM RETURN CODE NE 0 T ERROR Cannot Get File Listing T END * SET --- STREAM EOR SEQUENCE = LF GOSUB --- STREAM READ * The results will be in --- STREAM BUFFER DISPLAY --- STREAM BUFFER (AT APPEARANCE # ) | ||||||||
Don't forget to close, GOSUB --- STREAM CLOSE | ||||||||
[Append to This Answer] | ||||||||
2009-Mar-19 2:00pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Now that I can generate PDF files from APPX, how can I get the PDF to display as such in a browser? | |||||||
Changing the content type tag in the script to "application/pdf" which is the content type for pdf documents.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jul-09 5:36pm | ||||||||
![]() |
![]() ![]() ![]() ![]() What is the correct Date Mask for: Apr 13 09:23:00 2004? | |||||||
Mon Jan 05, 0807
Would result in the date displayed as Tue Apr 13, 2004
| ||||||||
[Append to This Answer] | ||||||||
2004-Jul-09 5:37pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Can Current Release of Appx support LDAP? | |||||||
That depends on platform. Windows and Linux - yes. Appx can make use of LDAP (since Appx is a language and you can call LDAP functions/executables with CALL and RUN statements). We also use LDAP for authentication if the server's operating system is configured to use LDAP. | ||||||||
[Append to This Answer] | ||||||||
2005-Mar-09 4:14pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How does LOCAL and RECEIVE statements work? | |||||||
First: a LOCAL statement is (nearly) equivalent to a RECEIVE statement that executes without a matching PASS statement (the RECEIVE statement will set the next T/F to F, but a LOCAL statement doesn't change the T/F flags). Second: when you execute a LOCAL (or RECEIVE) statement, the engine has to decide the point in time that the original value should be restored. If you execute a LOCAL (or RECEIVE) while there is a GOSUB active (in the current event point), the original value is restored when you execute a RETURN statement. If there is no GOSUB active, the original value is restored when the event point ends (with one exception). That means that you can add LOCAL statements to the beginning of an event point to protect variables that you want to use in that event point. You could instead add a RECEIVE statement, but that would be kind of weird (that may let you PASS a value in one event point and RECEIVE it in the next event point, but I can't recommend doing that). If you execute a LOCAL statement (and there is no active GOSUB) in the StartOfProcess event point, you are protecting a variable for the life of the process (the original value is restored when the process ends). | ||||||||
[Append to This Answer] | ||||||||
2005-Jan-27 3:46pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Can i have environment variable APPX_41_EPS set while designing in 4.2? | |||||||
No, you can't. APPX_41_EPS variable is a temporary, run time environment variable only. This variable was designed to give you a temporary Appx 41 behavior capabilities, while you are working on bringing your applications up to 4.2 capabilities.
| ||||||||
[Append to This Answer] | ||||||||
2005-Apr-13 1:47pm | ||||||||
![]() |
![]() ![]() ![]() ![]() I noticed that all of a sudden i have Applications tab on my Java client. How did it get there and how to get rid of it? | |||||||
Application tab and menu gets generated by Direct Process 1 or Direct Process 2.
You can get rid of Direct Process 1 and/or Direct Process 2 and it will get rid of the Applications tab for you.
| ||||||||
[Append to This Answer] | ||||||||
2005-Apr-13 4:02pm | ||||||||
![]() |
![]() ![]() ![]() ![]() I have set my --- OPTION = END PARAGRAPH, but it doesn't seem to do anything. Why is that? | |||||||
END PARAGRAPH is listed as a valid value for --- OPTION, but setting this value into OPTION doesn't seem to do anything. Also, the END PARAGRAPH keystroke does not trigger the Option Intercept Event Point, so the designer can't test for this.
| ||||||||
[Append to This Answer] | ||||||||
2005-Apr-14 8:59am | ||||||||
![]() |
![]() ![]() ![]() ![]() I am trying to PASTE a statement into the ILF editor, but it put "**" in the front of it and it looks miss-aligned. What did i do wrong? | |||||||
When you PASTE a block of statements into the ILF editor, Appx tries to
convert each line of text in the clipboard into a valid ILF statement. If it
can't, it converts the offending text into a comment. So, Appx doesn't like *something* about the statement you're trying to paste. The most likely problem is that the alignment of the fields is wrong (you have a space where you shouldn't have one or you don't have a space where you need one). If you've copied the IF DIFF statement from another event point, that's not likely to be the problem. Instead, it may be that the operands won't convert properly in the context that you're pasting in to. Next time it fails, you might try pasting into an empty subroutine just to see if that work. | ||||||||
[Append to This Answer] | ||||||||
2005-Apr-19 3:31pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Is there a way to get rid of the automatic drop down menus that appear on my GUI menus processes? | |||||||
I think that you'll find (most of) the automatic menus and toolbar buttons in the --- WIDGET file. If you don't want them to show up, just delete them from --- WIDGET in the Pre-Display event point (or disable them if you want to see them but you don't want them to do anything). If you want a more pervasive solution, you can hook the --- STANDARD TOOLBARS input process.
| ||||||||
[Append to This Answer] | ||||||||
2005-Jun-02 11:09am | ||||||||
![]() |
![]() ![]() ![]() ![]() Is there a way to get rid of the big red X (Cancel) and the green arrow (Return)? | |||||||
I think that you'll find (most of) the automatic menus and toolbar buttons in the --- WIDGET file. If you don't want them to show up, just delete them from --- WIDGET in the Pre-Display event point (or disable them if you want to see them but you don't want them to do anything). If you want a more pervasive solution, you can hook the --- STANDARD TOOLBARS input process.
| ||||||||
[Append to This Answer] | ||||||||
2005-Jun-02 11:10am | ||||||||
![]() |
![]() ![]() ![]() ![]() Is there a way to set child constraints on a data lookup field in an Input Process? | |||||||
You can constrain the scan list by creating a cached version of the file you
want to do the data lookup on an populating it with only the records that meet
your criteria. Create the cached file with NOLOAD, then once you have a PCF
record use a begin at/end at contraint to read the records from the disk file
and write them to the cached file. You will have to OPEN each instance of the
file before the reads and writes. Something like this:SCRATCH APP FILENAME FAIL 0 CACHE? Y CREATE APP FILENAME SHARE? Y FAIL 0 CACHE NOLOAD OPEN APP FILENAME SHARE? Y FAIL 0 CACHE? N (for disk version) | ||||||||
[Append to This Answer] | ||||||||
2005-Jul-06 8:36am | ||||||||
![]() |
![]() ![]() ![]() ![]() How can I wait on Windows-systems without consuming CPU? | |||||||
You might want to try "sleep" command. You can put the command into a .bat file and execute it from Appx with /w.
Here is link for a free download of a resource kit tool for Windows 2003 that contains sleep.exe command:
http://www.microsoft.com/downloads/details.aspx?FamilyID=9d467a69-57ff-4ae7-96ee-b18c4790cffd&displaylang=en Or you can take an approach as outlined there: http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=161
| ||||||||
[Append to This Answer] | ||||||||
2005-Jul-29 4:40pm | ||||||||
![]() |
![]() ![]() ![]() ![]() I am using a --- STREAM WRITE call on a file that is > 2GB. It doesn't crash or return an error code, but it doesn't write to a file either | |||||||
The STREAM WRITE subroutine uses the standard fputs() function (part of the C
Runtime Library). That function is limited to files smaller than 2GB in size.
If you want to write to a larger file, you'll have to use a different API
(that means that you'll have to write a C routine and CALL that routine
instead of using STREAM WRITE).
| ||||||||
[Append to This Answer] | ||||||||
2005-Aug-29 8:53am | ||||||||
![]() |
![]() ![]() ![]() ![]() When I execute SLEEP command from an Appx CALL i get the error 'You've CALL'ed C:\WINDOWS\SYSTEM32\kernel32.dll,Sleep with the wrong calling convention' | |||||||
You need to add a '@' to the end of the subroutine name:
C:\WINDOWS\SYSTEM32\kernel32.dll,Sleep@
That tells Appx to call the Sleep subroutine with the correct calling convention (for some reason, Windows supports a number of different "calling conventions", or rules for calling a function, and most of the kernel32 routines use a non-standard convention - there's no way for Appx to know which convention to use so you have to tell us).
| ||||||||
Windows supports two different (and incompatible) "calling conventions" - __stdcall and __cdecl. By default, most applications (including Appx) use the __cdecl calling convention. When you invoke a function that uses the __cdecl calling convention, the caller (that's Appx) pops arguments off the top of the runtime stack when the function ends. When you invoke a function that uses the __stdcall convention, that function cleans its own arguments off of the top of the runtime stack before it returns to the caller.
Appx can't tell the difference between __cdecl and __stdcall functions. Appx assumes (unless you tell it otherwise) that you want to call __cdecl functions. If you invoke a __stdcall function (and you don't tell Appx that you're calling a __stdcall function), the runtime stack will be corrupted. APPX tries to recover from this error but will also display a CASSERT message that tells you that you've CALL'ed a function with the wrong convention (the message includes the name of the function that you've called). If you see that message, add a '@' to the end of the function name (or, if you already have a '@' at the end of the function name, remove it). The '@' is the "windows way" to tell Appx to use the __stdcall convention to call your function. For example, you currently invoke the Kernel32,DeleteFileA - change that to Kernel32,DeleteFile@. So how can you tell which functions are __stdcall and which functions are __cdecl? That's not an easy question to answer - that information is included with the Microsoft C compiler, but I don't see it anywhere else. That's why I'm displaying the CASSERT message here; so you'll know when you run into a problem. In general, most of the functions that you find in Kernel32.dll will be __stdcall functions (so you need to add an @ to the end of each Kernel32.dll function name). P.S. If you want to learn more about calling conventions: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_core_Calling_Conventions_Topics.asp | ||||||||
[Append to This Answer] | ||||||||
2006-Jan-03 12:00pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How can i set default values during data entry and make Appx remember them from one entry to the next one? | |||||||
What you are looking for is CTRL+F3 - SET ENTRY ATTRIBUTES option. The SET ENTRY ATTRIBUTES option,is activated by selecting the CTRL+F3 keys. This option allows you to designate the following four attributes that pertain to input processing: *Save as Default allows you to designate whether you want to re-display oneach subsequent screen, the value that you entered on the prior input process screen. For example, if you are entering customer information and have a number of customers from the same city, you could save yourself keying time by having APPX redisplay the city as you begin to enter each subsequent customer record. You can change the city name if you want, but if it stays the same you do not need to re-enter the value each time. *Auto Read Next allows you to control which record will be read anddisplayed by APPX after you are done modifying, deleting, or displaying a record. If you select Auto Read Next and complete a change to the record on the screen, the next record automatically displays. *Auto Read First allows you to control which record will be read anddisplayed by APPX if you try to call up a record without specifying a key value. If you select Auto Read First, the first record in the file automatically displays. *Exact Key Required allows you to specify whether or not a complete key mustbe entered when accessing a record from a file. For example, if the specified key path to the CUSTOMER file is CUSTOMER NAME, you can designate whether you must enter the entire name to retrieve a record, or whether APPX will use a partial key value (e.g., the letters “SMI”) to retrieve a record. If you set Exact Key Required to No, entering “SMI” would retrieve the first customer name beginning with these three letters (“SMILEY,” for example). This partial key feature is helpful because it can minimize the number of keystrokes you need to enter. To set or modify these options, position the cursor on the desired item and select the SET ENTRY ATTRIBUTES option. You see the four SET ENTRY ATTRIBUTES options display on the screen. Note that the Save as Default value applies to the item you positioned the cursor on; the other three values apply to the input process as a whole. Examine the values and change them by clicking on the appropriate checkbox to toggle it from “yes” to “no”. | ||||||||
[Append to This Answer] | ||||||||
2005-Sep-08 2:24pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Copying Files between Databases/Versions | |||||||
The following example shows how all of the records in the CUSTOMER file in
database AAA can be copied to the CUSTOMER file in database BBB:* * Open file in source database * SET --- NEXT DATABASE = AAA OPEN SPF CUSTOMER SHARE? Y FAIL 0 CACHE? N * BEG READ SPF CUSTOMER HOLD 0 KEY IS CUSTOMER NO * * Open file in destination database * SET --- NEXT DATABASE = BBB OPEN SPF CUSTOMER SHARE? Y FAIL 0 CACHE? N WRITE SPF CUSTOMER FAIL 0 * * Open file in source database * SET --- NEXT DATABASE = AAA OPEN SPF CUSTOMER SHARE? Y FAIL 0 CACHE? N * END READ SPF CUSTOMERWhen you use the above technique to switch between a file that has been created in two different databases, the two databases MUST be associated with the same application version. In the System Administration file for Databases / Applications, database AAA and database BBB must both identify a startup application with the same Version. For example, if the Startup Application for database AAA is XXX 01, then the startup application for database BBB must also have a version of "01". The application ID can be different but the version must be the same. | ||||||||
[Append to This Answer] | ||||||||
2005-Oct-07 3:43pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Adding new fileds with defualt values to an existent file | |||||||
Would APPX place the default value of the new field into every existing record in the file? We do in fact add the default value to every record when you restructure. The restructure process generates an event point that BEG/END READ's through the old file, SET's the old fields into the new structure, then WRITE's the new record. After each read, we RESTORE DEFAULT RECORD (into the new record) - that assigns the default values to all fields. But, if you do a quick restructure (that is, you add a field to a variable-record-length file), we don't read copy the records.
| ||||||||
[Append to This Answer] | ||||||||
2005-Oct-11 9:59am | ||||||||
![]() |
![]() ![]() ![]() ![]() I have an ALPHA field with a validation table, but it allows for any value to be entered, regardless of the validation table values | |||||||
You need to make sure, that "Required Table Value" in the Additional attributes of the field is either NULL or Y. If it is set to blank or N, it will allow for any value to be entered.
| ||||||||
[Append to This Answer] | ||||||||
2005-Nov-11 3:03pm | ||||||||
![]() |
![]() ![]() ![]() ![]() What is the proper usage of --- STREAM READ LENGTH field? | |||||||
I have a job that takes a tab-delimited file and reformats it to an appxio file.
The STREAM READ only returns a valid record the first time, subsequent reads return varying data. My simple subroutine looks like this: SET --- STREAM OPEN TYPE = r SET --- STREAM READ LENGTH = GOSUB --- STREAM OPEN SET --- STREAM EOR SEQUENCE = LF IF --- STREAM RETURN CODE NE 0 * * read tab file record LABEL :NEXT RECORD TRAP GOSUB --- STREAM READ IF --- STREAM RETURN CODE EQ 0 IF --- STREAM BUFFER EQ GOTO :NEXT RECORD
The field --- STREAM READ LENGTH is used for two things.
If set to a value other than zero the READ subroutine will limit the data bytes
it reads to no more than that many bytes.
What gets you is that your READ routine also uses that field to tell you how many bytes it actually did read. So, the first time you call it the value was zero, it read in number of bytes (if you count the tab bytes) up to the linefeed and set that number of bytes into this field. Since you didn't reset it to zero that value carried forward to the next read.
It read that number of bytes and stopped leaving the rest<lf> unread.
The next time you called read it read the remaining number of bytes up to the linefeed and set the length to that number. And so on..... | ||||||||
[Append to This Answer] | ||||||||
2006-Jan-18 8:57am | ||||||||
![]() |
![]() ![]() ![]() ![]() Can the STREAM READ look for the presence of the \r character as a record delimeter? | |||||||
Or is it limited to looking for the \r\n combination? It depends on the platform. On Unix/Linux hosts, fgets() looks for \n to terminate each line. On Windows hosts, fgets() looks for \r\n. That follows the standard on each platform. When you set the line terminator in Appx, that doesn't affect fgets(), it just tells Appx which characters you want stripped from the end of the string. If you set the line terminator to NONE, Appx just calls fgets() and gives you whatever fgets() returns. If you set the line terminator to LF or CR\LF, Appx will strip those characters from the end of the string (if present). | ||||||||
We've never really made a link between STREAM READ and the format of an Appx print file (in other words, we don't produce print files using the --- STREAM functions). STREAM READ will simply treat the form-feed character as just another character. If you want to treat a form-feed as a line delimiter, you can always search for a form-feed in the buffer (a simple IF statement will find any form-feeds and TEXT AT POSITION will tell you where it appears). Or, you can use any other C runtime function (or OS-provided function) to read any file that you like. STREAM READ is just a convenient wrapper around the fgets() C runtime function. | ||||||||
[Append to This Answer] | ||||||||
2006-Feb-08 8:41am | ||||||||
![]() |
![]() ![]() ![]() ![]() The --- COMPARE file contains the fields that are different after an IF DIFF is executed. If a field has multiple occurances, how can I tell which occurance changed? | |||||||
You really can't tell which occurance changed, because --- COMPARE doesn't
support multiple occurances and --- COMPARE FIELD NAME is a primary key to the
file.
| ||||||||
[Append to This Answer] | ||||||||
2006-Apr-20 3:12pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to create a PDF Form Overlay | |||||||
Please refer to the Output Processes for complete instructions on using this technique. http://board.appx.com/faq/cache/639.html
| ||||||||
[Append to This Answer] | ||||||||
2007-Jan-24 4:05pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to create an ASCII fixed length flat file using Appx | |||||||
Create a consecutive file in your application with the necessary fields. All fields must be type Alpha. If needed, add a two character field for carriage return/line (last field).
Create an update process and simply SET, or CNV TEXT, fields from your source file (PCF) into the alpha fields of the consecutive file. The actual Appx file (filename.dat) in the database Data directory will contain the ASCII text file. You might consider renaming it to filename.txt before using or sending the file to someone else.
The carriage return/line feed characters can be added as follows; In Start of Process… CNV BIN --- CDF HEX00 = 0 CNV BIN --- CDF HEX0A = 10
In Start if Frame… APPEND --- TEMP 2 0 --- CDF HEX0A APPEND --- TEMP 2 0 --- CDF HEX00Numeric and Date fields must be converted to text using the CNV TEXT command. Other formatting may need to be performed depending on your particular specifications.
Don’t forget to WRITE the records to the consecutive file. Also, you must SCRATCH and CREATE the flat file on each execution of the Update process. If the file is not scratched, data will be appended to the end of the file.
| ||||||||
[Append to This Answer] | ||||||||
2007-Jan-31 1:22pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Execution Cycle in Appx 4.2 | |||||||
By setting APPX_41_EPS=1 environment variable, you can get previous EP behavior. This variable, however, can not be set for design. It is for Run time only. Execution cycle in 4.2 has been changed in 3 areas: 1. Input execution after OC 2. Input execution on Delete 3. Input execution auto execution of child process. On #1 – input Execution after OC – if you have ORDER1 Input Process, and execute opt1 to run Line Items process, we changed execution cycle when you come back from a child. The order of the events as follows: 1. Read the PCF record with HOLD 2. Executes Post PCF Read 3. Executes Post Invocation of the Child 4. Executes Select Image 5. Executes Pre-Display/Verify EP 6. Executes Pre-Display 7. We display the Screen 4 – 6 – is what changed in 4.2. On #2 – Input Execution on Delete – if you delete a record, Appx will execute Pre-Update EP, after Delete – Post_PCF Update EP. Prior to 4.2 – Pre-PCF Update Ep wasn’t executing. On#3 Input Execution auto execution of child process – Key change, record delete (for example, you have ORDER1 and ORDER2 as an AC to ORDER1. If you delete ORDER1 record, you need to delete all corresponding ORDER2 records). It looks to see if ORDER2 needs to be run. It executes ORDER2 in autoexecute, it goes through all the steps to delete ORDER2 records. It executes: Post PCF read Pre PCF Update Post PCF Read Delete – Post PCF Update It will execute all these EP’s for each line item. In 4.1, it wasn’t executing Post PCF Read and Pre PCF Update. | ||||||||
[Append to This Answer] | ||||||||
2007-Mar-15 4:11pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Under what circumstances you need to set NLS_LENGTH_SEMANTICS | |||||||
First a short introduction on the choice of character set and length semantics: Using Unicode as a character set will allow you to store any character, not just the western European characters you are normally limited to. Unicode is a multi-byte character set which means that a single character could use more than a single byte. So what do you mean by VARCHAR2(10)? Is this 10 characters or 10 bytes? This used to be the same with our single byte character set, but with UTF8 this is no longer true. You can specify VARCHAR2(10 BYTE) or VARCHAR2(10 CHAR) if you want to be specific. However, APPX doesn’t use this syntax and does not specify either. This is where the NLS_LENGTH_SEMANTICS parameter comes in. You can set this to BYTE or CHAR basically defining which one of the two is the default when not specifying it explicitly. A default Oracle installation will use BYTE semantics which will work with APPX. However, if the default is changed to CHAR semantics, then APPX won't work without setting the following environment variable: NLS_LENGTH_SEMANTICS=BYTE | ||||||||
[Append to This Answer] | ||||||||
2008-May-13 2:55pm | ||||||||
![]() |
![]() ![]() ![]() ILF (Integrated Language Facility) | |||||||
FAQ's relating to the APPX ILF editor and ILF statements.
| ||||||||
Subcategories:
Answers in this category: | ||||||||
[New Answer in "ILF (Integrated Language Facility)"] | ||||||||
2004-Mar-19 4:54pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Is the documentation for the CNV TEXT statement wrong regarding the use of occurrence "000"? | |||||||
In Chapter 4-6: ILF Keyword Reference <CNV TEXT> of the designer manual, under CNV TEXT, it says: •••••
CNV TEXT •••
•••••••••••••••••••••• ••• = ••• •••••••••••••••••••••• •••
RestrictionsWhen all occurrences of the sending field are selected as the CNV TEXT data (by entering occurrence number 000), all occurrences are treated as a single, rectangular alpha field. When the data is copied from the sending field, a check is made to ensure that soft spaces are compressed, ensuring that the next “word” is separated from the previous one by just one space. ... should the first "sending field" text instead be Destination field?
With respect to the second one, the ILF editor that lets you set it up appears to be broken. It won't take an occurrences of "000" on the RHS (Source side), it just disappears, and is treated normally (as if it were '1'). The '000' CNV TEXT spec only works on the LHS (Destination)...
Unless both the LHS and RHS fields are multi-occurrence. In which case the ILF editor will accept 000 for the RHS occurrence.
There's something I'm not understanding here. -pat- | ||||||||
The documentation is correct. The ILF editor has a bug that prevents this statement from being used as documented.
| ||||||||
[Append to This Answer] | ||||||||
2003-May-12 5:37am | ||||||||
![]() |
![]() ![]() ![]() ![]() How do I get the my current APPX Process ID | |||||||
====================================================================== SUBROUTINE Process Name: GET PROCESS ID GOSUB --- GET CONFIGURATION INFO SET --- CONFIG TYPE = PID READ --- CONFIG HOLD 0 BY CONFIG TYPE F CANCEL unexpected error trying to READ "--- CONFIG" SET --- TEMP 32 = --- CONFIG DATA * --- TEMP 32 contains the unique Process ID ====================================================================== | ||||||||
[Append to This Answer] | ||||||||
2004-Mar-16 1:58pm | ||||||||
![]() |
![]() ![]() ![]() ![]() ILF verb shortcuts (abbreviations). | |||||||
The following list of shortcuts can be used while entering statements in the ILF editor. S = SET W = WRITE A = APPEND G = GOSUB I = IF T = TRAP BA (or BEG A) = BEG AT BR (or BEG R) = BEG READ BL (or BEG L) = BEG LOOP EA (or END A) = END AT ER (or END R) = END READ EL (or END L) = END LOOP CA = CALC CO = COMPUTE READN = READNEXT R = READ REW = REWRITE RECIEVE = RECEIVE (auto correct) | ||||||||
[Append to This Answer] | ||||||||
2005-Jul-14 1:14pm | ||||||||
![]() |
![]() ![]() ![]() ![]() GOSUB/SUBR/COPY exit considerations. | |||||||
If you need to exit early from your subroutine, you need to be careful about how it is called. You normally use an EXIT to return from a SUBR, a RETURN to exit from a GOSUB, and a GOTO/LABEL to exit from a COPY'd routine. Falling out the bottom (process an END statement) is the best method and will work in all cases, as will the GOTO/LABEL concept.
If you use an EXIT or RETURN statement in the subroutine, then you may be setting yourself up for a problem. Exiting a subroutine with a RETURN for GOSUB calls will generate an EM Compiler error if you try to call it as a SUBR. A SUBR is a standalone process that now has a RETURN without a GOSUB. A worse problem is using an EXIT in the subroutine. This works fine when you call it as a SUBR. It also does not complain when you call it as a GOSUB. The problem is that the GOSUB brings the code inline. This means that the EXIT statement in the subroutine will also exit the calling code. This can be handy if this is what you really intended to do. This can be bad if you forget and call it with a GOSUB intending on it to return back when the GOSUB is done.
Try not to include a RETURN or EXIT in an external subroutine. Since you can never be completely sure of how it will be called in the future.
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-17 10:35am | ||||||||
![]() |
![]() ![]() ![]() ![]() GOSUB/COPY/SUBR usage considerations? | |||||||
COPY and GOSUB are almost identical in that they both bring the code inline to your process. In fact, when you code something like: GOSUB XXX SUBROUTINE where SUBROUTINE is *not* a label in the current event point, then APPX will create LABEL SUBROUTINE COPY XXX SUBROUTINE RETURN The major difference between COPY and GOSUB is that GOSUB has its own set of T/F flags, whereas COPY just copies the requested code into the event point at that location, and if there are any T/F flags involved, the copied routine better know about them. Example: READ <some file> F COPY <routine a> The code in routine <routine a> will have the F flag set in the first position when it starts running, and any T/F flags it changes will be visible to the code following the COPY. If the copy was a GOSUB instead, then in <routine a>, the first T/F flag would not be set, and any T/F flags it changes would *not* be visible to the statements following the GOSUB. A SUBR is another process invocation, so: - the code exists as a separate process, which is sometimes required. For example, you can call SUBR within a BEG READ/END READ loop, and the routine can also do a BEG READ/END READ on the same file without any problems. - you can control sharing via the SUBPROCESS/RELATED/DETACHED invocation - the code is *not* compiled into the calling program, thus reducing EM size (but who cares, really). - you cannot exit the routine with a RETURN, you must have an END or EXIT, or just run out of statements. - takes longer to invoke, as a separate process needs to be brought into memory and control passed to it, and then returned to the caller. Not a problem for data entry programs but can add run time if it's in a update & gets invoked hundreds of times. Because of the difference in exiting a SUBR (with END/EXIT) vs. a GOSUB (with RETURN), you can't really call the routine one way or the other. You must decide if it's going to be invoked as SUBR or GOSUB, and code accordingly. If a SUBR attempts to exit with RETURN, you will get a run time error, however, if a GOSUB encounters an END/EXIT, then you have just ended the execution of the entire Event Point, not just that subroutine. This is a subtle programming error that can lead to difficult to track down bugs, ie, sometimes a post just skips part of the updating for a record because someone put an END instead of RETURN in a GOSUB'd routine. As to which one to use: - COPY if you just want to bring in some straightforward code, i.e., for this current ORDER2 record, read the ORDER1, CUSTOMER and PRODUCT files. - GOSUB if you need to preserve the T/F flags - SUBR if you *need* the special advantages it offers. | ||||||||
[Append to This Answer] | ||||||||
2003-Dec-31 1:02pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Variable Scoping considerations with GOSUB/COPY and SUBR. | |||||||
This concept deals with variable values and memory as you branch into and return from subroutines. If you have a process that is using --- AI as a counter and at some point in the code you branch into a subroutine and return, the variable --- AI may have been changed (or stepped on) by the subroutine. That is because GOSUBs and COPYs bring the code into the current process. You can have the subroutine STORE and RESTORE any variables it uses, but that only works one level deep. If a subroutine is called by a GOSUB and it in turn calls another subroutine with a GOSUB, then the STORE in the second subroutine will step on the STARE done by the first subroutine. This is because there is only one STORE/RESTORE area per variable/process. Example: Process: TEST SET --- AI = 10 GOSUB AAA DO SOMETHING SET --- BI = --- AI * END * LABEL DO SOMETHING STORE --- AI SET --- AI = 20 GOSUB AAA DO SOMETHING ELSE RESTORE --- AI RETURN * LABEL DO SOMETHING ELSE STORE --- AI SET --- AI = 30 RESTORE --- AI RETURN So, instead of --- BI getting a value of 10, it would get a value of 30. This is because the second GOSUB'd routine wrote over the STORE buffer created by the first routine. On the other hand, if you use SUBR calls, then each SUBR routine contains it's own STORE/RESTORE buffer area that can never step on the parent process STORE/RESTORE buffer or be stepped on by any child process the SUBR calls. This way, you are safe to use any variable as long as you STORE it first and RESTORE it when done. Process sharing characteristics are also handy for this. If you call SUBRs as related, and SUBPROCESS variables are local and any RELATED variables are shared. This also allows for easy recursion. | ||||||||
[Append to This Answer] | ||||||||
2003-Dec-31 1:11pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Load time, memory usage, and caching considerations when determining using GOSUB, COPY and SUBR. | |||||||
If you have a very large process like order entry. Breaking it up into separate processes and ILF subroutines can shorten initial load time since the separate process will only get loaded when it is needed for execution. This can also consume less memory and modules used less often can get cached out under the EM caching mechanism.
The downside, is that there may be a very slight, theoretical, performance penalty since you are branching between separate processes, but I doubt this is a measurable difference unless you are very low on memory and other modules have to be cached back in.
| ||||||||
[Append to This Answer] | ||||||||
2003-Dec-31 1:12pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Why are there lowercase I/O Verbs in ILF? | |||||||
After upgrading to 4.1, previously existing APPX I/O statements (READ, WRITE, etc.) are now printed in technical documentation in lowercase (read, write, etc.).
APPX 4.1.3 has new I/O statements, with different formats than the prior I/O statements. To prevent conflicts, instead of replace the APPX I/O statements, we added new ones. But, we wanted the new one to have the name of the old ones. Our solution was to convert the current I/O statement names from upper to lower case, then have the new statements be the names with uppercase. So, the old I/O statements are still there and work. A lower case "read" is the old READ statement and an upper case "READ" is the new I/O statement. The statements are converted as you edit ILF code. When an ILF event point series is loaded into the ILF editor, the "read" statements are converted to "READ" statements. When you save the code, the I/O statements have been updated to the new I/O statement format.
If you select "upper/lower" with opt-6, the command goes in as "read" instead
of "READ", and the remainder of the line uses the old format (8-character file
name, etc.) instead of the new. It also does not verify the key path on entry, as READ does.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-02 10:52am | ||||||||
![]() |
![]() ![]() ![]() ![]() ILF Option 94 | |||||||
ILF Browse (Opt-94 within the ILF editor) lets you drill down into design elements embedded in ILF code.
The results of performing an Opt-94 from within the ILF editor depends on the statement at which the cursor is currently positioned and sometimes where the cursor is positioned within the statement. If you're positioned to a statement that names a label or a process (GOSUB, SUBR, INPUT, etc.), then your cursor can be anywhere on that line and Opt-94 will take you to either the local label, or the process. Some statements will jump to the DD, not to a process. In those cases you must have your cursor positioned within the field name on the statement. Some statements can contain more than one field name (like IF, APPEND, SET). With a statement like BEG READ, you can jump to 3 different places. Based on the cursor position, you can jump to the FILE, the FIELD, or the END READ.
If you're not positioned somewhere where ILF Browse can determine where to jump to, then it invokes Xcopy logic. This is the beginning of an enhanced Xcopy that hasn't been implemented yet. For example, you might want to ILF Browse to a subroutine and mark some statements to be Xcopy'd. Someday you should be able to do that.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-06 4:26pm | ||||||||
![]() |
![]() ![]() ![]() ![]() ILF Force Save Option 88 | |||||||
ILF will normally be saved upon exiting the editor. In a case where you want to save the code, with or without errors, use option 88.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-02 10:57am | ||||||||
![]() |
![]() ![]() ![]() ![]() ILF Option 95 | |||||||
In the ILF Editor, position your cursor on a LABEL command and hit Option 95 (normally ~~95). APPX takes you to the first GOTO or GOSUB command within that event point for that LABEL. Hit it again and it will take you to the next GOSUB, etc.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-06 4:24pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Text and Icon Position via ILF --- WIDGETs | |||||||
Which fields in the --- WIDGET file correspond to the GUI attribute input fields "Text Position" and "Icon Position", and how are they decoded?
| ||||||||
Text Position WIDGET ALIGN HORIZ WIDGET ALIGN VERT ---------------- ------------------ ----------------- {null} {null} {null} CENTER CENTER CENTER TOP CENTER TOP RIGHT RIGHT CENTER BOTTOM CENTER BOTTOM LEFT LEFT CENTER UPPER LEFT LEFT TOP UPPER RIGHT RIGHT TOP LOWER RIGHT RIGHT BOTTOM LOWER LEFT LEFT BOTTOM WIDGET TEXT WIDGET TEXT WIDGET TILING Icon Position POS HORIZ POS VERT MODE ---------------- ----------- ----------- ------------- {null} {null} {null} {null} BEHIND TEXT CENTER CENTER {null} ABOVE TEXT CENTER BOTTOM {null} TRAILING TEXT LEFT CENTER {null} BELOW TEXT CENTER TOP {null} LEADING TEXT RIGHT CENTER {null} ABOVE & LEADING RIGHT BOTTOM {null} ABOVE & TRAILING LEFT BOTTOM {null} BELOW & TRAILING LEFT TOP {null} BELOW & LEADING RIGHT TOP {null} EXPAND TO FILL {null} {null} EXPAND EXPAND PROP'L {null} {null} TILE | ||||||||
[Append to This Answer] | ||||||||
2004-Feb-11 4:09pm | ||||||||
![]() |
![]() ![]() ![]() ![]() I keep loosing my toolbar when I go in and out of the Image Editor. | |||||||
Prior to release 4.2, the icons that appear on the Image Editor using the Java client were painted by the client. Starting in release 4.2, the APPX engine was changed to get all toolbar functionality from the engine.
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-19 4:55pm | ||||||||
![]() |
![]() ![]() ![]() Menu Processes | |||||||
FAQ's relating to the design of Menu Processes.
| ||||||||
Subcategories:
Answers in this category:
| ||||||||
[New Answer in "Menu Processes"] | ||||||||
2004-Jan-07 2:26pm | ||||||||
![]() |
![]() ![]() ![]() Job Processes | |||||||
FAQ's relating to the design of Job Processes.
| ||||||||
Subcategories:
Answers in this category: | ||||||||
[New Answer in "Job Processes"] | ||||||||
2003-Nov-18 10:18am | ||||||||
![]() |
![]() ![]() ![]() ![]() How can I get a date range from an input to the heading on an output? | |||||||
I have a job that includes an input, a query, and an output. The input prompts for a beginning and ending date range, which are stored in work fields. I would like to use the dates in the query to select the proper records and in the output to display the date range in the page heading. The dates are present at the end of the input, but are empty in the query and output processes. How can I get the work fields from the input to the other job steps?
| ||||||||
The most common reason that the work fields in the input are not seen by the other steps of the job is the share class of the work variables. The default share class of work fields is Subprocess, while the default invocation type of job steps is Related. Subprocess variables are only visible to the parent process and any children invoked as Subprocess. When the input ends the next step is executed as Related, so any Subprocess variables are no longer visible.
Change the Share Class in the Additional Attributes of the work field(s) in the data dictionary to Related and the fields should become visible to both the query and output.
For more information on invocation type and share class refer to Chapter 1-5; Interprocess Communications in the online APPX Application Design Manual at http://www.appx.com/common/documents/manuals/appx/designer/helpset.htm.
| ||||||||
[Append to This Answer] | ||||||||
2003-Nov-18 10:44am | ||||||||
![]() |
![]() ![]() ![]() Input Processes | |||||||
FAQ's relating to the design of Input Processes.
| ||||||||
Subcategories:
Answers in this category: | ||||||||
[New Answer in "Input Processes"] | ||||||||
2006-Apr-27 9:40am | ||||||||
![]() |
![]() ![]() ![]() ![]() How can I scale a picture on an Input screen? | |||||||
I created an item widget with a control type of Picture to display on an Input screen. The actual picture is larger than the area available to display it on the screen. How can I scale the picture to fit nicely in the defined space?
| ||||||||
As of Appx 4.1.a the Picture control type for an alpha item does not let you set anything to adjust the size or aspect of the image for the item. In order to scale the image, go to change mode on the item and pull up the GUI attributes. Change the control type from Picture to Label. This will open several different attribute field for entry. Change the Icon Position field to EXPAND PROP'L. Now chage the control type back to Picture and save the changes. The Picture control will retain the Icon Position setting and scale the image to fit the defined area.
| ||||||||
[Append to This Answer] | ||||||||
2003-Nov-04 4:03pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to add a second image to a frame in an input process | |||||||
APPX 4.1 In order to add more than one input image to a frame, the check box under the column heading Mul Img (Multiple Images) on the Frames specification window must be set to "yes" (checked). The default value for this box is “no” (unchecked). If you are in change mode at the image level and want to add another image to this frame, pressing ADD will take you back to the Frames window. Check the Mul Img box and press Enter. You can now add additional images A Warning message will be displayed at the Frames level when the Mul Img box is checked and Enter is pressed. This is to remind you to code the SET statement in Select Image. The designer must SET the --- ALTERNATE IMAGE NUMBER in the Select Image Event Point to control which image will be displayed for this frame at run time. Refer to the Images section in Chapter 3-1 of the Application Design Manual for a discussion of alternate images. | ||||||||
[Append to This Answer] | ||||||||
2003-Nov-07 2:32pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Message “Scrolling Frame Must Precede All Interactive Frames” | |||||||
APPX 4.1
This message will appear when a scrolling input function is invoked that has multiple image specifications defined and the display only (Dspl Only?) checkbox is set to “no” on an image prior to the scrolling image. Within a Frame, all the images defined before a scrolling image must be display only.
Note; if a modifiable field is specified on an image that is defined as display only, APPX will automatically set the Dspl Only? flag to “no” when the image is saved. You can reset the flag to “yes” if your application requires a modifiable field on the image. Refer to Chapter 3-6 of the Application Design Manual for further information on the Dspl Only? specification.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-07 2:39pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to have a scrolling input process display in-progress messages? | |||||||
The technique used in the 0 apps for things like Build EMs or Restructure Files is in the 1EX application.
| ||||||||
[Append to This Answer] | ||||||||
2003-Dec-26 3:03pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Display spaces instead of MM/DD/CCYY on an input screen which is inquiry only | |||||||
The only way currently to get a truly blank date display on an INPUT in Inquiry mode is to paint an alpha field on your Image, then fill it with all blanks or an alpha value constructed from the source date field, depending on whether the source date is blank or not..
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-07 2:28pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Can my scrolling input refresh itself when a record is added or deleted? | |||||||
I have a scrolling input that displays some basic information about the records. This input has an optional child process that will let the user pull up a full screen process to add, change, or delete a record. When the user is returned to the scrolling parent I would like the scrolling input to refresh to reflect the changes made by the user.
| ||||||||
You can refresh a scrolling input by designing it as a single step in a job. The input will not actually refresh, it will be terminated and re-executed, which will give the appearance of refreshing the screen.
Instead of executing the input directly, execute the job. Place a value in the CHILD ID field for the job step, such as RERN. In the Post Invocation event point add ILF code to test the value of a work variable to see if the input should re-execute or if the job should terminate. To re-execute the input set the value of --- NEXT CHILD ID to the value you entered on the job step (RERN). This will cause Appx to change its default behavior and go the job step with that child id and start processing from there.
In the parent input process, go to the Additional Attributes of the optional child and set the Parent Disposition to End Before. In places appropriate to your processing in the parent and/or the optional child (the full screen process) set the variable you are going to check in the Post Invocation of the job to a value to indicate if the parent input should be re-executed or not (this is the code mentioned above). Make sure the share class of the variable and the invocation type of the inputs are set so that the variable you use is visible to the Post Invocation event point of the job.
| ||||||||
Here is an example from 1EX: I added the following code to the ORDER2 Input Process, in 1EX, frame 200, Option Intercept: SET 1EX WORK LOG EQ 0 * Copy current line IF --- OPTION EQ USER 1 T STORE 1EX ORDER2 RECORD T BEG LOOP WI = 000 TO 001 STEP 000 T COMPUTE 1EX ORDER2 SNO + 1 T WRITE 1EX ORDER2 FAIL 0 TT SET 1EX WORK LOG EQ 1 TT END PROC Then in the parent process - INPUT ORDER1, i went to the AA and gave it a child ID of TSTT. Then in the Post Invocation of the Child Rule i added: IF 1EX WORK LOG EQ 1 T SET --- NEXT CHILD ID = TSTT It causes the child process to re-display silently and the newly added record is displayed to a user. | ||||||||
[Append to This Answer] | ||||||||
2007-Feb-26 2:27pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Can I use different image sizes in my scrolling input? | |||||||
To display different sizes of images for records in a scrolling input set the Scroll Type for the scrolling frame to Columnar rather than Down and set the Multiple Images flag to Y(es). Create the desired images and add the appropriate code in the Select Image event point for the scrolling frame to decide which image should be displayed.
| ||||||||
[Append to This Answer] | ||||||||
2003-Nov-20 4:47pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How do I create a dynamically sized scrolling input? | |||||||
Some users have larger monitors and I would like to run Appx with more rows and columns to take advantage of the screen sizes. How can I create a scrolling input that will display more data on the larger monitors?
| ||||||||
One way is to design the scrolling input with four frames. Each frame will use a different value for the starting row position or row size. Each frame will contain the same value for the column size.
The first frame will have a starting position of row 1, column 1 (or whatever you want as your upper left corner anchor). The size will be set to -1 for the rows and however wide you would like for the data you need to display. The -1 tells Appx to end the frame one line up from the bottom of the display area. Set the box attribute to Y. Do no create an image for this frame (do not go to the image editor). This will be a display only frame. The second frame will be the heading frame. The starting position will be the same as the first frame. The size will be the number of rows needed for the headings. This will be a display only frame. The third frame is the footing frame. The starting position will be a negative number set to the number of rows needed for you footing information. This negative number tells Appx to start the frame that many rows from the bottom of the display area. This will be a display only frame. The fourth frame will be the scrolling area. The starting row will be one more than the starting row of the heading frame plus the row size of the heading frame. The row size of this frame will be a negative number, one less than the starting row of the footing frame. That indicates to Appx to end the frame size that many lines up from the bottom of the display area.
See the image below for an example of the frame specifications listed above. | ||||||||
[Append to This Answer] | ||||||||
2003-Nov-25 10:45am | ||||||||
![]() |
![]() ![]() ![]() ![]() When using the PICTURE command I get Load Error! | |||||||
In an input process I am trying to display a picture using the PICTURE command and Load Error! is being displayed. What does this error message mean?
| ||||||||
The only image files you can use in APPX is .png or .gif or .jpg. If your file type is not one of these, you will get the Load Error! message. You could get this message if your path to the image in misspelled or not accessible to the user running APPX. Or, the picture field is not large enough to hold the complete path to the image. | ||||||||
[Append to This Answer] | ||||||||
2004-May-21 11:05am | ||||||||
![]() |
![]() ![]() ![]() ![]() How to set button (widget) colors! | |||||||
When you create the button (or any other widget), assign a name on the Button Properties screen. In Pre-Display, based on the condition you wish to check: SET --- WIDGET NAME = <Name you gave the widget> READ --- WIDGET HOLD 1 FT 0 BY WIDGET NAME F CANCEL Widgit not found IF <Condition you need to test on> T SET --- WIDGET COLOR EN FG R = <red value: 0-255> T SET --- WIDGET COLOR EN FG B = <blue value: 0-255> T SET --- WIDGET COLOR EN FG G = <green value 0-255> T SET --- WIDGET COLOR EN BG R = <red value: 0-255> T SET --- WIDGET COLOR EN BG B = <blue value: 0-255> T SET --- WIDGET COLOR EN BG G = <green value 0-255> * Set the default color for button F SET --- WIDGET COLOR EN FG R = <red value: 0-255> F SET --- WIDGET COLOR EN FG B = <blue value: 0-255> F SET --- WIDGET COLOR EN FG G = <green value 0-255> F SET --- WIDGET COLOR EN BG R = <red value: 0-255> F SET --- WIDGET COLOR EN BG B = <blue value: 0-255> F SET --- WIDGET COLOR EN BG G = <green value 0-255> * SET --- WIDGET COLOR EN FG NL = 1 <so color is not ignored> SET --- WIDGET COLOR EN BG NL = 1 <so color is not ignored> REWRITE --- WIDGET FAIL 0 The color values are the decimal values for the colors. For example; hex color value #FFFFFF (white) is decimal value 255 for red, green, and blue. The FG fields set the text color (foreground) on the button. The BG fields set the background color. When you save the ILF READ and WRITE statements, if it says the widget file could not be found, use Opt 88 to save the code. | ||||||||
[Append to This Answer] | ||||||||
2005-Jan-12 2:52pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to print tech doc for GUI input processes? | |||||||
RC1 of APPX 4.2.0 includes the ability to print Tech Doc for GUI input processes. GUI Tech Doc now requires a minimum form width of 96 printable characters instead of the 80 character width that was previously used. However, if you define a form with a wider width (such as 120) then you will find that the screen image will be printed without splitting it into two parts. This will be especially useful for those of you who are designing input screens with a size of 28x110. The screen image will also be more accurately depicted if it does not need to be split into two parts to be printed. Input process tech doc also includes complete documentation for all widgets that are defined in the input process and a rendition of the screen that closely resembles what you see at design time. | ||||||||
[Append to This Answer] | ||||||||
2003-Dec-26 2:03pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to get information about why the --- SEND FILE TO CLIENT subroutine failed? | |||||||
Start a session, try the SEND FILE TO CLIENT, then immediately look at the tail end of ![]() | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-02 4:43pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How can I dynamically apply Special Characteristics (Underline, Bold, Inverse Video) | |||||||
If you look in the 1EX application that is shipped and installed along with APPX, you will find an input process called SPECDSPL which has an example of how to directly apply special screen attributes to the window via ILF code. This is not the field oriented method of ULINE, BLINK, etc. Instead, you give an screen row, col, height, width, and what characteristics you want and it directly paints them there. The example shows how to underline and bold a sub-region of a text field.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-07 2:33pm | ||||||||
![]() |
![]() ![]() ![]() ![]() What’s PreDisplay/Verify for? | |||||||
There are three event points which complement each other in order to provide
the flexibility actually needed when designing a well behaved, complex input
process. We will ignore the OPTION INTERCEPT event point (and others) for the
purposes of this discussion. They are:
PRE-DISPLAY PRE-DISPLAY/VERIFY VERIFY VERIFY is executed after the operator keys data and presses ENTER. It is not executed prior to displaying the screen. It is only executed after data entry. The this event point's purpose to validate data entered and to allow for displaying of ERROR and WARNING messages.. PRE-DISPLAY is executed only once when a record is initially retrieved in Change mode or Inquire mode, just before the screen is displayed. In Add mode it is executed once for each ENTRY LEVEL which occurs, just before the screen is displayed. Pre-Display's primary purpose is to allow default values to be set, and screen attributes such as NO INPUT, etc. The PRE-DISPLAY/VERIFY event point is the most difficult to understand because it is more or less a combination of the other two event points although there are some differences. It is executed before the screen is displayed after retrieving a record (much like PRE-DISPLAY). However, it is also executed after data entry - after the VERIFY event point - just before the screen is redisplayed. It can be executed multiple times for a record being processed, not just once like PRE-DISPLAY. This is intended to facilitate displaying of related information such as data lookups, results of calculations, etc. This event point should not be used to validate data unless the ERROR and WARNING messages are intended to be displayed when the screen is initially displayed since they will be executed at that point as well. This behavior is the source of the current discussion regarding error messages which display in inquire mode as well as other modes.
It is my contention that the prior behavior (before 3.3) of APPX was the correct one and there is a good chance that the next release (3.4) will revert back to that behavior.
| ||||||||
[Append to This Answer] | ||||||||
2003-Dec-31 12:09pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to display the HELP text for the current Menu? | |||||||
The following technique displays the user documentation text for the current Menu:
Create a detached Optional Child:
--- SUBROUTINE HELP (PROCESS)
Give it a Pre-Invocation ILF command:
GOSUB --- HELP (GRAB CURRENT PROCESS) | ||||||||
[Append to This Answer] | ||||||||
2004-Jan-07 2:41pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How do you create dynamic screen titlebar text with ILF? | |||||||
Either of:
1) If no Window Label is defined in the widget, the label value comes from the first row of the screen. That will include the display values of any fields that are on line 1. 2) If there is a Window Label defined in the Window widget, that is used instead of the line1 text. You can name the widget and use ILF in Pre-Display of the image that contains the Window Widget definition. Read the widget by name, change the label, and rewrite it.
If you have an INPUT process with a Window widget Label and call another INPUT process that is the same or smaller size but has no Window widget and has Box? = No, the screen contents will be layered into the prior window and the prior windows widget will still be enforced. You can break this reuse by setting Box? = "?" on the child process frame, and/or add a Window widget to the child image.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-06 4:18pm | ||||||||
![]() |
![]() ![]() ![]() ![]() What are the rules for non-positive widget positions within an image? | |||||||
If widget row = 0, Appx will center the widget (vertically) within the image If widget row < 0 the widget will appear abs(row) rows above the bottom of the image If widget column = 0, the widget will be centered (horizontally) within the image If widget column < 0, the widget will appear abs(column) columns to the left of the right edge of the image | ||||||||
[Append to This Answer] | ||||||||
2004-Jan-09 9:59am | ||||||||
![]() |
![]() ![]() ![]() ![]() How do I stop APPX from automatically displaying the next record during INQUIRY. | |||||||
In an INQUIRY process, when the user enters a nonexistent key, the next record in sequence is automatically displayed. If you don’t want this to occur in the INQUIRY Start of Process event point, code:
SET --- EXACT KEY REQUIRED = Y When the INQUIRY is in Key Entry, if a non-existing key value is entered, it will then not advance to the next record. Also, by setting:
SET --- AUTO READNEXT = N
... after a valid key has been entered and the INQUIRY has been run, when END is pressed, it will then not auto advance to the next key value. (Setting READ NEXT to NO in the INQUIRY's Additional Attributes does not accomplish this.)
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-20 10:20am | ||||||||
![]() |
![]() ![]() ![]() ![]() How can I make a constrained field editable? | |||||||
Setting the field to OK INPUT (or maybe Entry Level=0) will make the field editable. But, then you will need the following trick to actually get the changed value to save because APPX always restores the constraint field values just before rewriting the PCF record. In Pre-Update STORE XXX HOLD RECORD In Post-Update READ XXX HOLD (with hold) RESTORE XXX HOLD RECORD REWRITE XXX HOLD | ||||||||
[Append to This Answer] | ||||||||
2004-Feb-13 8:45am | ||||||||
![]() |
![]() ![]() ![]() ![]() Which fields in the --- WIDGET file correspond to the GUI attr. input fields? | |||||||
Text Position WIDGET ALIGN HORIZ WIDGET ALIGN VERT ---------------- ------------------------ -------------------- {null} {null} {null} CENTER CENTER CENTER TOP CENTER TOP RIGHT RIGHT CENTER BOTTOM CENTER BOTTOM LEFT LEFT CENTER UPPER LEFT LEFT TOP UPPER RIGHT RIGHT TOP LOWER RIGHT RIGHT BOTTOM LOWER LEFT LEFT BOTTOM Icon Position WIDGET TEXT POS HORIZ WIDGET TEXT POS VERT WIDGET TILING MODE ---------------- ------------------------ ----------------------- ------------- {null} {null} {null} {null} BEHIND TEXT CENTER CENTER {null} ABOVE TEXT CENTER BOTTOM {null} TRAILING TEXT LEFT CENTER {null} BELOW TEXT CENTER TOP {null} LEADING TEXT RIGHT CENTER {null} ABOVE & LEADING RIGHT BOTTOM {null} ABOVE & TRAILING LEFT BOTTOM {null} BELOW & TRAILING LEFT TOP {null} BELOW & LEADING RIGHT TOP {null} EXPAND TO FILL {null} {null} EXPAND EXPAND PROP'L {null} {null} TILE | ||||||||
[Append to This Answer] | ||||||||
2004-Feb-19 4:33pm | ||||||||
![]() |
![]() ![]() ![]() ![]() When I go into an Input screen with Optional Children exceeding option number 130 - options 1 through 30 are not there. | |||||||
I have to go past 30 and then use the scroll bar - and scroll up one line at a time to see the Optional Children.
| ||||||||
This bug has been reported and is logged in the BugTracker system as bug report #624. Two other related bugs are #458 and #459. The BugTracker system can be found at; | ||||||||
[Append to This Answer] | ||||||||
2004-Mar-19 4:56pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Word wrapping on multi-line text fields. | |||||||
On Character Mode and Win32 client interfaces, word wrapping on multi-line text fields only works if there are no other editable fields on the same row. The Java client interface does not have this limitation.
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-19 4:59pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Is it possible to make the cursor on APPX thicker or more visible? | |||||||
Using the Java Client for 4.2.x you can set the "caretcolor" under the advanced options to something like #FF0000 to get solid red but, as yet, there's nothing that'll make it wider.
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-19 5:00pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to blank out or make invisible a Field on an Image | |||||||
` Using ILF control, to temporarily remove a Widget (field) from an Image, perform: SET --- WIDGET INVIS = YSee also the ILF verb 'BLANK', in the Application Design Reference Manual: www.appx.com > Support > Online Manuals > Application Design Manual` | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-21 12:03pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Optional frame may result in infinite loop | |||||||
When an error is detected in an event point past the normal display cycle, such as "record already on file" in pre-pcf update, APPX attempts to re-invoke the last frame in that input process. If that frame is optional and alternate image number is zero, the frame will not be displayed and you'll fall right back to pre-pcf update, an infinite loop.
You can check for duplicate keys, primary and unique alternates, within a displayed frame and send a message to the status line informing the user of the condition. You could also set a flag in pre-pcf update and check this flag in select image and set the alternate image number to non-zero so the frame will be displayed.
| ||||||||
[Append to This Answer] | ||||||||
2004-May-25 10:39am | ||||||||
![]() |
![]() ![]() ![]() ![]() How To Add a Picture to an input process | |||||||
You can use PRODUCT file input in 1EX application as an example. Make sure you have a little room to the right of the boxes on the input. We can use that area to add a picture of the product to the screen so that the order entry clerks can see what they are working with.With buttons, labels, and picture widgets we used icons and images that are constant. The same image appears on the screen every time it is displayed. With the product input we will want to have a different picture displayed for each product. This is accomplished by adding a field to the PRODUCT file to store the name of the image and using GUI attributes to tell APPX where the picture is located. You can add the alpha field to the screen and define it as a picture type (in Object Properties). Add an alpha field to the PRODUCT file. It should be large enough to contain the name, or path and name, for the image. In this case we will not need a large field since the names we will be using are short. Don’t forget to restructure the PRODUCT file. Add the new field to the PRODUCT input in two places. One entry will be the text field so that the image name can be entered. The second will be the location you want the picture displayed. That field should be non-modifiable and should have the rows and columns set to cover an area large enough for the image. In this exercise make the field fit into the area to the right of the data by inserting the image and using the size handles to drag it out. You may need to adjust the size after running a test. On the second field, pull up the GUI properties screen and select the picture control. Set the location to DESIGN FILE. We will use a couple of existing images. In real life you would probably have a central repository on the server and would point to SERVER FILE. That is it. We should be able to run the PRODUCT input and select an item in change mode. Enter image name in the modifiable product picture location field. The image should display in the second field. The images are loaded into cache in memory when first displayed in order to keep from downloading the image each time it is displayed. Sometimes the cache does not clear when an image is entered incorrectly the first time. You may need to exit APPX and get back in if the name was entered incorrectly the first time. | ||||||||
[Append to This Answer] | ||||||||
2004-Nov-05 11:07am | ||||||||
![]() |
![]() ![]() ![]() Output Processes | |||||||
FAQ's relating to the design of APPX Output Processes.
| ||||||||
Subcategories:
Answers in this category: | ||||||||
[New Answer in "Output Processes"] | ||||||||
2007-Jan-24 3:40pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How do I keep an Output from automatically printing Grand Totals? | |||||||
There is a flag in each query process called “Grand Total”. Set it to “None”.
| ||||||||
[Append to This Answer] | ||||||||
2003-Nov-17 4:41pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Can I print a date in Julian format? | |||||||
A display mask of 555 will display the Julian day number. A mask like "8807 - 555" would display a date as 2004-247.
| ||||||||
[Append to This Answer] | ||||||||
2003-Nov-26 3:07pm | ||||||||
![]() |
![]() ![]() ![]() ![]() When I add rows at the frame level the rows on the image do not change. | |||||||
The number of rows are set in additional attributes at the IMAGE LEVEL. The number of rows (and columns) in an image by default are the same as the number of rows and columns of the frame. You can set the number of rows and columns for each image in the additional attributes for the image. If the numbers of rows are set to 2 at the image level (in additional attributes) and you change the number of rows at the frame level from 2 to 5, the image size will not change. The image size cannot exceed the frame size.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-07 2:43pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Does APPX support printing a bar code on an output form? | |||||||
No. As of release 4.2, there isn’t a bar code font supported within APPX..
| ||||||||
[Append to This Answer] | ||||||||
2003-Dec-26 1:38pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to get a setup grid on a PDF report? | |||||||
There's a field in the PDF form definition process labeled "Print Grid?". Set that to "Y" if you want a grid to be overlaid on your report during design.
| ||||||||
[Append to This Answer] | ||||||||
2003-Dec-26 1:40pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to format a date to automatically display day of week or month of year! | |||||||
If in painting a date field onto an OUTPUT image, you edit the display masks
with the Day-of-the-Week or the Month-of-the-Year, you will get appropriate
substitutions. For example:
A display mask of "Monday January 05, 04:03 am" will (on 9/16/96) yield a displayed Date of "Monday September 16, 11:48 am". A display mask of "05 January 0807" will (on 9/16/96) yield a displayed Date of "16 September 1996". Also, the 'SET DATE' ilf command can extract the Day-of-the-Week or the Month-of-the-Year, as documented in ...
http://www.appx.com/manuals/appl-dsgn/drm282.html | ||||||||
[Append to This Answer] | ||||||||
2003-Dec-31 8:53am | ||||||||
![]() |
![]() ![]() ![]() ![]() Can I format the date on automatic OUTPUT header(s)? | |||||||
Date masks on OUTPUT Report Page Headings can be controlled by means of a System-Parameter, or Application-override Date masks, and an environment variable 'APPX STD PGH MASK'. For Example: If I have no System or Application date mask override set, and I run an OUTPUT with a standard page heading, I get a page heading date (for example) of "03/25/1999 00:16 23.83" If I had set my System or Application date mask to "06/05/07 - 04:03:02.01" I get a page heading date of "03/25/99 - 00:16 23.83" | ||||||||
[Append to This Answer] | ||||||||
2003-Dec-31 8:52am | ||||||||
![]() |
![]() ![]() ![]() ![]() Why are my labels in an output PDF report being truncated? | |||||||
Several things might be causing this problem. First check to see if the report will print on another printer. It’s been reported that this problem occurs on a Xerox Docucenter 440ST. If it does, there may be a problem with the print driver.
If you are trying to print using Adobe Acrobat, make sure that the image is not being modified by the viewer when it prints. In Acrobat 6.x, on the File/Print screen set Page Scaling to none, Auto Rotate to no, and Choose Paper Source to yes. Set the "Bitmap" ("Image" in English?) option under the Advanced button on the bottom-right of the Adobe print screen. Also ensure that the form definition is defined and allows enough ‘grid’ space for the elements on the output page. | ||||||||
Bruce Johnston Jan 12, '04: wrt the Xerox driver, the problem was only appearing for right-justified label widgets but was there regardless of whether a PCL or PS driver was used. Have a care when changing the drivers for experimentation. I tried the latest and greatest and it reverted to a previous bug in which white space in fixed-space fonts was being calculated as zero which really messed thigns up. Note that printing as Image or Bitmap will be slower but only really noticable in slower LAN/WAN connections to the printer since each page can be a couple of Mb vs. the KB range for native .pdf requests. | ||||||||
[Append to This Answer] | ||||||||
2004-Jan-16 2:40pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How do I pass 'ESCape' sequences to my printer? | |||||||
The ILF code ... CNV BIN --- TEMP 1 = 27 ... puts an "ESC" Escape character (hex(1b)) into TEMP 1. You can then SET this into an Alpha field, append other control codes as necessary, then embed Alpha fields constructed in this manner in our OUTPUT report. ('ESCape' = Hex(1b) = 16 + 11 = decimal(27).) See the ILF manual on the CNV BIN verb, for more detail on how it works. www.appx.com > Support > Manuals > Application Design > Search > CNV BIN On APPX/Windows platforms, you'll need to send a 'Form Control' of "-raw", in order to tell the Windows Print Spooler not to filter out your escape codes. WARNING: Winprint interfaces to the printer's printer driver. Some printer drivers don't honor '-raw' pass through of hex codes. The only way to find out is to try it. | ||||||||
[Append to This Answer] | ||||||||
2004-Jan-02 10:48am | ||||||||
![]() |
![]() ![]() ![]() ![]() How to print duplex, print on front and back of each page | |||||||
For occasionally printing in duplex mode, you can put -interactive into the Form or Printer Control string. This calls up the printer driver's interactive setup screen (just like Word's File; Print; Properties screen). You should be able to set front/back printing there.
If you need to hard code it in the body of your output file with escape/hex codes, you must turn on the -raw flag in the Form or Printer Control string.
WARNING: Winprint interfaces to the printer's printer driver. Some printer drivers don't honor '-raw' pass through of hex codes. The only way to find out is to try it.
| ||||||||
Bruce Johnston Jan 14, '04:
Under Unique things are easier to manage, Go down to the formfont directory and look for files named "formname.printermake" as in "136.HP" and inside you should see something like
Duplex=1
or
Duplex=2
The first results in long-edge binding the second in short-edge binding. Always back things up first. | ||||||||
[Append to This Answer] | ||||||||
2004-Jan-15 8:54am | ||||||||
![]() |
![]() ![]() ![]() ![]() How to program an exception report, example of ALTERNATE IMAGE NUMBER | |||||||
On an exceptions report, I only want to print records with problems. How do I tell it to skip (not print) the good ones? Do I do this in Pre-Display?
| ||||||||
Start your OUTPUT Frame's "Select Image" ILF series with:
SET --- ALTERNATE IMAGE NUMBER = 0 Put the ILF that tests for exceptions below that. If a Record (or set of conditions in a Range-End frame) qualifies as an exception:
SET --- ALTERNATE IMAGE NUMBER = 1
You can also issue MESSAGE, WARNING, ERROR, or CANCEL ILF commands at this point. Paint whatever fields and text you'd like on the OUTPUT Frame's Image, and you have a customized exception report!
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-06 4:15pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Can GRAND TOTAL be controlled via ILF | |||||||
The "Grand Total?" design spec is editable in the QUERY editor, and displayed at run-time on the QUERY sort order screen. Manipulating the "Grand Total?" spec would get into editing the run time Q files.
The design spec, "Grand Totals", is used to set the following QSORT fields:
QSORT SUBT QSORT SUBT NEW PG They are set respectively as follows:
NO N,N STANDARD Y,N NEW PAGE Y,Y Note that there are multiple QSORT records. This one is the one with QSORT SNO=0. The other QSORT records would be for the other "Sort Order" records. The field QSORT ACTV probably also needs set to 'Y'.
You're dealing with APPX internals here, so ASI does not provide support for the viewing and manipulation of these files. You're on your own.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-06 4:30pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Additional help on PDF layout options | |||||||
If you haven't already tried it, create a new PDF form and set Print Grid? to Y (and then print your reports with the new form). You should get an extra page at the end of each report that explains how to use the APPX_GRID_STYLE environment variable to control a few useful layout options.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-09 9:56am | ||||||||
![]() |
![]() ![]() ![]() ![]() Now that I can generate PDF files from APPX, how can I get the PDF to display as such in a browser? | |||||||
Normally I use a CGI script that designates the content type as "text/html". I can create a link on the website that runs a subroutine that creates a PDF report, but in sending it back to the browser, it's treating it as text, so all of the PDF
codes you would see if you looked at it in Notepad are displayed
instead of launching Acrobat. How can I send the PDF file as a *.pdf back to
the browser so it knows to open Acrobat?
Changing the content type tag in the CGI script to "application/pdf", which is the content type for *.pdf documents, will do the trick.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-07 3:39pm | ||||||||
![]() |
![]() ![]() ![]() ![]() What is the best format to print a logo, images? | |||||||
In general to get the best scaled images, you want as much resolution as you can get in pixels (within reason) and also a high number of colors in the image bit depth.
The high resolution means the image will be scaled down for the pdf form instead of up. Scaling formulas do a lot better job throwing away extra detail than they do creating detail where it doesn't exist. The large color depth gives the formula a much better ability to anti- alias. If you are using a black and white (1 bit) color depth, it can't anti-alias at all and will always create a jagged border. If you are using straight black and white, just converting the image to a gray scale image will make a big difference in the result of scaling. As for image processing software, you can use Adobe Photoshop. But almost any tool will allow you to alter the image color depth and save under a number of formats. If you have linux, it comes with a tool called "gimp" that is an open source knockoff of photoshop without the fancy user interface. Is .JPG the 'best' file type? Or is there a better one? And for that matter, what other formats are acceptable (if any)? For screens, you can use JPG, GIF, and PNG files. JPG's aren't good for line drawing (because the images are compressed with a lossy algorithm - sharp lines disappear). GIF's are patent-encumbered. If you want to include a resource image that has fine, crisp, details, you don't want to use JPG to store the image. JPG uses pixel averaging which distorts and drops out fine detail. Like very thin lines and such. JPG was create to store high color, low detail images like photographs. PNG is the best bet. It's the newest if the three and does a fine job.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-28 4:32pm | ||||||||
![]() |
![]() ![]() ![]() ![]() We need to be able to use a specific font to support an OCR scan line | |||||||
We need to be able to use a specific font to support an OCR scan line in an
output process with APPX 4.2.4. How would we go about using the following
font: OCR A Extended
Go the the output editor and bring up your output image. In the Object Properties
> GUI Attributes of the field there is a selection for Font (in Font Options box). This
is a drop down list showing the fonts that are available to you. Select the font you want.
Of course this has to be a PDF document for printing this report. If the font is not
listed in the drop down, then the font will have to be installed on your machine.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jun-16 9:15am | ||||||||
![]() |
![]() ![]() ![]() ![]() HTML tags that can be used within a text field that is to be displayed with an HTML Viewer widget type via the APPX client. | |||||||
For a new line, use CTL RETURN. <p> - new paragraph (does not require an ending </p>) <pre> ... </pre> - new paragraph with Courier font and fixed spacing   - fixed space (needed when not using <pre>) <b> ... </b> - bold <i> ... </i> - italic <li> ... </li> - each bullet <ul> ... </ul> - to indent bullets <font size="n"> ... </font> where n=1-9 (1=8,2=10,3=12,4=14,5=18,6=24,7=36pt) A good example of usage to look at is the new IF DIFF statement under System APPLICATION DESIGN, Subsystem ILF STATEMENTS. Remember, in INQ mode, you see the HTML tags applied; in CHG mode, you see the actual HTML tags coded. | ||||||||
[Append to This Answer] | ||||||||
2004-Jun-24 8:30am | ||||||||
![]() |
![]() ![]() ![]() ![]() Can I print an OCR font in a PDF document? | |||||||
No, currently (rel 4.2.4) the only fonts supported for PDF output are the ones listed on the pulldown list. Unfortunately, it is not possible with APPX release 4.2 to use an OCR font for PDF output.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jul-09 5:39pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to embed an image on an output? | |||||||
If you'd like to embed an image (i.e. company logo) at the PAGE-START of the output, you need to do following: 1. Design transfer STANDARD PAGE HEADING output from 0LC to your application. 2. Modify STANDARD PAGE HEADING to include following code: RESTORE --- WIDGET DEFAULT RECORD SET --- WIDGET PARENT TYPE = WIDGET SET --- WIDGET WIDGET TYPE = PICTURE SET --- WIDGET POSITION ROW = 1 SET --- WIDGET POSITION COLUMN = 2 SET --- WIDGET LOC OFFSET COL = -100 SET --- WIDGET SIZE ROWS = 3 SET --- WIDGET SIZE COLUMNS = 15 SET --- WIDGET RESOURCE TYPE = RESOURCE SET --- WIDGET RESOURCE NAME = <your resource name> SET --- WIDGET RESOURCE AP = <your app> SET --- WIDGET TEXT POS HORIZ = SET --- WIDGET TEXT POS VERT = SET --- WIDGET TILING MODE = TILE WRITE --- WIDGET FAIL 0This code needs to go right before the very last statement of the STANDARD PAGE HEADING, which is COPY --- STANDARD COLUMN HEADING (GUI) 3. You need to go to the System Administration Menu --> System Setup --> Hook records and hook your process. 4. You have to have resource defined. We recommend to have your mage on the server. Your image can be .png, .gif or .jpeg. Some image types can be more restrictive than the other's, so try it with different types and see which one works the best (.jpeg should almost always work). Remember, that this will work with PDF outputs only and you have to run Java client. If you want picture displayed anywhere on your image, you need to have a WIDGET defined as PICTURE, give it location type and Resource Name. Make sure you have Resource defined. | ||||||||
[Append to This Answer] | ||||||||
2005-Mar-08 2:33pm | ||||||||
![]() |
![]() ![]() ![]() ![]() I have upgraded to 4.2.6 recently and now my PDF output text is shifted | |||||||
You need to make sure that in your Form Definition, the default Font is left blank. The default font for PDF documents is Courier. If you define a font in the Form definition, Appx will use it instead of the default and it may cause your PDf document not to look right.
This field was ignored prior to version 4.2.6.
| ||||||||
[Append to This Answer] | ||||||||
2005-Apr-01 3:45pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Is there a limit to the number of lines PAGE-END can have? | |||||||
There's a 255-line limit on any frame class.
| ||||||||
[Append to This Answer] | ||||||||
2005-Jul-25 1:52pm | ||||||||
![]() |
![]() ![]() ![]() ![]() HTML in PDF Documents | |||||||
I thought we could use HTML in PDF outputs? I have a TEXT type field that I
have filled with some simple HTML: <html> Address 1<br> Address 2<br> Phone<br> </hmtl> The <br> is ignored, and the text prints w/o a break. I used a LABEL control type. This works fine in an input process. What I am doing wrong?
<br> is ignored...You can change fonts and colors inside of a PDF field (using HTML tags), but not layout (at least not yet). You should be able to use: <font size=10 color=#00FF00> set size and color at once, you can also do stuff like: size=+2 or size=-3 </font> <big> next larger font </big> <strong> bold </strong> <i> italics </i> <em> italics </em> <tt> tele-type font (courier) </tt> <small> next smaller font </small><u> underline </u> More tags likely in future releases | ||||||||
[Append to This Answer] | ||||||||
2006-Jan-10 10:51am | ||||||||
![]() |
![]() ![]() ![]() ![]() How to create a PDF Form Overlay. | |||||||
A PDF form overlay is a predefined image, or electronic form, that is printed along with data fields in an output process. The use of form overlays can help eliminate the need for preprinted forms. These instructions explain the basic steps for creating an output process with a form overlay.
You will have to determine the scale of your image in relation to the form size that will be used for the output. It may be necessary to create a form in System Administration that is adequate for the overlay you are using. For this example, I have a form named PDF-6P10 that is a type PDF with form length of 60 and width of 80. The overlay image is a .png file named POForm.png. Although Appx accepts jpg, gif and png images, the png format is the recommended image type to use. 1. The first step is to obtain or develop the electronic form you wish to use in your output process and create the Appx form definition as described above. 2. Copy the overlay file (POForm.png in this example) to the AppxPath/vv/aaa/Resource directory where vv is the application version and aaa is the application. 3. In Application Design add a Named Resource (PO FORM in this example). Make the State ENABLED and set the Type to Design File. The Location is the name of the overlay file, POForm.png. Note; match the case in the Location to that of the actual file name in the Resource directory. The image will not display if the name and case is not exactly the same. 4. Now create an output process. In my example I add a new output process called PRINT PO, Columns set to 80, Standard Page heading set to No, Column headings set to No, and remove the default Separator character (=). 5. Set the Preferred Form in Additional Attributes with the predefined form for this output process, PDF-6P10 in my example. If the default form is not set to the form name you have defined the printed result may not match your design. 6. Select PAGE-START for the first output image. 7. Set the length and width to match the form you will be using. In this example the form is length 60 and width of 80. 8. Navigate to the image editor. 9. Select the Picture icon from the toolbar and drag out a box the size of the display area. 10. Enter the Resource name you added above, PO FORM in this example (don’t forget to include the Application Id). Save these settings. 11. Page the image down (Cntl-down arrow) and drag the bottom of the Picture widget to the bottom of the display area. Repeat this step until you are at the bottom of the display area, line 60. 12. Go back to the top of the display area (Cntl-up arrow). 13. Edit the Picture properties and set the scale to a number that fits your liking. This might be a trail and error process until the overlay is exactly the way you want it. If necessary the overlay image may have to be adjusted using an editing tool such as MS Paint or PhotoShop. 14. Save the output image. 15. Return to the Frame level and set the length to 1, explanation below. 16. Add other frames as needed to complete the output process. On my PO FORM there is a place for repeating and non-repeating data. For the non-repeating fields, the top of the PO FORM, I set the Size of this frame to 21 by 80. There are 21 rows on the form before the repeating line items begin. 17. In the image area for ach frame add the fields, placing them at the approximate location to match your form. You can fine tune their locations while testing the process. 18. Create a Job process to include a Disposition. The Disposition Form Id must be the form you added for this output (PDF-6P10) and the Format must be PDF. You can set these parameters in Pre-Invocation of the Disposition job step for testing. 19. Run the job to test the output process and make adjustments as necessary. The PAGE-START frame was changed back to 1 line after dragging the picture widget out so that the output would be a single page. PDF output cannot distinguish blank areas within a widget. If the length was left at 60 lines, the output would have printed the form as a page followed by the text on the second page based on my form and image sizes. By changing the length to 1 the output prints only one line, although the actual image extends beyond that. The text image then starts on line 2 of the output for the length indicated. The result is that your data is printed on top the overlay image on a single page. The fit of the fields into the boxes of the form can be further refined by creating the text or fields as widgets and using micro adjustments to move the widgets into the exact location. Don’t forget you can also adjust the font type, size and color for each widget. | ||||||||
[Append to This Answer] | ||||||||
2007-Feb-08 5:15pm | ||||||||
![]() |
![]() ![]() ![]() Query Processes | |||||||
FAQ's relating to the design of APPX Query Processes.
| ||||||||
Subcategories:
Answers in this category: | ||||||||
[New Answer in "Query Processes"] | ||||||||
2004-Jul-09 4:50pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Query stops before processing entire file! | |||||||
When running a job/update process that uses a query, we got an Appx error during the selecting records phase. This was about 10000 records into the file, out of ~180000, and stated that it couldn't scratch the work file because the record length was invalid.
| ||||||||
That's caused by a known bug in earlier versions of Appx. You can work around that problem by setting an environment variable, try this:APPX_RUN_MEM=2097150This tells Appx to allocate 2MB to process a give query before it falls back to using an on-disk sort strategy. | ||||||||
[Append to This Answer] | ||||||||
2003-Nov-20 11:10am | ||||||||
![]() |
![]() ![]() ![]() ![]() Why doesn’t my QUERY use the file’s index? | |||||||
A query for (FLD EQ "A") used the index on FLD to select records, a query for (FLD EQ 1) OR (FLD EQ 2) OR (FLD EQ 3) doesn't use the index, why? (Determined by looked in APPX QUERY LOG and saw what it was doing.)
The Query compiler currently (as of 4.1.9) stops looking for indexes once it runs into an OR condition.
| ||||||||
Bruce Johnston Feb 5, '04:
Starting in 4.1 you can use the new Query Event Point, Establish PCF Range, to boost performance where OR conditions are on leading portions of a key field. In the following example, a memory file, MCUST, contains customer master record keys of interest obtained using a prior scolling input...
...
* * Customer of interest were supplied in an earlier input. * BEG READ DAR MCUST HOLD 0 KEY IS MCUST CUSTOMER NO BEG AT DAR TRANSACT IN DAR MCUST CUSTOMER NO END AT DAR TRANSACT IN DAR MCUST CUSTOMER NO BEG READ DAR TRANSACT HOLD 0 KEY IS TRANSACT KEY GOSUB --- PROCESS QUERY RECORD END READ DAR TRANSACT END READ DAR MCUST... This is effectively an OR condition for each value of MCUST CUSTOMER NO. You could have additional OR conditions on other key fields by simply cloning the above sequence and then modifying it. I have verified Steve's assertion that you can't end up with the same record selected twice. Note that the presence of ANY code in this series even something as innocuous as a simple TRAP or comment line will disable the Fast Query which might otherwise occur on design/runtime criteria normally specified though additional selection criteria are honoured. The records acted upon by --- PROCESS QUERY RECORD are simply the only candidates considered for the selection criteria. | ||||||||
[Append to This Answer] | ||||||||
2004-Feb-05 6:40pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Can I create a Cached copy of a file to use in my pre-user selection event point? | |||||||
Yes, CREATE the cached file in Start of Query Execution
| ||||||||
[Append to This Answer] | ||||||||
2004-Jul-09 4:49pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Is there a way to edit query and sort order screens? | |||||||
Yes (rel 4.2 and up). Look at 0LC 00: Inputs
QSLCT EDIT
QSLCT EDIT (EXPR)
QSORT EDIT
| ||||||||
[Append to This Answer] | ||||||||
2004-Jul-09 4:50pm | ||||||||
![]() |
![]() ![]() ![]() Update Processes | |||||||
FAQ's relating to designing APPX Update Processes.
| ||||||||
Subcategories:
Answers in this category: | ||||||||
[New Answer in "Update Processes"] | ||||||||
2003-Dec-31 9:05am | ||||||||
![]() |
![]() ![]() ![]() ![]() How can I show my users a progress message? | |||||||
There are three ways to show an in progress message so the user knows the process has not hung.
The first, and simplest, is the APPX_SHOW_PROGRESS environment variable. Setting this variable with a value to 1 when APPX is started will cause APPX to display the record counts for selection and processing in queries, update, and outputs. The message is displayed on the status line at the bottom of the APPX screen. The count will display starting at 1 and then changing the frequency of the display as the count increases. It starts at 1, then every 10, then every 100, then every 1000, etc. as the file is processed.
| ||||||||
Method two is the REFRESH command. If you would like more control over the display you can issue a REFRESH command based on your own calculations. The REFRESH command will display your message on the status line at the time the command is executed.
| ||||||||
The third method is to execute an input from ILF code during the processing of the update. If you would like to display a pop-up style message you can issue an INPUT command based on your count. Make sure the input is display only so that it will not wait for user intervention to continue and set the frame’s End Disposition in Additional Attributes to HOLD so that the screen will remain after execution returns to the update.
| ||||||||
[Append to This Answer] | ||||||||
2003-Nov-21 3:59pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to change the Progress bar color during an update! | |||||||
Give the progress bar widget a name, and update the color at runtime using
the --- WIDGET file.
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-29 2:33pm | ||||||||
![]() |
![]() ![]() ![]() Status Processes | |||||||
FAQ's relating to the design of APPX Status Processes.
| ||||||||
Subcategories:
Answers in this category:
| ||||||||
[New Answer in "Status Processes"] | ||||||||
2003-May-09 1:34pm | ||||||||
![]() |
![]() ![]() ![]() Inquiry Processes | |||||||
FAQ's relating to the design of APPX Inquiry Processes.
| ||||||||
Subcategories:
Answers in this category:
| ||||||||
[New Answer in "Inquiry Processes"] | ||||||||
2003-May-09 1:36pm | ||||||||
![]() |
![]() ![]() ![]() Subroutine Processes | |||||||
FAQ's relating to the design of APPX Subroutine Processes.
| ||||||||
Subcategories:
Answers in this category: | ||||||||
[New Answer in "Subroutine Processes"] | ||||||||
2004-Jan-07 2:49pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Invocation error when subroutines with the same name in different applications | |||||||
Example:
GOSUB TRN TEST ABC The subroutine TRN TEST ABC will be invoked in all cases. Now reverse the App Id's so that XFR TEST ABC is invoked first. Now only XFR TEST ABC is invoked.
This is a document bug in APPX (Bug #799).
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-07 2:49pm | ||||||||
![]() |
![]() ![]() ![]() Data Dictionary | |||||||
FAQ's relating to the use of the APPX Data Dictionary.
| ||||||||
Subcategories:
Answers in this category: | ||||||||
[New Answer in "Data Dictionary"] | ||||||||
2007-Jul-13 3:57pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How many fields can be defined for a file in the Data Dictionary? | |||||||
The maximum size of a record in APPX is 32767 bytes. There is no limit on the number of fields as long as the cumulative length doesn't exceed this 32K maximum APPX record length.
Maximum record length is regardless of file type (AppxIO, Oracle, Sybase, SQL Server, PostgreSQL, etc.).
| ||||||||
[Append to This Answer] | ||||||||
2003-Nov-26 12:19pm | ||||||||
![]() |
![]() ![]() ![]() ![]() I changed the alignment of the field from left to right but the sorting remains the same, why? | |||||||
When you change the justification in the data dictionary the structure file is rebuild but not the data file. The result of this is the sequencing of the data is unaffected by the change of the justification. This is a documented bug and will be corrected in a future release of APPX (Bug #768). In order to get the change in justification to effect the file (data), you have to force it to restructure the entire file (add a field or change the length of a field) or write an update to read each record and simply set the field into itself and rewrite the record. This will put the data in the correct order.
| ||||||||
[Append to This Answer] | ||||||||
2003-Dec-26 1:35pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Can I invoke another process in a FLEP? | |||||||
No, although you can have a COPY or a GOSUB. Furthermore, only the record buffer is shared between FLEP's and the controlling process. This is by design. When ASI designed this feature, we felt that the FLEP's should only be used for "generic" ILF code. That is, ILF code that should always be run unconditionally in conjunction with file I/O. For example, we felt like it would be inappropriate for a FLEP to execute ILF code conditionally depending on the name of the controlling process. Code that is specific to a particular process should be in an event point of the actual process, not in a FLEP.
However, with experience comes wisdom. We now agree that there are situations where it is desirable and even necessary to share some additional information between the controlling process and the FLEP's. We will be reviewing the functionality of this feature in the near future.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-13 8:38am | ||||||||
![]() |
![]() ![]() ![]() ![]() FLEP’s may not execute when the cache priority it set to 1. | |||||||
This is a documented bug in APPX 4.2.2 and below. If the initial cache priority is 1, FLEP’s may not execute as they should. Try setting the cache priority to 2 instead (for now).
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-13 8:39am | ||||||||
![]() |
![]() ![]() ![]() ![]() What is the scope of a FLEP? | |||||||
Currently, only the record buffer is shared between the FLEP and the controlling process (work fields are not shared either). This is by design. When ASI designed this feature, we felt that the FLEP's should only be used for "generic" ILF code. That is, ILF code that should always be run unconditionally in conjunction with file I/O. For example, we felt like it would be inappropriate for a FLEP to execute ILF code conditionally depending on the name of the controlling process. Code that is specific to a particular process should be in an event point of the actual process, not in a FLEP.
However, with experience comes wisdom. We now agree that there are situations where it is desirable and even necessary to share some additional information between the controlling process and the FLEP's. We will be reviewing the functionality of this feature in the near future.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-13 8:40am | ||||||||
![]() |
![]() ![]() ![]() ![]() Can I pass information into a FLEP? | |||||||
Yes and No. The way you pass more information into a File Level Event Point (FLEP) is by adding more fields to the record buffer for that file.
For instance, if you need to pass in a POST TO HISTORY flag so that the FLEP knows if it should update the HISTORY file from this record. You would add this flag to the data dictionary for the file. It doesn't hurt to have it there and stored with the record. Doing so lets you know at a later date which records have been posted to history. Being part of the record makes it visible and obvious that the data element is there and needs to have a value for the FLEP code to execute properly. This is visible and passed regardless of when, how, and why the FLEP fires. By an APPX Process, an ILF Write, an AppxODBC Rewrite, etc. it doesn't matter. The FLEPs that are associated with a file only share the file record buffer with the processes that trigger them. Additionally, the standard PASS and RECEIVE statements will not work to pass data in and out of FLEPs. This is by design. There are a number of reason for this restriction. 1)Work field and file fields other than those in the FLEP record buffer used in a process are protected from being stepped on by any FLEP code that might fire during the running of that process. 2) FLEPs run as a separate process and don't always fire in a procedural fashion as a design might expect. They are event driven and fire anytime Appx reads, writes, rewrites, or deletes a record. There are times when Appx does this automatically for the designer. And also times when FLEPs are fired when there is no designer created process running. One example of this is when a AppxODBC connection manipulates data that is stored in an Appx database. 3)FLEPs were designed to provide a place to code data specific rules, not process specific rules. If there is code that is specific to a process, code it in that process, not in the FLEP.
Some customers have come up with creative ways to bypass this restriction such as creating a permanent disk file with OS process ID as the key to write data into that they can later read in the FLEP. This is not recommended as a general programming technique for the reasons listed above.
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-16 1:47pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How many times does Post-PCF Read FLEP fire? | |||||||
I have an update/query combination in a job. While stepping thru the code, I noticed that APPX ran thru the Post PCF Read FLEP 4 times for the first record (it may do it for every record, but my test only had one record in it).
Is there some reason for this?
Yes. | ||||||||
A range start happens when you've sorted the PCF and Appx finds a new value in one of the sort keys.
Just because you don't have a frame that executes at that range boundary
doesn't mean that the range doesn't exist. In other words, we detect the range start and range end boundaries regardless of whether your have range start and range end frames. Remember, you can use the same query invocation with multiple outputs. If you remove all of the sorts, you'll still see two extra Post PCF Reads (for the unbounded range). Appx isn't physically reading the record for each range boundary - it's just reporting the state change (by invoking the Post PCF Read). | ||||||||
[Append to This Answer] | ||||||||
2006-Mar-13 2:41pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Do many duplicate keys decrease the performance? | |||||||
When you define a key (in the Appx data dictionary), you can choose from four key types:Primary Alternate/Unique Alternate Alternate/ForcedThe last two types allow duplicate key values. When you create an Alternate/Forced key, Appx appends the primary key (for each record) to the end of the Alternate/Forced key. There are two advantages to an Alternate/Forced key (and at least two disadvantages). The first advantage is that you don't suffer the performance penalty usually associated with a long chain of duplicate key values (because you have no duplicate key values). The second (and typically more important) advantage is that, when you read along the Alternate/Forced key path, you get duplicate records in primary key order. Many applications assume that duplicate key values appear in primary key order. The first problem with an Alternate/Forced key is that it takes more disk space to store the index and, therefore, more disk I/O to read and write the index - Appx must store the complete primary key for every record in the alternate index (along with the key segments that define the Alternate/Forced key). The second problem with an Alternate/Forced key comes from the fact that Appx limits keys to 16 segments - if you have a four-segment primary key, you can't define more than 12 segments in an Alternate/Forced key. That's not often a problem, but it can be difficult to work around when you run into it. Appx will coalesce adjacent string segments into a single segment to reduce the segment count so you run into the 16 segment limit less often than you might think.
Note that the on-line help text for Key Type states that an "Alternate/Forced key is identical to an Alternate key fields, except that duplicate alternate keys are retrieved in primary key order" - there's no guarantee there that you'll gain better performance by choosing an Alternate/Forced, we just promise to return records with duplicate key values in a specific order. The mechanisms that we use may (and in fact do) vary by file type (AppxIO vs. Oracle vs. DB2, etc. | ||||||||
[Append to This Answer] | ||||||||
2005-Jun-01 9:22am | ||||||||
![]() |
![]() ![]() ![]() ![]() Can ERROR statement be used in FLEP's? | |||||||
ERROR statements can be useful in some FLEP's, but you have to remember that Appx may execute the FLEP's in contexts where a user can't see the message. If you execute an ERROR in the PrePCF Update event point, you cancel the WRITE, REWRITE, or DELETE that caused the event point to fire. WARNING and MESSAGE statements in an FLEP seem fishy to me - I'd rethink any of those that I ran across. | ||||||||
[Append to This Answer] | ||||||||
2005-Jun-28 3:33pm | ||||||||
![]() |
![]() ![]() ![]() ![]() FLEP questions | |||||||
If I have a FLEP for file "A", and in that FLEP I read file "X", will the record buffer for the calling process for file "X" be changed (if it uses file "X"), or does the calling process have it's own record buffer for ""X"? I realize that if I change file "A", the calling process will see the change, I'm just wondering if that applies to all files I use in the FLEP.
Each "stream" has it's own set of variables (not just the record buffer, but PDF's, readnext positions, ....).
| ||||||||
[Append to This Answer] | ||||||||
2005-Aug-24 9:21am | ||||||||
![]() |
![]() ![]() ![]() ![]() I want to delete fields from a file in my DD, but those fields contain data, should i delete the data first? | |||||||
No, you don't need to delete your data first. When you delete the fields and run Restructure, the data in the deleted fields will be deleted as well.
| ||||||||
[Append to This Answer] | ||||||||
2006-Feb-24 4:15pm | ||||||||
![]() |
![]() ![]() ![]() ![]() I added a new value to a validation table and it’s not listed at run-time, why? | |||||||
This is a bug. Validation table values are cached at the workstation and the Java client is not recognizing that a change has occurred. As such, the cache is not updated. The temporary workaround for this it to delete the folder .appx\cache\x where x it the server name on the users workstation. The .appx directory is normally found in Documents and Settings for the users. Exit and restart the Appx session and the update validation table should contain the new value(s).
| ||||||||
[Append to This Answer] | ||||||||
2010-Mar-23 3:54pm | ||||||||
![]() |
![]() ![]() ![]() Other Application Design Questions | |||||||
FAQ's relating to APPX Application Design that don't fit into an existing category.
| ||||||||
Subcategories:
Answers in this category: | ||||||||
[New Answer in "Other Application Design Questions"] | ||||||||
2007-Mar-13 11:23am | ||||||||
![]() |
![]() ![]() ![]() ![]() Commonly used APPX Abbreviations | |||||||
APPX Application Excellence AA Additional Attributes AC Automatic Child Process APPXPATH Default directory location for APPX applications and data CC Child Constraint CDF Comma Delimited File DD Data Dictionary DLU Data Look Up EM Executable Module EP Event Point FLEP File Level Event Point FMS File Management System GUI Graphical User Interface ILF Integrated Language Facility LFN Logical File Name (If you use symbolic links or the "Use DB" feature, many logical file names can map to the same physical file. A logical file name is (roughly) an application ID + database ID + filename) OC Optional Child Process PCF Process Control File PDF Pre-Defined Field | ||||||||
[Append to This Answer] | ||||||||
2005-Jan-19 11:25am | ||||||||
![]() |
![]() ![]() ![]() ![]() What should the field "CDF Path & File" on the Comma Delimited Update screen contain? | |||||||
When entering specifications for Comma Delimited Update in the toolbox, what should the field "CDF Path & File" contain?
| ||||||||
CDF PATH & FILE NAME is the name of a disk file that the update process will create. The generated update process will use the internal STREAM functions to create this file. So, for example, you can use /tmp/output.csv as the file name. This file name path must be on the server and be accessible to APPX. You cannot specify a location on the client machine. Use the subroutine --- SEND FILE TO CLIENT to transfer the CDF to the client machine if necessary.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-07 2:46pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Are there reserved words in APPX? | |||||||
While you are allowed to define fields is an application ABC like "OI" and "CURSOR ROW" you can never use them within the ILF editor as they are changed to "--- OI" and "--- CURSOR ROW", respectively. Are these reserved words in APPX?
| ||||||||
No, there are no reserved words in Appx. The ILF editor uses the following logic (merely as a convenience for the designer) when you enter a fieldname and application ID: 1) If the given field is defined within the specified application, the statement remains unchanged by the editor. 2) If the given field is not defined within the specified application, but a field of the same name is defined in application 0LA (PDF’s), the editor changes the application ID to ---. 3) If the given field is not defined in the specified application and is not found in application ---, the ILF editor throws a warning (or an error in earlier releases). There is a bug in 4.1.a that changes the application ID to --- for any field that is also defined in 0LA. This bug has been fixed in release 4.2. Here is the text on this from the APPX Application Design Manual (01/13/03), chapter 4-4: The ILF Editor: The editor may display some default field values that you are likely to use, such as the application ID. You can override these defaults by entering the desired values or by entering spaces. When you enter a field name, APPX automatically searches for that name in the specified application's data dictionary. If it finds the specified field, it leaves the application ID as is. If it does not find the field, it next searches for the field in the runtime application's data dictionary (where all predefined fields are defined). If it finds the specified field, APPX automatically changes the application ID to "---" to signify the runtime application. If it does not find the field in either place, the editor provides an error message. | ||||||||
[Append to This Answer] | ||||||||
2003-Nov-20 11:27am | ||||||||
![]() |
![]() ![]() ![]() ![]() What is an event point? | |||||||
An event point is a place in the execution of an Appx process where a designer can insert code to enhance the standard Appx behavior. These insertion points loosely relate to points where the Appx engine interfaces with external functions, such as screen display, keyboard input, or disk access. At these points an Appx designer can place code to add business rules to tailor the application to a specific industry or company policy.
These interactions can take place at different stages of a process. Some points of interaction would be when a process starts or ends, when a frame is executed or completes, when an image is displayed, when a user makes an entry through the keyboard or mouse, or when a record is read or written.
| ||||||||
[Append to This Answer] | ||||||||
2003-Nov-25 5:48pm | ||||||||
![]() |
![]() ![]() ![]() ![]() ILF Statements missing on the cross reference selection screen! | |||||||
Prior to release 4.2, the ILF Statement cross reference screen did not show all the statements available (or that accounted for the 0-97 counter displayed). There are 9 ILF statements missing from the list, GETPREC, PUTPREC, DELPREC, REFRESH, ENABLE, DISABLE, COMMIT, ROLLBACK and SAVEPOINT. These 9 ILF statements, plus the ones listed, minus the * and ** on the Cross Reference (Processes) screen comprise the 97 statements stated on the bottom of the screen (0 of 97).
| ||||||||
[Append to This Answer] | ||||||||
2003-Dec-08 1:50pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Why don’t icons print in tech doc? | |||||||
There are some specific requirements that a graphic file must meet in order to be printable within a PDF document. It is possible that you will see an icon/graphic displayed by the image editor but that it will not print when you print the tech doc. If this happens, you will need to edit the characteristics of your graphics file to meet the requirements of PDF output.
| ||||||||
[Append to This Answer] | ||||||||
2003-Dec-26 2:10pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Can I change the key of a file while in a BEG / END READ loop? | |||||||
No. Don’t change the key of the associated file and then update the record during a read loop.
| ||||||||
[Append to This Answer] | ||||||||
2003-Dec-31 9:07am | ||||||||
![]() |
![]() ![]() ![]() ![]() How does the pivot year logic work? | |||||||
By defining a pivot year, you direct APPX to determine what century a particular year belongs to. For example, if the pivot year is set to 35, then any date field with a year greater than 35 will be assumed by APPX to have a century value of 19. Any date field with a year less than or equal to the pivot year will be assumed by APPX to have a century value of 20 (APPX System Admin Manual, Chapter 1).
In the following example: SET ABC WORK CCYYMMDD 20------------ SET ABC WORK CCYYMMDD --98---------- ABC WORK CCYYMMDD would contain "19980101--------" after the second set statement was executed. Here's why: Assuming the pivot year is 35 and the current year is 2004, after the first SET, ABC WORK CCYYMMDD contains "20040101--------". After the second, it contains "19980101--------". The pivot rule is applied. The month and day of 01 was set because the MMDD was null in the work field.
APPX date-synthesis rules will cause APPX to synthesize a century if a pivot date is specified and if a field containing only a YY is set into or compared with a field containing CCYY. As in the case above, "--98----------" is a date
containing only a YY. APPX thus figures out a century for it, and when doing
the SET into the CCYYMMDD field, the CCYY is set to 1998.
| ||||||||
[Append to This Answer] | ||||||||
2003-Dec-31 9:21am | ||||||||
![]() |
![]() ![]() ![]() ![]() File-Level Event Point Modes | |||||||
In file-level Event Points, does APPX report reliably on the 'real' mode of the I/O? For example, if we're adding a record in an INPUT process, and a file-level event point fires incrementing a value in a parent table, how does the file- level Event Point for the event report set flags indicating what's going on? When the event triggering the firing of the File EP's is an ILF statement, then INTERACTIVE PHASE and MODE both are inferred from the ILF statement itself: WRITE - Add REWRITE - Change DELETE - Delete This is true even if the ILF statement is itself part of a File EP. Another interesting point: In a File's POST READ event point, if it fired off because of an ILF statement, then ... - INQUIRE is inferred if the read operation was without a hold on the record - CHANGE is inferred if the read operation was with a hold on the record. This then results in both INTERACTIVE PHASE and MODE being set accordingly. 1) The MODE and INTERACTIVE PHASE are not what they are in the Input process. You will not see DATA SCROLL for instance. 2) Multilevel process families. For example, if you add an order in Order Entry: You add some header info, then lineitem info, then to the header and down to charge/allowance items, then back to the header and down to order comments, then back to the header to complete the order. You will get several file level event points fired. When you go from the header down to the lineitems while adding the order, APPX will write the order header PCF and fire the event points with a MODE=ADD, but the order is not done yet. It will then re-trigger the file event points several more times in MODE=CHANGE as it resaves the PCF during the remaining entry of the order including the exit from the final frame of the order header to complete the order. So, if you want to do something when the order is completed, you need some way to detect a completed order other than MODE=ADD in the file level event point. Also, File Event Points are fairly isolated from the trigger process that fires them. You can't set a workfield in your input process and check it in the file event point. Only the PCF record is shared. | ||||||||
[Append to This Answer] | ||||||||
2004-Jan-02 10:43am | ||||||||
![]() |
![]() ![]() ![]() ![]() Can a button with a picture be resized using APPX software alone? | |||||||
Icons attached to a label or a button have a position selection of Expand to Fill and Expand Proportional, that will scale an image. Wallpaper images can also be set to expand, although expanding a very small image really looks weird.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-02 10:58am | ||||||||
![]() |
![]() ![]() ![]() ![]() Where do digital image files reside? | |||||||
Images used in GUI design may reside in a number of places. When you define a resource there is a selection for the storage type. That selection determines where APPX will look for the files.
DESIGN FILE is the most convenient. In this case you place the images in a $APPXPATH/vv/aaa/Resource directory. When the application is moved, the images move with it. If the images appx.gif were placed in the .../Resource directory, the path in the 'Named Resource' would simply be appx.gif. SERVER FILE means that the images are stored somewhere on the server. The path to that location will be entered into the resource. When the process is run, the image is retrieved from that location and sent down to the client. CLIENT FILE is the client side of that. You must insure that the images are loaded to each individual client machine. If the images are on a shared drive, the client must be able to access that path to the images. The Named Resource path may be something like /home/images/appx.gif for a SERVER FILE on a Unix server, or x:\images\appx.gif for a shared drive on a Windows client. SERVER URL and CLIENT URL can be used to access images across the internet. SERVER URL will currently work on a Windows/NT server. The path would be an address that can be resolved by the client.
DIRECT is not currently used.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-02 11:00am | ||||||||
![]() |
![]() ![]() ![]() ![]() Where do we get digital images from? | |||||||
Do we load software, such as Photo Shop or a similar product, and simply transfer the digital data file(s) to our Unix server and then from there incorporate them into the icons/buttons or other graphics (paint a picture or logo on a screen)?
| ||||||||
The images themselves can come from anywhere. You can use a tool like Photo
Shop to create your own, or there are lots of sites on the internet that have
images you can buy or download for free. With a little modification, web page backgrounds and layouts lend themselves very well to APPX wallpaper and buttons.
You do not need a product like Photo Shop to maintain or store images. As long as the image is the size you want, you need only the image.
If you want to modify the image you will need an editor of some kind. APPX will help you alter an image, although in some cases, such as defining a picture widget, APPX will allow you to scale the image size to fit (in 4.1.4 and after).
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-02 11:08am | ||||||||
![]() |
![]() ![]() ![]() ![]() What is "Point Size"? | |||||||
In general terms, point size is a relative measure of the size of a font. It used to have a more concrete meaning in the "Old days" of typography.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-06 4:23pm | ||||||||
![]() |
![]() ![]() ![]() ![]() What is the 0LC application? | |||||||
APPX 4.2
The 0LC application is new in release 4.2. This application contains some of the processes in 0LA to provide designers the ability to customize the look and feel of their application(s). Use design transfer to copy the desired process from 0LC as a starting point for your own process. The original process in 0LA could then be overridden by a HOOK record.
The 0LC application is read-only. Processes may be transferred out but may not be modified within the 0LC application.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-16 2:05pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Can we create widgets at run time dynamically? | |||||||
It is possible to create WIDGET records with a WRITE statement in 4.2. It is not necessary to define the widget on the image. However, you may find that it is "easier" to modify an existing WIDGET record than to create a new WIDGET record.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-13 8:42am | ||||||||
![]() |
![]() ![]() ![]() ![]() Has APPX ever considered to introducing field level event points? | |||||||
Yes, ASI has considered and is still considering adding field level event points. We have discussed adding event points that would be associated with a field in the DD. These event points would be triggered by field references. We have also discussed adding event points that would be associated with individual items on an image. For example, we are considering adding event points that would be triggered when a field on an image gets the focus (tab in), loses the focus (tab out), has a change of value, etc.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-13 8:43am | ||||||||
![]() |
![]() ![]() ![]() ![]() Can I tell which event point I am in for appropriate processing my a generalized subroutine? | |||||||
You can set a flag in the calling process and interrogate that flag in the subroutine to determine this information. Currently, there isn’t anything in APPX that passes this information automatically.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-13 8:43am | ||||||||
![]() |
![]() ![]() ![]() ![]() Is possible to read the design files 0AD PROCESS, 0AD CHILD, 0AD WIDGET etc. of the current application? | |||||||
Yes. You must explicitly open and close each design file that you want to read. You must set the NEXT APPLICATION and NEXT VERSION fields before each open.
For Example:
SET --- NEXT APPLICATION = XXX | ||||||||
[Append to This Answer] | ||||||||
2004-Feb-25 10:10am | ||||||||
![]() |
![]() ![]() ![]() ![]() Report writer. | |||||||
Please refer to;
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=654
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-02 9:16am | ||||||||
![]() |
![]() ![]() ![]() ![]() How to convert an array to scalar data. | |||||||
Please refer to;
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=157
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-02 9:43am | ||||||||
![]() |
![]() ![]() ![]() ![]() Direct process doesn’t work, causes system internal error. The process works okay when I option 99 in design mode. | |||||||
Are you reading or accessing the files in application design? In design mode, the application files are open and available to your processes. Hence, the option 99 works. The application files are not automatically available at run time. When you try the same process as a direct process during run time, you’ll have to open/read the application files.
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-19 5:02pm | ||||||||
![]() |
![]() ![]() ![]() ![]() What image file formats are supported in PDF documents created within APPX? | |||||||
Here are the image file types supported on PDF output;
PNG: PNG images which make use of interlacing,contain an alpha channel (which will be lost anyway - we don't support alpha channels in PNG files),or have 16 bit color depth will have to be uncompressed. JPEG: APPX supports baseline JPEG compression which accounts for the vast majority of JPEG images. We also support progressive JPEG compression. GIF: Due to restrictions in the compression schemes supported by the PDF file format, the entry in the GIF file called "LZW minimum code size" must have a value of 8 bits.
Unfortunately,there is no easy way to determine this value for a certain GIF file. An image which contains more than 128 distinct color values will always qualify (e.g.,a full 8-bit color palette with 256 entries). Images with a smaller number of distinct colors may also work,but it is difficult to tell in advance because graphics programs may use 8 bits or less as LZW minimum code size in this case,and we may therefore reject the image.
The following trick which works in Adobe Photoshop and similar image processing software is known to result in GIF images which are accepted:
load the GIF image,and change the image color mode from "indexed" to "RGB". Now change the image color mode back to "indexed",and choose a color palette with more than 128 entries (for example the Mac or Windows system palette,or the Web palette).
The image must not be interlaced. TIFF: We support the following TIFF images: compression schemes: - uncompressed CCITT (group 3,group 4,and RLE) ZIP (=Flate) LZW (with restrictions) PackBits (=RunLength) other compression schemes are handled by uncompressing. color: black and white grayscale RGB CMYK any alpha channel or mask which may be present in the file will be ignored.
TIFF files containing more than one image
Color depth must be 1,2,4,or 8 bits per color sample (this is a requirement of PDF).
Multi-strip TIFF images are converted to multiple images in the PDF file which will visually exactly represent the original image,but can be individually selected with Acrobat s TouchUp object tool. Multi- strip TIFF images can be converted to single-strip images with the tiffcp command line tool which is part of the TIFFlib package. The Image-Magick tool always writes single-strip TIFF images. Some TIFF features (e.g.,CIEL*a*b*color space,JPEG compression)and certain combinations of features (e.g.,LZW compression and alpha channel or mask, LZW compression and tiling)are not supported.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-28 5:07pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Debugging PDF Output Problems | |||||||
Define a PDF form and set "Print Grid" to "Y", then, define an environment variable named APPX_GRID_STYLE to control the grid settings. The default value for APPX_GRID_STYLE is 15 (decimal). To change the grid style, just add up any of the following numbers: 1 - draw horizontal grid lines at grid boundaries 2 - draw vertical grid lines at grid boundaries 4 - label horizontal grid lines 8 - label vertical grid lines 16 - subdivide grid height into 1/10 intervals 32 - subdivide grid width into 1/10 intervals 64 - draw outlines around all widgetsSo, the default APPX_GRID_STYLE gives you labeled horizontal and vertical grid lines (1 + 2 + 4 + 8 ) on every page. APPX_GRID_STYLE=64 is very useful | ||||||||
[Append to This Answer] | ||||||||
2004-May-26 4:17pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How do I change widget properties on a hooked 0LC DISPOSITION screen. | |||||||
I decided to try to create my own disposition screen so that it
would have the same GUI attributes found throughout the rest of my
system.
I design-transferred the 0LC input DISPOSITION and started to work with
it when I noticed something strange. The GUI attributes which are
already there by default do not show up. It behaves as if the client has its GUI Interface option turned off. Yet when I change the Window Properties for the image (to change the background color), those changes are applied.
| ||||||||
In Pre-Display of the images of the DISPOSITION input process you will see a GOSUB to --- APPLY RUNTIME GUI THEME. This is using ILF code to modify the widgets on the screen. If you remove this, it will stop messing with your widget changes on this screen.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jul-09 4:54pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Is there an existing utility to list Named Resources? | |||||||
Yes, Application Design > Documentation tab > Print Technical Documentation group > Named Resources
| ||||||||
[Append to This Answer] | ||||||||
2004-Jul-09 4:55pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Will a automatic child process run if auto update is set to "Y", even if include children = No | |||||||
Yes, for each child, when a parent record is changed or deleted, it will run the Pre and Post PCF update EPs in each child, plus any FLEPs.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jul-09 5:33pm | ||||||||
![]() |
![]() ![]() ![]() ![]() I am trying to do a BEG READ/END READ, which nests a BEG READ/END READ on the same file | |||||||
The way i have it setup is as follows: BEG AT END AT BEG READ STORE BEG AT END AT BEG READ END READ RESTORE END READ
It will not work because BEG AT/END AT and BEG READ/END READ share the same stream buffer.
What will work however, is the following scheme:
LABEL: DO SOMETHING This way, you will have 2 streams open because READNEXT opens up a second stream buffer and you can BEG AT/END AT and BEG/READ/END READ on the same file. | ||||||||
[Append to This Answer] | ||||||||
2004-Sep-15 9:05am | ||||||||
![]() |
![]() ![]() ![]() ![]() Recording Macros on Unix | |||||||
This is APPX 4.2.6 on AIX, connecting via telnet. They normally use Control-R to start recording, perform the keystrokes and then use Control-R to stop recording. APPX used to save the macro in a file called .appx_mac in the users home directory. It doesn't do that anymore. They seem to be unable to record a macro at all, ie, they go thru the procedure to record it and immediately try to play it back, and it won't play back. I have the following environmental variable set: APPX_UI_LOG /tmp/uilog
You'll need to change two things: unset APPX_UI_LOG and write-protect $HOME/.appx_last.
| ||||||||
[Append to This Answer] | ||||||||
2005-Apr-06 9:45am | ||||||||
![]() |
![]() ![]() ![]() ![]() I am trying to start appx from a DOS command line and getting BI.C error | |||||||
The error reads: "BI.C - Appx Startup Failure. Unable to Open System Administration Files, check file protection and APPXPATH". Before starting appx from the command line, make sure you have APPXPATH set. | ||||||||
[Append to This Answer] | ||||||||
2005-Apr-13 1:53pm | ||||||||
![]() |
![]() ![]() ![]() ![]() I have a subroutine in an application and I am trying to hook it to a different one and it does not work | |||||||
The hook is restricted by database and user. Any ideas?
You can't hook a subroutine that you invoke from a GOSUB or COPY. The hook mechanism only works when you invoke a process - that means that you can hook a subroutine that you invoke with a SUBR statement, or a subroutine that you invoke as an optional or automatic child.
| ||||||||
[Append to This Answer] | ||||||||
2005-May-05 10:35am | ||||||||
![]() |
![]() ![]() ![]() ![]() Does APPX has something equivalent to WHERE LIKE "%123&"? | |||||||
Actually, the RI and RS operators are (almost exactly) like the LIKE operator. When you code an IF, AND, or OR statement (or you fill in a query record constraint), you can compare a field against a regular expression. RI matches against a regular expression, ignoring differences in case. RS matches against regular expression, sensitive to differences in case. When you execute an IF/AND/OR statement that uses an RS or RI operator, Appx sets TEXT AT POSITION to point at the beginning of the match (assuming that the IF statement returns 'T'). So you could: IF XYZ FOO RS .*123.Since we don't allow RS or RI in BEG/END AT statements, you still have to read through the whole file (unless you can come up with some other constraint). | ||||||||
[Append to This Answer] | ||||||||
2005-Dec-06 1:24pm | ||||||||
![]() |
![]() ![]() ![]() ![]() I am trying to change my named resource for wallpaper, but all i am getting is a small image in the corner instead | |||||||
Make sure that the named resource you are changing to has a State of "Wallpaper".
| ||||||||
[Append to This Answer] | ||||||||
2006-Jan-05 3:06pm | ||||||||
![]() |
![]() ![]() ![]() ![]() What does the new GUI attribute "Shrink To Fit Content" do? | |||||||
Please see the following page:
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=896
| ||||||||
[Append to This Answer] | ||||||||
2006-Mar-14 10:43am | ||||||||
![]() |
![]() ![]() ![]() ![]() Print Setup on the Java Client | |||||||
The Print Setup action is a client side action. Kind of like TAB. When something fires the option the client processes that directly. It does not set it back to the server for processing. For TAB the trigger is the keyboard.
For Print Setup the trigger is a widget that has it's option set to fire PRINT SETUP. You can add a button widget to a screen that fires PRINT SETUP as the option and the client will process it when it is clicked.
Setting option to PRINT SETUP in ILF code has no effect because the client does not see the ILF code run. Just like setting option to TAB has no effect. Print Setup is client platform specific. On windows it works for a number of reasons: 1) Windows has a common print setup dialog at the OS level we can easily call; 2) We interface our client side printing to the print driver that the print setup dialog controls using winprint, so the options you change will be used when you go to print. It does not work on Linux because:
1) There is no one common dialog we can call; | ||||||||
[Append to This Answer] | ||||||||
2006-Jul-31 1:41pm | ||||||||
![]() |
![]() ![]() ![]() ![]() What is the difference between --- MODE and --- INTERACTIVE PHASE? | |||||||
--- INTERACTIVE PHASE is set during input processes and indicates which data entry phase is currently in force. It works with --- MODE and, although they work together, each has a specific use. MODE is determined when the user selects an input process from a menu and selects a mode option (ADD, CHG, DEL, or INQ). INTERACTIVE PHASE determines what the user may do while in that mode. For example, if you are in ADD mode entering data into a scrolling frame, you can move the cursor to a previously added record and select the change item option. At this time you will still be in add mode, but the interactive phase will change from data addition to data modification. | ||||||||
[Append to This Answer] | ||||||||
2007-Mar-13 11:25am | ||||||||
![]() |
![]() ![]() ![]() APPXIO File Access Method | |||||||
FAQ's relating to the APPXIO File Access Method
| ||||||||
Subcategories:
Answers in this category: | ||||||||
[New Answer in "APPXIO File Access Method"] | ||||||||
2004-Mar-29 10:45am | ||||||||
![]() |
![]() ![]() ![]() ![]() What is standard APPX data record wrapper? | |||||||
Each data record in an APPXIO data file contains 16 bytes of "wrapper" - 12 bytes on the front end of the data and 4 bytes on the tail end.
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-29 10:44am | ||||||||
![]() |
![]() ![]() ![]() Image Editor | |||||||
| ||||||||
Subcategories:
Answers in this category: | ||||||||
[New Answer in "Image Editor"] | ||||||||
2004-May-18 4:40pm | ||||||||
![]() |
![]() ![]() ![]() ![]() What does the * after the Chg on the status line mean? | |||||||
In Appx 4.2 you may notice the asterisk (*) after the Chg mode indicator on the status line in the Imade Editor. This was added to indicate that a change has been made to the image, but has not been saved. This indicator was not present in earlier releases of Appx.
| ||||||||
[Append to This Answer] | ||||||||
2004-May-18 4:52pm | ||||||||
![]() |
![]() ![]() ![]() Compile Time Error Messages | |||||||
| ||||||||
Subcategories:
Answers in this category: | ||||||||
[New Answer in "Compile Time Error Messages"] | ||||||||
2004-Nov-01 10:58am | ||||||||
![]() |
![]() ![]() ![]() ![]() Message "pc_item - Unexpected case switch" | |||||||
That particular error means that the 'modifiable' field in one of your items
has an invalid value. 'Modifiable' is a logic field but apparently holds
something besides '0', '1', or ' '. You may be able to find the erroneous
item by simply looking through the items by hand. If not, design transfer the
entire process to a temporary process, then start deleting the items one by
one. This is a compile-time error so you can Opt 97 after each deletion.
| ||||||||
[Append to This Answer] | ||||||||
2004-Nov-01 10:59am | ||||||||
![]() |
![]() ![]() ![]() New Item | |||||||
[Append to This Answer] | ||||||||
2007-Mar-08 1:43pm | ||||||||
![]() |
![]() ![]() APPX Runtime Environment | |||||||
FAQ for questions relating to the use of the APPX Runtime environment.
| ||||||||
Subcategories:![]() ![]()
Answers in this category:
| ||||||||
[New Answer in "APPX Runtime Environment"] | ||||||||
2011-Feb-04 9:38am | ||||||||
![]() |
![]() ![]() ![]() Runtime Messages | |||||||
| ||||||||
Subcategories:
Answers in this category: | ||||||||
[New Answer in "Runtime Messages"] | ||||||||
2011-Feb-09 2:51pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Message; "op_prt_buf, print new page fa". | |||||||
There are several common causes for this error. Have you changed the code for these jobs in the past week? If not, check for ERROR/WARNING/MESSAGE statements that might be executing when the ALTERNATE IMAGE NUMBER is zero. (This could cause this error to appear despite the jobs running fine for months – it might be the first time a particular error/warning/message occurred on a particular record). Also, check for ERROR/WARNING/MESSAGE statements that might be in End of Process or an unbounded range end frame. Another likely scenario is that more ERROR/WARNING/MESSAGE statements are being triggered for a record than there is room for on the page -- to check for this, comment out your ERROR/WARNING/MESSAGE statements and run the job, and see if the error occurs. If you check for all of the above and none of those seem to be the cause, and you are using standard page headers in those output processes, try turning off the standard page headers, and run one of the jobs, and see if that fixes it. | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 9:05am | ||||||||
![]() |
![]() ![]() ![]() ![]() Message; “free_pool() - attempting to free unallocated memory ()” | |||||||
This error has been documented when a CNV TEXT command with an occurrence number of zero is encountered. Check to see if you have a CNV TEXT in your ILF and if it could possibly be set to occurrence zero.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 10:58am | ||||||||
![]() |
![]() ![]() ![]() ![]() Message; “Internal Error has Occurred, Proceed with Caution” | |||||||
Internal Error has Occurred, Proceed with Caution" means something unexpected has happened within APPX, sometimes the result of something happening before your current operation. Instead of proceeding with caution, tell your users to write down the last three things they did, then exit Appx, then to contact you.
If you can reproduce the error, we'd love to get a copy of the replication, so we can fix it. Frequently the error is not easily reproducible, so any scenario we can get that reproduces it would be helpful.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 11:00am | ||||||||
![]() |
![]() ![]() ![]() ![]() Message; "Cannot write any more qdaemon" | |||||||
When trying to print large print files, get:
"Enq: (FATAL ERROR): 0781-024 Cannot write anymore to /var/spool/qdaemon/to4mZM"
The /var file system is full. Delete some unneeded files out of the file system.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 11:02am | ||||||||
![]() |
![]() ![]() ![]() ![]() Message "memcpy - trash the heap" | |||||||
This message in the past has indicated corrupted Area Numbers (and internal Appx construct). The recovery procedure in www.appx.com/assets/asp/dynamic_generator.asp?pageid=584 gets rid of these ANO errors.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 11:05am | ||||||||
![]() |
![]() ![]() ![]() ![]() Message; "unknown AppxIO status" | |||||||
Could be that backup has a *.key file locked.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 11:42am | ||||||||
![]() |
![]() ![]() ![]() ![]() Message; "Can't connect to host" | |||||||
The DNS server may not be resolving hostnames properly.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 11:43am | ||||||||
![]() |
![]() ![]() ![]() ![]() Message; “PDF_begin_page: Function must not be called in ‘page’ scope” | |||||||
Rel 4.2
This error occurs when a page break triggers another page break. For example, setting "new page before" on a page heading frame. Refer to bugtracker bug #517 and #617
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 11:44am | ||||||||
![]() |
![]() ![]() ![]() ![]() Message; “Connection Refused by Host” | |||||||
This message normally indicates that;
1. winappxd/appxdsvc (listener) is not running on the server (host)
Referring to item 3 above. If you are entering a server name and you are sure the listener is running and the port is correct, try entering the ip address of the server instead. If you connect, most likely your DNS name is not mapped to the right ip address. You will have to resolve your DNS server mapping to eliminate this error. | ||||||||
Also see; http://board.appx.com/cgi-bin/fom.cgi?_highlightWords=connection%20refused&file=439 | ||||||||
[Append to This Answer] | ||||||||
2010-Nov-17 4:26pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Message; “Application Lock verification failed. Access Denied”. | |||||||
An attempt has been made to open a locked application (already opened by the registered number of users).
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 11:46am | ||||||||
![]() |
![]() ![]() ![]() ![]() Message; “can't write cwdgt - Error - Already on File” | |||||||
Prior to the Pre-Display event point(s), Appx copies designed widgets (that is, widgets that you painted in the image editor, as opposed to widgets that you create at runtime through ILF code) out of the EM and into the --- WIDGET file. After the Pre-Display event point(s), Appx takes a snapshot of the items in the --- WIDGET file and pushes them out to the screen (or to the report if you're running an output process).
This error occurs when Appx takes the snapshot (after you've had a chance to change the widgets with ILF code).
The primary key to the internal widget file is position row+position col. There's an alternate unique key that on name + appearance number. Check for duplicate name+appearance number.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 11:47am | ||||||||
![]() |
![]() ![]() ![]() ![]() Message; “Cannot read cfi_rec” | |||||||
When running an INPUT process, I get:
PL.C.2842 - "Cannot read cfi rec - Error - Record Not in File",
followed by "Internal Error Has Been Detected, proceed with caution!".
| ||||||||
You may be attempting to PASS a FILE. You can pass a RECORD, but you can't PASS a FILE (even though the ILF editor and compiler don't complain about it.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 11:48am | ||||||||
![]() |
![]() ![]() ![]() ![]() Message: “mm_free() 'freeing watched address' or 'attempting to free freed memory'" | |||||||
These errors suggest that memory is getting stepped on, usually by some application action occurring before the most recent action. (The most recent action often being exiting from some Appx process.)
To diagnose these, set the two environment variables: APPX_TRAILER_COUNT=40and APPX_LABEL_MEMORY=1... either as conventional OS environment variables, or else in the ./data/appx.env file. When then running into the above error messages, send a copy of the error message itself (a screen snapshot if possible) to Appx technical support. On Windows platforms, also send a copy of the 'appx.stk' file found in the same directory as the Appx engine. (It may then be safely deleted.)
Consider also performing the cleanup steps described in:
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=584
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:24pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Message; "pl rloc - too few cchld records(1)" | |||||||
This is caused by an Optional Process defined in an INPUT process. The Optional Process had an Additional Attributes, Default PCF Key, defined on a field that was not a key in the target file.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 11:55am | ||||||||
![]() |
![]() ![]() ![]() ![]() Message; “ID not defined as valid Login” | |||||||
A VAR installed Appx onto an XP laptop that was a member of a domain "RND". During the initial Appx loading, it asked him for his OS Login. He tried entering his OS user id ("abc"), but Appx told him that "This ID is not currently defined as a valid Login on your system".
It did let him enter an OS login of "RND/abc". But when he then logged into his OS as RND/abc, then into Appx, it told him - "Bad User Id - The User Id you are currently using was not found in the APPX user file." VAR deleted .\data\0SA\Data\USER.* in order to be able to enter Appx. In Security > Users he tried entering "abc", but it gave him the "not currently defined" message. It did let him enter an OS Login ID of "RND/abc", but again wouldn't let "abc" log in. VAR didn't notice that there was the word "Warning" in front of the first message. Because of confusion of local IDs and domain ID, Appx validates against the domain id, but allows entry of only the user portion of the Domain/User ID. I.E., "abc" works for logging in, but generates a Warning during OS Login ID Entry. "RND/abc" doesn't work for logging in, but generates no warning during OS Login ID entry. If you're in a Domain environment, enter only the user part of the user's OS Login ID. Also, ignore the "Warning - This ID is not currently defined..." message.
Note, this message was changed from 'Error' to 'Warning' in 4.1.8. If your Appx version is prior to 4.1.8, it's probably necessary to upgrade to 4.1.8 or higher in order to be able to enter OS Login ID’s.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 11:57am | ||||||||
![]() |
![]() ![]() ![]() ![]() Message; “File Organization Specification Mismatch” | |||||||
This error can be caused by a damaged EM. Delete all your EM’s for this application, in APPXPATH/data/db/app/EM directory, and try running the application again. APPX will automatically rebuild EM’s when needed or you can force them all to be rebuild by going to Utilities>Toolbox>Create Executable Modules.
You can also get this error if a file is damaged. If a {file}.dat is damaged and you rebuild the {file}.key from it, you may or may not get an error message indicating that there's a problem in the .dat. If you get no message, you could be left with the impression that your .dat/.key pair are good. Running verify may or may not tell you if there's a problem. (This is a low probability, but possible scenario.) Your safest course of action is to run through the "What to do with a file That Fails Verification" procedure in http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=624
You can do a bit more investigation using the techniques in "Verifying and Analyzing a File" on that webpage. Using the utility program Recover.exe is the recommended course of action. Exporting and re-importing the file will work however may result in more lost data. The Export program will only read to the "bad spot" on the file and stop whereas Recover.exe will continue to the end of file reading and writing records beyond the error. Information on this utility can be found at the above address.
| ||||||||
[Append to This Answer] | ||||||||
2006-Feb-28 1:38pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Message; “License Server not Detected” | |||||||
Try to manually start the license server by means of;
appx -l=logfile
Consider deleting the data\0SA\Data\USAGE.*, .\REGISTER.dat, and .\LOCK.* files, then re-import the registration.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 11:59am | ||||||||
![]() |
![]() ![]() ![]() ![]() Message; "file does not exist" | |||||||
We are suddenly having a problem with a disk-related file that manifests itself as "file does not exist". I changed these files to
Memory-Related and that seemed to solve the problem but why? The files were not moved and previously had been working for the past 12 years.
| ||||||||
Look at the Tmpdata directory - you may need to clean it out occasionally. If you see a lot of old temporary files, you may be running out of file names.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 12:00pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Message; "Can't connect to Host" or "Connection refused by host" (Troubleshooting WinAppxD) | |||||||
If, when attempting to connect from the Windows or Java clients, you get either of the above two messages, the Presentation Server is probably not running.
For an NT based Presentation Server (WinAppxD), see the FAQ “Service is not running” for debugging approaches. Also for NT Presentation Server: 1) Bring up the Task Manager and look for a WinAppxD process, which should tell us whether WinAppxD is running. 2) Running "netstat -a" and looking for "*.8060" (for example) in the "Local Address" list will tell you if anything is listening on the port. For example: C:\WINDOWS> netstat -a Active Connections Proto Local Address Foreign Address State TCP oz:1079 P66:0 LISTENING TCP oz:1650 P66:0 LISTENING TCP oz:1656 P66:0 LISTENING TCP oz:1533 P66:0 LISTENING Services for WinAppxD has a radio button giving alternatives for 'System' or 'This Account:'. The latter should be on, with UserID equal to the APPX user set up for this Presentation Server. Try reentering the password for this User Account. Then Re-IPL. For a Unix based Presentation Server:
To see what Presentation Servers are running, execute: ps -ef | grep appxd To see what ports (prefixed with '806') are being listened to: netstat -a | grep 806 Proto Recv-Q Send-Q Local Address Foreign Address (state) tcp 0 0 *.8064 *.* LISTEN tcp 0 0 *.8068 *.* LISTEN tcp 0 0 *.8067 *.* LISTEN.
| ||||||||
On Linix; The iptables and ip6tables are probably getting in the way. Those restrict access to incoming ports. Try turning them off... cd /etc/rc.d/init.d/ ./iptables stop ./ip6tables stop | ||||||||
[Append to This Answer] | ||||||||
2010-Nov-17 4:28pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Message; "Allocation of TOKEN_USER failed" | |||||||
This is a system error which should never occur. It is indicative of the system having trouble allocating memory to hold a data structure. - Resolution: Reboot and try again. If it still fails, call APPX Software Technical Support.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 12:02pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Message; "LookupAccountSid() failed" | |||||||
This is a system error which should never occur. It says that NT could not retrieve security information for the account used to run WinAppxD.
Reboot and try again. If it still fails, call APPX Software Technical Support.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 12:03pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Message; "can't open stream socket" | |||||||
This is a system error which should never occur.
Resolution: Reboot and try again. If it still fails, call APPX Software Technical Support.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 12:41pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Message; "can't bind local address" | |||||||
Something on your server already has the port you specified in the "-s=" argument, open. Causes:
1. A lingering copy of WinAppxD. Check to make sure no copies of WinAppxD are listed in Task Manager. This may occur if you Start and Stop the WinAppxD service using Control Panel, or if you run WinAppxD from the command line during troubleshooting. If you see any rogue WinAppxD's, kill them and try again.
2. Some other (non-APPX) application wants to use the port you specified in the "-s=" argument for WinAppxD during installation. There is no completely reliable way to detect this. If you are getting the "can't bind" error and are sure it's not due to an extra WinAppxD process running, this is probably what has happened. Since WinAppxD can't use a port claimed by another application, go back and edit the registry, choosing a different port number for the WinAppxD service. For example, try 8061 instead of 8060. Reboot, and try again.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 1:13pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Message; "op_prt_buf, print new page failed" | |||||||
This message is displayed from an output process if there are MESSAGE statements in End of Process or too many ERROR, WARNING, or MESSAGES are produced while processing a single PCF record.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 1:13pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Message; “There was an error opening this document. No such file or directory” | |||||||
This error was displayed while appx was sending a report to Adobe Acrobat PDF viewer. Check to see if the path to the pdf document contains two or more consecutive blank spaces. Change the path to have only one blank space and the pdf will print.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 1:16pm | ||||||||
![]() |
![]() ![]() ![]() ![]() NET_LOG 'error's 122 & 10054 | |||||||
In the course of Appx/Clients attaching to a WinAppxD Appx/Server, with APPX NET_LOG enabled, the following NET LOG entries can come up. Here are explanations: SetProcessWindowStation() returned 1, (err=122) CreateDesktop() returned 168 (err=122) These aren't errors. They would be errors if they had returned 0. recv() failed, exiting, errno = 10054 "An existing connection was forcibly closed by the remote host." (From the MS Win32 API Error Codes) This can be caused by something in the network (aka an 'assassin') sending a RESET packet. This kills WinAppxD, and therefore all links between Appx/Clients and the Appx/Server. The Appx/Server may or may not be able to manually restart, depending on whether something in the network is holding the old port open or not. If the port is being held open, the Appx/Server can't grab it again. That "something in the network" could be routers, modems, or other equipment in the network. | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:32pm | ||||||||
![]() |
![]() ![]() ![]() ![]() PDF Output: "Windows cannot find $display" | |||||||
In running a PDF OUTPUT, user gets popup error box:
$display: (can look like "Sdisplay")The problem was resolved by associating Adobe 6.0 with all PDFs, and installing the newest java client. | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-27 1:06pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Message: "required data was not placed into memory because of an I/O error" | |||||||
Users running "appx -c" got error popup boxes: Appx - 41440: appx.exe - application error | ||||||||
==> Users got I/O errors trying to page blocks of appx.exe executable into local process space.
There were most likely occasional, brief network problems when trying to load a block of appx.exe executable into his client PC. This can happen after initial appx.exe -c program loading, because the OS grabs 2k blocks of the disk form of the executable, as needed. (The problem can also be a disk fark, or a controller error.)
The solution is to bring the appx.exe previously stored on the network server down to the local PC hard drive, to eliminate this potential network problem. | ||||||||
[Append to This Answer] | ||||||||
2004-May-25 2:53pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Message – “Error - Invalid Request Using Main ARB” | |||||||
That typically means that you've rewritten (or deleted) the PCF record in ILF code. If you've rewritten the PCF record, be sure to re-read it with hold or Appx will get confused.
| ||||||||
An 'arb' is an access request block - it's the internal representation of a file stream. When you OPEN a file, you get a new arb. Appx creates arbs for you when you BEG/END READ, or when you invoke a new process.
| ||||||||
[Append to This Answer] | ||||||||
2005-Aug-29 11:37am | ||||||||
![]() |
![]() ![]() ![]() ![]() Message "Found active record on freelist" | |||||||
Every APPXIO file maintains a list of deleted record (the freelist).
The freelist is added to whenever a record is deleted. Freelist pointers are used to 'recycle' deleted record space in the *.dat file.
Each record in *.dat file also has a "deleted?" flag. If a freelist pointer points to a record that doesn't have this flatg set, you get this error.
Get all users out of the file. Run "Verify Inegrity" on the file. If Verify Integrity reports that the file is OK, export and re-import the file. This gets rid of the corrupted list of deleted records. If Verify reports that the file is damaged, follow the recovery procedure as outlined in the following link: http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=624
| ||||||||
[Append to This Answer] | ||||||||
2005-Feb-09 2:57pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Message. "ERROR - CANNOT ACCESS REQUIRED FILE" | |||||||
This runtime error normally happens when you incorrectly specify the name of a Query in the Output processes Use Query parameter.
This error can also happen when a temporary file is created in a process and that temporary file is not deleted completely. Under normal conditions, APPX will delete temporary files (Disk Related for example), when the process ends. Look for the presents a .key components without a corresponding .dat for the file in your database directory for the offending application. Delete the .key file manually if necessary.
| ||||||||
[Append to This Answer] | ||||||||
2005-Feb-17 2:23pm | ||||||||
![]() |
![]() ![]() ![]() ![]() What does error "Can't read LFN File - Error - Already on File" mean? | |||||||
LFN stands for Logical File Name.
If you use symbolic links or the "Use DB" feature, many Logical file names can
map to the same physical file. A logical file name is (roughly) an
application ID + database ID + filename.
You can usually get rid of the error by exiting Appx and going back in. It
wouldn't hurt to verify files as well.
| ||||||||
[Append to This Answer] | ||||||||
2005-May-18 9:13am | ||||||||
![]() |
![]() ![]() ![]() ![]() Message, "can't empty sarb list" | |||||||
The Appx engine keeps a list of all files open at each scope, when a scope ends, the engine closes all files opened at that scope. This error occurs when the engine has just finished closing all files a scope list - when it's finished, the engine double checks to make sure that the list is empty. "Can't empty sarb list" means that the list is not empty after closing all files. There's nothing that a user or designer should be able to do to make that happen. It's an engine bug.
'sarb' is an abbreviation for 'slave arb'. A sarb is a slave to a 'marb' (a master arb). An 'arb' is an access request block - it's the internal representation of a file stream. When you OPEN a file, you get a new arb. Appx creates arbs for you when you BEG/END READ, or when you invoke a new process.
Recommended course of action, determine what process was running then look at the file(s) that were open. Check the number of alternate keys. Appx allows for 1 primary and 15 alternate keys. If you exceed this you could get this error. You should also delete the em(s) and run the process again.
| ||||||||
[Append to This Answer] | ||||||||
2005-Aug-30 8:42am | ||||||||
![]() |
![]() ![]() ![]() ![]() Message, "bad reg no." | |||||||
This message is normally occur when Appx can't find the window that holds the cursor. When testing this situation, notice where the cursor is prior to the error and where it is after.
You may see this message from Subroutine CSE. CSE is the Call Statement Editor.
| ||||||||
[Append to This Answer] | ||||||||
2005-Sep-16 3:02pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Message "An unexpected error occurred, please enable logging and retry" | |||||||
This is an error thrown in Pre-Display of the registration process if the field REGERR CHK LOG is set by the engine. This REGERR CHK LOG flag is set in 8 different places in the Appx License Manager engine code as reg_err_chk_log:
* It tries in 4 different places to open the USAGE file and if it fails it sets this flag.
The basic problem might be a corrupt USAGE file. | ||||||||
[Append to This Answer] | ||||||||
2005-Oct-11 4:00pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Message "Cannot write to Cache - Invalid Prototype Record Length" | |||||||
Most likely, the Em needs to be re-build for that particular process
| ||||||||
[Append to This Answer] | ||||||||
2006-Mar-29 3:36pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Message; "No Record Currently Held" | |||||||
For a single input process APPX uses a common area to store file information. A key element is the Held Record pointer. There is only one Held Record Pointer per file.
APPX can maintain three threads to the same file; one for the PCF, one for READ/READNEXT and one for BEG READ/END READ loops. When you READ the PCF in ILF (sub-process level), it resets the hold pointer depending on the READ specifications. That’s why the STORE, READ with hold, and RESTORE in Pre-PCF Update works. It re-established the hold on the record APPX automatically read from the PCF. Of course the interactive phase is import too. Appx won’t hold the record in Inquire mode for example. Also keep in mind that the data record is also stored in the common area and subsequent READ statements may replace the record read (and perhaps displayed) from the PCF. It can be a slippery-slop when you start messing around with the PCF in your application. There are certainly situations where it’s necessary but it could be done accidentally as well. A record will be released by the REWRITE, DELETE, or CLOSE statements. Why, Appx assumes when you execute any of these commands you are done with the record. As mentioned above, a READ or READNEXT creates a second thread into the file but uses the same common area as the parent. So if you access the PCF in ILF with hold, the hold pointer and record buffer are changed in the common area. When you return to your input screen after the events points, or sub-process child have executed APPX expects the PCF record to be held (in change mode). Since you re-established the hold in ILF, the hold at the PCF level has been lost. This might be what is happening in your case. That’s what the message is in the status line (in red) is telling you. If you tried to REWRITE or DELETE a record in ILF and didn’t have the hold, Appx would display the ILF code that was causing the problem. You can also release the hold by invoking a sub-process child that uses the same PCF as the parent. Sub-process children share the common area with the parent. Basically the same thing happens as a READ, but APPX has read the file and may have reset the hold. This would happen on an input process invoked as a sub-process that has the same PCF as the parent.
You should analyze your system to determine where the hold is being released. We can’t tell you specifically where to look because, as described above, the hold can be release in any number of ways depending how your system is coded. If this just started happening, I would find out what has recently changed and investigate what the programmer may have done that resulted in this situation.
| ||||||||
[Append to This Answer] | ||||||||
2006-Jun-14 11:39am | ||||||||
![]() |
![]() ![]() ![]() ![]() Message, Error - Request Not Allowed | |||||||
This error is displayed when the user doesn't have the rights for something they are trying, switch to change mode for example. Rights are assigned in System Administration, Security, Security Profiles.
| ||||||||
[Append to This Answer] | ||||||||
2008-Sep-18 5:19pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Message, "BI.C - APPX Startup Failure: Unable to Initialize Window Manager" | |||||||
This error can occur when starting the Appx engine (appx.exe) and can be caused by a missing file in the 0 app or and entire directory missing.
| ||||||||
[Append to This Answer] | ||||||||
2008-Dec-05 2:18pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Message: "key field conversion failure - Error - Invalid Logical Value" | |||||||
The engine code at this location is trying to write to a MODLOG by comparing the old and new values of the PCF record. This error is thrown when it tries to grab the old value and convert it to a text value to put in the log. The data conversion failed with "Invalid logic value" so it seems it might have tried to convert a logic field that had an unexpected and invalid value somehow. Maybe set via a group header that didn't match up right?
| ||||||||
[Append to This Answer] | ||||||||
2010-Feb-12 1:44pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Message; "too much data" | |||||||
This is caused by Appx restoring a saved record or field buffer and detecting that the size is different between the saved copy of the buffer and the current copy of the buffer. This happens with STORE/RESTORE PASS/RECEIVE ILF commands as well as certain places in like when running processes that are scoped not to share buffers (RELATED and DETACHED), file level event points, etc.
Perhaps something is being changed in the data dictionary that alters the length of the current buffer and Appx maybe has a copy of the data stuck is a save buffer that it is trying to restore.
| ||||||||
[Append to This Answer] | ||||||||
2011-Jan-06 4:20pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Message, "Network IO Error" | |||||||
Possible causes of the Network IO Error:
Most of the time this error is the result of lack of permissions on the Appx directory. Appx users must have full control within the Appx directory and all sub-folders within it. They also need to be able to run the Appx executable on the server with logon local rights. We have seen this error caused by a spam filter. If any new spam/virus filters been added to your server in the past few months, could you turn them off briefly to test connectivity?
You might get this error if you're running a newer version of the client than the engine. Example, running Appx 4.2.a with the 5.0.1 client.
| ||||||||
[Append to This Answer] | ||||||||
2011-Feb-04 9:42am | ||||||||
![]() |
![]() ![]() ![]() ![]() Message, "ORA-01000: maximum open cursors exceeded" | |||||||
This is an error detected by Oracle.
It has been found that exiting a BEG READ/END READ loop that is accessing an Oracle table will not close cursors properly. In this case you should write your Appx ILF process to always execute the END READ statement for each READ. Tuning OPEN_CURSORS The best advice for tuning OPEN_CURSORS is not to tune it. Set it high enough that you won't have to worry about it. If your sessions are running close to the limit you've set for OPEN_CURSORS, raise it. Your goal in tuning this parameter is to set it high enough that you never get an error during normal operations. If you set OPEN_CURSORS to a high value, this doesn't mean that every session will have that number of cursors open. Cursors are opened on an as-needed basis. And if one of your applications has a cursor leak, it will eventually show up even with OPEN_CURSORS set high. Your DBA should be able to monitor the number of open cursors. After you've increased the value of OPEN_CURSORS, continue monitoring to see if opened cursors keeps increasing for any of your sessions. If you have an application session whose opened cursors always increases, then you've likely got a cursor leak in your application code: your application is opening cursors and not closing them when it's done. There is nothing you (DBA), can do to fix a cursor leak. The application developers need to go through the code, find the cursors that are being left open, and close them. As a stopgap, the most you can do is raise OPEN_CURSORS very high and schedule times when all the application sessions will be closed and reopened. How not to tell if you're closing all your cursors Frustratingly for developers, the session statistic 'currently open cursors' can include some cursors that the application has closed. When application code calls for a cursor to be closed, Oracle actually marks the cursor as "closeable". The cursor may not actually be closed until Oracle needs the space for another cursor. So it's not possible to test to see if a complex application is closing all its cursors by starting a session, running a test, and then checking to see if currently open cursors has gone down to 1. Even if the application is closing all its cursors properly, currently open cursors may report that some "closeable" cursors are still open.
One way for application developers to tell if an application is closing all
its cursors is to do a single test run, on a dedicated development box, while
monitoring opened cursors for the session that's running the test. Then set OPEN_CURSORS to a value a little bit higher than the peak cursors open during your test run, start a new session, and run through multiple iterations of the same test run. If your application still has a cursor leak, you will see the value of OPEN_CURSORS going up, and you may hit an ORA-1000 after a reasonable number of iterations. (Don't set OPEN_CURSORS too low or it may be used up by recursive SQL; if your single test run opens very few cursors, consider
making your test run longer rather than setting OPEN_CURSORS unreasonably low.)
| ||||||||
[Append to This Answer] | ||||||||
2011-Feb-09 3:01pm | ||||||||
![]() |
![]() ![]() ![]() Other Runtime Questions | |||||||
| ||||||||
Subcategories:
Answers in this category: | ||||||||
[New Answer in "Other Runtime Questions"] | ||||||||
2007-Jul-02 3:30pm | ||||||||
![]() |
![]() ![]() ![]() ![]() What is the difference between END and CANCEL? | |||||||
END and CANCEL are both commands that terminate the current APPX process and return to the previous level, or, in APPX terminology, parent process. The main difference between END and CANCEL is what APPX does when control is returned to the parent.
END returns to the previous RELATED process level and continues operation. CANCEL returns to the DETACHED process level and continues operation. This may sound very similar but are actually quite different. A simplified answer is that END terminates the current process and goes back one level, while CANCEL terminates the current process and may go back more than one level. For example, when a report is selected from a menu it may start a job that has several steps. It may contain an input that asks for a date range, a query that will select and sort records based on that date range, a disposition to direct the report to the desired device, and an output that actually creates the report. In this case the menu is the parent of the job, which is considered DETACHED since creating the report is not dependent on any information received from the menu. The input, query, disposition, and output steps of the job are RELATED, since the task depends on successful completion of each step.
If you are on the disposition screen and you decide that you want to terminate the report you must decide whether to press END or CANCEL. If END is pressed, then the disposition is terminated and control is returned to the RELATED level, or the job, and processing continues. In this case the output would then run, creating the report that you thought you were exiting. On the other hand, if CANCEL is selected the disposition is terminated and control is returned to the DETACHED level, or the menu. This skips any remaining RELATED steps of the job, giving the desired results.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:06pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Is there a way to pass login nformation to APPX? | |||||||
Yes, you can do this with the following startup options: AppxDesktopClient -user=xxx -password=xxx -host=xxx -port=xxx Where xxx is user/site specific information. | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:06pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Is there anyway to force the appx client to open in a specific size window? | |||||||
Yes, you do this differently depending on what you are trying to do.
A) If you want to run with more Appx screen rows and columns, start the client with the following options: AppxDesktopClient -rows=28 -cols=110 This will launch the client that has been sized to allow this number of application Rows and Columns. Similar to running a non-24x80 xterm window and running Appx. B) If you want to launch the client with a different screen font size, that controls the overall size and magnification of the Appx Client screen. You can do that with a different startup option: AppxDesktopClient -initialFontSize=14 &
This will launch the client using that base font size instead of the default
it is currently using. The base font size is used by the client to set the
overall Appx client window size and also how to scale all the screens it
presents. The screens will be 'zoomed' to fill the Appx screen. Similar to
starting to client today and dragging out the border to a different size.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:07pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Graphic resource(s) not being displays (red X)? | |||||||
After upgrading a Windows 2000 workstation (anit-virus, Novell client , Groupwise ), the graphics in the APPX java client would not display. Even on the very first APPX screen where it normally has the Run, Design and APPX software there were only red Xs in place of the graphics. In the one application that is fully GUI, anyplace there was a reference to a resource (menu backgrounds, input backgrounds etc) the resources did not show. Clear the cache on the client workstation. Locate and remove the .appx directory on the client machine. This is where all image files are stored and retrieved from during processing. The client software will refresh the cache area as resources are needed. | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:08pm | ||||||||
![]() |
![]() ![]() ![]() ![]() What does the check mark on the Java client do? | |||||||
In the Java client on the upper right corner of the screen there is a question mark, a check mark and an x. What does the check mark do?
| ||||||||
The check box between the ? Mark and the X is the Enter command. APPX automatically "clicks" the check box when the Enter/Return key is pressed. Clicking it will do the same thing as pressing Enter
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:08pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Checking the APPX registration number. | |||||||
In Systems Administration / System Setup / System Registration the CPU Serial Number field near the bottom of the screen should be the same as the Serial Number displayed in the CPU Information box. If not, your system may not be properly registered resulting in a registration error when APPX is run.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:09pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Is the date/time a user signs in and out of APPX kept? | |||||||
In Appx 4.2 there will be a logging system to allow you record when a user signs in and out. Prior to release 4.2 this information is not saved, however you could easily write a startup process to capture this information.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:10pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Pasting data into a text field in APPX. | |||||||
In the Java client, for text field entry, the client does not allow the user to continue typing beyond the max length of the text field; all keystrokes are rejected. However, if text is copied from an external source (Notepad, Word, etc.), and pasted into the text field, it appears to allow lengths greater than the length of the defined field. Upon saving, the pasted text is truncated appropriately to the field length; however, it could give the user the mistaken impression that the entire text string was saved, when in fact it wasn't. Starting in APPX release 4.2, the text from the clipboard will be truncated and a beep will indicate that the incoming data does not fit in the field.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:11pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How do you set up keystroke playback (keyboard scripting)? | |||||||
You can use keyboard scripting from the Appx Telnet and Windows client, but it is unable to handle unexpected or error conditions. It allows you to record, edit, and then play back (blindly) specified keystrokes. <www.appx.com/assets/asp/dynamic_generator.asp?pageid=648> describes APPX Keystroke & Process Recording & Playback. When run from a Windows client, the file that is generated and read from for scripting is on the client PC.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:11pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How do you turn off dynamic indexing in APPX? | |||||||
The environment variable to set to turn off dynamic indexing in Appx is:
APPX_DISABLE_DYNAKEYS=1 | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:12pm | ||||||||
![]() |
![]() ![]() ![]() ![]() What is dynamic indexing? | |||||||
Dynamic indexing allows you to alternately sort the data (PDF) displayed on an input screen. Normally, the data sequence is by a predefined key in the PDF. Use dynamic indexing to temporarily change the data sequence. The new sort is active for the current APPX session only and is not saved. Place the cursor in the field that you wish to sort on and press F3. A confirmation message will appear on the status line, press Enter and the data is now “indexed” by the field chosen. There are several environment variables that can be set to control dynamic indexing (_DYNAKEYS).
| ||||||||
Bruce Johnston 15, '04: You can also create a dynamic index via ILF (at least from 4.1 through 4.2.2). Given two fields, DGA FDRFEPR FED WASTE PRE and DGA FDRFEPR FED WASTE SUF, if I want to sort by the PRE and then by the SUF, both in ascending order, I use the following... PASS DGA FDRFEPR FED WASTE PRE FIELD SHARE? N PASS DGA FDRFEPR FED WASTE SUF FIELD SHARE? N CALL ,PI_DYNA_BLD RESIDENT? N END? N FAIL 0 If I wanted to change the default order of any to reverse it I'd simply double up its PASS command as in... PASS DGA FDRFEPR FED WASTE PRE FIELD SHARE? N PASS DGA FDRFEPR FED WASTE SUF FIELD SHARE? N PASS DGA FDRFEPR FED WASTE SUF FIELD SHARE? N CALL ,PI_DYNA_BLD RESIDENT? N END? N FAIL 0 which gives the records sorted by the PRE in ascending order followed by the SUF in descending order. I believe that it was Korry who first told me this. | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:13pm | ||||||||
![]() |
![]() ![]() ![]() ![]() What are the maximum file size(s) in APPX? | |||||||
The maximum file size is dependent on the release of APPX and the operating system. The following chart shows the maximum file sizes allowed for each operating system based on the release level of APPX. Maximum file sizes by release Release Windows AIX Solaris HP/UX Linux ======= ======== ======= ======= ======= ======= 4.2 2 GB 4 GB 4 GB 4 GB 4 GB 4.1.a 2 GB 4 GB 4 GB 4 GB 2 GB 4.1 2 GB 4 GB 4 GB 2 GB 2 GB prior 1 GB 2 GB 2 GB 2 GB 2 GB | ||||||||
On AIX and some other Unix platforms, the OS can limit the maximum filesize a user can use, say to something like 1 gig. (1 gig = 1073741824 bytes, a number which came up when diagnosing this problem for one customer.)
Typing "ulimit -a" will tell you (in AIX) your user's current maximum filesize (in blocks). The maximum Appx record length is 32767 bytes, regardless of file type (AppxIO, Oracle, Sybase, ...). | ||||||||
A user's export of an Appx file stopped with: Mu.c.6842: "Main[] - cannot write port file - error - unknown appxio status".
The source file verified OK.
Only 41% of a 2+ gig filesystem was used. The Portdata file size was 1,073,740,936 bytes at the time of the error.
==> The problem was that the AIX operating system wouldn't allow files larger than 1 gig to be written to the file system. An OS parameter needed to be changed: the /etc/security/limits file, fsize parameter was set at 2097151. They changed it to -1 and the problem went away.
Prior to this change, executing the 'ulimit -a' command returned: time(seconds) unlimited file(blocks) 2097151 data(kbytes) 131072 stack(kbytes) 32768 memory(kbytes)32768 coredump(blocks) 2048 nofiles(descriptors) unlimitedAfter the change, 'ulimit -a' command returned: time(seconds) unlimited file(blocks) unlimited data(kbytes) 131072 stack(kbytes) 32768 memory(kbytes) 32768 coredump(blocks) 2048 nofiles(descriptors) unlimited
The value for file(blocks) is the limit on the file size in 512k blocks that can be written. After
the change the value is unlimited and the size of file that can be written is limited only by the
available disk space.
| ||||||||
The user changed their fsize limit, except that it was for the operating user, not for the appx User.
They changed the fsize limit to -1 for all appx users, and the problem went away.
| ||||||||
[Append to This Answer] | ||||||||
2005-Dec-27 9:03am | ||||||||
![]() |
![]() ![]() ![]() ![]() How to determining who has a file open (Unix OS). | |||||||
The Unix ‘fuser’ command will, when properly qualified, let you know what processor id and user’s login id. For example:Fuser –u /user/appx/data/VV/AAA/Data/Bugvar.datYields… /user/appx/Data/VV/AAA/Bugvar.dat: 15846(tom) 18211(appx)The –u parameter tells Unix to supply the users login id. The names have been changed to protect the innocent. | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:14pm | ||||||||
![]() |
![]() ![]() ![]() ![]() No Beep on Errors and Warnings | |||||||
If your Appx/Client loses its BEEP sound, when ERRORs and WARNINGs are encountered, look at the following:
1) Check that the Windows Sound Control's "Mute" isn't on, and that mixer volumes (Wave, Synth, Line, CD, etc.) are all set on high. 2) Try deleting Appx/Client cache files (Win2k: C:\Documents and Settings\{yourWindowsID}\.appx\cache\). 3) The "Toolkit.getDefaultToolkit().beep()"code may or may not be what your desktop expects as the default beep. It may be associated with another control. Go to Control Panel > Sounds and Multimedia > Sound Events. Is there a Sound Event named "Default Beep"? If not, go to Microsoft Knowledge Base Article 300406 http://support.microsoft.com/default.aspx?scid=kb;en-us;300406 titled: "Default Sound Is Unavailable in the Sounds Tool in Control Panel", and follow its instructions. If there is a "Default Beep" Sound Event, check to see if it has a .wav file associated with it and that the .wav file really exists. If there is not a .wav there, set one and see if that works. If one does exist, try setting a .wav association with the Windows program events that do not have a sound attached until you find the one that works.
4) Try re-installing the Appx/Client. | ||||||||
Background: When an Error or Warning occurs in the Appx application, we ask the Appx Java/Client to issue a ...
Toolkit.getDefaultToolkit().beep() ... to the Java VM (rather than fire off a .wav file). The Java VM forwards that request on via the Windows OS to the external speaker, but it's possible it's going thru the Client PC's BIOS => internal speaker to produce a beep. (We can't really tell, as this is internal to the Java VM.)
It's possible something you installed or uninstalled may have changed the sound
associated with the event the Toolkit.getDefaultToolkit().beep() is sending.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:15pm | ||||||||
![]() |
![]() ![]() ![]() ![]() What are the command line options? | |||||||
The APPX Client has a number of options that can be set at the command line. These options will only effect the associated session being started. You can prevent the client login box from displaying by supplying the options to attach and login to the proper system. If enough information is available for the client to make a good connection, the login box will not be displayed. If any part is missing or invalid, the login box will pop up. The following command line options can be appended to the COMMAND LINE= line of the runnappx.ini file located in the Primary Destination Directory. (Default location= C:\appx\java\runappx.ini).
Command Line Options -application=(APPX server Application ID) Instructs the server to startup in a particular application ID. (not implemented) -bg=(color) Background color (See -fg for color list). -bmode=(tile|expand) default=tile Defaults how background tiles are painted in the Java window. The “tile” setting uses the tile image over and over again to fill the window. The “expand” setting resizes the image to just fill the space inside the window. Used with the –splash= setting. -boldFg=(color) Set the default text foreground text color for bold text (See –fg for color list). -cols=(window size in columns) default=80 Defaults the initial screen size in columns. -database=(APPX server Database ID) Instructs the server to start in a particular database. (not implemented) -editBg=(color) Set the default text foreground text color for edit fields (See –fg for color list). -fg=(color) Valid colors are black, blue, cyan, darkGray, gray, green, lightGray, magenta, orange, pink, red, white, yellow, or any valid #rrggbb number. Set the default text foreground color. Defaults to black. -font=fixed Turns off the proportional font normally used by the Java client. If you are having problems with the text on your application screens not lining up the way you want, try this setting. -hideMenu (not implemented) -hideToolbar (not implemented) -host=(server hostname) Defaults the remote host field on the remote login pane of the login dialog box. It is also used when the login dialog box is skipped. -look=(java|windows|motif) default=windows Defaults the look and feel setting on the “options” pane of the login dialog box. It is also used when skipping the login box. -mode=(local|remote|both) default=both Controls which login panels are shown and also determines which type of login to do if the login in dialog box is skipped. -optkey=(character) Resets the key used as the option key. The default is the single back quote character (`, left of the 1 on the QWERTY keyboard. To set the option key to the ~ character, use –optkey=~ -password="(server OS password)" Defaults the password on the remote login pane of the dialog box. It is also used when skipping the login box. -pathname=(path & filename of the local appx.exe file) Defaults the location and name of the APPX server when running APPX locally. This is also used when skipping the login dialog box and the –mode=local is set. -port=(server port number) default=8060 Defaults the remote server port number on the login dialog and also used when doing a remote login with the login dialog box skipped. -process=(APPX server process name) Set startup process name. -ptype=(menu|job|input|output|...etc...) Sets the startup process type. -rows=(window size in rows) default=21 Defaults the initial screen size in rows. -shell=(command line to start a document) Overrides the default command line used to ‘start’ a document. Starting a document is telling Windows to open a document and having Windows use the association for that document type to decide which program to use. This defaults to start (document), which might not work on NT. NT may require this to be set to start the command shell like “cmd.exe /c start”. -smode=(tile|expand) default=expand Defines how the splash image is painted on the Java window. The “tile” setting uses the tile image over and over again to fill the window. The “expand” setting resizes the image to just fill the space inside the window. Used with the –splash= setting. -splash=(url to an image) Used as a background image in the main client window during the login process. How it is painted is determined by the –bmode= setting. -tile#=(url to an image) Defines an array of images that the client will use to fill window backgrounds. –tile1= defines the base wallpaper image. –tile2= defines the wallpaper for all one up from the base window. –tile3= sets the pattern for all windows two up from the base window, etc. You can define as many or as few as you like. The client will cycle back to the first image if you have more windows layered on the screen for which it has tile images. Used with the –bmode= setting. -title="(text/information to display)" Replaces the default text in the title bar of the client with the text and optional data specified in this parameter. Supports the following options; $(host) displays the host id, either name or IP as entered in login $(user) displays the user login id $(pathname) displays the engine path $(pid) displays the server task id $(port) displays the port the connection is attached through Example: -title=”Host is $(host), PID is $(pid), on server port $(port)”
-user=(server OS userID) Defaults the userid on the remote login pane of the dialog box. It is also used when skipping the login box.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:16pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Diagnose SUBR --- SEND FILE TO CLIENT problems | |||||||
"I'm trying to send a file to a specific location on the user's PC, but it
keeps failing. The target folder exists, and this used to work, now it
doesn't. The user can use notepad and save a file in in that location, but
APPX won't upload to it. How do I diagnose/debug the problem?" _ | ||||||||
==> Start a session, try the SUBR --- SEND FILE TO CLIENT, then look at the
tail end of the ![]() This should also provide useful information if you're having problems with: SUBR --- LOAD URL ON CLIENT.
See also: | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-02 4:38pm | ||||||||
![]() |
![]() ![]() ![]() ![]() More information about why the --- SEND FILE TO CLIENT subroutine failed? | |||||||
I'm trying to send a file to a specific location on the user's PC, but it keeps failing. The target folder exists, and this used to work. Now it doesn't. The user can use notepad and save a file in in that location, but APPX won't upload to it. Win2K client, APPX 4.1.a. | ||||||||
Start a session, try the failing SEND FILE TO CLIENT, then immediately look at the tail end of ![]() | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-02 4:43pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Scan hangs! | |||||||
When I run an certain input process and try to scan a particular file, I get an hourglass and it never comes back. If I turn GUI off, I can scan OK. I have trapped through the process and have determined that there is no ILF code causing this.
| ||||||||
In older versions of APPX, the display sequence (dsp seq) field in the data dictionary was defaulted to 1. In recent version of APPX the default display sequence is not set, leaving the dsp seq field blank. The undefined dsp seq can confused the new scan processor and cause it to hang in GUI mode. To fix this problem, check the display sequence (dsp seq) setting of the fields in the scan file. If they are all blank, set an appropriate field’s dsp seq to 1.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:19pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Am I running Java Client? | |||||||
Is there a way to determine if APPX Java Client (rather than Windows Client, or character based APPX running) is connected, to determine what type of menu should be displayed (for example)?
In APPX 4.1 and higher, you can use the following code:
SUBR --- CHECK GUI CLIENT SUBPROCESS END? N IF --- RETURN CODE EQ 1 T it's the java client F it's not | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:25pm | ||||||||
![]() |
![]() ![]() ![]() ![]() What's "appx.exe -f=" mean? | |||||||
winappxd waits for connection requests (from an appx -c session). When it gets a request, it validates the user id & password from the client. Then it spawns a copy of APPX (which becomes the server).
When the server is spawned, it inherits a bunch of file descriptors from winappxd. One of these file descriptors is the TCP/IP connection from the client. The "-f=" flag tells the server which file descriptor is connected to the client.
After completing the spawn, winappxd closes it's copy of the client file descriptor and the server starts talking to the client on the indicated descriptor.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:26pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to recover from record "locked". | |||||||
We have a record in a file that is reporting "locked" if you try to change it. No one is on this record that we are aware. What do we do?
| ||||||||
A user was in the middle of updating this record when the session "crashed".
The APPX session is probably still running on the server, and that's what's holding the record. You need to do one of the following: - Have a look at the registration usage to see if there is an orphaned session for that user. If you can find it, KILL it from the console. - Use NTHandle on the server and find the PID that has the file. Then kill it. At the heart of it, NTHandle digs out the PIDs and the open files. You still have to parse through NTHandle, once you have it from www.sysinternals.com - Ask everyone to log off, stop the WinAppxD and License servers, and kill any remaining APPX sessions on the server. If there are background jobs running, it might be tricky to identify the background jobs from the ghost task. - Identify the process id's of all currently connected clients (look in the title bar if P/M client, or under the 'About' menu if Java) and kill everything but those. Again, watch out for background jobs, if you use them at your site. Also, you might want to stop the WinAppxD service while you do this to prevent new users from logging on while you try to find the ghost process. - Download and install the BJutils package. This is Bruce Johnston's APPX utility package, and one of the utilities allows you to see who has what files open and also allows you to kill APPX sessions. This would help you identify which APPX session is holding the record. You can get this from www.cansyswest.com, under Free Stuff. You also need the NT Resource Kit to make these work. - Reboot the server (simple, but drastic) In addition, key file corruption can cause locking problems. It is not unlikely that externally killing an APPX process may cause key file corruption. So you should run a 13)Verify 1)Integrity on any files that may be open when you have a record locking problem, for which you end up either killing processes, or re-IPL'ing with APPX processes still running.
If you're having record locking problems, it might also be prudent to run
13)Verify 1)Integrity on a regular schedule, perhaps monthly.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:27pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to determine what are my environment variable are? | |||||||
To determine your environment variables under Unix, perform: RUN set > /tmp/env.txt To determine your environment variables under APPX for Windows: RUN cmd /c set >C:\tmp.txt RUN wordpad.exe C:\tmp.txt (Under Windows 9x, use command.com rather than cmd.exe.) If you're running APPX/Client, have the first RUN redirect standard out to a file in a client-accessible directory, then run an editor on that file. To get the environment variable using ILF, try; SET --- TEMP 80 = cd /tmp; APPEND --- TEMP 80 1 set > env.tmp; APPEND --- TEMP 80 1 grep APPX env.tmp > APPEND --- TEMP 80 1 env.txt ; APPEND --- TEMP 80 1 rm env.tmp RUN --- TEMP 80 | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:28pm | ||||||||
![]() |
![]() ![]() ![]() ![]() APPX/Client startup problems | |||||||
If your APPX/Client ('appxjava.exe') fails to startup for various reasons ("Memory could not be read.", or terminates without error message), try
rebooting your Client PC.
Set the environment variables APPX_NET_LOG and APPX_NET_MASK to have APPX create a log file of why the client is not being started. If that doesn't work, perform:
1) Download a fresh copy of the APPX Java Client ('javacli.exe'). | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:29pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Slow APPX Login Time | |||||||
Over the past 6 months, our APPX login times have steadily lengthened. Normally this symptom is due to a growing USAGE file. Other likely events; - network traffic in general has increased on your network - more users in APPX - more PC’s on your network - do you have the APPX client stored on a local disk on each client PC, or are you retrieving it from the network any time someone logs in? (See the WinAppxD FAQ, ftp.appx.com/pub/documents/winappxd-faq.txt, section 2.12: "Automatically update Presentation Client".) - It's also possible that you have a DNS or WINS issue | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:30pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Auto-update Java Client version | |||||||
Example of a batch file that can start APPX and automatically update the APPX/Client to the most recent version prior to logon: rem AppxJAVA.bat rem Batch file to launch Appx Java Client and keep it updated. xcopy x:\Appx\StartUp\Images\splash.jpg c:\"Program Files"\AppxClient\ themes\default\ /d xcopy x:\Appx\StartUp\login.ini c:\"Program Files"\AppxClient\ /d xcopy x:\Appx\StartUp\JavaClientUpdate\AppxClient.exe c:\"Program Files"\ AppxClient\ /d xcopy x:\Appx\StartUp\JavaClientUpdate\Appx.jar c:\"Program Files"\ AppxClient\ /d "C:\Program Files\AppxClient\AppxClient.exe" -cols=80 -rows=25 -title="Appx -$(user) on $(host):$(port), PID $(pid) exit The following batch file does the same for the Appx Windows Client. rem AppxWin3.bat rem 09/03/99 PAK rem rem Batch file ran on each client at startup of Appx rem i.e., the Appx Desktop shortcut should point to this file rem rem XCOPY switches: rem /d - Copies only those files whose source time is newer than rem the destination file. rem /i - If destination does not exist and copying more than one file, rem assumes that the destination must be a directory. rem /u - Copies only files that already exist in destination rem rem Copies the Latest Version of Appx to your computer! rem xcopy x:\appx\appx.exe c:\Appx\Win32\ /d md c:\Appx\Win32\data xcopy x:\appx\startup\winprint.exe c:\Appx\Win32\data\ /d rem for WinNT, HOSTS file is in: Winnt\system32\drivers\etc\ xcopy x:\Appx\Startup\Hosts.* c:\Winnt\system32\drivers\etc\ /d /i xcopy x:\Appx\Startup\Hosts c:\Winnt\system32\drivers\etc\ /d start c:\Appx\Win32\Appx.exe -c | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:31pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How are usage locks allocated? | |||||||
Each process belongs to an application. Every Appx session has a list of application locks that are in use by that session. When you start a process in a locked application, Appx checks to see if the lock is already in use by this session. If so, the usage count in incremented - if not, the lock is added (if possible) and the usage count is set to 1.
When you run the first process in a locked application, Appx acquires a USAGE (this means that you are using 1 user right from that product registration). When you run the second, third, fourth, etc. processes in that application, you don't count as 2, 3, 4, etc. users - just a single user.
When you end ALL processes in the locked application, it decrements the usage count for the appropriate lock. If the usage count for a lock goes to zero, the lock is forfeited, and therefore the overall user count for that lock is decremented. (You are no longer counting against the user rights for that product registration)
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:32pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Appx/Client timeout duration | |||||||
What controls the timeout duration, before the Appx/Client gives up on trying to talk to the Appx/Server? The Client itself? The network?
| ||||||||
It depends on the message that you see. We don't specify a timeout. We simply request a connection to the host identified by the user.
If the user gives us a host name (as opposed to a numeric IP address), we have to convert that to an IP address, using the TCP/IP stack on the client machine. If the server's name is in the hosts file (/etc/hosts or %WINDIR%\System32\drivers\etc\hosts), the conversion should be nearly instantaneous. If the server's name is not in the hosts file (or if file-based lookup Has been disabled), the conversion requires a network conversation with a DNS name server - that can take quite a while. If the name cannot be resolved, you'll get an "Invalid Host Name" error after a while.
If the host is not reachable, the IP protocol specifies some number of retries (and some waiting period in between retries) before the TCP/IP stack gives up and tells Appx that the host is unreachable.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:33pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Action Logs don't generate | |||||||
We run a job for a post and the action log normally behaves correctly, but on occasion no log is produced. But in a subsequent job for another group, the action log contains items (usually Warnings) for this post, as well Warnings from the first post. | ||||||||
One possibility - check the Start-of-Process and the End-of-Process event points. If these event points have ERROR, WARNING, MESSAGE, or DISPLAY statements, they can cause a problem if executed. They are not valid statements for those event points. | ||||||||
Action logs are created automatically when an APPX update process encounters an error or executes an ERROR, WARNING, or MESSAGE statement. Normally, an action log is closed and queued to print at the end of the process that created it. We are not aware of any specific problems relating to the creating and queuing of action logs. Having said that, there must be something that is preventing APPX from closing and queuing the action log. Perhaps the update process is crashing or otherwise ending prematurely and APPX never has an opportunity to close and queue the action log. | ||||||||
You might consider a workaround that also gives you more control over Logs produced, by converting your post's Updates to Output processes. The ILF normally in UPDATE's "Start of Frame" is put into the OUTPUT's "Select Image" ILF series. Explicitly set --- ALTERNATE IMAGE NUMBER = 0 at start of "Select Image". Then set ALTERNATE IMAGE NUMBER = 1 if you run into any CANCEL, ERROR, WARNING, or MESSAGEs. Paint the primary key to the file on the RECORD level OUTPUT image, and the Sort/Control fields onto any RANGE-START/END frames.
You'll have more control over the format of your Logfile, and you can use DISPOSITION functions to direct them. You could also use ILF to update an ancillary error tracking file, if you want a more permanent record of errors encountered, by whom, and when. | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:34pm | ||||||||
![]() |
![]() ![]() ![]() ![]() General AppxODBC recovery | |||||||
Recommended recovery procedure for difficult-to-debug AppxODBC errors: Uninstall/Re-install AppxODBC. 1) In Control Panel > Administrative Tools > Data Sources(ODBC) > System DSN tab => Remove the AppxODBC record. 1) Uninstall AppxODBC. 2) If 'C:\appx.env' exists, delete or rename it. 3) Delete appxodbc directory tree (which contains the 'appx.dbs' tree). 4) Search for and delete appxodbc.dll and appxsetp.dll. 5) Reboot. 6) Reinstall AppxODBC from a downloaded AppxODBC installation package.Test AppxODBC with WinSQL, see FAQ at http://board.appx.com/faq/cache/232.htmlfor information on the WinSql tool. | ||||||||
![]() ![]() | ||||||||
[Append to This Answer] | ||||||||
2007-Jul-02 3:23pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Appx-Client scrambled display on Startup Login | |||||||
Occasionally when the new client is started, the login screen appears, but is scrambled, perhaps shifted up and left a bit, leaving a part of the first placement and hiding some of the login fields. Minimizing or Maximizing the Client Login screen, then Restoring it will set it right. | ||||||||
Try turning down the video acceleration setting on your computer.
Right Click on your Windows Client Desktop > Properties > Settings Tab > Advanced... > Troubleshooting Tab > Hardware Acceleration slider. Click it to the left, perhaps all the way to "None". That should straighten out the display. If it doesn't, call Appx Support. | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-27 12:50pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to turn off full selection (highlighted) of text fields in change mode. | |||||||
I have an input screen that contains just a text field. When the user goes into the input in change mode is there anyway to prevent the client from highlighting all the text automatically?
| ||||||||
Pull down the Options menu at the top of your window. There is an option called Auto Select. Set that to No and fields will no longer be automatically selected when the cursor moves into the field. The 4.1 client does not remember this setting between settings. The 4.2 client does.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:36pm | ||||||||
![]() |
![]() ![]() ![]() ![]() What kind of code does APPX generate? | |||||||
Appx compiles process specifications into a form that minimizes runtime processing. It's a bit difficult to describe the format. The Appx engine is similar to a Java VM (virtual machine) or the .NET environment. When we designed Appx, we defined an ideal execution environment that doesn't actually exist in any hardware - we implemented the execution environment in software. There are a number of different execution components. ILF code is executed in an optimized register-based software CPU (there are about 500 op-codes in the instruction set - the opcodes do things like "convert from binary form to packed-decimal", "jump to label", "invoke a subroutine"). Process specifications are interpreted by the process interpreter - when we build an EM, we resolve as many details as possible - the basic theory being "do it once, at compile time" rather than "do it every time you run this process". That's one reason that it would be difficult to add indirection as some people have asked for - indirection means that you defer as many decision as possible until runtime.
So we don't really generate code in the way that some tools do. We don't generate C code that then gets compiled into a program. Appx is a compiler, interpreter, and VM all rolled into a single package.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:37pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Is there any "standard" screen size as it relates to the GUI interface? | |||||||
No, the screen size is more a person preference. Here are some tips from other users;
I use 28x100 because it creates a nice sized and readable screen on a 17” monitor when using a resolution of 1024x768. It fills the screen nicely, but has a font that is large enough to easily read. My personal preference is 28x110. This size fits nicely on 17" monitors with a resolution of 1024x768.
We chose to set the standard at 21 X 97. This will fill a screen when the resolution is set at 800 X 600. It gives us some extra screen real estate, particularly in the width where its most useful, but doesn't strain the eyes of our older employees.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:38pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Is there any way to increase the screen response time using the APPX client. | |||||||
You can try the repaintLevel setting in the Advanced client options list. This controls screen repaint frequency.
0 = Paint every screen 1 = Skip some intermediate screen repaints 2 = Skip all intermediate screen repaints
Screen painting is the most intensive thing the client can do.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:39pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Several commands which I can RUN successfully on our HP-UX 11.0 system, do not work when invoked on a Redhat Linux 9 system. | |||||||
For example,
--- TEMP 132 is loaded with: ln -s -f /ft/mv90/test.PRN/home/appx/data/TST/UBS/Data/MV9IRPRN.dat
RUN --- TEMP 132
| ||||||||
Either the RUN statement can't find the "ln" program, or you don't have the same privileges when running Appx that you do at the command line.
You can rule out the first problem by including the complete path to the /bin/ln program. To check on the second problem. RUN the command "id > /tmp/myid", then look at /tmp/myid. You'll probably see that you are running as user appx rather than yourself s you might expect.
Make sure that the destination directory is modifiable by $(cat /tmp/myid)
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 3:40pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Diagnosing Appx/Client problems | |||||||
` To diagnose general Appx/Client problems, send tech support will ![]() Note: appxlog.txt is initialized when a user starts a new session, so you must capture it before the user starts a new session.
See also | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-02 4:49pm | ||||||||
![]() |
![]() ![]() ![]() ![]() home | |||||||
` For the purposes of the Appx Java/Client, {home} is in one of the following locations: Unix & Linux: $HOME/.appx/Windows 2K: C:\Documents and Settings\{yourWindowsID}\.appx\NT: C:\WINNT\.appx\` | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-02 4:41pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Performance Issues | |||||||
-Tmpdata data directory
Files are created in Tmpdata for large sorts and for temporary disk files created by application(s). Under ideal circumstances, APPX removes all temporary files at the end of the job that created them. However, if a job is interrupted, the temporary files are not automatically removed and, over time, they can accumulate. So, the system administrator should routinely remove them when performing system maintenance to keep them from accumulating. APPX has to choose a unique file name when creating a temporary file. Determining a unique file name can take some time if there are a lot of files in the Tmpdata directory. If users are actively in Appx, you should not blindly remove the contents of the tempdata directory. But if all users are out, then it is perfectly fine to remove the contents. -Reorganize active files "Active" data files should periodically be "reorganized" whether or not they are APPXIO, C-ISAM, Oracle, or whatever. Files and disk drives should be defragmented periodically. -Orphan APPX sessions Check for "orphaned" APPX sessions on the server that might be consuming system resources. -Network errors Check for "high" error counts on your network that might be causing slow response or "orphaned" APPX sessions on the server. -Logging
Check your enviromental variables to see if you are creating any dianostic log files that are not needed. | ||||||||
[Append to This Answer] | ||||||||
2004-Jul-09 4:39pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Memory corruption after calling an external subroutine. | |||||||
Historically, APPX administrators have had memory corruption problems when external subroutines are executed from within APPX. For example, when you call a C subroutine from within APPX, the C subroutine is responsible for making sure that allocated memory is properly released before returning back to the calling APPX process. If this is not done properly, then memory corruption can result.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jul-09 4:41pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How do we use the routine --- READ FROM CLIENT CLIPBOARD? | |||||||
PASS Rq: Buffer FIELD SHARE? Y
The first field is a field to receive the clipboard data. | ||||||||
[Append to This Answer] | ||||||||
2005-May-03 1:37pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Asql Errors | |||||||
![]() ![]() ![]() ![]() ![]() ![]() | ||||||||
[Append to This Answer] | ||||||||
2008-Mar-12 3:36pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Would adding "-session" to a command line cause APPX to respond to any input screens with an END? | |||||||
And if so, then why does APPX still display the 'Restructure Required' or 'Missing
or Invalid Process Definition Record' screen?
It depends on the platform. If you're running a Linux or Unix server, the operating system, background jobs will pretend like the user pressed the END key whenever a process gets to a point where it would normally wait for user input. On Windows servers, the OS doesn't really provide anything that differentiates between a foreground and background process - there isn't a notion of a "background process" on Windows (except for a Windows service, which is something else entirely). Instead, when you spawn an Appx background job on a Windows server, we just start another copy of Appx (minimized). Try running Appx on a Windows server without running in client/server mode - run a background job that needs to wait for user input. When you spawn the job, you should see another copy of Appx show up in your task bar. Open that window and you'll see the background job running. You can interact with it using the keyboard and mouse. It's just a second Appx session that starts in the right place, has a copy of all of the parent session's important data, and starts minimized. Just like the specification says: separate task allowed? Very handy for debugging background jobs.
However, that's an old feature that was written before we had a client/server
configuration. If you connect to appxdsvc or winappxd, the broker creates an
invisible desktop for the engine sessions - that means that you can't get to
any background sessions. We should probably modify the Windows engine so that
it notices that you're running in client/server mode and behaves more like
Unix/Linux of you are.
| ||||||||
[Append to This Answer] | ||||||||
2004-Nov-04 2:55pm | ||||||||
![]() |
![]() ![]() ![]() ![]() What does error "Appx startup failed because of the following startup error: 34" mean? | |||||||
This error appears when user doesn't have sufficiant Security Profile rights to run Startup Job.
| ||||||||
[Append to This Answer] | ||||||||
2005-Feb-01 3:13pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How can i tell from the ILF code what screen size user has? | |||||||
PASS --- RI FIELD SHARE? Y PASS --- CI FIELD SHARE? Y GOSUB --- GET SCREEN SIZE | ||||||||
[Append to This Answer] | ||||||||
2005-Mar-29 4:03pm | ||||||||
![]() |
![]() ![]() ![]() ![]() I can get the PID number from the usage file, but where can I get the port number? | |||||||
If you're looking for the port that the client connected to, you could define an environment variable (say APPX_BROKER_PORT) and set it to a value unique to each listener. Then you could examine APPX_BROKER_PORT in each engine.
| ||||||||
[Append to This Answer] | ||||||||
2005-May-03 9:50am | ||||||||
![]() |
![]() ![]() ![]() ![]() What does -session flag do when added to a command line? | |||||||
The -session flag suppresses terminal interaction as a
side-effect.
It's real purpose is to start a background
job. When you submit a job to background, Appx re-invokes
itself with "-session=<filename>", where <filename> is the
name of a session file.
| ||||||||
[Append to This Answer] | ||||||||
2005-Jul-29 4:28pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Previous Activity key | |||||||
I have job like this:
QUERY <some query name> JOB DISPOSITION - consists of one INPUT process OUTPUT <some output name> When the user is at the INPUT process of the nested job, and they press F4 to go back, it continues to the OUTPUT. Why does it do this? Can I get it to return to the previous job step? Yes, you can get it to return to the previous job step. Make sure that your JOB DISPOSITION step is invoked as a Subprocess, not as "related", and make sure that "Separate task" box is not checked. That should do the trick.
There are 3 things that controls if you can or can not return to the previous
activity: | ||||||||
[Append to This Answer] | ||||||||
2005-Aug-09 11:42am | ||||||||
![]() |
![]() ![]() ![]() ![]() Does APPX run on Mac OS X Server? | |||||||
Appx will not run on MAC OS X server. The Appx client will, but the server
will not.
| ||||||||
[Append to This Answer] | ||||||||
2005-Dec-20 11:02am | ||||||||
![]() |
![]() ![]() ![]() ![]() Performance issues when using a RDBMS | |||||||
The following factors will significantly impact performance when using a database:
1) commit frequency I'll briefly discuss each. 1) commit frequency (Commit Mode, Process Additional Attributes). We have determined that a commit is very "expensive" in terms of performance. If you can reduce the number of commits, then performance will almost always increase, sometimes significantly. Deferring commits to the End of Process probably maximizes performance for this factor but may increase the size of the rollback logs and will certainly increase the number of rows in the database which are "locked" to other users while updates are pending. 2) Length of data read/written This may be the most significant factor which impacts performance. As the length of the data being read or written increases, the run time increases, sometimes dramatically. This is why we added the Partial Record I/O feature. If possible, you should avoid reading the entire record if the record is large. How large? I seem to remember that each increment of about 800 bytes caused a significant incremental loss of performance. Even if you must read the entire record, then try to avoid a rewrite of the entire record. If you are only updating a single field, then do a rewrite of just that field. If you are rewriting several fields, wrap them in a group and rewrite the group. If necessary, you can add a "group" of synonyms to the end of the record to accomplish this. 3) Read with hold Don't read with hold unless you need to. If you are only going to actually update a small percentage of the records read, read each record first without a hold and then, after you determine that an update is needed, read it with hold. A read with hold is very "expense" in terms of performance. Keep in mind that an output or update process will automatically read the PCF with hold if a REWRITE or DELETE statement is detected. If only a small percentage of records will actually be updated, it might be much more efficient to write a Subroutine process as an alternative to an update process. 4) # of database I/O's Use the new file cache capability to load read-only "code" files into memory where they can be very efficiently read. Accessing of code files in a database is much slower than accessing the same code files from memory. 5) communication protocol and settings If possible, install the Oracle database and APPX on the same machine so that you can avoid database I/O across a network. If they are both on the same machine, configure Oracle to use "pipes" for communication instead of TCP/IP. Define the ORACLE_SID environment variable instead of specifying the database name in the FMS group. APPX will then use the local communications protocol which will probably be pipes. Pipes are much more efficient than TCP/IP.
If you are using TCP/IP make sure that the packet size is large. I'm not sure how large you can define the packet size to be, but 10K or more might be desirable if you are reading/writing large rows. | ||||||||
[Append to This Answer] | ||||||||
2011-Jun-15 2:45pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Appx and new Daylight Savings time | |||||||
Is Appx going to be affected by the new Daylight Savings Time? APPX does not keep time – it simply reads what the operating system provides. As long as you have patched your OS properly, there will be no issues as far as APPX is concerned. | ||||||||
[Append to This Answer] | ||||||||
2007-Feb-27 4:01pm | ||||||||
![]() |
![]() ![]() ![]() ![]() What does "Corrupt lfb list" C-Assert mean? | |||||||
It means that Appx found an unexpected entry in a "scope list". When you open a file, Appx creates a "logical file block" (LFB) to keep track of that file. Every file is opened at some particular scope - when that scope ends, the file is closed and the LFB is discarded (a scope is something like "the most recently invoked related process", "the current event point", or something like that). The LFB is linked into a list of all LFB's belong to a given scope. This message means that Appx was processing a scope list and found an LFB that should have been linked into a different list (because it has the wrong scope). It could be related to FLEP bug. | ||||||||
[Append to This Answer] | ||||||||
2007-Mar-16 12:33pm | ||||||||
![]() |
![]() ![]() ![]() ![]() How to uninstall AppxODBC. | |||||||
please refer to FAQ; http://board.appx.com/cgi-bin/fom.cgi?auth=ck41f1191a3c8a254b2a9c32ee5e2ee117&file=344 | ||||||||
[Append to This Answer] | ||||||||
2007-Jul-02 3:31pm | ||||||||
![]() |
![]() ![]() APPX System Administration | |||||||
FAQ's relating to the use of the APPX System Administration application.
| ||||||||
Subcategories:
Answers in this category: | ||||||||
[New Answer in "APPX System Administration"] | ||||||||
2009-Sep-04 5:34pm | ||||||||
![]() |
![]() ![]() ![]() What rule does APPX / Oracle interface use to decide when a field will be "char" vs "varchar". | |||||||
The basic rule: if the field is less than six characters long or is a key segment, we use a 'CHAR', otherwise we use a 'VARCHAR'. You can override that with field-level overrides or by setting "Use VARCHAR for all alpha fields?" to Y (in the FMS group). | ||||||||
[Append to This Answer] | ||||||||
2003-Nov-24 9:17am | ||||||||
![]() |
![]() ![]() ![]() Oracle import performance issues. | |||||||
When APPX imports records into an Oracle database, APPX reads a record from the source file and then executes a SQL INSERT ROW statement to insert the row (record) into the Oracle database. With every insert, APPX executes a commit statement. The environment variable APPX_IMPORT_COMMIT can be set to change the commit frequency if necessary. Example:export APPX_IMPORT_COMMIT=5000An INSERT ROW statement also updates the indexes that are defined for the Oracle table. Inserting individual rows of data and updating the indexes is probably the slowest operation that you can perform with a database. Performance of the import operation can be improved dramatically by removing the indexes from the Oracle table. After the data is imported, the indexes can be added back. Another factor that can have a significant impact on performance is if your Oracle database resides on a different system than APPX. If APPX and Oracle are on different systems, each INSERT ROW statement is going to generate one or more TCP/IP transactions. Moving data thru a network can be painfully slow. APPX always recommends that you install APPX on the same system as your database if at all possible.
The only other suggestion is to have your DBA monitor the Oracle database and verify that all configuration settings that might affect performance are set appropriately.
| ||||||||
[Append to This Answer] | ||||||||
2003-Nov-24 9:53am | ||||||||
![]() |
![]() ![]() ![]() How to import dates from APPX to Oracle. | |||||||
Internally APPX stores all dates in CCYYMMDDHHMMSSTh format and the routine that creates the comma delimited file uses the CNV TEXT which converts the date to a MM/DD/CCYY character format. This converted format is designed for general exporting and uses the MM/DD/CCYY format because that format is relatively standard for text files. If you are exporting APPX data that is to be imported into Oracle or another database that has the date field(s) defined as CCYYMMDD, you can instruct APPX to format the date in the CCYYMMDD format by setting the date mask for the application you wish to export. There are two ways this can be specified.
You can manually modify the generated CDF update and put the data into the desired format, or; If you're sufficiently segregated from your other Appx users, you can for the duration of your CDF generation temporarily set the 'Date Mask' on the second screen of your 'Application' record to something like "08070605 04:03.02(01)". Alternately, at the Appx system-wide level, in System Administration, Databases/Applications, Applications, locate the application which contains the update you are trying to run. Highlight that application and press Enter. You should get a pop up for the application and on this window is a Date Mask Field. Set the date mask to 0807060504030201and press Enter. Now when the update runs (for this application only) it will format the date(s) as an internal APPX date which will then match the format expected by your data definitions in the Oracle table.
Don’t forget to change the date mask back after the import.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-02 4:48pm | ||||||||
![]() |
![]() ![]() ![]() Why is my RDBMS import so slow? | |||||||
"I am importing files residing on our AIX platform to an Oracle database on our Solaris platform. The APPX program is running on the AIX platform.
"The import runs very slowly, even when processing files with less than 50,000 records. I have taken out all the constraints and alternate keys from the APPX file descriptions in an attempt to speed up the process. Why does it run so slowly, and how might I speed it up?"
| ||||||||
==> When APPX imports records into an Oracle database, APPX reads a record from the source file and then executes a SQL INSERT ROW statement to insert the row (record) into the Oracle database. With every insert, APPX executes a commit statement. The environment variable APPX_IMPORT_COMMIT can be set to change the commit frequency which may improve importing performance, for example:
export APPX_IMPORT_COMMIT=5000An INSERT ROW statement updates the indexes that are defined for the Oracle table. Inserting individual rows of data and updating the indexes is probably the slowest operation that you can perform with a database. Performance of the import operation can be improved dramatically by removing the indexes from the Oracle table. Check to make sure that the indexes have really been removed from the Oracle table. I know that you removed them from the APPX data dictionary. But, have they actually been removed from the Oracle database? After the data is imported, add the indexes back via Appx restructure. Having your database reside on a different system than APPX significantly impacts performance. Each INSERT ROW statement will generate one or more TCP/IP transactions. Moving data thru a network can be painfully slow. We recommend installing APPX on the same system as your database if at all possible. You may want to ask your DBA to monitor the Oracle database and verify that all configuration settings that might affect performance are set appropriately. ecr #7007
| ||||||||
[Append to This Answer] | ||||||||
2003-Nov-24 10:10am | ||||||||
![]() |
![]() ![]() ![]() What is a security profile? | |||||||
Appx has an array of 10,000 yes/no settings ranging from 0000 to 9999. Access to protected processes, files, fields, etc. within Appx is can be secured by setting a value in the security field, usually accessed from the Toolbox/Security selection, of the item you wish to protect. When a user accesses a protected object Appx looks at the corresponding element in the yes/no settings. If the table contains a Y the user can access the process/data/function. If it is set to N then access is denied. A security profile is the definition assigned to a particular group of 10,000 value settings.
Any user not an Appx administrator must be assigned a security profile. Multiple users may use the same profile, such as a PAYROLL profile for the Human Resources department, or a AP profile for all payables clerks.
| ||||||||
[Append to This Answer] | ||||||||
2003-Nov-25 5:36pm | ||||||||
![]() |
![]() ![]() ![]() Cannot see the Oracle database? | |||||||
We are experiencing a problem with the GUI when accessing the Oracle files. Basically, we cannot see the Oracle database. It seems that when we login via the GUI screen, it does not execute the Unix .profile associated with the users id. This profile contains the information necessary for the user to access the Oracle database (Oracle SID). Is there a place to set the necessary Oracle parameters other than the .profile?
| ||||||||
APPX will read two files on startup regardless of whether APPX started from a GUI client or a local command line. The two files are:$APPXPATH/appx.env $HOME/appx.envYou can use the appx.env in $APPXPATH for environment variables that you want shared by all users and the $HOME/appx.env for each user. You should be able to set the Oracle environment variables in one of those files, example: ORACLE SID=APPX APPX DBG CODE=OxFFFFFFFF Etc. | ||||||||
[Append to This Answer] | ||||||||
2003-Dec-01 4:28pm | ||||||||
![]() |
![]() ![]() ![]() --- COMMIT MODE PDF hierarchy! | |||||||
Currently, changes to the --- COMMIT MODE pdf are only recognized when a transaction completes. This means that if you are in COMMIT MODE=END and you change to COMMIT MODE=PCF CYCLE, the change won't be recognized until your process ends (or until you execute a COMMIT or ROLLBACK statement). Also, we need to establish a hierarchy (similar to the hierarchy that we use for DEFAULT MODE) that determines the precedence for the COMMIT PDF when you invoke a child process. | ||||||||
[Append to This Answer] | ||||||||
2003-Dec-08 9:40am | ||||||||
![]() |
![]() ![]() ![]() How to incorporate COMMIT & ROLLBACK into APPX code! | |||||||
The --- COMMIT MODE pdf has four valid values. (You may see AUTOCOMMIT as well, but it's not implemented yet): MANUAL - Appx will not automatically COMMIT your changes. You must use the COMMIT statement. END - Appx COMMITs your changes when the process ends. PCF CYCLE - Appx COMMITs your changes as you progress from PCF record to PCF record. COMPATIBLE - Appx COMMITs your changes as soon as -all- record locks are released. Appx never automatically issues a ROLLBACK. Based on the structure of your application, there may be other places where you want to COMMIT a transaction. That's what the COMMIT statement is for. One thing to keep in mind is that the frequency of COMMITs will affect performance. The more COMMITs you do, the slower your application will be. For interactive processes, you can probably ignore the performance issue, but for batch-mode operations, COMMITing too often can really slow things down. Another issue to be aware of is that AppxIO files do not support transaction processing. If you ROLLBACK a change to an RDBMS-hosted file, any changes made to AppxIO will not be rolled back. Related to this is the issue of visibility. Changes made to an RDBMS-hosted file are invisible to other users until they are committed. Changes made to an AppxIO-hosted file are visible immediately. Appx also supports save-points. A save-point is a partial transaction. You mark the beginning of a save-point with the SAVEPNT statement - the only argument is a name of your choosing. Executing a SAVEPNT tells the RDBMS that it should write a marker into the current transaction. If you find that you want to ROLLBACK part of a transaction, you can specify a save-point name in the ROLLBACK statement. The transaction is still open and you can commit other changes, but changes made since the save-point was created are lost. | ||||||||
[Append to This Answer] | ||||||||
2003-Dec-08 9:49am | ||||||||
![]() |
![]() ![]() ![]() What are the APPX invocation switches? | |||||||
Example: moz /users/pat> appx –u Usage: -u list these options -k define a new keymap -m=[user_id:]keymap_name override keymap ID -d=<database_id> override startup database -a=<application_id> override startup application -t=<process_type> override startup process type -p=<process_name> override startup process name -i=<flat_file_name> convert a flat file into UNIXIO format -e=<data_file_name> convert a UNIXIO file into a flat format -v=<data_file_name> verify the integrity of a UNIXIO file -an=<data_file_name> analyze a UNIXIO file -l=<log file name> start a license server Restrictions: An application_id and process_type must always be included when specifying a process_name. If an application_id is included without specifying a process_type/name, the startup menu for the application will be used. If no application_id is specified, the startup application and menu for the database will be used. If no database_id is specified, the startup database defined for the user within System Administration is used. If the startup database is also unspecified, the Appx main menu is used. The valid process_types are Menu, Job, Input, Output, Update, Action, Inquiry, Query, Status, and Subroutine. Use underscores (_) in place of any embedded spaces within parameters. | ||||||||
[Append to This Answer] | ||||||||
2003-Dec-08 10:01am | ||||||||
![]() |
![]() ![]() ![]() Commit parameter doesn’t seem to work? | |||||||
APPX_IMPORT_COMMIT was added in August of 2000. If your engine build
date is later than 9/13/2000, it should include support for
APPX_IMPORT_COMMIT.
| ||||||||
[Append to This Answer] | ||||||||
2003-Dec-18 2:59pm | ||||||||
![]() |
![]() ![]() ![]() How to connect Appx to Oracle. | |||||||
Let's assume we have two different hosts, the Appx server host we'll call appxhost, the Oracle server host we'll call oraclehost. They may or may not be the same machine. (But they perform much better if on the same machine.)
You must install a package called "Oracle Client Software" on appxhost. As of Appx 4.1.a, you must install Oracle Client version 8, the version we built our 4.1.a engine against. (ecr #6417, 7008) Appx connects to Oracle using the Oracle Client software (called the OCI). The OCI must be able to find a few configuration (and localization) files using the $ORACLE_HOME environment variable. (If you don't have $ORACLE_HOME properly defined, Appx displays the error message: "*Oracle initialization failed".) The typical way to define $ORACLE_HOME is to use the oraenv shell script. Just run: ".oraenv" When Appx connects to Oracle, there are three different ways that the OCI can locate the Oracle server:
1) Enter a server name in the Appx/Oracle FMS group (either an Oracle SID, or the name of a remote server as described below).
2) If you leave the server name blank, the OCI uses the environment variable $TWO_TASK to locate a remote server.
3) If you leave the server name blank and $TWO_TASK is not defined, the OCI uses the $ORACLE_SID environment variable to locate a local server.
You use $ORACLE_SID when appxhost and oraclehost are the same machine. The $ORACLE_SID environment variable refers to an entry in the /etc/oratab file (created by Oracle). Here's a sample /etc/oratab file:
This file is used by ORACLE utilities. It is created by root.sh and updated by the Database Configuration Assistant when creating a database. A colon, ':', is used as the field terminator. A new line terminates the entry. Lines beginning with a pound sign, '#', are comments. Entries are of the form: $ORACLE_SID:$ORACLE_HOME:<N|Y>:The first and second fields are the system identifier and home directory of the database respectively. The third filed indicates to the dbstart utility that the database should , "Y", or should not, "N", be brought up at system boot time. Multiple entries with the same $ORACLE_SID are not allowed.
oracle:/opt/oracle/product/9.2.0:N The $ORACLE_SID here is 'oracle' and the $ORACLE_HOME is '/opt/oracle/product/9.2.0'. The oraenv script examines the /etc/oratab file. oraenv uses a command named dbhome to find the $ORACLE_HOME location given an $ORACLE_SID The $TWO_TASK environment variable refers to an entry in the tnsnames.ora file (located somewhere in the $ORACLE_HOME directory tree). Here's a sample tnsnames.ora file:
ORACLE.INTERNAL.APPX.COM = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = badger.appx.com)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = oracle))) This entry defines a server named ORACLE. It also defines a server named ORACLE.APPX.COM). The body of this entry tells the OCI to find the DBMS server using the TCP protocol to connect to the listener running on port 1521 at badger.appx.com. You can refer to this server as 'oracle' or 'oracle.appx.com'. The OCI supports many different protocols. TCP is probably the most common. On Windows machines, you'll find named-pipe servers. The fastest transport mechanism (which can only be used for local servers) is the bequeath adapter which uses shared memory to communicate between the client (appx) and the server (oracle).
Here's our recommendation for finding all of the magic values you need: 1) If you know your Oracle server is installed on the same machine as your Appx server,
Using the APPX/Oracle Connection, providing APPX/Oracle connection setup and operation instructions: www.appx.com/assets/asp/dynamic_generator.asp?pageid=605How to Debug an APPX/Oracle Connection: www.appx.com/assets/asp/dynamic_generator.asp?pageid=682 | ||||||||
[Append to This Answer] | ||||||||
2004-Feb-13 6:03am | ||||||||
![]() |
![]() ![]() ![]() Can I run different releases of APPX on the same server? | |||||||
Yes however they must be installed in separate directories and not share any information (data files) with each other.
| ||||||||
[Append to This Answer] | ||||||||
2003-Dec-31 9:18am | ||||||||
![]() |
![]() ![]() ![]() Why is APPX building the EM’s every time? | |||||||
Permissions can cause this. If Appx can't write out a new EM (because it doesn’t have rights to the directory) it will continue to create EM’s every time a it needs it. You can also set the environment variable APPX_DBG_VFY to create a log of why APPX is rebuilding the EM(s) each time. | ||||||||
[Append to This Answer] | ||||||||
2003-Dec-31 9:22am | ||||||||
![]() |
![]() ![]() ![]() WinSQL: APPX ODBC debug utility. | |||||||
Steve Rickley found a great way for customers to debug their ASQL import errors during our Web Interface class. There is a free tool called WinSQL (www.imranweb.com/freesoft.htm).
The main use of this tool is to attach to any ODBC data source and let you browse and run SQL commands. Steve found that it had an option to OPEN a text file containing SQL commands. So, when he got an ASQL syntax error, he started WinSQL and had it open a file that ASQL automatically created. The file contained the SQL that ASQL generated. When the SQL from this file was loaded into WinSQL, it syntax highlighted the exact syntax error and I think have a message about what was wrong with the offending syntax. The really cool part was that Steve was able to fix the syntax in WinSQL and have WinSQL execute the create table as modified. Then the table worked with APPX in it's modified fashion without having the change the offending field name in the APPX database. This was a great debugging tool. And also a great tool to correct errors in field names without having to change the APPX data file and field names. AppxODBC does not match up by field name, so this worked. WinSQL is also useful for debugging our SQL Server (via ODBC) connection (www.appx.com/pub/documents/odbc.ConnectionInstructions.txt). There are many protocols SQL Server can use. (TCP/IP, named pipes, LocalServer, ...) The client (the ODBC data source) and the server must be speaking the same protocol. WinSQL is good at passing through error messages that our APPX/ODBC connection might filter out. Thus, it's a good debugging tool if you're unable to get APPX for Windows to talk successfully to an ODBC / SQL Server backend to APPX. Sometimes, you can get APPX/ODBC connection working over 'LocalServer' DSN, where it might not work properly with a manually created DSN. This could be because Local Server uses a simple protocol. Client & server know automatically which to use.
(Under ODBC , you have to have a listener set up for each protocol. The client has to know which protocol, plus addressing and identification info. For example, you may have to have a TCP/IP listener (with IP address & port#).)
| ||||||||
[Append to This Answer] | ||||||||
2003-Dec-31 12:56pm | ||||||||
![]() |
![]() ![]() ![]() How to track “Record Held by Another User" | |||||||
You can instruct AppxIO to track lock holders on a file-by-file or FMS Group basis:
Include the text "track_locks" (without the quotes) in an FMS control string. APPX will record extra information in the file whenever a record is locked. There is a performance penalty of two extra I/O operations per READ with HOLD when you use this flag, so you may want to apply this flag selectively, through 'Edit File Specifications'. 'track_locks;' is defined for individual files in Appl Design > Tools Tab > Database Management > File Specification > File Attributes. 'track_locks;' is defined for whole databases using SysAdmin > Config > File System Groups > 'FMS Group Attributes', and SysAdmin > DB/Appl > DB/Appl > 'FMS Group'. (It is not defined as an environment variable.) Appx displays the user's three-character UserID on an ILF 'READ with Hold', whenever it waits more than 10 seconds for a lock. APPX will *not* wait for or display User-holding information for records attempting to be held by INPUT processes, in either Change or Delete mode. Instead it goes into 'Chg/Inq' or 'Del/Inq' mode and displays a generic 'This record held by another user'. If however you execute a Read with Hold from ILF within such an INPUT process, APPX will display the holding user's UserID. On Unix systems, you will see a process ID even if you don't use 'track locks'. There is no performance penalty for this.
On Unix systems' INPUT processes, you can also run 'fuser -u {filename}' to determine who has a given file open. | ||||||||
If you get the "Record Held by Another User" message on application design files (such as in the OUTPUT editor), you can use the following code in a SUBR within that application: BEG READ 0AD PROCESS HOLD 1 KEY IS PROCESS KEY END READ 0AD PROCESSYou can hold (but not write, rewrite or delete) 0-app file records. The above code attempts to lock every PROCESS file record. If it gets hung on a Process for more that 10 seconds, it generates the message: Waiting for lock held by APX in /usr/appx/data/00/SUR/Data/PROCESS.dator Waiting for lock held by session 9999 in /appx/data/00/SUR/Data/PROCESS.datYou get the former if "track_locks;" is defined in an FMS group referenced by the application's Application record in System Administration.
You get the latter if there is no "track_locks;". This could be more useful,
as it tells you *which* APX user session holds the lock. | ||||||||
You can also use the lsof (or fuser) commands to find information about open files. lsof shows you all files currently opened by a given process, or it can show you all processes that have opened a given file.
lsof and fuser are available on Linux and Unix systems. Windows systems use 'Process Explorer': Windows - use SysInternals.com's Process Explorer utility: http://www.sysinternals.com ... look for "Process Explorer"
HP/UX - http://hpux.cs.utah.edu/hppd/hpux/Sysadmin/lsof-4.70
Red Hat Linux - part of the lsof RPM package
Solaris - use the fuser command instead of lsof | ||||||||
[Append to This Answer] | ||||||||
2006-Nov-21 5:04pm | ||||||||
![]() |
![]() ![]() ![]() How APPX License counts WS's | |||||||
If you are logging in with an APPX Client (i.e. from Windows using the APPX Client), we count IP addresses (and allow up to 4 duplicates).
If you log in from a dumb terminal, we count the tty name. If you can somehow arrange for the tty names to be the same between to tty sessions, we will only count you as one user (again, allowing up to 4 duplicates). That's a little hard to understand, so here's the test: Log into APPX, then press Option-99 from the main menu, then Option-1. Look at the Workstation name. Then do the same in another session.
If the Workstation names are identical you are only consuming one user-right. If they are different, you are consuming two user-rights.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-02 10:39am | ||||||||
![]() |
![]() ![]() ![]() How to reprint a print file? | |||||||
How can I easily reprint a file that's has been requeued (saved in the print directory) without using the winprint from the dos prompt? The file in question is checks. Once you print them you can't rerun the process. I cannot use the winprint command from dos because I need to grab the form file so it spaces everything correctly. When you requeue an APPX report, it leaves the print file and a configuration file in the user's print directory after they've been submitted to the print spooler. For example, when printing a System Administration list, the print file might be SYSADMI0 and the configuration file SYSADMI0.cfg If you wanted to reprint this report, you might submit commands like the following: If you are on Windows: cd C:\appx\data\PRINT\USR C:\appx\data\winprint.exe -config=SYSADMI0.cfg SYSADMI0 or C:\appx\data\winprint.exe -config SYSADMI0.cfg SYSADMI0 The general form is: winprint.exe -config=<config.file> <print file> or winprint.exe -config <config.file> <print file> For those on Unix/Linux: /usr/local/appx/data/appx_print -config=/usr/local/appx/data/PRINT/USR/SYSADMI0.cfg /usr/local/appx/data/PRINT/USR/SYSADMI0 You can construct and issue shell (DOS) commands by means of the RUN command. You'll find documentation for it in the Designer Reference Manual, and at www.appx.com/pub/documents/HowTo/run.Windows.Functions.html The print file name can be found in --- PRINT FILE PATHNAME. You'd be well advised not to operate on the file pointed to by --- PRINT FILE PATHNAME, until after you've exited the OUTPUT process that generated the print file. This means passing the contents of --- PRINT FILE PATHNAME to a subsequent job step, possibly by means of a related or detached work field. | ||||||||
[Append to This Answer] | ||||||||
2007-Feb-27 10:57am | ||||||||
![]() |
![]() ![]() ![]() Message: "Building Dynamic Index" | |||||||
A user receives when running a process, the message:
Building Dynamic Index
You are building a dynamic index for a possibly large number of records.
This process may take a long time. Please CANCEL to stop building index. Press RETURN to continue. What exactly makes this message occur? How big does a file have to be before this occurs? This message is displayed while APPX is building a requested dynamic index after indexing 1000 records. The administrator can adjust the record count by setting the environment variable APPX_DYNAKEY_PROMPT. For example:
APPX_DYNAKEY_PROMPT=5000 Dynamic indexing (not just the prompt, but all of the capability) can be disabled altogether by setting the variable:
APPX_DISABLE_DYNAKEYS=yes | ||||||||
[Append to This Answer] | ||||||||
2004-Jan-07 11:06am | ||||||||
![]() |
![]() ![]() ![]() Oracle-Store blanks, not NULL ! | |||||||
How can one force blanks into null fields, when converting Appx to the Oracle Database?
| ||||||||
If an Appx alpha field contains all blanks and the database field allows NULL values, then Appx stores a NULL value in the corresponding database field. If the database field does not allow NULL values, then Appx stores spaces in the database field. If you don't want Appx to store null values in he field, make sure that the database field has the NOT NULL attribute set.
You can use the field override option in the File Specifications to specify that null values are not allowed. Do this before running Create Files to create the table.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-05 4:26pm | ||||||||
![]() |
![]() ![]() ![]() Where is Java/Client cache? | |||||||
Following are locations for the Appx/Client cache directory (which stores GUI
information downloaded from the Appx/Server, so it doesn't have to download
the same GUI information more than once.) Under Windows 2K: C:\Documents and Settings\{yourWindowsID}\.appx\cache\Under NT: C:\WINNT\.appx\cache\Under Unix & Linux: $HOME/.appx/cache/To find where the .appx\cache directory should be on a client, run the Appx/Client, then find ![]() | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-02 4:44pm | ||||||||
![]() |
![]() ![]() ![]() Importing big Oracle tables! | |||||||
If your tables are large &/or have numerous indexes, the following can speed up the import significantly:
After using APPX to create the table in Oracle (and presumably other RDBMS's), use SQL PLUS or any other DBA tool to drop all the table's indexes. Then import the data -- it will import much faster. Important: Your Appx import should use the "merge" option. Otherwise, APPX scratches/creates before importing, recreating the indexes that you just dropped, and eliminating the performance boost you want during the import.
After importing, tell APPX to 3)Create the table again. APPX won't create the table since it already exists, but will create the missing indexes much more quickly than if you had built the indices one row at a time.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-05 4:25pm | ||||||||
![]() |
![]() ![]() ![]() What is my AppxODBC version? | |||||||
Method #1: Start > Settings > Control Panel > Administrative Tools > Data Sources (ODBC) > Drivers Tab > Version Method #2: Windows Explorer > {your Windows Directory} > System32 > AppxODBC.dll > Properties > Version Tab > "File | ||||||||
[Append to This Answer] | ||||||||
2004-Jan-05 4:27pm | ||||||||
![]() |
![]() ![]() ![]() How to use recover.exe! | |||||||
A quick recommendation:
` 1) Move FILE.dat and FILE.key to FILE.bad.dat and FILE.bad.key ` 2) Execute: IF you are on 4.1: recover FILE.bad.dat FILE.dat > FILE.corrupted ` 3) Display FILE.corrupted ` 4) Rebuild your keyfiles (run 'Create Files').
This allows the original corrupt files to be maintained as ".bad." files,
For full instructions see: http://www.appx.com > Support > | ||||||||
Bruce Johnston Jan 14, '04: FOR THOSE OF YOU ON WINDOWS, here're a few .bat files in a .zip to help you do this. They assume that they and the recover.exe reside in D:\APPX\Tools and that D:\APPX\Data is the starting path for your .dat and .key files so you might have to edit them accordlingly. One is standalone, rebuild.bat, and it is for doing the cmd line work on a single file. It's syntax is rebuild ver_or_db app datfilenamewithoutextension No wildcards allowed for this one! The other four are invoked in sequence rebuild1 ... rebuild4 with rebuild1 being invoked from the command line as rebuild1 ver_or_db app datfilenamewithoutextension but, in this case, all three parameters may contain dos wildcards e.g. rebuild1 01 T?? * should run recover against all of the design files in the T-Apps, assuming no file locking issues. and, rebuild1 TST * C* would run recover againt the TST database for all files starting with "C" across all applications. Hopefully, I'll be able to upload rebuildx.zip after completely this... | ||||||||
That didn't work so here're the .bat files: rebuild.bat >>> d: cd\appx\data cd %1 cd %2 cd data del %3.ke0 ren %3.key %3.ke0 del %3.bad del %3.del del %3.da0 ren %3.dat %3.da0 d:\appx\tools\recover %3.da0 %3.dat %3.del > %3.bad cd.. cd.. cd.. <<< rebuild1.bat >>> REM Receives %1 = 1st level below APPXPATH (Company or Version) REM %2 = 2nd level below APPXPATH (Application) REM %3 = .DAT file spec WITHOUT the extension REM Wildcards permitted at all three levels. REM Note that the "/d" usage in the FOR commands implies REM that the command line extensions in NT server be supported. REM Make sure that "d:\appx\tools" is changed to match the path to REM you own .BAT files. AND RECOVER.exe d: cd\appx\data for /d %%d IN (%1) DO CALL d:\appx\tools\REBUILD2.bat d:\appx\tools %%d %2 %3 <<< rebuild2.bat >>> REM REBUILD2.bat REM CALLed from REBUILD1.bat REM Receives %1 = path to REBUILD3.bat and RECOVER.exe REM %2 = 1st level below APPXPATH (Company or Version) REM %3 = 2nd level below APPXPATH (Application) REM %4 = .DAT file spec WITHOUT the extension cd .\%2 for /d %%d in (%3) do CALL %%1\REBUILD3.bat %1 %%d %4 REM In case dir structure or wildcards were wacky REM Force a return to where REBUILD1.bat started us. cd\appx\data <<< rebuild3.bat >>> REM REBUILD3.bat REM CALLed from REBUILD2.bat REM Receives %1 = path to REBUILD4.bat and RECOVER.exe REM %2 = 2nd level below APPXPATH (Application) REM %3 = .DAT file spec WITHOUT the extension if not exist .\%2\data goto ENDBATCH cd .\%2 cd .\data for %%f in (%3.dat) do CALL %1\REBUILD4.bat %1 %%f cd.. cd.. :ENDBATCH <<< rebuild4.bat >>> REM REBUILD4.bat REM CALLed from REBUILD3.bat REM Receives %1 = path to RECOVER.exe REM %2 = .DAT file spec REM REM Thanks to Paul Peterson, (ppeterson@utahsbr.edu) REM I know that %~n2 returns the file name REM WITHOUT the extension which he learned from REM (the?) Windows NT Scripting Administrators Guide REm by William R. Stanek del %~n2.ke0 ren %~n2.key %~n2.ke0 del %~n2.bad del %~n2.del del %~n2.da0 ren %~n2.dat %~n2.da0 %1\recover %~n2.da0 %~n2.dat %~n2.del > %~n2.bad <<< | ||||||||
[Append to This Answer] | ||||||||
2006-Jan-17 8:49am | ||||||||
![]() |
![]() ![]() ![]() Message, “Can't access named resources”! | |||||||
The following assumes a unix or linux server:a) Verify that the files are indeed OK.` | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-02 4:48pm | ||||||||
![]() |
![]() ![]() ![]() AppxODBC & Appx Security | |||||||
With APPX ODBC, files stored on the RS/6000 in APPXIO format, accessing the files from a PC using ODBC on the PC with a client like Access, what security is available? Can I use APPX internal security to control what databases/files/records/fields can be "seen" by the ODBC client?
Yes. When AppxODBC logs into your RS/6000, it provides a user name and password to AIX. We use that user name to control security within Appx.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-05 4:32pm | ||||||||
![]() |
![]() ![]() ![]() Can I reserve an application lock? | |||||||
We don't have a subroutine that can be called from within an application to reserve a lock.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-05 4:58pm | ||||||||
![]() |
![]() ![]() ![]() Which Windows version are we? | |||||||
A client needs to intercept the Operating System type in Appx. The subroutine "GET OS TYPE" returns the type of OS (Unix, Windows) but is there another subroutine to get the type of Windows OS (WIN 95, 98, 2000, NT, XP) ?
Here's one way:
NT, 2000, and XP all set the OS environment variable OS=Windows_NT If OS is set, then your operating system is NT, 2000, or XP Here's another way: Define a DOMAIN called DWORD, numeric, 10.0 digits, signed, storage-type = binary. (This is important, it must be exactly that format). Define a one-record working storage file (I called mine 1EX VERSION) with the following structure (note - each DOMAIN field is defined by the DWORD domain):
Seq No Field Name Field Type Format ======= =================== ========== ====================== 100 VERSION SIZE DOMAIN S9(10) 200 VERSION MAJOR DOMAIN S9(10) 300 VERSION MINOR DOMAIN S9(10) 400 VERSION BUILD DOMAIN S9(10) 500 VERSION PLATFORM DOMAIN S9(10) 600 VERSION CSD ALPHA X(128) The following ILF should populate the VERSION record for you:
SET --- TEMP 80 = kernel32.dll, APPEND --- TEMP 80 0 GetVersionExA * SET 1EX VERSION SIZE = 148 PASS 1EX VERSION RECORD SHARE? Y CALL --- TEMP 80 RESIDENT? N END? N FAIL 0 If --- RETURN CODE is not equal to 0, the VERSION record should be filled in.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/sysinfo_49iw.asp (all one URL) has more information about the GetVersionEx function and the contents of the OSVERSIONINFO structure.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-05 5:19pm | ||||||||
![]() |
![]() ![]() ![]() Message; “Invalid Native File Management System” | |||||||
I am trying to create an Oracle (9i) file through APPX file management and I’m getting the error message, “Invalid Native File Management System” on the Create Files screen. What does that mean?
| ||||||||
You are probably not running the appx.oracle engine. You are probably running the standard appx engine.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-07 11:05am | ||||||||
![]() |
![]() ![]() ![]() File fragmentation. | |||||||
Extensive file activity can lead to thousands of fragment per file, over time. This cannot help performance and could lead to problems. In lieu of a script to periodically verify and (if no errors found) export and re-import all of the files for all version and application or database and application combinations or the pain of full backup and restore, some use Executive Software's DiskKeeper product to do this task, say, after every full nightly backup.
ASI has not tested and in no way warrants this software.
| ||||||||
Bruce Johnston Jan 14, '04:
Related to the file system under Windows NT, you may want to consider preventing the O/S from updating one of the file/folder attributes that, by default, is updated EACH AND EVERY TIME THAN IT IS ACCESSED FOR WHATVER REASON. APPX installations have easily have tens of thousands of files and folders lurking beneath \APPX\Data and asking the O/S to update the file system with the information doesn't really seem worth it IMHO. Reg Key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem Procedure: Add Value name NtfsDisableLastAccessUpdate of type REG_DWORD. Set it to 1 to prevent the LastAccess time stamp from being updated. Under Windows 2000 (and ???) you might also want to consider disabling the NTFS disk file indexing at at least the \APPX\Data level and include the subdirectories. How often are you really going to search the drive/data for "foobar" from the server console? You might want to refrain from doing this if you actually use APIs to dig out this information or if your APPX server is doing other things as well. I've had this set for years now with not observed ill effects. | ||||||||
[Append to This Answer] | ||||||||
2004-Feb-05 6:43pm | ||||||||
![]() |
![]() ![]() ![]() Printing to a printer produces blank pages. | |||||||
Printing to certain printers through winprint.exe can cause the printer to eject lots of blank pages, rather than the desired APPX OUTPUT file. This can be caused by the printer driver not knowing from NT's Forms database the page size of the current form, and returning a form length of zero to winprint.exe. This can be diagnosed by setting the environment variable WINPRINT_DEBUG=C:\winprint.txt from the DOS command prompt, then manually running winprint against an APPX generated printfile.
To override the NT form length, enter into your APPX FORM table's FORM CONTROL attribute: -form_id=Letter
A complete list of valid form_ids can be seen by clicking on winprint.exe from Windows Explorer.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-09 10:11am | ||||||||
![]() |
![]() ![]() ![]() APPX.EXE process is consuming 95% | |||||||
I look in my NT task manager and see that an APPX.EXE process is consuming 95% (or more) of the CPU. Why do I get these runaway processes?
| ||||||||
A process using large amounts of CPU is not likely to be a "runaway" in the sense that it is malfunctioning, and is out of control, taking over your computer. What IS likely, though, is that it is an OUTPUT, or UPDATE, or some other process which takes a while to run, and does lots of I/O and/or data processing. (Designers, Cross Reference has been known to do this when run across multiple large apps). Until the process finishes, it will likely keep using a large percentage of CPU time, simply because that is how NT chooses to allocate CPU time. (The strategy seems to be, "Oh, you don't need any keyboard input? Good, I'll let you keep busy, since you seem to be making lots of progress." This is NT doing what it thinks is the right thing -- APPX has done nothing to raise the priority of these processes, or lower the priority of others.) The best thing to do is just be patient.
Some users have reported that it really helps to run on a multi-processor system, so that even if you have one or two of these CPU-hogging processes running, there is still likely to be a CPU which is not as busy.
| ||||||||
Bruce Johnston, Jan 14, '04:
One cause of an input hogging a cpu may be inappropriate use of --- ALTERNATE IMAGE NUMBER. It's been a while but a few processes that I had might set this to zero when the series was hit subsequent to pressing F4. Look at this carefully and always set it to a valid value at the beginning of the ILF series before any logic which might change it.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-14 7:29pm | ||||||||
![]() |
![]() ![]() ![]() The command-line "kill" too time-consuming and error-prone. Is there a better alternative? | |||||||
APPX user, Bruce Johnston, has put together a suite of utility processes he uses in the day-to-day administration of his APPX server. One of these utility processes is a "kill" utility reminiscent of similar functionality found on Wang systems.
While ASI has not tested and in no way warrants this software, it has been available for some time now, and we have heard no negative feedback regarding it. You might want to check it out at www.cansyswest.com/nt_utilities.htm and see if serves your needs.
Please be aware that if you install this package, ASI cannot provide support for its functions, since we did not write it. (Caveat emptor, and all the other precautions that normally go along with free and/or user-supported software).
| ||||||||
Bruce Johnston, Jan 14, '04: Be advised that I've recently discovered a problem with the kill-related portion of the utilities. NT Admins are still allowed to kill any APPX process that they see in the APPX input and non-Admins are supposed to be able to kill sessions under their own APPX id. I've found that this second bit was only working because, during the process of getting to work several years ago, I'd given the Advanced NT User Right "Act as part of the operating system" to the APPX user group. I discovered this after removing that right from the group and then learning that users could no longer kill their own orphaned sessions. There are a number of security concerns about this as documented by Microsoft at http://www.microsoft.com/msj/0899/security/security0899.aspx At some point I hope to change the utility so that the kill requests is not actually attempted by the APPX code but is instead forwarded via a file to an APPX process running as a service under an Administrator group account and have that service periodically check for processes to kill. In the meantime, if your users have never been able to kill there own sessions, this is probably why not. If they have and you're worried about the potential exposure if code were ever run on the server by a user with this right which contains routines which may exploit the hole, you would want to consider reoving this priviledge.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-15 8:45am | ||||||||
![]() |
![]() ![]() ![]() How can I determine which APPX.EXE processes on my server are orphans? | |||||||
"View Registration usage" within the System Administration Registration editor, in APPX versions 4.0.a and higher, will let you view PID (Process ID) by User. Once you have identified which processes on the server are orphans, you can kill the using the standard mechanisms described earlier.
| ||||||||
Bruce Johnston Jan 14, '04:
For those of you that run WinAPPXD or the new APPXDSVC under multiple ports there's a nice (free AFAIK) utility that I've come across called prcview.exe at
http://www.teamcti.com/pview/prcview.htm With it you can learn a number of things about what's going on on your server and one of the nice ones is a view that shows you a process tree. This means that you can see which appx PIDs are running under which instance of WinAPPXD/APPXDSVC especially if you're running under the copies of the exe whose names reflect the port being serviced. I'd often see a number of APPX sessions in the task manager but nothing under the USAGE log. It turns out that they were all running under another port which only serviced the appx-in-a-browser connection and tha the users were exiting the browser window without shutting down appx. | ||||||||
[Append to This Answer] | ||||||||
2004-Jan-15 8:47am | ||||||||
![]() |
![]() ![]() ![]() All of my users except for one have gone home for the night, and I am sure they have turned off their PC's. I still see three (or four, or ten) APPX.EXE processes in the server's task list. Why are they there? | |||||||
ONE will be there, because it is the APPX License Server. Some installation maintain a separate copy of appx.exe called AppxLicS.exe (for example) and invoke this copy to start the License Server. This keeps the task separate from (but close to) the group of APPX tasks in the NT Task Manager's list."
At least one other server side process will be there to service your remaining user's connection. (If the user has more than one APPX Client session running, there will be one server side process for each Client session.) Generally, the others are there because users did not properly exit the APPX client (END'ing until the APPX Client window disappears). For example, they may have just hit the power switch or executed shutdown on their PC without properly exiting APPX. In the APPX world, we refer to these leftover server APPX.EXE's as "orphans". It is probably a good idea to look for and kill orphan processes from time to time, particularly if your system goes days or weeks without a reboot (which would remove the orphans).
If you're running APPX 4.0.a or higher, you should set environment variable APPX_LS_GHOSTS=True. This will cause the APPX License Server to perform periodic cleanup of the APPX usage register, and may help keep the number of orphaned sessions down.
| ||||||||
Bruce Johnston Jan 15, '04:
Observation: while I've seen APPX do a fair job at toasting server sessions when the client side dies unexpectedly there is one instance in which it will fail to do so, 100% of the time AFAIK. Up to appx-in-a-browser 4.18, if the user simply uses the "X" to close the browser window then the server session will never get blown away. Someday I should update BJUtils and put out something which would blow away (such) sessions that have been active for, say, 24 hours or more. | ||||||||
[Append to This Answer] | ||||||||
2004-Jan-15 8:43am | ||||||||
![]() |
![]() ![]() ![]() A user just called me to say that her APPX Client window just disappeared, or there was a power outage or system malfunction, that caused their APPX Client session to end unexpectedly. Do I need to do anything? | |||||||
It would be a good idea to verify that the server-side process attached to that client session has terminated, and if not, kill it manually.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-09 10:25am | ||||||||
![]() |
![]() ![]() ![]() How do I manually kill an APPX server process? | |||||||
In many instances, an APPX server process may be killed by doing the following:
Go to the server on which WinAppxD and the APPX server processes run, and log in as Administrator. Bring up the NT task list, and look for an APPX.EXE listed with the process ID you want to kill (usually, this will be one given to you by the user, from their client's Windows title bar). Highlight it and click "End Task". If another box pops up, saying that the application is not responding, click "End Task" there as well. Hopefully, this will result in that process disappearing from the task list. If a process refuses to be killed in this way, it is time to take more drastic measures.
If you can't kill the process via the Task Manger, try using the NT Resource Kit's "kill" command. (You probably have this installed, since some utilities from it are required to install and run WinAppxD. Do a Find for "kill.exe" if you can't locate it.) The Resource Kit "kill" command is very effective, and using it is expected to kill the process even if the Task Manager method did not. (You must be logged in as Administrator to do this.)
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-09 10:26am | ||||||||
![]() |
![]() ![]() ![]() The user process is hung, and I haven't been able to resolve the problem, so I need to kill that client/server session. How do I do that? | |||||||
First, have the user try again to END and CANCEL out of their process, to make sure that it is not possible to resolve this any other way.
Have the user tell you the number which appears in their APPX Client title bar (they've presumably done this already, but in case they haven't, now's the time to ask). That is the NT PID (process ID) of the SERVER process to which this client is connected. Once you have the PID, but not before, instruct the user to bring up their Windows Task List, and select the APPX process, then click on "End Task". It may pop another box up, saying that the process is not responding. Instruct the user to click "End Task" on that box as well. Wait a minute or two for an orderly shutdown of the server-side process connected to the client. APPX should detect that the client has disappeared, and end the server process.
If after waiting several minutes, you still see the server-side process ID in your NT server's task list, you will need to manually kill the server-side process.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-09 10:27am | ||||||||
![]() |
![]() ![]() ![]() What should I do when a users APPX session is hung? | |||||||
First, have the user tell you the number that appears in their APPX Client title bar. This is the NT PID (process ID) of the SERVER process to which they are connected. Go to your server, and verify that there is an APPX.EXE process with that PID on your system in the task list.
If there is no process listed in your server's task list with that number, double-check with the user that you're looking for the right one. Once you are sure that it isn't there, you have a situation in which the client process exists and the server process doesn't. Instruct the user to "End Task" on his APPX Client session via the Windows Task Manager. It may pop another box up, saying that the process is not responding. Instruct them user to click "End Task" on that box as well. If the server-side process does appear in your server's task list, then you have more sleuthing to do. Find out what the user was doing. Do they see any error messages on their screen? What process are they in? How long have they been waiting for a response from the system? Try to find out if they are doing anything that requires locking a record (they probably are). (The user himself may not know the answer to this. Refer to your application for the final word.) If so, try to find out if that record is likely to be held by another interactive user, or perhaps a JOB that is batch updating a series of records. In many instances, even if the user does not receive a message to the screen, the culprit of these hangs is that their process is trying to access a record held by someone else. (If, for example, the INPUT calls an UPDATE as an automatic process, and that UPDATE runs into a locked record, it will silently wait for that record to become available, without advising the user.) If it is possible that they are waiting for a lock, check with other uses and see if you can discover (and then eliminate) the source of the lock conflict. APPX user, Bruce Johnston, has put together a suite of utility processes he uses in the day-to-day administration of his APPX server. There are a couple of methods for determining who has which files open. While it cannot tell you who has which records locked in which files due to NT O/S design limitations, it can point you in the right direction. Remember also that the system might just be slow. Check to see what system performance is like, before assuming that their process is actually paused, as opposed to just running slowly. ASI has not tested and in no way warrants the utility software from Bruce Johnston, it has been available for some time now, and we have heard no negative feedback regarding it. You might want to check it out at www.cansyswest.com/nt_utilities.htm and see if serves your needs.
If you were unable to narrow the situation down to lock contention, and solve it, and are also certain that the process is not just running slowly, it is time to look at killing the process.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-14 2:24pm | ||||||||
![]() |
![]() ![]() ![]() What can I do if WinAppxD gets stuck regularly? | |||||||
Many customers have increased the availability of WinAppxD by installing multiple WinAppxD services (WinAppxD as originally installed, plus nearly exact copies of it as WinAppxD2, WinAppxD3, etc.). These differ only in the port used by each one. For example, WinAppxD may listen on port 8060. WinAppxD2 may listen on port 8061. WinAppxD3 on port 8062. Once you have set up multiple WinAppxD services, you can instruct your users to change their "Server Port" (in the login dialog) to one of the alternate port numbers, if they experience difficulty connecting to the default port number.
You may wish to copy WinAppxD.exe to names like Appx8060.exe, Appx8061.exe, etc., in order to keep them grouped together under NT Server's Task Manager. In any case, we recommend that you run multiple APPX/Servers, due to the increased level of fault tolerance it provides. Instructions on setting up WinAppxD services are in the APPX Presentation Client/Server Installation Guide.
Multiple WinAppxD services on different ports invoked from batch files is also a way of changing the main environment variables for, for example, running two versions and data sets in parallel, or using a different APPX_KEYMAP when attaching from another device type such as handheld RF scanners through a telnet session via a LINUX box.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-09 10:28am | ||||||||
![]() |
![]() ![]() ![]() When might I want to stop and restart WinAppxD (either with, or without, a reboot)? | |||||||
If you experience the following scenario on your network, you probably need to stop and restart WinAppxD (Note that existing users can continue to work in APPX.):
Client(s) are trying to login to APPX and hang after entering their login information. (APPX may eventually come back and say, Cannot connect to host.) Having the user logout, and try to log back in again, to make sure that the situation is not due to exceeding your licensed user count, results in that user not being able to log in. Also, if you bring up an NT task list, and do not see WinAppxD.exe in the list, that is an indication that it has already stopped (either you stopped it, or it ran into an error condition and ended itself), and needs to be restarted.
Once again, restarting WinAppxD without a reboot is not guaranteed to work, due to NT TCP/IP implementation. The existence of "Stop" and "Start" buttons in the Services Control panel applet does not mean that these functions work 100% of the time.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-09 10:29am | ||||||||
![]() |
![]() ![]() ![]() Is it safe to stop WinAppxD, if I'm going to need to restart it again without rebooting my server? | |||||||
MAYBE. Sometimes you can stop WinAppxD, then manually start it again, and everything will work fine. However, sometimes the manual restart process is not successful. This appears to be due to NT not properly releasing the port (usually 8060) when WinAppxD is stopped. If the port is not released, when WinAppxD restarts and attempts to recapture it, it can't, so client logins won't be accepted.
See "My WinAppxD gets stuck regularly ...” for a workaround to this. It may be a very good idea to set up Multiple WinAppxD servers as a fallback position, in case you unexpectedly get a hung port condition.) If the restart fails, you can try stopping WinAppxD again (if one started during the restart process) and restarting it again. If a WinAppxD.exe does not reappear in the task list, or if it appears but client logins are not accepted, at this point, your only option is to reboot.
We don't have any figures as to what percentage of the time this is and is not successful. In general, if you stop a WORKING WinAppxD, and expect to be able to restart it without a reboot, YOU ARE TAKING A CHANCE. It may or may not work, due to NT. If you stop a malfunctioning WinAppxD in the hope that restarting it will resolve the error condition without a reboot, you have nothing to lose. In that case, it is definitely worth a try. (You must be logged in as Administrator to do this.)
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-09 10:30am | ||||||||
![]() |
![]() ![]() ![]() How do I stop WinAppxD? | |||||||
WinAppxD automatically stops when the system is shut down or on its way to a reboot.
If you want to manually stop WinAppxD before that point, you MAY be able to stop it through the NT "Services" Control Panel applet, by selecting WinAppxD, and clicking "Stop". Wait a moment or two, then bring up the task list and verify that it is no longer listed.
If after several minutes, you still see WinAppxD in the task list, you can try a more "drastic" measure and try to "End Process" the WinAppxD.exe entry in the task list.
It's several minutes after that, and it's still there? The most drastic way of stopping WinAppxD, if you have the NT Resource Kit installed, is to use the kill.exe command provided by the Resource Kit. (Hint: You probably have this installed, since some utilities from it are required to install and run WinAppxD. Do a Find for "kill.exe" if you can't locate it.) (You must be logged in as Administrator to do this.)
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-09 10:31am | ||||||||
![]() |
![]() ![]() ![]() How do I start WinAppxD? | |||||||
WinAppxD is normally started automatically by the system when it boots. See this document for detailed Installation and Configuration instructions.
If you don't want WinAppxD to start automatically (for example, if you wish for the system to boot without allowing APPX logins), you can set the Startup Type for the WinAppxD service to "Manual" in the NT "Services" Control Panel applet. Then, you can reboot the system. If you check the NT task list at this point, you should not see WinAppxD in it. To manually start WinAppxD, go to the NT "Services" Control Panel applet again, select WinAppxD, and click "Start". Wait a moment or two, then bring up the task list and verify that it is there. (You must be logged in as Administrator to do this.)
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-09 10:32am | ||||||||
![]() |
![]() ![]() ![]() How can I verify that WinAppxD is running? | |||||||
Bring up the NT Task Manager. Look for a process named WinAppxD.exe. If you see it, WinAppxD is running. (Note: this does not necessarily mean that WinAppxD is running properly, as a WinAppxD with a hung port will still appear in the task manager. This is mainly useful to do, to verify that WinAppxD is at least starting successfully.) If this process is not present in your task list, client logins cannot be accepted on your APPX server.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-09 10:33am | ||||||||
![]() |
![]() ![]() ![]() What is WinAppxD, and what is it used for? | |||||||
WinAppxD is the NT implementation of <APPX name for this functionality>. Its purpose is to monitor a user-defined port number for connection requests from clients, such as the APPX Client or AppxNET (used for APPXODBC across the network as well), then validate the client's login and password, and start an APPX Server session connected to that client.
After the user authenticates and is connected to a server-side APPX session, WinAppxD has nothing further to do with that client/server session. If WinAppxD is killed, ends with an error, or experiences a hung port, this will not affect users who have already established APPX client/server connections. (A problem with WinAppxD is the most common cause of the error situation in which no new users can login, but users who are already logged in, can continue to work.)
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-09 10:34am | ||||||||
![]() |
![]() ![]() ![]() Getting 'ps -ef' original UserID in Linux | |||||||
Customer's "ps -ef" on their AIX box gave the User's actual user ID, whereas "ps -ef" under Linux always gives the 'Appx' UserID. The customer uses the ps -ef for Appx user management. Is there a way to get the process user's original ID, so they can do this in Linux?
| ||||||||
. Place the following shell script in /usr/local/bin or /bin. Then pipe the output from appxps into "grep appx" to get a list of all Appx processes: . | ||||||||
> # which appxps /bin/appxps > # cat /bin/appxps #!/bin/sh ps -axwo ruser,pid,ppid,c,stime,tty,time,args > # appxps|grep appx root 1573 1 0 Jan11 ? 00:00:00 /appx/tools/appxd -s=8066 root 1576 1 0 Jan11 ? 00:00:00 /appx/tools/appxd -s=8090 appx 1589 1 0 Jan11 ? 00:00:00 /appx/appx -l=/appx/license.log nobody 1660 1573 0 Jan11 ? 00:00:00 /appx/data/../appx -f=4 -fms_server al 11565 1576 0 Jan12 ? 00:00:01 /appx/data/../appx -f=4 -d= brenda 22224 1576 0 Jan13 ? 00:00:01 /appx/data/../appx -f=4 -d= al 24736 1576 0 Jan13 ? 00:00:10 /appx/data/../appx -f=4 -d= al 4786 1576 0 10:22 ? 00:00:04 /appx/data/../appx -f=4 -d= pat 6181 6180 0 12:42 pts/1 00:00:00 /bin/bash /home/pat/.appx_profile pat 6183 6181 0 12:42 pts/1 00:00:01 /appx/appx -d=CTS root 6574 6522 0 13:17 pts/0 00:00:00 /bin/sh /bin/appxps root 6575 6522 0 13:17 pts/0 00:00:00 grep appx > # | ||||||||
[Append to This Answer] | ||||||||
2004-Jan-14 4:48pm | ||||||||
![]() |
![]() ![]() ![]() Information on Winprint 2.4 | |||||||
Please refer to:
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=610
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-16 1:42pm | ||||||||
![]() |
![]() ![]() ![]() How to Purge the USAGE File | |||||||
Please refer to:
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=170
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-16 1:43pm | ||||||||
![]() |
![]() ![]() ![]() Does Winprint -width and -length work? | |||||||
Please refer to:
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=618
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-16 2:06pm | ||||||||
![]() |
![]() ![]() ![]() Is there any special consideration that we should take in order to use Winprint? | |||||||
Please refer to:
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=618
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-16 2:07pm | ||||||||
![]() |
![]() ![]() ![]() What is the relationship between winprint.exe and winprintdll.dll? | |||||||
APPX uses a DLL so that we can honor the "Print Setup" specifications that you’ve enter. All printer drivers support two different methods for altering the Print Setup specifications. One method is through the Print Setup dialog box (where the user adjusts the choices on the screen), the other method is through a callable API (where Appx, for example, would send your disposition choices directly to the printer driver).
Most printer drivers seem to ignore the information provided through the callable API. So, the only other choice is to allow you to use the Print Setup dialog box. In order to do that, we had to use a DLL so that the specifications entered in the Print Setup dialog can be shared with the program that actually does the printing.
So, when you choose client-side printing, the report file is sent (over the net) to the client, and then the client invokes functions inside the winprintdll.dll module to actually spool the report to the printer (using a combination of the disposition options and the print setup dialog specs).
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-20 10:24am | ||||||||
![]() |
![]() ![]() ![]() Storing zero numeric values in SQL Server | |||||||
I’m having trouble getting zero values into a SQL server table from APPX ... they keep getting added as nulls.
| ||||||||
When storing values in a RDBMS, APPX normally stores a numeric value of zero as a "null" value. Conversely, when retrieving a "null" numeric value, APPX normally converts the null value to zero.
However, this default behavior can cause problems if you attempt to perform arithmetic operations on a database column using a program other than APPX unless the program anticipates the fact that a numeric column may contain null values. For example, if you add two values together and one of the values is null, the result will be null. Many SQL programs will fail if numeric null values are encountered when performing arithmetic.
The default behavior of APPX can be easily changed. If you want APPX to store numeric values of zero as zero instead of null for all database tables, you must toggle on the "Suppress Null Numerics?" option in the FMS Group definition. If this behavior only needs to be changed for selected tables, the option can be set for individual files on the "File Attributes" screen using the "File Specification" program in Database Management.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-19 9:32am | ||||||||
![]() |
![]() ![]() ![]() What are the zero apps? | |||||||
The zero apps are the interface modules used to develop APPX applications. These applications are not modifiable, although the 0LC apps can be copied and hooked to provide a customized system.
The zero app modules are;
0LC Hook processes templates. New with rel 4.2
0AD Application Design
0LA Runtime environment
0DB Database
0SA Systems administration
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-09 1:40pm | ||||||||
![]() |
![]() ![]() ![]() How do I start the license server? | |||||||
To manually start the license server, enter;
appx -l=logfile | ||||||||
[Append to This Answer] | ||||||||
2004-Feb-13 8:31am | ||||||||
![]() |
![]() ![]() ![]() How to debug the license server | |||||||
Set environment variables:
APPX_LS_DBG=0xFFFFFFFF APPX_LS_LOG={some.file.location.and.name} Debug information for the "appx -l=" license server process appears in the file named after the "-l=". Debug information for clients attempting to obtain session licenses will appear in $APPX_LS_LOG, if it is set. In order for this variable setting to affect the license server, you must kill and restart the License Server.
Warning: Watch the size of your log file when you have APPX_LS_DBG set. License server logging tends to be verbose, and you can fill up your disk more quickly than you think.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-13 8:34am | ||||||||
![]() |
![]() ![]() ![]() How do I determine my server’s serial number required for registration with APPX? | |||||||
Go to the APPX FTP site and download/uncompress/install then run the appropriate utility.
ftp://customerftp.appx.com/hostinfo/ | ||||||||
[Append to This Answer] | ||||||||
2004-Feb-13 8:37am | ||||||||
![]() |
![]() ![]() ![]() How to associate PDF output to enable printing in a windows environment. | |||||||
In APPX 4.2.2, the APPX session tells the O/S to "Print" the PDF print file. For this to work, Acrobat Reader must be installed on the server and there must be an action defined for the "Print" action for "pdf" files. Open Windows Explorer and navigate to Tools-->Folder Options-->File Types. Scroll down and select the extension for "pdf". If there isn't one, the easiest way to get one is to uninstall Acrobat Viewer and reinstall a fresh copy of Acrobat Viewer. If you find an entry for "pdf", click on the Advanced button. In the Actions box, there should be an entry for "Print". This entry defines the command that should be run when an application issues a request to Print a pdf document. If there is no Print entry, then you should reinstall Acrobat Viewer to correct the problem.
The printed output will always go to the server's current default printer regardless of what printer you may have specified within APPX. This is a limitation of the current release of APPX and will be addressed in a future release. Make sure that your server has a default printer defined.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-19 4:21pm | ||||||||
![]() |
![]() ![]() ![]() What different configurations of APPX/ODBC are supported? | |||||||
Two configurations of APPX/ODBC are supported: standalone and client/server.
Most commonly, we expect sites to use APPX/ODBC in the client/server network configuration, where the APPX/ODBC driver is installed on a client PC where programs like MS Access and Excel are run, and the APPX data sits on another machine, typically a server.
It is also possible to use APPX/ODBC on a machine which can access APPX data directly, either because that data is on a local drive, or because it is on a "mapped drive" accessible across the network.
If you have a choice, you will probably achieve better performance running APPX/ODBC in a client/server fashion, than by running it standalone against a network "mapped drive".
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-19 4:22pm | ||||||||
![]() |
![]() ![]() ![]() What software do I need on the data server in addition to APPX? | |||||||
a. APPX Presentation Server. This is 'appxd' on UNIX systems, and WinAppxD or ‘appxdsvc’ (preferred, Rel 4.1.a and above) on windows systems.
b. The TCP/IP network protocol. APPX Presentation Server requires TCP/IP to communicate with clients.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-19 4:25pm | ||||||||
![]() |
![]() ![]() ![]() APPX and ODBC information | |||||||
Please refer to;
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=687
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-19 4:26pm | ||||||||
![]() |
![]() ![]() ![]() What kind of machines and network do I need for server and clients? | |||||||
For the server, any machine capable of running APPX Presentation Server (appxd or WinAppxD/appdsvc) and APPX version 3.5 or later will work.
Please note that this excludes Novell Netware servers. If you wish to make data stored on a Novell Netware drive accessible to ODBC clients, you should install APPX/ODBC in the 'standalone' configuration, going against the mapped Netware drive, instead of using the client/ server configuration. For the client, a machine running Windows 9x, NT or above is required. Windows 3.x is specifically not supported by APPX/ODBC.
Because file I/O will be taking place across the network, the faster your network is, the faster your client programs will be able to access APPX data. This might be the ideal time to think about justifying a 100mbit/sec "Fast Ethernet" upgrade.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-19 4:27pm | ||||||||
![]() |
![]() ![]() ![]() Can I get a log of file activity using APPXIO? | |||||||
Yes, set the environment variables
APPX_IO_LOG=filename The first will tell Appx to log all AppxIO actions to filename. The second will tell Appx to write the log in an easier to read format. The log file will show all reads, readnexts, writes, deletes, and rewrites. Each entry will show a complete dump of the data being read, written, or deleted. For read operations, the log will show the key number and key value being retrieved.
You'll also see log entries for each process that runs so you can tell which process caused each I/O.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-25 10:18am | ||||||||
![]() |
![]() ![]() ![]() How do I verify all files in a database? | |||||||
The "appxutil -v" command verifies one file at a time. To verify an entire database, you could individually enter the commands at the DOS command prompt, but it is more efficient to create a batch file which does it. Use your favorite text editor to create a text file (NOT a .doc file!) which looks like:
c: cd \APPX\DATA\DDD\AAA\DATA appxutil -v=CUST.dat appxutil -v=CUST2.dat appxutil -v=DEPT.dat ...(include a line for each data file)
It's necessary to add a line to the script for each data file. You may want to do a "dir > temp", then bring that up in an editor window, and cut and paste filenames into the verify script. Save this file as "verfyAAA.bat", in the directory containing appxutil.
It is a good idea to create a batch file to verify each of your databases, in advance, so that when you want to verify all files in a database, you can just run the applicable script without having to spend time creating it.
Analyzing data files with APPXUTIL
Analyzing a data file will interactively provide more information about the file's internal structure. In general, this isn't important unless the file has failed verification.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:12pm | ||||||||
![]() |
![]() ![]() ![]() How do I verify the file 'ORDER' in application 'AAA', database 'DDD'? | |||||||
Obtain APPXUTIL.EXE from our FTP site, and put it in the same directory containing APPX.EXE
Open a DOS box on the NT or Windows 95 machine containing the data files. While it is possible to verify data files across the network, it is most time-efficient to run the verification on the actual machine (server) on which the data files are located. "cd" to the directory containing the files - for example, if my APPX data files were stored in C:\APPX\DATA, and I wanted to verify the file named above, I would:
c:
cd \APPX\DATA\DDD\AAA\Data
Run "appxutil -v=filename.dat" - for example, for the scenario described in this section, type:
appxutil -v=ORDER.dat
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:14pm | ||||||||
![]() |
![]() ![]() ![]() How can APPX data file indexes become corrupt? | |||||||
The 'APPXIO' file system has proven itself to be very stable over the years. However, no database system is immune to the effects of system or application crashes, in which unpredictable things happen to database files. For example, APPX might be in the middle of adding a record, and has completed updating 2 of 3 keys, at the time of a crash. This leaves the index for that file in an inconsistent state. The data itself is correct and intact, but the key file must be rebuilt in order for the indexes to be correct. Typically, a system administrator is not going to know in detail what was happening on the system, when a power failure or equipment problem occurred, and will not know whether any APPX data files on the system became corrupted as a result. Verifying the data file would tell you whether or not it is necessary to run "Rebuild keys" for that file.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:15pm | ||||||||
![]() |
![]() ![]() ![]() When might I want to use APPXUTIL to check my file system? | |||||||
If your file system (disk) fills up. Adding records to a file on a full disk is likely to corrupt the file.
After a system crash during which there were active users on a system. You should verify all files in the database before allowing users back into APPX. When certain records you "know" are in a data file, do not show up as expected on a report or input display, you might want to verify that file. When a constrained child process fails to correctly retrieve data, you might want to verify the PCF of the child process.
For routine file maintenance. Once a month on your data files and on application design files that are being edited is recommended.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:16pm | ||||||||
![]() |
![]() ![]() ![]() Where do I get APPXUTIL? | |||||||
APPXUTIL.EXE is found in the .\Tools directory, underneath the appx.exe engine.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:17pm | ||||||||
![]() |
![]() ![]() ![]() Why does a user of APPX for Windows need APPXUTIL? | |||||||
Traditionally, APPX data file verification and analysis are done from the command line, using the normal 'appx' engine itself. Since APPX for Windows is a GUI program, and the data file verification and analysis functions are text-based utilities, it is necessary to have a separate, alternate copy of the 'appx' engine which runs in text rather than GUI mode, in order to use those functions. This alternate version of APPX is called APPXUTIL.EXE.
Starting with APPX 3.3 and above, the data file verification (-v) function can be invoked from the database management menu, so it is not necessary to use APPXUTIL.EXE to access that capability. However, APPXUTIL.EXE is still needed by users of APPX 3.3 and above, to perform one of the two steps required for cross-platform data file import/export, and for detailed data file/key integrity analysis.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:18pm | ||||||||
![]() |
![]() ![]() ![]() What is APPXUTIL? | |||||||
APPXUTIL.EXE is used to invoke the command line functions of APPX, on a Windows PC. These functions include:
-v Data file/key integrity verification (to detect file corruption) -an Data file/key integrity analysis (to analyze possible file corruption) -e Second step of data file export (after Exporting from the menu)
-i First step of data file import (before Importing from the menu)
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:20pm | ||||||||
![]() |
![]() ![]() ![]() What does it mean to 'verify' a data file? | |||||||
Verification checks to make sure there are no duplicate keys, that each key points to only one record, that all keys point to active (rather than deleted) records, and that all indexes for that file have the same number of keys.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:21pm | ||||||||
![]() |
![]() ![]() ![]() How do I script imports for windows using APPXUTIL? | |||||||
The following example will import (appxutil -i=) the design files for application TAP version 00 from portable ASCII format into the BRF format needed before you can actually import the files into APPX:
cd c:\appx\data\00\TAP\Portdata FOR %%f IN (*.) DO c:\appx\tools\appxutil -i=%%f | ||||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:22pm | ||||||||
![]() |
![]() ![]() ![]() How do you diagnose strange or generic errors (such as bus errors, seg faults, attempting to free freed memory errors, or "an internal error has been detected" errors)? | |||||||
Run through the following checklist:
Delete all of your Applications' EMs. Rerun your problem scenario to see if the problem still occurs. Set environment variable APPX_TRAILER_COUNT=40, then re-run the condition that generates the error.
This catches most APPX "stepping on memory" errors, by generating an "mm free() - corrupted trailer" message earlier in your problem scenario. This can be set in the appx.env found in the data directory under the directory containing your APPX engine. (If you're running APPX/Server, any new APPX Application server session fired off from an APPX/Client after appx.env editing will have newly edited appx.env environment variables activated.) Search for Design Discrepancies: From the Utilities menu; Run: ‘Run Each of the Above’ from the ‘Orphan Detection’ process Run: ‘Check for Duplicate ANO and EMs’ (‘Verify ANO’s and EM’s’). "No Lines Were Output" means the Application passes this test. If any Applications don't pass, perform: 1. Run: Reset Process Date Add Fields.
The name of an executable module is derived from the date that the PROCESS record was added for that process. If you happen to get two processes with the same "date added", they'll have the same EM name and nasty things will happen. "Reset Process Date Add" assigns a unique "date added" to every process record.
This resets the Date Compiled fields for all data Field and Domain definitions in an application to NULL and also resets the internal Appx Area Number for each field to zero.
It deletes and then re-creates the given files. When the data dictionary compiler compiles a dictionary, it writes records into those four files. When the process compiler compiles a process, it reads from those files, not the FIELD and RECORD file. So, initializing those files is basically the same thing as deleting your data dictionary and typing it all back in again - you end up with an uncompiled dictionary. 4. Reprocess your Data Dictionary. Analyzes the source form of the data dictionary for errors and inconsistencies and produces a more directly executable form (the compiled form is stored in BITMAP, ELEMENT, FILE, and INITIAL).5. Restructure your enduser data. (This should go quickly - only the /Struct file date/time stamps will need to be reset, to match the newly compiled DD. Restructure changes existing data records into a new form after you've changed (and compiled) a data dictionary.
7. Then rerun the scenario that causes the problem. If your problem scenario still fails, and you're running on a Windows platform, send us your appx.stk 'appx.stk' is a stack dump, telling us something of what goes on inside APPX when cassert error messages occur. You'll find it in the same directory that your 'appx' or 'appx.exe' engine is located. If it is overly large, you may want to delete or rename it, then run your problem scenario one more time to get a clean dump. Send to techsupp: The appx.stk dump, The version# of APPX under which you are running, The release level of your Operating System, A brief description of what the error looks like from the operator's perspective, and a brief description of the Application Design elementes in which the error occurred. | ||||||||
See also FAQ: ![]() | ||||||||
[Append to This Answer] | ||||||||
2005-Oct-07 9:10am | ||||||||
![]() |
![]() ![]() ![]() How do I see the APPX Process Stack? | |||||||
If you have TRAPed into the ILF debugger, you can see the process stack by invoking Direct Menu 1 (GO 1). A typical Process Stack might look like: ECR ENTRY (HISTORY) (COMMENTS) 0000200.001.0000000 Inp Option Intercept ------- ------------------------------------------------------------- | Stack Trace | | | | Lvl# Ap/Ver Proc Type Process Name Invoked As | | 1 CTS 00 INPUT ECR ENTRY (HISTORY) (COMMENTS) SUBPROCESS | | 2 CTS 00 INPUT ECR ENTRY (HISTORY) SUBPROCESS | | 3 CTS 00 INPUT ECR ENTRY DETACHED | | 4 CTS 00 MENU MAIN MENU DETACHED | | 5 0LA 00 JOB SELECT DATABASE SUBPROCESS | | 6 0AD 00 INPUT APPLICATION DESIGN DETACHED | | 7 0LA 00 MENU APPX MENU DETACHED | | | | | -------------------------------------------------------------------- The current process (being debugged thru the ILF editor) is at the top the stack (Level #1). The first process in the stack is at the bottom (APPX MENU).
Note that this stack also shows you the "Invocation Type", or scoping (Detached/Related/Subprocess).
You can only view the Process Stack when running 4)Run Test Database from with the Application Design editor, or when you have launched a Process from one of the Process editors using hidden Option 99.
If you have no TRAP to get you into the ILF editor in your current process, don't despair! Press your interrupt key (generally Control-C), then ENTER. The ILF editor will stop at the next available ILF statement. From there, you can GO 1, to see your current Process Stack!
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:26pm | ||||||||
![]() |
![]() ![]() ![]() What is the APPX Process Stack? | |||||||
Running an APPX application consists of a series of processes calling each other. For example, the Main Menu might call a submenu, which might call a JOB process, which might call an INPUT, which might call a child INPUT process, etc.
The list of current processes that have called each other is called a "Process Stack". This is a particular 'drill down' within a Process Family, or Process Tree.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:27pm | ||||||||
![]() |
![]() ![]() ![]() How to define the keyboard layout, (appx –k) | |||||||
Please refer to:
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=602
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:28pm | ||||||||
![]() |
![]() ![]() ![]() New Item | |||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:28pm | ||||||||
![]() |
![]() ![]() ![]() WinAppxD service is not running (Troubleshooting WinAppxD) | |||||||
First, login as Administrator and check Event Viewer, to see if there are any errors regarding SRVANY.EXE startup. These could occur if the WinAppxD service registry entry points to the wrong pathname for the winappxd.exe executable. If you see errors, edit the appropriate registry key to fix the path name or command syntax. (See WinAppxD installation instructions for registry locations to check.)
If there are no SRVANY.EXE errors saying that the service failed to start, then WinAppxD started executing, but some type of error caused it to exit. Instruct WinAppxD to create a log file by defining the following environment variables:
APPX_NET_LOG=c:\appxdlog.txt APPX_NET_LOG_MASK=0xFFFFFFFF Reboot. Wait a few minutes to make sure WinAppxD has had a chance to start. Check the c:\appxdlog.txt file for error messages. IF NO LOG FILE EXISTS, check to make sure that the logging variables APPX_NET_LOG and APPX_NET_LOG_MASK are still defined, and that they were defined in the global System environment area, not the user-specific area. (A common error.) If they appear to be defined correctly, then it is extremely likely that the environment variable "APPX_SERVER" is not set, because some versions of WinAppxD will exit silently, with no error indication, if APPX_SERVER is not set. Another possibility is that the Windows "winsock" library could not be correctly initialized, but this is unlikely if you have TCP/IP installed.
- Resolution: If you've tried the above and it still isn't working, call APPX Software Technical Support. "accept error - {n}" - This is a system error which should never occur. - Resolution: record what {n} is, and call APPX Software Technical Support for assistance.
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-02 9:28am | ||||||||
![]() |
![]() ![]() ![]() Client login issues - Incorrect login (Troubleshooting WinAppxD) | |||||||
If you are receiving the error "Incorrect login" when trying to login to APPX from a client PC, there are several common reasons for it.
The best diagnostic information is available in server-side logs, not client-side, since generally these failures occur as a result of a Windows function call failing inside winappxd. Here's how to collect a server-side log to find out more about a WinAppxD error.
Procedure for current WinAppxD, through 3.2.x: Set the following vaariables in the same place you set APPX_SERVER: APPX_NET_LOG=c:\appxserv.log APPX_NET_LOG_MASK=0xFFFFFFFF Reboot. If you are attempting to login from the console of the APPX server, you must use a command prompt to reset APPX_NET_LOG then run "appx -c". It is necessary to do this, because if you don't reset APPX_NET_LOG, the (probably uninteresting) client log will overwrite the (probably very interesting) server-side log. Start up a DOS command shell, then type: set APPX_NET_LOG=c:\appxcli.log now cd to your directory containing appx.exe appx –c Otherwise, if you are attempting to login from a different PC, you can either set APPX_NET_LOG and APPX_NET_LOG_MASK in your global System variables via Control Panel / System / User Environment (or for Win95, set them in AUTOEXEC.BAT) then reboot and run the APPX client, OR (probably quicker) do the following from a DOS command shell on the client: set APPX_NET_LOG=c:\appxcli.log set APPX_NET_LOG_MASK=0xFFFFFFFF now cd to your directory containing appx.exe appx -c Now check the contents of c:\appxserv.log on the server. A ways down in the file, you should find a line that looks like:
LogonUser() failed with 9999 In place of the 9999, you will see a number which is the reason Windows NT denied the login request. Common ones we've seen, and what to do to solve the problem they indicate, are: 1314. This indicates that the account used to run WinAppxD is missing one or more of the 4 user user rights it needs. See sections 1.6 and 1.7 (or the WinAppxD installation instructions) for details on setting these rights. Generally "Replace a process level token" or "Act as part of the operating system" is the right that is missing (others may be as well). 1326. This is Windows error "ERROR LOGON FAILURE" which might mean that the user ID is unknown to NT, or that the password specified during APPX client login is incorrect. However, it is MUCH more likely to mean that the account used to run WinAppxD does not have the 4 rights set, that it needs to have set (or that you set them on the PDC instead of the local server). See sections 1.6 and 1.7 (or the WinAppxD installation instructions) for details on setting these rights. Generally "Log on as a service" is the right that is missing (others may be as well). You can verify it's not a user/password error by logging in to the user from the server's console. It MAY also mean that you have started WinAppxD from the Local SYSTEM account. Check your Services control panel applet entry for WinAppxD to make sure you have specified a user ID and password, rather than trying to run it under the SYTEM account. If your LogonUser(….) line in your NET LOG (see above instructions about how to create one) lists "NTAUTHORITY", this is almost certainly the problem, as that is the pseudo-domain membership of the Local SYSTEM account. 1385. The user you're trying to login with from the client, does not have the right to logon locally to the server machine. Set this right from User Manager on your APPX Server (make sure to choose the machine name rather than the domain name when you start User Manager). Rather than setting this for each user individually, you probably want to set it for "Domain Users" or "Everyone", or better, a group called something like "APPX Users" which contains only those users allowed to run APPX. See section 1.18 for more information. If you have a different return code than the above, if you don't have a "LogonUser() failed" line in your log file at all, or if you have one of the codes above but the recommended solution is not working for you, please call APPX Software Technical Support. When calling APPX Software Technical Support, there are several pieces of information you can have ready that are likely to speed up the problem-solving process for an "Incorrect login" error:
a. What the "LogonUser() failed" return code is. B. Whether you were trying to connect to the server from the server itself, or from a separate client PC. C. Whether "appx -c" logins from OTHER machines work. D. Whether the user you're trying to login with is in the Administrators group on the server. E. Whether "appx -c" logins using OTHER user ID's (Administrator and other non-privileged users) work. Once you have successfully connected to APPX with your clients, remember to remove the APPX_NET_LOG and APPX_NET_LOG_MASK variables from Control Panel / System / User Environment (or your AUTOEXEC.BAT for Win95 clients).
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-02 9:33am | ||||||||
![]() |
![]() ![]() ![]() HASP not seen by APPX (Troubleshooting WinAppxD) | |||||||
If the APPX Registration screen shows your serial number as "00-…", then it is not seeing the HASP. As of APPX 3.3 and beyond, APPX should produce a CASSERT describing the problem. You may be able to figure out what to do to fix it, from the message. If not, call APPX Software Technical Support. This message will not necessarily appear if you are running the "appx -c" client, therefore we recommend that while troubleshooting HASP issues, you run APPX directly on the server.
If you are running a version prior to 3.3, you will need to collect a debug log on the server. You may also need to do this when running a later version, if APPX Software Technical Support requests it. Here's how to do it. Set the following variables in the same place you set APPX_SERVER: APPX_SS_LOG=c:\hasplog.txt APPX_SS_CODE=0xFFFFFFFF
Reboot again, then run APPX directly on the server once more. You will probably be presented with the Registration screen and some sort of license error again. Exit APPX. Now go look at c:\hasplog.txt.
If the problem and its resolution are not obvious, call APPX Software Technical Support for assistance. We will need to see (email is best) or hear (over the phone) the contents of the debug log.
Remember to remove the APPX_SS_LOG and APX_SS_CODE variables once the HASP is successfully recognized!
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-02 9:34am | ||||||||
![]() |
![]() ![]() ![]() Winprint won't print to my printer (Troubleshooting WinAppxD) | |||||||
Using Control Panel / System / User Environment, set a global system environment variable WINPRINT_DEBUG on the machine running WinAppxD to the name of a file in a directory which is writable by everyone.
Reboot the machine.
Try to print again. Then, look in the log file to see what it says. There might be an obvious failure, like it truncated your printer name (if it was a really long printer name), or it substituted an underscore for a space, or some such. If the failure is not obvious, contact APPX Software Technical Support. We will probably want to see (via email) or hear (over the phone) the contents of the log file.
Remember to remove the WINPRINT_DEBUG variable once you have solved the printing error.
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-02 9:35am | ||||||||
![]() |
![]() ![]() ![]() Winprint won't print to printers that are not defined on my NT server (Troubleshooting WinAppxD) | |||||||
As of version 3.5 and earlier, APPX can only print to printers which the server knows about, because the printing task occurs on the server.
This means that if a user wants their report to come out on their local printer, there are two options that we currently know of:
A. Define the printer on the server, and map it to that user's printer. This is the preferred method, in terms of being easy for the user. However, it may be difficult or impossible for a particular site to keep these definitions up to date. B. Have the user email (using OPT-7) the report to themselves, and print it from email. See section 4.1 for how to do this. The caveat here is that if it's a big report, it's going to take up lots of space on your mail server.
We understand that many sites consider this an inconvenience and expect to implement client-side printing in a future release, to more easily allow this to be done.
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-02 9:37am | ||||||||
![]() |
![]() ![]() ![]() Getting an APPX Stack Trace / Disabling Dr. Watson (Troubleshooting WinAppxD) | |||||||
If APPX is ending with an error, then it is helpful to the APPX Tech Support staff if you can collect an APPX Stack Trace and email it to us along with the rest of the information we request.
You don't have to do anything to APPX itself to cause it to create the "appx.stk" text file containing the stack trace. However, you do have to disable Dr. Watson. If you do not disable Dr. Watson, then an APPX error will invoke Dr. Watson rather than the APPX Stack Trace recorder.
To disable Dr. Watson, go into your NT system32 directory, and look for the file named drwtsn32.exe, and rename that file to drwtsn32.disabled. You might have to reboot after doing this, in order to get APPX to generate the stack trace. After you've gotten the stack trace info, you might want to rename drwtsn32.disabled back to drwtsn32.exe so that your next non-APPX error will be handled by it.
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-02 9:38am | ||||||||
![]() |
![]() ![]() ![]() File analysis and recovery. | |||||||
Please refer to;
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=624
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-02 9:40am | ||||||||
![]() |
![]() ![]() ![]() How to move Appx files between platforms. | |||||||
Please refer to;
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=627
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-02 9:40am | ||||||||
![]() |
![]() ![]() ![]() How Appx spawns background tasks. | |||||||
Please refer to;
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=657
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-02 9:41am | ||||||||
![]() |
![]() ![]() ![]() How does executable module (EM) caching work? | |||||||
Please refer to;
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=653
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-02 9:42am | ||||||||
![]() |
![]() ![]() ![]() With APPX ODBC, files stored on the RS/6000 in APPXIO format, accessing the files from a PC using ODBC on the PC with a client like Access, what security is available? Can I use APPX internal security to control what databases/files/records/fields can be "seen" by the ODBC client? | |||||||
Yes. When AppxODBC logs into your RS/6000, it provides a user name and password to AIX. We use that user name to control security within appx.
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-19 4:37pm | ||||||||
![]() |
![]() ![]() ![]() Where can I find the BugTracker system? | |||||||
Go to http://bugtracker.appx.com:81/
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-19 4:39pm | ||||||||
![]() |
![]() ![]() ![]() How do you turn on/off AppxDSvc logging? | |||||||
You can adjust the logging parameters by setting three registry values:
LogServiceDir - set to the name of a directory and AppxDSvc will write the log there (in a file named $(LogServiceDir)\serviceName.log LogAllEvents - set to 'Y' to get a complete log or any other value to disable most log messages. The default is 'N' so Jean should be seeing very few message written to the log
LogCreate - set to 'Y' to create a log file or any other value to disable logging. The default is 'N' (starting with 4.2.3 - it defaulted to 'Y' before release 4.2.3) | ||||||||
[Append to This Answer] | ||||||||
2004-Mar-19 4:40pm | ||||||||
![]() |
![]() ![]() ![]() What's the address of the site where we can download the email support archive? | |||||||
Go to http://mail.appx.com/mailman/listinfo/support
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-19 4:42pm | ||||||||
![]() |
![]() ![]() ![]() Are there any issues with HPUX 11.11 that we need to be concerned about? | |||||||
Our supported HPUX release is 11. We are not aware of any issues with 11.11.
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-19 4:43pm | ||||||||
![]() |
![]() ![]() ![]() Excessive CPU utilization when client reboot’s PC. | |||||||
We see when users reboot their PCs without properly exiting the application, the APPX process on the server side still continues its attempt to communicate via TCP with its non-existent client process.
This communication effort seems to result in excessive CPU utilization.
| ||||||||
Client’s need to be encouraged to exit all applications before rebooting or shutting down their PC. Short of user support, you’ll have to locate and kill hung session(s) periodically. See ‘APPX session is hung’ FAQ for further instructions on killing hung sessions.
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-19 4:44pm | ||||||||
![]() |
![]() ![]() ![]() Is there a PDF for the record number in a consecutive file? | |||||||
No, not at this time. (release 4.2.3)
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-19 4:45pm | ||||||||
![]() |
![]() ![]() ![]() "Recover"ing data into a consecutive file. | |||||||
` The 'recover' utility has an option for directing its output to a consecutive file, rather than an AppxIO indexed-format .dat file. Example: /usr/local/appx/appx -recover -c INDEXED.dat CONSEC.dat INDEXED.deleted The "-c" argument takes data records found in the INDEXED.dat indexed file and writes them as consecutive records in CONSEC.dat. Any deleted records are placed into INDEXED.deleted as usual, and any invalid records are streamed to standard out as usual (from which they can be redirected into a file). This can be handy for recovering data records you can't get via a keypath. It's also be useful if you have records in your INDEXED.dat with duplicate primary key values, on which you'd be unable to rebuild a .key because the key rebuild logic in "Create" stops on duplicate unique primary index values.
See also: http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=624 | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-01 4:07pm | ||||||||
![]() |
![]() ![]() ![]() I can't connect to a second instance of the database (Sybase, Oracle, etc.) | |||||||
A single APPX session cannot connect to two instances of a database within the same APPX session. In other words, if an APPX session connects to one Oracle or Sybase database to access one or more tables, that same session will not be able to connect to a second Oracle database to access one or more additional tables. This is true for all supported databases. | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-06 4:01pm | ||||||||
![]() |
![]() ![]() ![]() Is it possible to create Indexes in the Dharma tables to improve speed? If yes then how? | |||||||
Only indirectly - if you need more indexes in the SQL tables, add key definitions to your Appx data dictionary and re-import the schema (using ASQL).
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-06 8:40am | ||||||||
![]() |
![]() ![]() ![]() Is it possible to use specific names for the FIELDS in the Dharma Tables? | |||||||
When we import tables into Dharma using ASQL we do not get the choice for naming of the tables. Even using ASQL_EXPERT_MODE=1 we don’t have the choice…How can we do this? The easiest way to rename fields is to create a view in SQL server that maps to the underlying table that you want to use. I don't think that there's a way to do rename fields during the initial schema import. | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-06 8:42am | ||||||||
![]() |
![]() ![]() ![]() Are there any tweaks to improve performance when retrieving data using the Dharma ODBC link? | |||||||
Queries are extremely slow even if the fields are KEYS in the APPXIO files. Make sure you turn off AppxODBC logging before you do any timing tests. If possible, keep the AppxIO data files on the same machine where the AppxODBC data source lives - otherwise, performance will suffer. | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-06 8:43am | ||||||||
![]() |
![]() ![]() ![]() Is there a way to synchronize databases in APPXIO with databases kept in SQL Server? | |||||||
We would like to have a Replica of our APPX files in SQL Server tables and being updated every hour or more frequently if possible. If SQL Server supports replication, you should be able to push data from SQL Server into the AppxODBC data source. | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-06 8:53am | ||||||||
![]() |
![]() ![]() ![]() Can we update records in APPXIO files using SQL Statements from SQL Server? | |||||||
We've never tried use an AppxODBC stream as a linked server in SQL Server, but can't think of any reason you should have problems.
| ||||||||
[Append to This Answer] | ||||||||
2004-Apr-06 8:47am | ||||||||
![]() |
![]() ![]() ![]() Is it possible to change the field names that are used by APPX/ODBC? | |||||||
First, before you run asql.exe, set the expert mode environment variable as follows: ASQL_EXPERT_MODE=1 1) Run asql and select the file that you wish to import the schema for. 2) Click on the "Show Script" button. The "create table" script should be displayed in the lower window. 3) Remove all of the comment lines from the script 4) Change field names to suit your purposes 5) Remove the last ";" from the very end of the script 6) Click on the "Try Again" button. 7) If "OK" is displayed, then everything probably worked as expected. 8) If there is an error, drop the table and try again. 9) WinSQL can be used to verify that the table, field names, and indexes were created as expected. | ||||||||
[Append to This Answer] | ||||||||
2007-May-16 11:59am | ||||||||
![]() |
![]() ![]() ![]() French Characters in Oracle | |||||||
When i put French charaters in to the Oracle table that is connected to APPX, i get question marks in return.
Accented characters require 8 bits. Setting the following environment variable will correct the problem: | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-12 3:11pm | ||||||||
![]() |
![]() ![]() ![]() "mm free()-corrupted trailer" | |||||||
If environment variable APPX_TRAILER_COUNT has been set, you can get the message mm.c.876 - "mm free()-corrupted trailer". This message indicates that some unexpected condition is causing memory to be overwritten. (Without APPX_TRAILER_COUNT, real data or executable code would have gotten overwritten, with an unpredictable results, probably a cassert message, that is otherwise unexplainable.)
As of 4.1.4 and later, also set the environment variable: APPX_LABEL_MEMORY=1This tells APPX to attach a label to each chunk of allocated memory. This label will be included in the "corrupted trailer" message and should give us a clue as to what is being corrupted. If this error occurs, the user should immediately write down the last few things he/she did, prior to the error occurring. User should then exit APPX.
If APPX_SCRIPT_OUT tracking is enabled, the script-log should be preserved, for analysis. APPX can then safely be reentered. | ||||||||
To diagnose, run:
Application Design > Utilities > Toolbox > Conversion Utilities > Check for Duplicate ANO and EMs. If any Applications don't pass ("No Lines Were Output" means they pass), perform the following procedure:
1) Run: Conversion Utilities > Reset Process Date Add Fields Conversion Utilities > Reset DD for full processIf this doesn't help, go into a more manual debugging mode. You'll need to be able to make this condition occur, upon demand. Make a copy of the process family involved, make sure the error still exhibits itself, then start stripping design elements out of it, until you zero in on the design element that is causing the error. You may want to call Appx Support to get guidance on this. | ||||||||
APPX_TRAILER_COUNT tells APPX to append additional "trailer" bytes to every memory allocation. Example: export APPX_TRAILER_COUNT=40These bytes are filled with known values and checked for corruption when the memory is given back to the system. This can find if APPX is writing beyond the end of an allocated chunk of memory or if, for some other reason, the memory is getting stepped on. APPX presents a "mm.c.876: mm free()-corrupted" cassert immediately upon detecting memory corruption that steps on this trailer. The message comes at the end of the job, when Appx is cleaning up (returning to the OS) memory that it allocated and wrote to earlier in the job.)
It may be prudent to keep the APPX_TRAILER_COUNT environment variable
permanently on, in order to avoid unexpected and harder to detect memory
corruption. APPX_TRAILER_COUNT has very low overhead. | ||||||||
As an example, an error message of: "mm free() - corrupted trailer (AREA: 0LA:7.2)" indicates that there has been memory overwritten associated with the writing of ERROR statement error log. In this case, an ERROR statement may be trying to write more than 250 bytes to the Appx error log when an UPDATE has just run.
(This might happen by the execution of an ERROR --- TEMP 2K statement, where
TEMP 2K was populated with more than 250 bytes of data. This can be diagnosed
by looking at the ERROR log produced by the update. At least one line should
be filled with 250 bytes of Error text, and probably truncated.) | ||||||||
See also FAQ: ![]() (from ecr #3353) | ||||||||
[Append to This Answer] | ||||||||
2004-May-07 3:02pm | ||||||||
![]() |
![]() ![]() ![]() Is it safe to remove USAGE.dat and USAGE.key files? | |||||||
You can safely remove the USAGE.dat and USAGE.key file as long as you don't
have anyone running Appx at the time.
| ||||||||
[Append to This Answer] | ||||||||
2004-May-20 10:11am | ||||||||
![]() |
![]() ![]() ![]() When do entries in USAGE.dat file gets removed? | |||||||
By default, the license server removes phantom entries every two minutes. you
can change the interval by setting APPX_LS_INTERVAL=<some_number_of_seconds>
(where <some_number_of_seconds> is less than 600). The default is 120 (two minutes). Note that Appx won't let you go more than 10 minutes (600 seconds) between refreshes. If you have an env. variable named APPX_LS_NO_GHOSTS, the license server won't remove phantom entries from the USAGE file. Phantom entries are always ignored when Appx counts user rights, so, even if you have some phantom entries, they won't cause you any problems. Of course, if your USAGE file grows to some huge size, Appx will take longer to start and end, but you'd have to have a *really* big USAGE file before you noticed a problem. The entries will not be removed from the USAGE file if you are running a single or promo license. | ||||||||
[Append to This Answer] | ||||||||
2005-Mar-22 11:16am | ||||||||
![]() |
![]() ![]() ![]() Can I export a registration key? | |||||||
There is no utility to export a registration.
If you are performing a new installation, you can copy the files where the registration is stored:
$APPXPATH/0SA/Data/REGISTER.dat | ||||||||
[Append to This Answer] | ||||||||
2004-Jul-09 4:46pm | ||||||||
![]() |
![]() ![]() ![]() In NT 4.0 I have a user named joe@my-company and when I upgrade the os to Win 2K Joe can’t logon. Why? | |||||||
Logging in with the @ sign is still perfectly valid in windows 2003 server. The at sign when used in the login field is for identification of where the user account exists. Active Directory Domain Controllers do not have local accounts. Member servers can have local accounts. So it is important to know the role of the server that you are
installing APPX on.
If joe@my-company doesn't login (producing "invalid login", then it is telling you that my-company does not have an account there.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jul-09 5:38pm | ||||||||
![]() |
![]() ![]() ![]() I want to use Appx with SQL Server. Are there any known issues/performance issues? | |||||||
1) SQLServer 2000 (and newer) uses row-level locking. This is good. This means that only the row that is being updated is locked. You may recall that earlier versions locked the entire block that a record was stored in thereby increasing the likelyhood of locked record conflicts between users.
2) As you know, the default behavior of an APPX application using a RDBMS is to use a commit mode of "Compatible". The intent of this mode is to allow an application that was designed to use APPXIO to be run with a database without requiring any changes to the application. Basically, if your application writes, rewrites, or deletes a record, APPX will immediately issue a commit to the database unless there is another record in another file that has also been read with hold but that has not yet been updated. If another record is held, APPX will wait until that record is updated before issuing a commit to the database. APPX must wait because a commit after updating the first record would cause the lock on the second record to be lost. As you know, updates to a database are not "permanent" until the commit occurs. The default behavior of SQLServer is to block any attempt to read a record that has been updated but not yet committed. This behavior increases the likelyhood that users will be blocked when they try to read a record (even if they are reading without a hold) that has been updated but not yet committed. In other words, users running an APPX application that uses SQLServer are more likely to see the dreaded "Waiting for locked record" message. It is hard to predict the impact of this issue. It really depends on the design of the application and the number of users who are running the system. But, I would assume that it will be more of an issue than it is with APPXIO. APPX processes that encounter/cause this issue can be re-engineered to avoid this problem. However, you probably won't be able to identify them all in advance. It is possible to change the default behavior of SQLServer to allow "changed but uncommited records" to be read. This may be the best solution. But, if an APPX session crashes with uncommitted changes, then the uncommitted changes will be rolled back. This is OK but there is slight risk that uncommitted data might be read by another APPX session and then get rolled back if the session that updated the data crashes without ever executing a commit. 3) There is the potential for date mapping issues. SQL Server supports two date types: CC-th and CC-mm (that's CC-minutes). The smalldatetime type can only handle dates between 1900 and 2079. 4) VARCHAR (and CHAR) fields have a maximum length of 8000 characters, TEXT fields are essentially BLOB's (and are not indexable). 5) The maximum index size is 900 bytes. This should not be a problem since the maximum length of an APPX index is 256. 6) The maximum row size is 8060 bytes. This might be a problem since APPX allows a maximum record size of 32K. 7) Maximum column count (per-table) is 1024. This might be a problem if you have more than 1024 fields in an APPX file. Remember that each occurrance of an APPX field counts as a column in a table. So, if you have an APPX field with 30 occurrances, that will result in 30 columns in the database table.
8) Here's the important limitations: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/architec/8_ar_ts_8dbn.asp | ||||||||
[Append to This Answer] | ||||||||
2004-Jul-29 4:23pm | ||||||||
![]() |
![]() ![]() ![]() How do I print a query log? | |||||||
Set the environment variable APPX_QUERY_LOG to a valid path on your computer, i.e. c:/appx/query.log. After running a query, you can examine the log file for diagnostic information with a text editor.
| ||||||||
[Append to This Answer] | ||||||||
2004-Oct-05 4:15pm | ||||||||
![]() |
![]() ![]() ![]() How can I move APPX data stored in an FMS group to SQLServer? | |||||||
My Appx data is stored in a different directory path than my Appx engine using an FMS group. I want to move the data to SQLServer. I exported the Appx data, added an FMS group call SLQServer with a type 6, and assigned the FMS group to the files I wanted to move. When I selected Import on the files Appx could not find the files. What can I do?
| ||||||||
When an Appx file using an FMS group with a type of 1 is exported the Portdata file is created in the same location as the Data and Struct files, in the path of the FMS group. When the FMS group is changed for the SQLServer path Appx no longer recognizes that the file was stored in a different path. The import process will look for the Portdata file in databas under $APPXPATH. There are two options to overcome this problem. First, you could simply move the Portdata file from the location it was created in to $APPXPATH under the database and application id for your data. Of course, if disk space is tight this may not work. The second option is to add another tyep 1 FMS group with the same name as the type 6 FMS set up for SQLServer, but with the path defined the same as the original type 1 FMS group. When Appx executes the import utility it will see the type 1 group with the same name and follow that path to find the Portdata directory. This procedure applied to all FMS types and databases. | ||||||||
[Append to This Answer] | ||||||||
2004-Oct-12 9:48am | ||||||||
![]() |
![]() ![]() ![]() Is the proxy database id "LOK:" still required when using SQLServer? | |||||||
The answer depends on the version of Appx and the version of SQL Server you are using. Releases of SQL Server prior to SWL Server 2000 did not support record locking, therefore Appx used the proxy_db setting of LOK: to duplicate the record locking in Appx in SQL Server. In Appx release 4.1 the use of proxy_db became optional if you were also using SQL Server 2000 or above. Appx still supports the use of LOK:, but it is not required. | ||||||||
[Append to This Answer] | ||||||||
2004-Oct-12 12:11pm | ||||||||
![]() |
![]() ![]() ![]() How can i build up the FMS path for APPXIO data files? | |||||||
There is a feature in release 4.0 which may help you do this... for AppxIO
data files, you can build up the FMS path using the following macros:$(host) - host name $(engine) - Appx engine version $(endian) - 'intel' or 'risc' $(root) - $APPXPATH $(uid) - 3-character Appx User ID $(user) - OS User ID $(pid) - OS Process ID $(ap) - File's application ID $(ver) - File's application Version $(db) - File's Database ID $(scope) - Process nesting level $(file) - 8-character file name $(type) - "Data", "Struct", "Portdata", etc. $(anything-else)- An environment variableAs an example, the normal location for an Appx data file would be: $(root)/$(db)/$(ap)/$(type)/$(file)If you wanted to invert the database/application hierarchy: $(root)/$(ap)/$(db)/$(type)/$(file)And, of course, you can do other fancy things: /tmp/$(user)/$(type)/$(file)The one thing which is missing is that you don't have a way to set an environment variable from within ILF code. If you could do that, you could programmatically control the entire pathname. | ||||||||
[Append to This Answer] | ||||||||
2004-Dec-29 10:30am | ||||||||
![]() |
![]() ![]() ![]() List of Environmental Variables | |||||||
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=601
| ||||||||
[Append to This Answer] | ||||||||
2005-Apr-15 9:03am | ||||||||
![]() |
![]() ![]() ![]() Our developers wants to know if Appx has Dharma JDBC Driver? | |||||||
Appx doesn't have Dharma JDBC driver, but does have Dharma ODBC driver. Depends on what users are trying to do/access. The AppxODBC driver (Dharma ODBC) lets you read/write Appx-hosted data (that is, data stored in an AppxIO file) from some other application, i.e. Access, SQL, Postress or Oracle. You can certainly use the AppxODBC driver with a Java program. AppxODBC will function as a type 1 JDBC driver. A type 1 driver uses the JDBC/ODBC bridge to connect a Java application to an ODBC data source (a very common practice). Type 1 drivers don't perform as well as a type 4 driver, but that may not be a problem (in fact, given the performance of a typical Java application, the difference between a type 1 driver and a type 4 driver may be undetectable). When you use the JDBC/ODBC bridge, the JDBC URL is structured like this: jdbc:odbc:appxodbcIf you want to include the username and password in the URL: jdbc:odbc:appxodbc;UID=appx;PWD=password | ||||||||
[Append to This Answer] | ||||||||
2005-Feb-08 9:11am | ||||||||
![]() |
![]() ![]() ![]() Is there an environment variable that records a log of the user interface? | |||||||
Yes, there is. The variable is APPX_UI_LOG APPX_UI_LOG. It records a log of the user interface - the log contains a mix of screenshots and the keys that you typed in order to produce those screenshots. It also contains a prefix that describes how to use the log. Here's a sample (screenshot is stripped out):
--------------------------------------------------------------------------------
... screen shot goes here ... | ||||||||
[Append to This Answer] | ||||||||
2005-Apr-15 9:02am | ||||||||
![]() |
![]() ![]() ![]() What is APPX_OLD_MODES variable for? | |||||||
APPX_OLD_MODES If APPX_OLD_MODES is defined, the input process interpreter uses the old set of rules when switching modes in a non-scrolling input process (the old rules say that, when you switch modes, you should move into Key Entry and lose the previous key value). | ||||||||
[Append to This Answer] | ||||||||
2005-Apr-15 9:05am | ||||||||
![]() |
![]() ![]() ![]() Do record locks display when files are in RDBMS? | |||||||
Appx can't display lock information when it encounters a record lock in a file
stored in an RDBMS. If you're using MS SQL Server, you can use the Enterprise
Manager to view record locks.
| ||||||||
[Append to This Answer] | ||||||||
2005-Jul-22 3:30pm | ||||||||
![]() |
![]() ![]() ![]() Oracle 9i Performance issues | |||||||
Oracle 9i, specifically release 9.2.04 has problems determining which index to use when executing certain queries. In other words, Oracle sometimes uses the wrong index or sometimes uses no index resulting in potentially severe performance problems for some APPX processes. The good news is that this problem is supposedly fixed in release 9.2.06.
| ||||||||
[Append to This Answer] | ||||||||
2005-Jul-26 9:04am | ||||||||
![]() |
![]() ![]() ![]() I have an existent RDBMS table and i want to use Field Override feature in the FMS group settings, can i do that? | |||||||
No, you can not. Field override fature doesn't apply to an existent table.
This feature can be used when you "Create" File or "Restructure" File only.
| ||||||||
[Append to This Answer] | ||||||||
2005-Sep-08 2:13pm | ||||||||
![]() |
![]() ![]() ![]() Accessing 2 different schema's defined for 1 instance of Oracle | |||||||
I have 2 database IDS: XXX and YYY and I have 2 different schemas defined in Oracle called SCHEMA1 and SCHEMA2. I want XXX to access SCHEMA1 and YYY to access SCHEMA2. It is necessary for me to have 2 different schemas because we use triggers extensively and they all reference tables that begin with XXX.
Therefore, I need to have the exact same names for the tables under both database IDs. I have 2 FMS groups defined: oracle1 and oracle2. The server name is oracle for both. The table naming scheme for oracle1 is $db_$appl_$file. For oracle2 it's XXX_$appl_$file (which would make the table names identical for the 2 different schemas). From Appx's main menu, i choose "Run Application" and put XXX for my database name. Everything runs jsut fine. Then I back up to the Appx main menu and choose Run An Application again. This time I use YYY for the database ID. But when I go into different applications, I actually see the records from XXX. I'm only running 1 instance of Oracle but each database ID should be accessing different schemas. It looks like once you access a particular schema, it stays within that schema rather than changing whenever you enter a new database ID. _____________________________________________________________________________ The solution to the problem would be is to add schema name to the each of the FMS groups that you have defined (i.e. schema1.$db_$appl_$file for one and schema2.XXX_$appl_file for the other). By doing so, you will be telling the system which schema name to use when you switch between the databases.
| ||||||||
[Append to This Answer] | ||||||||
2005-Sep-20 2:12pm | ||||||||
![]() |
![]() ![]() ![]() What is the default field mapping for RDBMS? | |||||||
For Oracle the mapping is hard-coded.
For ODBC (and DB2), the mapping depends on what the engine finds at run time. Appx asks the backend database for a list of data types and then tries to find the closest match for each field.
For Oracle (with Appx 4.2.8):
Appx field type = Alpha or Logic if the field is a key segment , Appx builds a CHAR(n) column
if the field is less than 6 character long, Appx builds a CHAR(n)column,
otherwise, Appx builds a VARCHAR(n) column
Appx field type = Date for CCYYMMDDhhmmss key segments, Appx builds a VARCHAR(14) column
for CCYYMMDDhhmmss non-key fields, Appx builds a DATE column
for all other date components, Appx builds a VARCHAR(n) column
Appx field type = Numeric (binary) if field length = 1, Appx builds a NUMBER( 3, 0 ) column
if field length = 2, Appx builds a NUMBER( 5, 0 ) column
if field length = 4, Appx builds a NUMBER( 10, 0 ) column
Appx builds a NUMERIC( x, y ) column | ||||||||
[Append to This Answer] | ||||||||
2005-Oct-05 8:49am | ||||||||
![]() |
![]() ![]() ![]() Known issue with SQL Server SP4 | |||||||
Here's an article that discusses the problem (locking pages instead of row):http://support.microsoft.com/?kbid=899976The root of the problem is that MS changed some of the optimizer rules in SP4 so SQL Server is choosing an index scan over an index seek and locking way too many records as a result. In particular, since Appx creates parameterized queries, the SQL Server optimizer can't know (at the time that it plans the query) that the data type of a parameter matches the data type of the corresponding column. For example, Appx may generate a query like: SELECT * FROM appx_dmo_prospect WHERE prospect_no = ? Where the '?' is a parameter marker. SQL Server plans the query based on that text - it doesn't know the value of the parameter at planning time. Instead, each time we execute that plan, we provide a different value for the parameter. In SP4, SQL Server is taking a cautious approach and assuming that the data type of the parameter may not match the data type of the column and therefore, it scans (and locks) the whole index instead of seeking directly to the desired row (and locking only that row). You can get around this problem (without rolling back to SP3) by following "Method 2" in the article above (don't forget to stop and re-start the server after adding the startup parameter). | ||||||||
[Append to This Answer] | ||||||||
2005-Oct-05 8:53am | ||||||||
![]() |
![]() ![]() ![]() Storing NULL/blank values in SQL files | |||||||
We encountered an issue when using APPX SQL files, moving from version 4.0.9 to
4.2.6 of APPX. In 4.0.9, empty fields without data were blank. In 4.2.6, these
fields are NULL. This is causing problems with other applications that access the
shared SQL tables, whose logic is checking for IS NULL.
Is there a way to have blank fields retain a value of blank, rather than be NULL in SQL Files?
No, currently there is no way to control that behavior.
| ||||||||
[Append to This Answer] | ||||||||
2005-Oct-12 9:29am | ||||||||
![]() |
![]() ![]() ![]() A Handy list of RDBMS commands for various RDBMS's | |||||||
We often get support requests that require interacting with an RDBMS. Need to ANALYZE STATISTICS? View a table definition? Analyze a query? In Oracle?
DB2? SQL Server? Here's a handy list of RDBMS commands for various RDBMS's. http://troels.arvin.dk/db/rdbmsIn particular, you'll probably find this section very useful: http://troels.arvin.dk/db/rdbms/#cli | ||||||||
[Append to This Answer] | ||||||||
2005-Oct-17 9:05am | ||||||||
![]() |
![]() ![]() ![]() How to get a list of the files in which your Appx session holds record locks? | |||||||
The .FM_GET_LOCKS engine function will populate a memory file with a list of file names - each name corresponds to a file that your session holds a lock in. You may hold more than one lock in any given file (the record count and primary keys are *not* stored in the memory file).
To obtain the list:
PASS 0DB PATH FILE SHARE? Y Here's the layout of the 0DB PATH memory file:
Dsp -Options-- Since you're using this function as a diagnostic tool, you're mostly interested in the PATH FI NAM.
You might want to add this function to your DIRECT PROCESS 1 process
so you can view a list of locks from anywhere within your application. You may also want to add a | ||||||||
[Append to This Answer] | ||||||||
2005-Oct-19 10:52am | ||||||||
![]() |
![]() ![]() ![]() How can I produce an Appx Event Log? | |||||||
You can set environment variable APPX_USAGE_LOG to a file name. for more information please take a look at: http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=819 | ||||||||
[Append to This Answer] | ||||||||
2005-Oct-19 3:20pm | ||||||||
![]() |
![]() ![]() ![]() TCP Keep-alive registry entries | |||||||
These should appear in HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<service name>\Config TCPEnableKeepAlive Y TCPKeepIdle 300 TCPKeepInterval 60 TCPKeepCount 8 Tthe values shown are the default values, those values are installed when you create a new service and they are also the values that we use if the entries are missing from the registry. | ||||||||
The AppxDSvc installer only writes a Config entry if it differs from the default value. That means that the installer won't write out entries for the TCPKeepXXX values, but AppxDSvc will pretend like those values are present (and set to their default values). You can add the entries manually if, for some reason, you want to change the defaults. | ||||||||
Setting Argument Default What it does ----------------------- --------------- ------- ----------------------------------------------- TCPEnableKeepAlive true or false true Enable dead connection detection TCPKeepIdle (seconds) 300 Idle time before starting to send pings TCPKeepInterval (seconds) 60 Interval between keepalive pings TCPKeepCount (count) 8 Count of keepalive ping attempts before closing The time before a server session closes would be the combination of all of these. Here is what happens. After 300 seconds of idle time the server TCP stack will start trying to ping the client TCP stack. The server will make 8 attempts to ping the client and get a response before giving up and closing. It will wait for 60 seconds after each ping attempt for a reply before sending the next ping. So in this case it will be 300 seconds + ( 8 * 60 seconds ) = 780 seconds = 13 minutes before the server session goes away. | ||||||||
appxd has environment variables for these settings as follows: APPXD_DISABLE_KEEPALIVE set to anything will turn off the keepalive code. APPXD_KEEPIDLE = TCPKeepIdle APPXD_KEEPINTERVAL = TCPKeepInterval APPXD_KEEPCOUNT = TCPKeepCount | ||||||||
[Append to This Answer] | ||||||||
2007-Aug-07 4:29pm | ||||||||
![]() |
![]() ![]() ![]() Why is my sqlcmd log is truncated? In prior versions, I've seen logs with create table lines in excess of 3000 char? | |||||||
In 4.2.something-recent, APPX changed the logging package used by the APPX_SQL_CMD log. In older releases, Appx just used a straight fprintf() to write all log information to a flat ascii file. IN 4.2.something-recent, APPX switched the APPX_SQL_CMD log over to the new logging package that most of the engine uses. The new logging package lets you send a log to: 1) the windows event log 2) a pipe 3) a gzipped flat ascii file 4) an AppxIO data file 5) stdout 6) a flat ascii fileThe logging mechanism is determined by the name of the log file. 1) If the log file name ($APPX_SQL_CMD) is EVENT or EVENTLOG, we write it to the windows event log. 2) If the log file name begins with a '|', we consider it a pipe. 3) If the log file name ends with .z, .gz, or .zip, we consider it a gzipped file 4) If the log file name ends with .dat, we consider it an AppxIO data file 5) If the log file name is '-', we write the log to stdout 6) Otherwise, the file is a flat ascii file (if the log file name ends with '+', it's a flat ascii file, but we append to the end of the file instead of creating a new one) We trim each line to 1024 characters for gzipped files, the windows event log, and AppxIO data files. We don't trim flat ascii files or pipes so you should get long lines unless your log file name matches one of the other categories. If Appx is really trimming flat ascii logs (or pipes), that's a bug and I'll track it down. The customer can also see the commands generated by Appx by looking in the Oracle client/server log (maybe even in the Oracle error log if he just wants to see the errors) or the Oracle Alert Log. | ||||||||
[Append to This Answer] | ||||||||
2005-Dec-06 10:04am | ||||||||
![]() |
![]() ![]() ![]() Oracle Instant Client and Appx | |||||||
Try and start appx in character mode. Run the character mode client because the error will not be displayed if you are running the Appx Desktop Client (java client). The appx.oracle engine might give you an error such as: ==================================== # /vg01/appx.426/appx.oracle /usr/lib/dld.sl: Can't open shared library: /vg01/oracle/oracle-9/OraHome1/lib32/libclntsh.sl.9.0 /usr/lib/dld.sl: No such file or directory Abort # ==================================== You could also run the command (if you have it on the system of course) ldd:
==================================== =>/usr/lib/dld.sl: Can't open shared library: /vg01/oracle/oracle-9/OraHome1/lib32/libclntsh.sl.9.0 /usr/lib/dld.sl: No such file or directory
An alternative to ldd is strace and truss, here is the syntax I've used. However, none of these tools (ldd, strace, truss) should be needed, just attempting to start APPX in character mode should expose the missing oracle library and library path.
====================================
# grep libclntsh /tmp/appx.oraacle.out
You should get something back such as:
Then you should be able to start appx. If APPX complains about another
If you don't have the Oracle 9 Client library installed, you won't find
In that case you would create a directory and create a link with the
That way APPX built against Oracle 9, would see the Oracle 10 client
| ||||||||
[Append to This Answer] | ||||||||
2005-Dec-06 1:32pm | ||||||||
![]() |
![]() ![]() ![]() Is Appx a multi-threaded Application? WIll it take advantage of multiple CPUs? | |||||||
The answer to this questions is No and Yes*. Appx is not multi-threaded, but to an appx environment is usually enhanced by multi processors, because the os would normally spead processes accross the available processors. | ||||||||
[Append to This Answer] | ||||||||
2006-Jan-27 2:27pm | ||||||||
![]() |
![]() ![]() ![]() How to set the APPX_SQL_CMD to obtain a log of RDBMS activity. | |||||||
To gather timing statistics using the Oracle, Sybase, or ODBC interfaces you
must set the following environment variables prior to invoking Appx:
APPX_SQL_CMD=/... /rdbms.log (Unix users prefix with $ export) For details on reading the log, see http://board.appx.com/faq/cache/633.htmlAPPX_DBG_CODE=0x10000 (Unix users prefix with $ export) For details on setting the variable to control the contents of the log, see http://board.appx.com/faq/cache/634.html | ||||||||
[Append to This Answer] | ||||||||
2006-Jul-07 2:03pm | ||||||||
![]() |
![]() ![]() ![]() How to read the APPX_SQL_CMD Log | |||||||
How to set the APPX_SQL_CMD to obtain a log of RDBMS activity, see http://board.appx.com/faq/cache/632.html
For details on how to set the APPX_DBGL_CODE to log specific RDBMS activity, see http://board.appx.com/faq/cache/634.html Reading the SQL Log file Please note the Tips and Techniques section below for information on what to look for in this log. After your benchmark run, the /tmp/rdbms.log file will contain a set of entries similar to:
00 - 0000072.0797031 0000000.0057123 05000 01 - 0000076.0737460 0000000.0043817 10001 02 - 0000000.0000000 0000000.0000000 00000 03 - 0000000.0000000 0000000.0000000 00000 04 - 0000000.0022587 0000000.0022573 00002 05 - 0000000.0000000 0000000.0000000 00000 06 - 0000026.0281965 0000000.0031189 05001 07 - 0000002.0012514 0000000.0012999 15003 08 - 0000000.0000000 0000000.0000000 00000 09 - 0000000.0000000 0000000.0000000 00000 10 - 0000000.0017440 0000000.0017440 00001 11 - 0000024.0951585 0000000.0022819 05000 You will have one entry for each table accessed by Appx (there may be multiple entries for some tables - we log statistics each time we close a table). Each entry contains an array of 12 rows and 4 columns. The columns (from left to right) represent:
operation type cumulative time spent performing that operation for that table longest operation of that type for that table number of operations of that type for that table
The rows are: 00 - Read operations 01 - Readnext operations 02 - Write operations 03 - Rewrite operations 04 - Open operations 05 - Reread operations 06 - Search operations 07 - Release operations 08 - Search by primary key operations 09 - Search by alternate key(s) operations 10 - Position to start of table operations 11 - Search by row identifier operations Dissecting the first row of the above example:
00 - 0000072.0797031 0000000.0057123 05000 The operation type is '00' or "Read". We spent a little over 72 seconds performing Read operations against this table. The longest read took .0057123 seconds, and we performed exactly 5000 reads. Some of operation types are composites: for example, a READ statement is accomplished by performing a Search followed by a Readnext. So you can see in the above example that we performed 5000 reads, comprised of 5000 Searches and 5000 Readnexts. 00 - Read operations
As mentioned above, a Read is performed whenever Appx needs to retrieve a record by a specific key value. A Read is accomplished by performing a Search followed by a Readnext, so you should have at least as many Searches and Readnexts as you have Reads. 01 - Readnext operations
A Readnext is performed whenever Appx has established a Search position within a file and then needs to retrieve the record following that position. A Readnext will be performed for READNEXT, BEG/END READ, and READ statements as well as for most PCF operations. 02 - Write operations
A Write operation is equivalent to a WRITE statement - it causes a row to be INSERTed into a table. 03 - Rewrite operations
A Rewrite operation is equivalent to a REWRITE statement - is causes an SQL UPDATE statement to be executed. 04 - Open operations
This entry reflects the amount of time required to open a table. It includes querying the RDBMS data dictionary and performing all internal bookkeeping. The time required for this operation is usually negligible. 05 - Reread operations
Since Sybase does not perform row-level locking, Appx must simulate locking outside of the Sybase server. The algorithm used to simulate locking requires reading every locked record twice: once to retrieve the key values and once to read the rest of the record. A Reread operation reflects the second read. There should be one Reread operation for each record held. 06 - Search operations
A Search operation is performed whenever Appx needs to position to a specific key value. Searches are usually (but not always) performed by a Readnext operation and are usually part of a BEG AT or READ operation. Search operations are further divided into "Search by primary key", "Search by alternate key(s)", "Position to start of table", and "Search by row dentifier operations". In the above example, you can see that we performed 5001 searches: 1 position to start-of-table and 5000 read by row-id's. 07 - Release operations
A Release operation is performed whenever Appx releases a hold on a locked record. Appx will try to release holds on records which were not locked - the overhead is negligible and does not cause any i/o. 08 - Search by primary key operations
This a subdivision of the Search operation. It reflects the number of Search operations which specify a primary key value. In Sybase - primary keys are implemented as a clustered index. 09 - Search by alternate key(s) operations
This a subdivision of the Search operation. It reflects the number of Search operations which specify an alternate key value.10 - Position to start of table operations
This a subdivision of the Search operation. It reflects the number of Search operations which position to the first row in an index (as opposed to a specific key value). 11 - Search by row identifier operations
This is a subdivision of the Search operation. Whenever Appx reads a row from a table, it remembers the row-identifier (in the case of Sybase, the row-id is the primary key). If Appx needs to reposition to that row, it will use the row-id. An Appx query process works by recording the row-id's of all records which meet the query constraints and then re-reading the results using the row-id's. The above example was produced by selecting 5000 out of 5000 records in a query process.
When you are examining a statistics log, you should pay particular attention to two results:
1) The amount of time spent on 00 (Read), 01 (Readnext), 02 (Write), 03 (Rewrite), 05 (Reread), and 06 (Search) operations.
2) The number of operations performed against each file compared to the number of operations performed against the PCF. The first statistic will help identify which files are consuming the most amount of time. The second will help identify which files may be processed too frequently.
The "longest operation" column should be roughly equal to cumulative/count - if it's off by more than a factor of 10, it may be worth exploring - of
the 'count' operations, (at least) one of them took much longer than the rest.
| ||||||||
[Append to This Answer] | ||||||||
2006-Jul-07 1:59pm | ||||||||
![]() |
![]() ![]() ![]() How to set the APPX_DBG_CODE to log specific RDBMS activity | |||||||
The APPX_DBG_CODE environment variable controls the amount of information written to the APPX_SQL_CMD log file. APPX_DBG_CODE is a 32-bit bit mask - if a bit is on, the corresponding information will be logged. Here are the current (01/22/98) bit definitions: 0x00000001 - Log all generated SQL commands 0x00000002 - Log status codes returned from server (*) 0x00000004 - Log all fetch attempts (*) 0x00000008 - Log all engine level operations (*) 0x00000010 - Log all connection-related operations (*) 0x00000020 - Log binding summary (*) 0x00000040 - Log binding details (*) 0x00000080 - Log column/field mappings 0x00000100 - Enable server logging mechanism (Oracle only) 0x00000200 - Enable result (null/non-null) logging (*) 0x00000400 - Log negotiations for server options (such as packet size) 0x00000800 - Log all records returned from server 0x00001000 - Currently undefined 0x00002000 - Log proxy locking operations (Sybase/ODBC only) 0x00004000 - Time individual operations (use 0x10000 instead) 0x00008000 - Enable server-side statistics (if capable) 0x00010000 - Gather per-table timing statistics 0x00020000 - Enable "show plan" feature on server, generates voluminous logs 0x08000000 - Write server-based log to "/tmp/syblog" (Sybase only) 0xFFFFFFFF - Logging all activity Definitions marked with (*) are for internal debugging purposes only - they provide very little useful information. | ||||||||
[Append to This Answer] | ||||||||
2007-Apr-30 6:59pm | ||||||||
![]() |
![]() ![]() ![]() Which external DB still require the proxy database id "LOK" to be set? | |||||||
Proxy DB id of LOK is still required fro MS Access, Postgress, MySQL adn possibly DB2
| ||||||||
[Append to This Answer] | ||||||||
2006-Jul-26 12:01pm | ||||||||
![]() |
![]() ![]() ![]() Orphan Session Detection and possible causes | |||||||
1) Server task is running some loop (endless or lengthy).
For the duration of the loop, if there is no screen feedback or client
communication attempt and fail, then the potential for left over server side
processes exists. 2) Server task is running a long process. For the duration of the long process, if there is no screen feedback or client communication attempt and fail, then the potential for left over server side processes exists ---* until the long process finishes, at that time there would usually be a client communication attempt. If the communication attempt fails, then the server side session would die. 3) Server task is sitting at a menu. If the client dies, then this WILL leave a server side process running. 4) Server task is waiting on a record lock. If the record lock does not update the client, then when the client drops off unexpectedly, there will be a server side process left. These are known behaviors it seems. | ||||||||
[Append to This Answer] | ||||||||
2007-Jan-26 9:09am | ||||||||
![]() |
![]() ![]() ![]() Where can i find information on your Language Translation? | |||||||
Information regarding Language Translation and Language Translation Manual is available on our website: http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=558 | ||||||||
[Append to This Answer] | ||||||||
2007-Feb-28 12:31pm | ||||||||
![]() |
![]() ![]() ![]() New Item | |||||||
[Append to This Answer] | ||||||||
2009-Mar-23 8:20am | ||||||||
![]() |
![]() ![]() ![]() Merge and Replace application data files with the Database Management Import utility. | |||||||
You have two options for importing data into an Appx application data file, Merge and Replace. Both options require an import file matching the specifications of the application file. The import file must reside in the Portdata directory for the application.
The Replace option (defualt) initializes the existing application file and then reads and writes all the records from the import file into the application file. Similarly, merge writes records to the application file from the merge file however the application file is not initialized. If the primary key value in the import file and application file match, then the application file record is replaced with the record from the import file. If the primary key value from the import file is not found in the application file then the import file record is added to the application file. The only time a matching primary key record is not replaced is when there is a unique alternate key defined and the unique key value exists in another application file record.
Records in the import file are fixed length and should not be altered before importing. We recommend backing up your application file .dat and .key file before importing records. The application file should be free of structure errors prior to importing records.
| ||||||||
[Append to This Answer] | ||||||||
2009-Sep-04 5:38pm | ||||||||
![]() |
![]() ![]() APPX Installation & Configuration | |||||||
Questions relating to the installation and configuration of APPX on the various supported platforms.
| ||||||||
Subcategories:![]()
Answers in this category:
| ||||||||
[New Answer in "APPX Installation & Configuration"] | ||||||||
2006-Feb-16 9:53am | ||||||||
![]() |
![]() ![]() ![]() Printing | |||||||
Questions related to printing
| ||||||||
Subcategories:
Answers in this category: | ||||||||
[New Answer in "Printing"] | ||||||||
2006-Sep-27 10:43am | ||||||||
![]() |
![]() ![]() ![]() ![]() Print files truncated | |||||||
Customer has Laser and Matrix printers. Laser print fine, but matrix truncates Appx reports after 8" (20cm). Other applications print OK to the matrix printers.
This is probably a problem with the printer driver default truncating at 8". To get around this, put into 'Printer Options' for the printer in question: -form_id="U.S. standard fanfold"This should give either 132 characters across or 13.2" (33.5cm) wide reports.
(The above parameter was obtained from loading the DOS prompt in the data directory containing Winprint.exe, then typing "winprint". This gives you all possible Winprint parameters/switches.)
| ||||||||
See also:
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-16 2:40pm | ||||||||
![]() |
![]() ![]() ![]() ![]() Is the 'mpage' program required to print text files from the 4.2.4 client? | |||||||
Look for the following section in appx_print. Remove or comment it out. If you are doing client-side printing, appx_print will be in the client install directory. Otherwise, look for it in the $APPXPATH directory on the server. This is only for non-windows operating systems. Windows client and server systems do not use mpage or appx_print. # # default format if one wasn't specified # if [ "$FORMAT" = "" ] then FORMAT="MPAGE" fi | ||||||||
[Append to This Answer] | ||||||||
2004-Jul-09 4:52pm | ||||||||
![]() |
![]() ![]() ![]() ![]() I just installed Appx 4.2.4 On SunOS 5.8 and have a problem with printing | |||||||
I looked in my appx_print.last log and found an error: /appx/appx424/data/appx_print: syntax error at line 632: `count=$' unexpected.
You need to modify your appx_print script and replace born shell (/bin/sh) with korn shell (/bin/ksh). | ||||||||
[Append to This Answer] | ||||||||
2004-Aug-19 9:46am | ||||||||
![]() |
![]() ![]() ![]() ![]() What is the maximum size of a report? | |||||||
A customer was running a "large" report to the screen, and got a C-Assert:
Module: RT.C.4903
| ||||||||
[Append to This Answer] | ||||||||
2007-Jun-22 2:17pm | ||||||||
![]() |
![]() ![]() ![]() How do I determine the CPU serial number on Linux platforms? | |||||||
One of the required fields when requesting an APPX for Linux license key is the "serial number" of your Linux system. APPX uses the MAC Address of the ethernet adapter configured at eth0 as a "serial number". You must enter this serial number when requesting a license key. If you don't know the MAC Address, it is easily obtained. Simply enter the following command from the Linux command line:
# /sbin/ifconfig -a
eth0 Link encap:Ethernet HWaddr 00:50:56:A6:4F:CB | ||||||||
[Append to This Answer] | ||||||||
2003-Nov-17 3:51pm | ||||||||
![]() |
![]() ![]() ![]() How do I determine the CPU serial number on Unix platforms? | |||||||
When installed on a Unix server, the APPX license is tied to the serial number of the machine on which APPX is installed. The method of obtaining the serial number varies by platform:
IBM RS/6000 AIX and HP 9000 HP-UX
SUN Solaris
NCR and SCO
Linux
HP9000 HP-UX: http://www.appx.com/ftp/appx/support/utilities/hostinfo/info-hp.tar.Z
Note: A foolproof way of determining that you have the correct serial number on any platform is to start APPX. Without a valid license, the system will display the serial number it finds on the machine. If APPX is running, serial number and license information is found in System Administration.
| ||||||||
[Append to This Answer] | ||||||||
2003-Nov-18 10:06am | ||||||||
![]() |
![]() ![]() ![]() How do I determine the CPU serial number on Windows platforms? | |||||||
When installed on a Windows server or stand-alone PC, the APPX license is tied to the serial number of the C-drive of the machine on which APPX is installed. That is, even if you are installing APPX on the D-drive (or any other drive), it is still the C-drive serial number that is required.
To determine the serial number, exit to a DOS (command) prompt, and type the command "dir c:\ /p" (without the quotation marks, of course). This will display the first page of a directory listing for the root directory of the C-drive. The second line displayed will contain the serial number, like this: Volume Serial Number is 1A2B-C3D4 That is the number that APPX requires, but it will be reformatted when entered on your license and when displayed by APPX. APPX makes three alterations to the serial number: Add a leading zero and hyphen Change all upper-case letters to lower-case Remove the hyphen between the two groups of characters So, the serial number 1A2B-C3D4 will be entered and displayed in APPX as 0-1a2bc3d4.
| ||||||||
[Append to This Answer] | ||||||||
2003-Nov-17 3:49pm | ||||||||
![]() |
![]() ![]() ![]() What operating system versions are required to run APPX? | |||||||
APPX 4.2
Risc Processors:
Intel & Intel Compatible Processors: | ||||||||
APPX 4.1
Risc Processors:
Intel & Intel Compatible Processors: | ||||||||
[Append to This Answer] | ||||||||
2007-Feb-08 2:45pm | ||||||||
![]() |
![]() ![]() ![]() Which TCP/IP ports are used by APPX? | |||||||
The APPX Connection Manager is the only component of APPX that utilizes a TCP/IP port.
The APPX Connection Manager "listens" for connection requests on a configurable, TCP/IP port. The APPX Connection Manager can be configured by a system Administrator to use the port of your choice. The default port is 8060. On Unix and Linux, the APPX Connection Manager (appxd) runs as a daemon and is typically started by running $APPXPATH/../tools/start-appxd.sh. The desired TCP/IP port can be configured by editing this script.
On Windows, The APPX Connection Manager (appxdsvc.exe) runs as a service. The desired TCP/IP port can be configured via a command line argument when the service is started.
| ||||||||
[Append to This Answer] | ||||||||
2003-Nov-05 6:22am | ||||||||
![]() |
![]() ![]() ![]() How do I upgrade APPX 3.5 or 4.0 to version 4.1? | |||||||
The following should get you from Appx {3.5 or 4.0} to {4.1 or 4.2} pretty directly: | ||||||||
1) Confirm that your "MNT" (maintenance) registration cutoff date on your 2nd registration screen has not expired.
2) Download Appx 4.1 from our www.appx.com > Downloads > APPX Server Releases.
3) Run setup.exe (Windows) or install.sh (Unix), overlaying 4.1 on top of 4.0. 4) Delete all EM and Dbg directories ($APPXPATH/*/*/EM and $APPXPATH/*/*/Dbg) for all of your Design Files and the Appx 0-App files. 5) Scratch all '$APPXPATH/*/Tmpdata' directories. 6) Create system files new to 4.1: Run System Administration > System Setup > System Administration File Management > Create Files.
7) Go to System Administration > Database/Applications > Applications. 8) Optionally run "Create Executable Modules" while on the Design File Management screen.
9) For users using the GUI Appx/Client, download and install the current 4.1 Appx Java Client onto their PCs. 10) Once 4.1 is operational, update its Structure files to prevent future export/import problems:
10a) Delete each Application's APPXPATH\vv\aaa\Struct directories and their contents, where aaa\vv is your ApplicationID/Version#.
10b) Run System Administration > Database/Applications > Applications > Design File Management > Create Files, for each Application/Version pair, to recreate its Structure files. | ||||||||
[Append to This Answer] | ||||||||
2005-May-19 3:25pm | ||||||||
![]() |
![]() ![]() ![]() Where does APPX create temporary disk files? | |||||||
APPX applications routinely create temporary disk files. Temporary disk files include files explicitely created by an application as well as files automatically created by APPX while processing a query. When an APPX application needs to create temporary disk files, APPX creates those files in a special directory. The directory where APPX creates temporary disk files is:
$APPXPATH/aaa/Tmpdata
where: | ||||||||
[Append to This Answer] | ||||||||
2003-Nov-10 12:54pm | ||||||||
![]() |
![]() ![]() ![]() How to set up License Servers under Novell thick client. | |||||||
Novell is usually a thick client install. You do not necessarily need a hasp, but you do need a consistent serial number. With the hasp installed on the server you can have the license server started there and all should work, but Novell releases after 3.x won't let you run server applications unless installed as an NLM or similarly.
For Novell installations without a hasp, you can pick a single user's PC to act as the license server. Get the hard drive serial number for the license. Set up to run appx -l=c:/licenselog.txt in the Windows startup. You have to make sure this PC is always the first one to start Appx so the license server finds the right serial number. On each client, do a full Appx install, then set the Appx environment variables you will need. You MUST have APPX_0SA_PATH=<location of appx on network drive>. That is what lets you maintain one set of system admin files for users and such. Appx runs locally, but access 0SA on the shared drive. Set up an FMS group for your application according to the links:
FMS Path: R:\APPX\data (where R is the shared drive and path to the network Appx installation) This accesses data on the network drive and creates the EMs on the client PC. This makes the app run faster since the EM does not then need to be copied across the network.
To use the GUI client, just run it using the local tab to point to the client's local copy of Appx.
| ||||||||
There are several special considerations involved when running APPX on Novell. Some are discussed on the following documents:
www.appx.com/assets/asp/dynamic_generator.asp?pageid=608 www.appx.com/assets/asp/dynamic_generator.asp?pageid=626 www.appx.com/assets/asp/dynamic_generator.asp?pageid=695 www.appx.com/assets/asp/dynamic_generator.asp?pageid=707
As long as the hasp is attached, I would not rely on the serial number reported within APPX. The only sure way is to check the c-drive serial number of the server.
| ||||||||
[Append to This Answer] | ||||||||
2003-Nov-11 3:25pm | ||||||||
![]() |
![]() ![]() ![]() Appx Client/Server security considerations | |||||||
Security administrators might examine the following four areas of Appx interface with site security, in an Appx Windows Server installation using the APPX (Java) Client:
- The owner of the WinAppxD process has to be a member of the Administrators group. - The owner of the WinAppxD has a local policy of "Act as part of OS". - APPX users have to have an account on the server.
- SRVANY.EXE is used to run WinAppxD as a service.
| ||||||||
_______________________________________________________________________ ==> WinAppxD acts as a login program. When a client process establishes a connection to WinAppxD, we authenticate the user id and create a process that runs with the security credentials of that user. We don't perform the authentication ourselves, we let Windows do that for us (the client must provide a user id and password and we give those to Windows for authentication). If the user proves his identity to Windows, we use the security token returned to create the child Appx process. I don't think that the WinAppxD must be owned by a member of the Administrators group, but that is usually most convenient. We need the SeTcbPrivilege ("Act as part of the OS") in order to ask Windows to authenticate the user. When we start the Appx server process, it inherits the security context of the user logging in. (That's why each user needs an OS account.) That's all pretty secure. We require a password and user id that is authenticated by Windows. We don't give the Appx server process any privileges other than those held by the user. If we did anything else, we'd be bypassing the Windows security mechanisms. For example, if we supported HTPASSWD authentication, we would have to bypass the normal authentication performed by Windows. ---The WinAppxD service installation procedure that uses SRVANY has been replaced in 4.2 with a much easier to use "AppxDSvc.exe". While we've not added this to our 4.1.a distribution, this utility works very well with Appx 4.1.a. ---APPX HTPASSWD is built into appxd and winappxd.exe in 4.1.a. A Windows htpasswd.exe binary from an Apache 2.0 install is at ftp://customerftp.appx.com/pub/misc/htpasswd/ Also included are instructions on running htpasswd.exe. These can be tested on a Windows 2000 APPX Internet server. The Windows OS user account must exist, but can be disabled (i.e. no password, not just a secret password). One might best be served by reworking his application to use combination of htpasswd and Appx based users, where you could have user tables inside of Appx. ---ecr #6908 | ||||||||
[Append to This Answer] | ||||||||
2003-Nov-11 6:47pm | ||||||||
![]() |
![]() ![]() ![]() How do I setup an APPX/NET client? | |||||||
The APPX/Net Client can be installed and run on a Windows desktop computer. An APPX/Net Client session uses APPX/Net to connect to a remote APPX Server to access all data files.
The only file that needs to be installed on the desktop computer is the APPX/Windows executable (appx.exe). This is the same executable file that is needed when configuring a Windows desktop computer to use the APPX/Win32 Client. The following three environment variables must be set.
APPXPATH=<dir>
where:
Windows PC's can run an APPX/Net Client by setting the appropriate environment variables and then running appx.exe (without the -c command line switch). This can be done in a batch (.bat) file or from a Command Prompt. An APPX/Net client is a "thick client" that actually runs the APPX session on the desktop computer but performs all file I/O through an APPX/Net connection to an APPX FMS Server session runing on the server where APPX is installed.
| ||||||||
Example where: <dir>=c:\appxnet <hostname>=myappxserver <port>=8060 <userid>=joe <password>=please set APPXPATH=c:\appxnet set APPX_DATA_SERVER=myappxserver:8060 set APPX_UID=joe:please c:\appxnet\appx.exe | ||||||||
[Append to This Answer] | ||||||||
2003-Nov-12 2:21pm | ||||||||
![]() |
![]() ![]() ![]() How to connect Appx to Oracle | |||||||
Let's assume we have two different hosts, the Appx server host we'll call appxhost, the Oracle server host we'll call oraclehost. They may or may not be the same machine. (But they perform much better if on the same machine.)
You must install a package called "Oracle Client Software" on appxhost. As of Appx 4.1.a, you must install Oracle Client version 8, the version we built our 4.1.a engine against. (ecr #6417, 7008) Appx connects to Oracle using the Oracle Client software (called the OCI). The OCI must be able to find a few configuration (and localization) files using the $ORACLE_HOME environment variable. (If you don't have $ORACLE_HOME properly defined, Appx displays the error message: "*Oracle initialization failed".) The typical way to define $ORACLE_HOME is to use the oraenv shell script. Just run: ". oraenv" When Appx connects to Oracle, there are three different ways that the OCI can locate the Oracle server: 1) Enter a server name in the Appx/Oracle FMS group (either an Oracle SID, or the name of a remote server as described below). 2) If you leave the server name blank, the OCI uses the environment variable $TWO_TASK to locate a remote server. 3) If you leave the server name blank and $TWO_TASK is not defined, the OCI uses the $ORACLE_SID environment variable to locate a local server. You use $ORACLE_SID when appxhost and oraclehost are the same machine. You use $TWO_TASK when appxhost and oraclehost are different machines. The $ORACLE_SID environment variable refers to an entry in the /etc/oratab file (created by Oracle).
Here's a sample /etc/oratab file: # This file is used by ORACLE utilities. It is created by root.sh # and updated by the Database Configuration Assistant when creating # a database. # # A colon, ':', is used as the field terminator. A new line terminates # the entry. Lines beginning with a pound sign, '#', are comments. # # Entries are of the form: # $ORACLE_SID:$ORACLE_HOME:<N|Y>: # # The first and second fields are the system identifier and home # directory of the database respectively. The third filed indicates # to the dbstart utility that the database should , "Y", or should not, # "N", be brought up at system boot time. # # Multiple entries with the same $ORACLE_SID are not allowed. *:/opt/oracle/product/9.2.0:N The $ORACLE_SID here is 'oracle' and the $ORACLE_HOME is '/opt/oracle/product/9.2.0'. The oraenv script examines the /etc/oratab file._ oraenv uses a command named dbhome to find the $ORACLE_HOME location given an $ORACLE_SID
The $TWO_TASK environment variable refers to an entry in the tnsnames.ora file (located somewhere in the $ORACLE_HOME directory tree)._ Here's a sample tnsnames.ora file: ORACLE.INTERNAL.APPX.COM = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = badger.appx.com)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = oracle) ) )This entry defines a server named ORACLE. It also defines a server named ORACLE.APPX.COM). The body of this entry tells the OCI to find the DBMS server using the TCP protocol to connect to the listener running on port 1521 at badger.appx.com. You can refer to this server as 'oracle' or 'oracle.appx.com'. The OCI supports many different protocols. TCP is probably the most common. On Windows machines, you'll find named-pipe servers. The fastest transport mechanism (which can only be used for local servers) is the bequeath adapter which uses shared memory to communicate between the client (appx) and the server (oracle). Here's our recommendation for finding all of the magic values you need:
1) If you know your Oracle server is installed on the same machine as your Appx server, a) Examine the /etc/oratab file to find your Oracle SID2) If you know your Oracle server is installed on a remote host, a) Examine the /etc/oratab file to find your $ORACLE_HOME. (In this case, $ORACLE_HOME will tell the OCI where to find config files.)-- | ||||||||
Using the APPX/Oracle Connection, providing APPX/Oracle connection setup and
operation instructions:
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=605 How to Debug an APPX/Oracle Connection:
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=682................................................................................ | ||||||||
[Append to This Answer] | ||||||||
2003-Nov-13 7:00pm | ||||||||
![]() |
![]() ![]() ![]() "bad portable file - non-blank character found between portable fields" | |||||||
If you get this when importing end-user data into Appx, this means that Appx was looking for incoming \Portdata data in one format (as determined by the Appl Design's DD), but the Portdata didn't match that DD format. In other words, the importer was expecting a blank that separates individual fields being imported, but instead got a non-blank value and is saying "hold on, let's take a look at this".
The easiest diagnosis in this case is to enter a couple of records into the AppxIO data for the file with the problem, then export it and run it through 'appx -e={filename}' to get it into an ascii readable format. Then, run the problematic Portdata/{filename}.dat through 'appx -e={filename}' (renaming as needed). Then, compare them against each other, comparing the ascii data format Appx was expecting to receive (the data just entered) against the ascii data you were attempting to import. | ||||||||
If you get this error when attempting to import Application Design files, a step was probably missed a while back on the machine from which you're trying to import, when upgrading from Appx 4.0 to 4.1. (See ![]()
To fix this problem, scratch all the Design file "./data/*/*/Struct/" directories on the machine you're trying to import from *EXCEPT* the 0-app /Struct directories. Then run 'File Create' on all those Application Designs, to recreate those Struct libraries. Then re-export your "import from" machine's Design files, transport them to the "import to" machine's Portdata directory, and try the import again.
| ||||||||
[Append to This Answer] | ||||||||
2003-Nov-18 11:55am | ||||||||
![]() |
![]() ![]() ![]() How to install HASP on a windows system | |||||||
Please refer to:
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=626
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-16 1:58pm | ||||||||
![]() |
![]() ![]() ![]() How to install HASP on a Unix/Linux system | |||||||
Please refer to:
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=633
| ||||||||
[Append to This Answer] | ||||||||
2004-Jan-16 1:59pm | ||||||||
![]() |
![]() ![]() ![]() What is “xtra-gui”? | |||||||
The APPX installer refers to a package called "xtra-gui" for running a graphical interface from a Windows desktop. What is this for and where do I get it?
The reference to "xtra-gui" can be ignored. There is no package by this name to install when installing APPX on a server. The reference will be removed from the installer text.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-09 1:42pm | ||||||||
![]() |
![]() ![]() ![]() Can I install APPX to a mapped drive? | |||||||
No, APPX should never be installed to a mapped drive. This has been known to cause serious problems.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-25 10:11am | ||||||||
![]() |
![]() ![]() ![]() I am trying to connect to the APPX Demo server but get the message "Connection refused by host". | |||||||
First, APPX has to verify that the demo server is accepting connections. If it is, then check your corporate firewall. If possible, you might want to open up port 8064. The client also requires a "random" high-numbered port so those ports also need to be open.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-25 10:20am | ||||||||
![]() |
![]() ![]() ![]() What software do I need on the client PC in addition to APPX running the WinAppxD Daemon? | |||||||
Windows NT, Windows 95 or Windows for Workgroups 3.11.
The TCP/IP network protocol. The APPX client uses TCP/IP to communicate with APPX Presentation Server. If the client is a Windows 95 machine, and you EVER anticipate sharing the network drive containing the APPX application data files and running appx.exe (not appx -c) at the client with APPXPATH set to that network drive, you MUST install the Windows 95 network file redirector fix provided by Microsoft at
http://support.microsoft.com/support/kb/articles/q148/3/67.asp to avoid the potential for APPX data file corruption due to a bug in Windows 95. If you don't do this now, you may forget to do it later, corrupt your data files, and spend hours on problem resolution and recovery. You would not be the first person it's happened to. You have been warned.
NOTE ABOUT URLs: Microsoft periodically rearranges its web site, so the above URL may or may not be valid. If you can't find it, use the "Search" option on the MS web site, instructing it to look in whatever choice includes the "Knowledge Base". Specify "Qnnnnnn" as what to look for, where nnnnnn is the number between the "q" and the ".asp". For example, in the above, it would be Q148367. That should enable you to locate the article. | ||||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:31pm | ||||||||
![]() |
![]() ![]() ![]() How to install WinAppxD? | |||||||
Please refer to;
http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=586
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:34pm | ||||||||
![]() |
![]() ![]() ![]() Where at Microsoft are the instructions for that NT registry patch we need for installing WinAppxD? | |||||||
As documented in the installation instructions, see the following URL for instructions on the registry modification to avoid USER32.DLL initialization errors:
http://support.microsoft.com/support/kb/articles/q142/6/76.asp
NOTE ABOUT URL's: Microsoft periodically rearranges its web site, so the above URL may or may not be valid. If you can't find it, use the "Search" option on the MS web site, instructing it to look in whatever choice includes the "Knowledge Base". Specify "Qnnnnnn" as what to look for, where nnnnnn is the number between the "q" and the ".asp". For example, in the above, it would be Q148367. That should enable you to locate the article. | ||||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:35pm | ||||||||
![]() |
![]() ![]() ![]() What special rights must be assigned to the account used to run the WinAppxD process? | |||||||
As documented in the installation instructions, the account used to run the WinAppxD process should be in that machine's Administrators group, and it should have the following rights assigned to it:
- Act as part of the Operating System - Replace a process-level token - Increase quota - Logon as a service (if it's not already set)
If you do not see these rights in the list box in User Manager, click "Show Advanced Rights" and they should appear, so that you can assign them.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:36pm | ||||||||
![]() |
![]() ![]() ![]() What do we need to do differently if installing WinAppxD on an NT 'member server' instead of on a PDC or BDC? | |||||||
As documented in the installation instructions, the special User Rights that must be assigned to the account you will use to run WinAppxD must be assigned on the member server itself. One way to do this is to sit down in front of THAT SERVER's keyboard and login to the server as the local Administrator, run the "User Manager for Domains" utility, and when you "Select Domain" to administer, type in THE NAME OF THE MEMBER SERVER (not a domain name at all... the _machine_ name... honest!). This connects you to the account database specific to that server. From there, set the User Rights as you would normally.
The extra work is required because of NT security mechanisms. Most NT wizards will not think this is necessary. However, straight from Tier 3 MS phone support, it really is. Setting the rights without connecting to the specific machine will only work if you are running WinAppxD on a PDC or BDC.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:37pm | ||||||||
![]() |
![]() ![]() ![]() I installed WinAppxD for the first time, and it isn't working, what now? | |||||||
Verify that WinAppxD is running. Check the NT Task Manager. If it is not there, see the FAQ " How do I start WinAppxD”.
Verify that you can, directly on the server (without using the "appx -c" client option), login to APPX. Being able to do this is a necessary pre-requisite to being able to login from clients with "appx -c". Go no further in this troubleshooting process until you can successfully login directly on the server as with any standard (non-Presentation Server) APPX for Windows installation. Common things to check if this doesn't work are the APPX_KEYMAP and APPXPATH variable settings and data file permissions. Once you're logged in on the server, check to make sure that you have a Registration license for the APX/GCS product. This is required, to run APPX in APPX Server mode. If when you try to login with a client, you receive an error like "Incorrect login," see the FAQ "Troubleshooting WinAppxD". If, when you try to login with a client, your client session hangs BEFORE showing any APPX screen, make sure you have the following environment variables set in the global System section of User Environment variables on your NT Server:
APPX_SERVER - set to full path of appx.exe APPX_KEYMAP - set to "Windows" APPXPATH - set to your APPX data directory If you change any of these now, reboot the machine to make them take effect, then re-test the client login. If, when you try to login with a client, you get the error "host unreachable" or "host not found", verify that the server's host IP address (or name) and port number specified in the login dialog box are correct. Also check again to make sure that WinAppxD is running. If you have the dialog options set correctly, but WinAppxD exited with an error as soon as it was started, the client will not be able to contact WinAppxD and you will get errors like these. "Host unreachable" is generally misleading because the host is usually there just fine, it's just that WinAppxD isn't listening for connections. To verify that you are using a valid host address that is reachable from the client, go to a DOS command prompt on the client and "ping" the server address you put in the connection box on the APPX client.
If something else is happening, or if you've followed the procedures outlined here and WinAppxD still isn't working, please call APPX Software Technical Support for assistance.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:38pm | ||||||||
![]() |
![]() ![]() ![]() How do I run two versions of WinAppxD in parallel? | |||||||
The trick is that you'll want different values for certain environment variables used by both WinAppxD and APPX itself, for each engine you want to be able to run on the server.
To do this, set up your services to run batch files that set the appropriate environment variables, then launch WinAppxD.exe. (Instead of running the services running WinAppxD.exe directly.) Different services run different batch files, which start WinAppxD's with different ports and other environment variables.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:43pm | ||||||||
![]() |
![]() ![]() ![]() What environment variables must be set on the server? | |||||||
APPX_SERVER - Full path to the appx.exe on the server. Make sure that you reference a drive that is available from the server, not a network drive that is only visible from clients
APPX_KEYMAP - Normally set to "Windows", but you can set it to a different name if you wish to customize the keymap
APPXPATH - Full path to your APPX data directory
These variables MUST be set on the server. New values will not be in effect for any APPX sessions until the server machine is rebooted.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:45pm | ||||||||
![]() |
![]() ![]() ![]() When installing APPX clients using WinAppxD, what do I need to know about the server? | |||||||
The server's IP address. This is obtainable from your network technician or from the "ipconfig" command. You can run
C:> ipconfig /all from a DOS command prompt on the server. If it lists more than one network interface and IP address, ask the network tech. The port the APPX Presentation Server (WinAppxD) has been set to listen on. If you installed APPX Presentation Server, you should know what this is. It is the number you typed after "-s=" when editing the registry entry for WinAppxD. Unless you opted for a different port number because you're running multiple versions of APPX, or because some software at your site was already using the APPX- recommended value, it is probably 8060. Check the registry key:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinAppxD (or WinAppxD2, or WinAppxD3, etc. if you are running multiple versions of APPX) for the number following "-s=" in the "Application" entry.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:52pm | ||||||||
![]() |
![]() ![]() ![]() Can I keep the APPX client .exe file on a server and launch it from across the network on my clients? | |||||||
You can do this UNDER CERTAIN CONDITIONS. Basically, "the" condition is that your network has to be fast, uncongested, stable and reliable. If your network has a slow (less than 1 mbit/sec) communications link somewhere between the server and any clients, we STRONGLY recommend storing the client .exe file locally on each client machine on the far side of the slow link. Similarly, if your routers are not recent, top of the line equipment built for, well, abuse, they may drop net frames on the floor silently when they get busy or when a link (like an Internet or X.25 link) slows down. Basically, remember you are probably working over Ethernet, and Ethernet likes to have no more than half its bandwidth in use at any time. Additionally, some routers still use 68000's as their CPU's (think original Apple Mac speed, and you've got a ballpark estimate of the processing power here.) Still other pieces of net equipment, like certain T1 interfaces, are just buggy. Lots of traffic taxes everything on the network, and network equipment can fail in many strange, unpredictable and VERY difficult to diagnose ways in such situations.
If you really, really, really are set on the idea of storing the client on a central server, be warned that the typical failure symptom you will see when you push your network too hard, will be APPX clients "just disappearing" seemingly randomly. If you see things like that, or if processes that normally work randomly lock up client computers, and you have ANY clients ANYWHERE on your net loading appx.exe across the network, please set all clients to use a LOCAL copy of appx.exe and see if that takes care of the problem, before you call APPX Technical Support. Why is the APPX Client affected by this, and web browsing, file service, and other functions not? The APPX Client works like a UNIX telnet, and requires a constant connection between the client and the server. There will be code in 3.3 to reconnect dropped sessions, but it's probably best not to rely on this (performance will be slowed each time the client has to reconnect) if you can avoid it just by storing the client locally. If you are that concerned about the maintenance headache of updating several dozen clients' copies of appx.exe when a new version comes out, consider investing in one of the network software management packages out there, like Microsoft's SMS. (This isn't an official APPX "go out and buy it" recommendation, just a word to the wise regarding something you might want to consider.)
Nothing, most likely. However, current versions of APPX blindly pre-penned the APPXPATH to the value of APPX_PRT_SCRIPT. In order for APPX to properly invoke a replacement APPX_PRT_SCRIPT:
- your replacement print script must be in the APPXPATH directory - you must set APPX_PRT_SCRIPT to the file name, not including any directory or drive letter information in front of it (for example, you might set APPX_PRT_SCRIPT=myprint.exe) - APPX_PRT_SCRIPT must be set ON THE SERVER (not the client; remember, when connecting to APPX Presentation Server, the SERVER controls the printing), along with APPXPATH and the other standard variables. Generally this is done from Control Panel / System / User Environment. Remember to reboot after you change this. | ||||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:54pm | ||||||||
![]() |
![]() ![]() ![]() Winprint won't print to all or some of my printers. Help? | |||||||
APPX sometimes has trouble with printers whose names contain special characters, or which are located on remote non-NT machines that are connected to your network.
Since running APPX directly often results in better messages than when it's run through appx -c, see if you can reproduce the "won't print" error when running APPX directly on the server, and if you get an error message dialog box. If you get an error message that isn't self-explanatory, please call APPX Software Technical Support for assistance.
If you don't get an error message, follow the "Winprint won't print to my printer" instructions in the "Troubleshooting WinAppxD section of the FAQ.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:55pm | ||||||||
![]() |
![]() ![]() ![]() What if my network includes more than one Windows NT domain? | |||||||
If you're in a large organization, you might be using multiple NT domains to manage accounts and resource security. You need to be aware of how WinAppxD will interact with multi-domain architectures.
WinAppxD validates client users using the domain name found by running LookupAccountSID() against the NT account used to start up WinAppxD. Typically, this means that any client users running "appx -c" must be defined in the same domain in which the APPX server participates, because when WinAppxD is defined as a service, it starts up in the domain the server is assigned to. This means that if your APPX server running WinAppxD is a member of your UsefulApps domain, that users which are defined ONLY in your CorpUsers domain will not be able to login to APPX. If we looked on the client to see which domain the client user was logged into and sent that info to the server, it would work, but today (as of 3.3) we do not do that. You are restricted to validating logins only in the same domain your APPX server belongs to. DESPERATE to get around this? If you don't use your server for much else besides APPX, and it's in a secure room or you don't mind running a locked screensaver all day, you might be able to do it. Just walk up to the APPX server machine and login to your master domain, or useraccounts domain, or whichever domain your user accounts are found in. Make sure you are using an account in the Administrator group, and which has the four magic user rights set (as documented elsewhere in the FAQ). Now start winappxd from a DOS Command prompt using a line like:
c:\appx> winappxd -s=8060
This should cause WinAppxD to use the currently logged in user's domain for authentication. If you were able to successfully run winappxd as a service before trying this, using this technique should not cause it to "break". If you read this FAQ prior to installation and decided to skip the whole process of running WinAppxD as a service, then please make sure that the APPX environment variables APPXPATH, APPX_SERVER and APPX_KEYMAP are set for your current command shell by doing a "set |more" before running winappxd.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:57pm | ||||||||
![]() |
![]() ![]() ![]() What special rights must be assigned to the user accounts which will access APPX via the GUI client, Java client or AppxODBC? | |||||||
User accounts must have the following user right: - Logon locally (to the APPX Server)
This right must be set on the APPX Server. If your APPX Server is not the same machine as your PDC, please see item 1.7 for how to do this -- this right must be set at the machine level, not the domain level, for security reasons. Otherwise, just login as Administrator, and run User Manager for Domains (or just User Manager if you're using NT in a Workgroups setup).
The best way to do this, since you'll probably have lots of APPX users, is to assign this right to a group, rather than individual users. Although the quickest way to do this is to assign this right to the existing group "Everyone" or "Domain Users", it's better from a security standpoint if you create a group like "APPX Users" and assign the right only to that group. This way, you know that only users you've explicitly added to that group, have that added right. The downside is that you will have to remember to add users who will be accessing APPX to that "APPX Users" group.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:57pm | ||||||||
![]() |
![]() ![]() ![]() What APPX-provided files are needed on client PC's? | |||||||
If using the APPX executable client, just appx.exe.
| ||||||||
[Append to This Answer] | ||||||||
2004-Feb-27 4:58pm | ||||||||
![]() |
![]() ![]() ![]() If the base 'Data' directory is immediately under the appx engine (as it almost always is), does anyone know of any reason one would want to use APPXPATH? | |||||||
APPXPATH should only be used in rare circumstances when your data path cannot be located below the appx engine. If the data directory is under the appx engine (normal location during installation), the APPXPATH variable should never be set.
| ||||||||
[Append to This Answer] | ||||||||
2004-Mar-19 4:54pm | ||||||||
![]() |
![]() ![]() ![]() After an upgrade of the system from 4.1.a to 4.2.3 there is no 0LC application. What's missing? | |||||||
When you do a first time installation of APPX, it adds the following 5 "0 Apps":
0SA, 0AD, 0DB, 0LC, 0LA. However, on an upgrade, APPX does not automatically add the 0LC application to the Application file in System Admin. You will need to add the entry yourself. When you do so, make sure that you go into Design File management for the 0LC application. This will enable APPX to "find" the 0LC application. | ||||||||
[Append to This Answer] | ||||||||
2004-Mar-31 8:55am | ||||||||
![]() |
![]() ![]() ![]() I am preparing to upgrade to 4.2. The installation instructions suggest that I copy the License Key file so it can be imported in the version. | |||||||
Where can i find the License Key? How do i Import it? If you are performing a new installation, you can copy the files where the registration is stored: $APPXPATH/0SA/Data/REGISTER.dat $APPXPATH/0SA/Data/LOCK.dat $APPXPATH/0SA/Data/LOCK.key | ||||||||
[Append to This Answer] | ||||||||
2004-Apr-30 4:29pm | ||||||||
![]() |
![]() ![]() ![]() What are required Windows rights for Appx ? | |||||||
The following is also true for AppxODBC.
The following is true for XP and Windows 2003 Server and newer.
(actually this is true for all Windows but NT and 2000 default to these
rights) | ||||||||
[Append to This Answer] | ||||||||
2004-May-25 10:27am | ||||||||
![]() |
![]() ![]() ![]() What are required UNIX permissions for Appx 4.2.4? | |||||||
The following should work when done as root: (assuming appx is installed in /usr/local/appx - just change the path to whatever is needed) The "-R" bit is recursive - and is a dangerous command if typed wrong! Make sure you don't enter any typos!!!!
chown -R appx:appxgrp /usr/local/appx/ | ||||||||
[Append to This Answer] | ||||||||
2004-Jun-17 5:01pm | ||||||||
![]() |
![]() ![]() ![]() Setting HP-UX Kernel parameters | |||||||
When running at peak period, users were getting unixio.c.343 - "TOO MANY OPEN FILES, exiting". Depending upon the number of users you have, the following sample kernel parameters *might* work for you ... 4-users 16usrs 32users 64users nfile 1000 4000 8000 16000 nflocks 500 4000 8000 16000 ninode 750 3000 6000 12000 maxfiles 512 2048 4096 8192 maxfiles lim 1024 2048 4096 8192 semmnu 30 48 96 192
nfile - 1 for each file opened by each user on the system nflocks - nfile + 1 for each locked record on the system maxfiles - 1 for each file opened by a given user semmnu - 1 for each APPX session (user or background)Customers need to add a lot of padding and figure out what they think they need. Requirements will vary with user load and the type of application being used. These are starting values only, and depending on how complex your apps are, what else is going on on that system, how many users there are, etc., the proper values may be higher in your specific situation. Since memory is much cheaper and thus much more available these days, increasing these parameters beyond the base values given in the table above shouldn't have an adverse impact on your system, but start with the values above initially, and increase them if there are problems opening files, locking records, etc. (resource issues that indicate one of HP-UX's tables is too small for the amount of activity on the system). | ||||||||
[Append to This Answer] | ||||||||
2004-Jun-23 8:19am | ||||||||
![]() |
![]() ![]() ![]() Recommended system configuration for running APPX. | |||||||
We recommend that the system have at least 10MB of memory available for each active APPX session. So, 128 APPX sessions would require approximately 1.280GB of memory. If some users run more than one session at a time, then additional memory would be required.
APPX Software does not certify any configuration. There are too many variables that can affect performance that we have no control over. For example, information relating to the type of APPX applications or the perfomance characteristics of the APPX applications that will be run on the system. We also do not know which applications other than APPX might also be installed on the same machine. Response time is also very subjective. A response time of one second may be very acceptable to one user but not to another. We also have no information regarding how much disk space is needed by the APPX applications or any other applications that might be installed on the machine.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jul-09 4:37pm | ||||||||
![]() |
![]() ![]() ![]() Exporting and importing design files on different platforms. | |||||||
APPX recommends that you export and import your design files using the exact same version of APPX on both platforms. We are willing to provide supported customers with a temporary license that will allow them to migrate to another machine. We just need to know how long you need it for and how many user rights and design rights you need.
| ||||||||
[Append to This Answer] | ||||||||
2004-Jul-09 4:47pm | ||||||||
![]() |
![]() ![]() ![]() Emergency Registration for Supported Customers | |||||||
APPX Software is pleased to announce the introduction of our Online Customer Support System, by which customers on maintenance will be able to generate their own emergency “system-down” temporary registrations. We are pleased to make this available on a 24x7 basis, to better accommodate any potential emergencies our customers may face. The system is available for both APPX and Speed II customers who are current on maintenance (within a short grace period). If a customer’s system crashes, or other circumstances occur that require a temporary registration, a temporary registration, valid for 7 days on an alternate machine, may be obtained electronically at no charge to the customer. The system requires that the customer enter the 20-digit verification code from a valid, active permanent registration, or a non-expired temporary registration. Promotional registrations, evaluation registrations, or prior emergency registrations do not qualify, and the system will check to insure that maintenance is current on the registration, or has expired within the past 90 days. A valid serial number is required for the new CPU, and the name and e-mail address of the person requesting the registration must also be entered. Registrations will be e-mailed to the address provided, and optionally to other addresses as well. Customers may also choose to print a hard copy of the registration on their local printers, and/or view it on their screens. We want you to be aware that this system is, of course, an APPX application, and demonstrates some of the things that can be done with the new graphical capabilities of APPX 4.1. As a supported APPX customer, you need do nothing to be eligible for this program. It is available to you when you need it (and, of course, we all hope you never do). Please remember that this system is to be used for emergency system-down situations only, not for evaluation, testing, or other such purposes. Any customer who misuses the system is subject to having their access terminated. To use the system, you currently need to install the new APPX Java client on your desktop computer. You can download the latest version from our website. Install the client, and connect using the following parameters: Login: appxcust Password: appxcust Server: support.appx.com Server Port: 8090 | ||||||||
[Append to This Answer] | ||||||||
2004-Sep-23 10:07am | ||||||||
![]() |
![]() ![]() ![]() Is there a work around or environment variable that suppresses the "keep key" behavior? | |||||||
You're looking for an env. var. named APPX_OLD_MODES. If APPX_OLD_MODES is defined, the input process interpreter uses the old set of rules when switching modes in a non-scrolling input process (the old rules say that, when you switch modes, you should move into Key Entry and lose the previous key value). | ||||||||
[Append to This Answer] | ||||||||
2005-Jan-31 2:05pm | ||||||||
![]() |
![]() ![]() ![]() How to install Appx on a Cluster | |||||||
ACTIVE/PASSIVE 2 NODE FAILOVER CLUSTER HOWTO APPX 4.2.6 works just perfectly in a Failover Cluster. There were only two details different in the install and configuration from a normal Windows 2003 Server Installation -- 1) the APPX TCP Client Manger (appxdsvc) needed special attention, 2) The APPX Registration needed two serial numbers - one for each NODE. The details: The cluster was a two node Active / Passive cluster with shared storage, via a SAN. NODE 1 Windows 2003 Enterprise Server with Local C: Drive on HBA 1 Server was a Member Server of a Windows 2003 Active Directory Domain NIC 1 on LAN NIC 2 on PRIVATE Heartbeat for Cluster HBA 2 Drive 1 was Quorum drive on SAN (Drive Q:) HBA 2 Drive 2 was Data drive on SAN (Drive R:) Serial Number of Drive C: was xxxx-xxxX NODE 2 Windows 2003 Enterprise Server with Local C: Drive on HBA 1 Server was a Member Server of a Windows 2003 Active Directory Domain NIC 1 on LAN NIC 2 on PRIVATE Heartbeat for Cluster HBA 2 Drive 1 was Quorum drive on SAN (Drive Q:) HBA 2 Drive 2 was Data drive on SAN (Drive R:) Serial Number of Drive C was xxxx-xxxY Installed APPX onto Drive R:\APPX.426 on the SAN. Gave APPX users "Modify" rights to the NTFS permissions of R:\APPX.426. Copied R:\APPX.426\tools\appxdsvc.exe to new directory C:\appx426tools\appxdsvc.exe on BOTH NODE 1 and NODE 2 On NODE that had currently possession of the SAN (NODE 1) I performed the following command from a command window: c:\appx426tools\appxdsvc.exe -install -engine=r:\appx.426\appx.exe I then rebooted the node with possession of the SAN (NODE 1). On NODE that now has current possession of the SAN (NODE 2) I performed the same command from a command window: c:\appx426tools=appxdsvc.exe -install -engine=r:\appx.426\appx.exe You now have APPX installed with a license server configured on both NODES. You can connect to the CLUSTER and initiate a failure on NODE with SAN possession, appx sessions will die, but new sessions can be connected to the CLUSTER without delay. You should import an APPX Cluster registration that has serial numbers from both NODE's C: Drives xxxx-xxxX and xxxx-xxxY. The advantage you have above, is the data is in a single place - hopefully on a RAID'd SAN, this gives data protection against drive failure, but the ease of single location - no need for mirroring software. But unlike most single data location installs, you have server redundancy, provided by the Cluster software. You can certainly make one server the more powerful if your budget dictates, you should just give the powerful server the priority over SAN possession. | ||||||||
[Append to This Answer] | ||||||||
2005-Feb-02 9:11am | ||||||||
![]() |
![]() ![]() ![]() How to convert an HFS or Vxfs filesystem from a nolargefiles system to a largefiles system | |||||||
To convert an HFS or Vxfs file system from a nolargefiles file system to a largefiles file system: unmount the file system: then fsadm -F hfs -o largefiles /dev/vg02/lvol1 (or whatever the dev file for the volume is) or fsadm -F vxfs -o largefiles /dev/vg02/lvol1 | ||||||||
[Append to This Answer] | ||||||||
2005-Feb-04 2:14pm | ||||||||
![]() |
![]() ![]() ![]() What is the environment variable for identifying the Ethernet adapter for the APPX serial number? | |||||||
The variable you are looking for is APPX_ETHERNET_PORT. You would set it to something like "eth0" or "eth1" If you entered a non-ethernet port (like a loopback adapter), you might not get an address. | ||||||||
[Append to This Answer] | ||||||||
2005-Feb-04 4:18pm | ||||||||
![]() |
![]() ![]() ![]() I am trying to import a file to Oracle, but getting an error "File doesn't exist". | |||||||
Test 1: Selected an APPXIO file that had 0 records. Exported - Exported OK Changed File Spec. to Oracle Created File - File Created OK Imported - Receive error - File Does Not Exist. Tried to Create File again, - File already exists is message. What may be happening is that you have used an FMS group to redirect the AppxIO files (in other words, the AppxIO files are not in their usual location when you do the export). That means that the Portdata files are not in their usual location either. When Appx tries to import (using your Oracle FMS group), it can't find the Portdata files (thus the File Does Not Exist error). If that is the case, this is easy to fix. Find the FMS group that holds your AppxIO files (let's call that the APPXIO FMS group) it has an FMS type of 1. Make a note of the FMS Path for that FMS group. Now find your Oracle FMS group (let's say that one is named ORACLE) and it has an FMS type of 5. Now make a new FMS group (type 1 this time), but give it the same name as your ORACLE FMS group. In this new ORACLE (type 1) FMS group, enter the FMS path that you wrote down from the APPXIO FMS group. That should take care of the problem.
The root of the problem is that Portdata files are always AppxIO files - when you try to import from Portdata into Oracle, Appx is using the ORACLE FMS group to find the Portdata files. Since you don't have a type 1 FMS group named ORACLE, Appx is looking in the default location for the Portdata files - and they're not there. Creating a new type 1 FMS group with the same names as your type 5 ORACLE group will give Appx a way to find the Portdata files.
| ||||||||
[Append to This Answer] | ||||||||
2005-May-02 1:07pm | ||||||||
![]() |
![]() ![]() ![]() How do I upgrade APPX 3.5 or 4.0 to version 4.2? | |||||||
IMPORTANT: It is recommended that you read all the release notes prior to upgrading to a newer release of APPX. There have been major improvements and enhanced functionality at many levels of the system. You’ll want to be aware of how these enhancements will effect your current application environment. A complete list of release notes are available at www.appx.com . To upgrade from Appx 3.5 to Appx 4.2, perform the following steps. If you are not sure about how to perform a specific step, contact APPX Technical Support: 1) Confirm that the"MNT (maintenance) registration cutoff date has not expired. 2) Run "Verify Integrity" on your System Administration and Application Design Files. If any problems are detected, correct them. Backup the existing system. 3) Download Appx 4.2: http://www.appx.com/assets/asp/dynamic_generator.asp?pageid=203 4) Run setup.exe (Windows) or install.sh (Unix), overlaying 4.2 on top of 3.5. You must be logged in as Administrator in Windows or as root in Unix. 5) Delete all EM and Dbg directories ($APPXPATH/*/*/Em and $APPXPATH/*/*/Dbg) in all of your Design File and Appx 0-App directory trees. 6) Scratch all '$APPXPATH/*/Tmpdata' directories. 7) Scratch each Application's $APPXPATH\vv\aaa\Struct directories and their contents, where aaa\vv is your ApplicationID/Version#. Do not delete the five 0-app APPXPATH\00\0*\Struct directories. Note, we will create new structure files in step 10a below. 8) Scratch $APPXPATH/0SA/Struct/FORM.dat 9) Create your new 4.2 system files: Run System Administration => System Setup => System Administration File Management => Create Files. 10) Go to System Administration => Database/Applications => Applications. For each of your Applications: (a) Run ‘Create Files’
11) In Application Design for each application, run Utilities => Toolbox =>
Conversion Utilities => Synchronize Design Elements. | ||||||||
[Append to This Answer] | ||||||||
2005-May-19 3:30pm | ||||||||
![]() |
![]() ![]() ![]() What does Error message "Can't load Oracle dll (oci.dll)" mean? | |||||||
If you have a new install of Oracle on Windows 2003 Server and you can't get the APPX --> Oracle connection to work -- everyone receives - "Can't load Oracle dll (oci.dll)" -- It may be caused by the permissions of Windows 2003 server file system. Make sure users have rights to the directory containing oci.dll. (i.e. c:\oracle\ora92\bin)
| ||||||||
[Append to This Answer] | ||||||||
2005-May-27 10:42am | ||||||||
![]() |
![]() ![]() ![]() How to manually install Appx on Linux? | |||||||
*** Change paths to match your site *** *** This also assumes system user "appx" and group "appxgrp" *** Execute the following as root ***
#
#
#
#
chown -R appx:appxgrp /usr/local/appx.427/
# You can now connect from a client. If you want a client installed on your linux desktop, then continue below:
# Follow the prompts to install APPX Desktop Client 4.2.7. Pay attention to where you install the program. I often will install it at /usr/local/AppxDesktopClient/ When it is installed, execute /usr/local/AppxDesktopClient/AppxDesktopClient
You can now connect in via the APPX DesktopClient's REMOTE tab to connect via TCP/IP, or via the LOCAL tab to connect via the local file system.
| ||||||||
[Append to This Answer] | ||||||||
2005-Oct-11 9:39am | ||||||||
![]() |
![]() ![]() ![]() I have Appx/Net going, but unable to scratch a file from the client side. Should i be able to? | |||||||
You can't scratch, create, restructure, or initialize from the client side of an Appx/NET connection. | ||||||||
[Append to This Answer] | ||||||||
2005-Jul-21 8:37am | ||||||||
![]() |
![]() ![]() ![]() What does error message "Missing or invalid process definition record, 0LA subroutine SESSION (BEGIN)" mean? | |||||||
You would encounter this error if you're running a 4.2.7 engine against an older set of 0-apps (4.2.6 or older.)
| ||||||||
[Append to This Answer] | ||||||||
2005-Sep-27 8:32am | ||||||||
![]() |
![]() ![]() ![]() New Item | |||||||
[Append to This Answer] | ||||||||
2005-Sep-27 8:32am | ||||||||
![]() |
![]() ![]() ![]() How to set APPX_PIVOT_YEAR? | |||||||
APPX_PIVOT_YEAR determines which century Appx will add to a date item when you mask off the century portion in an input (or menu) process. In other words, if you have a date field DATE CCYYDD and a date mask of 7766, Appx will look at APPX_PIVOT_YEAR to decide which century it should stuff in the CC portion.
| ||||||||
[Append to This Answer] | ||||||||
2005-Sep-27 8:35am | ||||||||
![]() |
![]() ![]() ![]() When i try to login to Appx from my HP Notebook, i get an error "Negotitating GUI Interface" and it hangs | |||||||
We have had customers running the client on HP notebooks hit a problem with a certain network adapter chipset that has a known bug.
Seems a certain sequence of bits causes that network card to fall over and fail. You can try: turning off firewall on that laptop turning off anti-virus turning off anti-spyware If it doesn't work, download the latest Appx Client. When you get Appx Client login, go under Options and click on Advanced options. Under Startup Group, very first field called netcardLockupFix that is set by default to false, set it to True and try login again. This option was introduced to overcome that specific problem. A note from a customer: The notebook in question uses a National Semiconductor DP83815 chipset. Apparently, when Windows XP installs, it defaults to using a Netgear FA312 (fa312nd5.sys) driver to power this chipset. Downloading and forcing XP to switch to the actual driver (dp83815.sys) made and distributed on National Semiconductor's website appears to solve the issue and lets AppX login. | ||||||||
[Append to This Answer] | ||||||||
2006-Feb-16 11:08am | ||||||||
![]() |
![]() ![]() New APPX Releases | |||||||
Questions regarding new releases of APPX.
| ||||||||
Subcategories:
Answers in this category:
| ||||||||
[New Answer in "New APPX Releases"] | ||||||||
2003-Oct-31 5:25pm |
Next: |
![]() |
|