
Anomaly Report:  Genifer 3.0 Templates for dBASE IV 1.5

---[1]--------------------------------------------------------------------

PROBLEM:  If you change the index order of your primary database, then
Add, Modify, or Copy, but press <Esc> to abort entry, the index order is
switched back to the original (key) index.

COMMENT:  This problem was corrected in Release B.

FIX:  In the procedure InptRec, in GENMNT.GTL, insert the indicated code:

  if aborted
    select (WorkArea(table))
  << if [database #indexes] > 1 >>             <===
    if table = "{[database alias]}"            <===
      set order to tag &ndx_order              <===
    endif                                      <===
  << endif >>                                  <===
  else

--------------------------------------------------------------------------


Anomaly Report:  Genifer 3.0 Templates for dBASE IV 1.5

---[2]--------------------------------------------------------------------

PROBLEM:  In a multi-user environment, if one user modifies and saves a
record while another user is viewing that record, and the second user
then modifies the same record, the first user's changes are overwritten
without ever being seen by the first user.

COMMENT:  This problem was corrected in Release B.

FIX:  Insert the indicated line of code in the procedure InptRec, in
GENMNT.GTL:

    case input_mode $ "Modify, Copy"
      if .not. RecLock()
        aborted = .T.
        return
      endif
      do OnLoad{[program identifier]}   <===
  endcase

--------------------------------------------------------------------------


Anomaly Report:  Genifer 3.0 Templates for dBASE IV 1.5

---[3]--------------------------------------------------------------------

PROBLEM:  In a multi-user environment, if user #1 is adding a record
while user #2 deletes the record which user #1 was previously viewing,
and then user #1 aborts entry of the new record, user #1 is shown a
deleted record.

COMMENT:  This problem was corrected in Release B.

FIX:  Insert the indicated line of code in the procedure InptRec, in
GENMNT.GTL:

  if record_no > 0 .and. record_no <= reccount()
    go record_no
    if deleted()                         <===
      do GoBegin{[program identifier]}   <===
    endif                                <===
  endif

--------------------------------------------------------------------------


Anomaly Report:  Genifer 3.0 Templates for dBASE IV 1.5

---[4]--------------------------------------------------------------------

PROBLEM:  If you press press two keys in rapid succession, the
application terminates without warning and returns you to DOS, or
behaves in some other unexpected manner.

COMMENT:  This problem seems to manifest itself mostly on slower
systems.  It was corrected in Release B.

FIX:  First, insert the indicated code in the function NotKeys(), in
G_UDF.PRG:

function NotKeys
* Disable all hot keys set with ON KEY LABEL

  set typeahead to 0         <===
  on key label UPARROW
  .
  .
  .
  on key label Z
  set typeahead to 20        <===

return .F.


Second, make the same change to the procedure HotKey in the files
GENMNT.GTL, GENINQ.GTL, GENREP.GTL, and GENLABEL.GTL.  In GENREP.GTL,
for instance, the code will look like:

  set typeahead to 0                             <===
  on key label G do SetPad with "Go",     0
  .
  .
  .
  on key label Q do SetPad with "Quit",   0
  set typeahead to 20                            <===

--------------------------------------------------------------------------


Anomaly Report:  Genifer 3.0 Templates for dBASE IV 1.5

---[5]--------------------------------------------------------------------

PROBLEM:  When you run an application under dBASE IV 1.1, it crashes with
the message "Invalid or unknown function ISBLANK()."  Alternatively, you
may encounter a syntax error on the line "activate menu <program name>1
pad &option".

COMMENT:  This problem was corrected in Release B.

FIX:  In the function Empty(), in G_UDF.PRG, change:

    do case
      case type(value) $ "C"
        return len(trim(value)) = 0
      case type(value) $ "N"
        return value <> 0
      case type(value) = "D"
        return value = {}
      case type(value) = "L"
        return .not. value
    endcase

to:

    do case
      case type("value") $ "CM"
        return len(trim(value)) = 0
      case type("value") $ "NF"
        return value <> 0
      case type("value") = "D"
        return value = {}
      case type("value") = "L"
        return .not. value
    endcase

(Note the addition of the quotation marks for each occurrance of
type(value).)

--------------------------------------------------------------------------


Anomaly Report:  Genifer 3.0 Templates for dBASE IV 1.5

---[6]--------------------------------------------------------------------

PROBLEM:  On a network, if you Modify a record, but press [Esc] to abort
the modification, the record remains locked.

COMMENT:  This problem was corrected in Release B.

FIX:  In the procedure InptRec, in GENMNT.GTL, add the indicated code:

  do FirstWn{[program identifier]}
  unlock                                           <===
  if record_no > 0 .and. record_no <= reccount()
    go record_no
    if deleted()
      do GoBegin{[program identifier]}
    endif
  endif

--------------------------------------------------------------------------


Anomaly Report:  Genifer 3.0 Templates for dBASE IV 1.5

---[7]--------------------------------------------------------------------

PROBLEM:  If you press F1 while editing a memo field, the application
crashes.

COMMENT:  Help should not be available while editing memos.  This change
was made in Release B.

FIX:  Add the indicated code to the function EditMemo(), in G_UDF.PRG:

  * view/edit the memo field
  on key label F1                                     <===
  dummy = WOpen("MEMOEDIT", m_top, m_left, ;
                            m_bottom, m_right, m_title, 1, m_colors)
  define window MEMOEDIT from m_top + 1, m_left + 1 to ;
                              m_bottom - 1, m_right - 1 none
  set cursor on
  if .not. allow_edit
    on key label Ctrl-Home keyboard " "
  endif
  activate window MEMOEDIT
  @ 0,0 get &memo_field open window MEMOEDIT
  read
  on key label Ctrl-Home
  on key label F1 do Help with prg_name, varread()    <===
  set cursor off
  release window MEMOEDIT
  dummy = WClose()

--------------------------------------------------------------------------


Anomaly Report:  Genifer 3.0 Templates for dBASE IV 1.5

---[8]--------------------------------------------------------------------

PROBLEM:  In a report with several zoom levels, if you abort printing, the
application locks up your computer.

COMMENT:  This problem was corrected in Release B.

FIX:  In the procedure RepBody, in GENREP.GTL, change:

    << if [break alias] == _primary >>
        done = (recno() = last_rec)
    << endif >>

to:

    << if [break alias] == _primary >>
        done = iif(recno() = last_rec, .T., done)
    << endif >>

--------------------------------------------------------------------------


Anomaly Report:  Genifer 3.0 Templates for dBASE IV 1.5

---[9]--------------------------------------------------------------------

PROBLEM:  When you exit from a Report program which has no associated
Data Screen, the menu colors are messed up.

COMMENT:  This problem was corrected in Release B.

FIX:  At the end of the section labeled PROCESSING LOOP, in GENREP.GTL
and GENLABEL.GTL, change:

  do while old_window <> WName(0)
    dummy = WRelease()
  enddo

to:

<< if _HasScreen >>
  do while old_window <> WName(0)
    dummy = WRelease()
  enddo
<< else >>
  set color to &clr_window
<< endif >>

--------------------------------------------------------------------------


Anomaly Report:  Genifer 3.0 Templates for dBASE IV 1.5

---[10]-------------------------------------------------------------------

PROBLEM:  The application doesn't check for duplicate key values when
you Copy records.

FIX:  In the function NotExist(), in the file G_UDF.PRG, change:

  exists = (found() .and. recno() <> record_no)

to:

  exists = found() .and. (recno() <> record_no .or. input_mode <> "Modify")

--------------------------------------------------------------------------


Anomaly Report:  Genifer 3.0 Templates for dBASE IV 1.5

---[11]-------------------------------------------------------------------

PROBLEM:  When Adding new records and Posting to a lookup database, the
Posting code doesn't work.

COMMENT:  At the time the Posting procedure is called, the record
pointer in the active database has been moved to a new, blank record.
SET RELATION forces the record pointer in the lookup file to EOF.  You
must therefore perform an explicit SEEK before you do your REPLACE(s),
to locate the proper record; for example:

  do case
    case table = "cr"
      select cc                      <===
      seek m->cc_cruise              <===
      do case
        case input_mode $ "Add, Copy"
          .
          .
          .
      endcase
      select cr                      <===

This additional SEEK is necessary only if you are Posting to a lookup
database.  If you are Posting from a zoom database to the primary
database (or another zoom), this problem does not exist.

--------------------------------------------------------------------------


Anomaly Report:  Genifer 3.0 Templates for dBASE IV 1.5

---[12]-------------------------------------------------------------------

PROBLEM:  If you have more than one memo field in a database, the
maintenance programs give you a popup list of all the memos, but [Esc]
doesn't break out of the popup.

FIX:  Insert the indicated code in the procedure GetMemo, in GENMNT.GTL:

        do while .T.
          on selection popup memos deactivate popup
          activate popup memos
          do case
      << for all memo-fields in dictionary >>
            case prompt() = "{[field description]}"
              dummy = EditMemo("{[field name]}",.T.,10,8,21,76, ;
                      "{[field description]}", clr_window)
      << endfor >>
            otherwise    <===
              exit       <===
          endcase
        enddo

You should make the same change in the procedure ShowMem, in GENINQ.GTL.

--------------------------------------------------------------------------


Anomaly Report:  Genifer 3.0 Templates for dBASE IV 1.5

---[13]-------------------------------------------------------------------

PROBLEM:  When you press [PgDn] (or Next-window) to go the second window
of an Inquiry program, the application crashes.

FIX:  The function NextWn, in GENINQ.GTL, should be rewritten as follows
(you may simply copy the same function from GENMNT.GTL and change the
indicated line):

  parameters show_memo
  private record_no, last_win
  last_win = .T.
  do case
  << for all zoom-databases in program >>
    << for all windows in program >>
      << store at(str([window #numb], 1),[database windows]) to _win_pos >>
      << if _win_pos > 0 .and. _win_pos < len([database window-list]) >>
    case table = "{[database alias]}" .and. window = {j}
      window = {substr([database window-list], _win_pos + 1, 1)}
      last_win = .F.
      << endif >>
    << endfor >>
  << endfor >>
  endcase

  * go to the memo window
  if last_win
    if show_memo
      do case
  << for all zoom-databases in program >>
        case table = "{[database alias]}"
    << if [database is-memo-present?] >>
          do ShowMem{[program identifier]}    <===  replace "do GetMemo"
    << else >>
          dummy = Warning("No other windows")
    << endif >>
  << endfor >>
      endcase
    endif
  else
    do PaintWn{[program identifier]}
  endif

return last_win

--------------------------------------------------------------------------


Anomaly Report:  Genifer 3.0 Templates for dBASE IV 1.5

---[14]-------------------------------------------------------------------

PROBLEM:  After entering data, your index files become corrupted.

COMMENT:  dBASE IV 1.5 contains a bug which causes .MDXs to become
corrupted if the program code contains several sequential REPLACE
statements, as the Genifer code does.

WORKAROUND:  Insert the indicated code in the procedure Offload, in
GENMNT.GTL:

  do case
  << for all zoom-databases in program >>
    case table = "{[database alias]}"
    << for all fields in dictionary >>
      << if [field type] <> 'M' >>
      replace {[field alias]}->{[field name]} with m->{[field name]}
      set echo off     <===  insert this line
      << endif >>
    << endfor >>
  << endfor>>
  endcase  

FIX:  Contact Borland's customer support department at 800/331-0877 and
request in-line release "X71", which will correct this problem.  Be sure
to tell them if you're using the Developer's Edition.

--------------------------------------------------------------------------


Anomaly Report:  Genifer 3.0 Templates for dBASE IV 1.5

---[15]-------------------------------------------------------------------

PROBLEM:  When you press [up], [down], [PgUp], or [PgDn] in a scrolling
window, the application throws you back to a menu.  However, the menu
screen is not properly redrawn.

COMMENT:  This is a timing problem with the dBASE IV ON KEY command.

FIX:  In the Processing Loop in GENMNT.GTL and GENINQ.GTL, change:

      do HotKeys{[program identifier]}               <=== delete
      dummy = SetColor(clr_menu)
    << if _Scrolling >>
      if .not. str(window, 1) $ "{_ScrollWin}"
        activate menu {[program name]}1 pad &option
        dummy = NotKeys()
        option = iif(lastkey() = K_Esc, "Quit", option)
        show menu {[program name]}1 pad &option
      else
        activate menu {[program name]}2 pad &option
        dummy = NotKeys()
        option = iif(lastkey() = K_Esc, "Quit", option)
        show menu {[program name]}2 pad &option
      endif
    << else >>

to:

      dummy = SetColor(clr_menu)
    << if _Scrolling >>
      if .not. str(window, 1) $ "{_ScrollWin}"
        do HotKeys{[program identifier]}             <=== insert
        activate menu {[program name]}1 pad &option
        dummy = NotKeys()
        option = iif(lastkey() = K_Esc, "Quit", option)
        show menu {[program name]}1 pad &option
      else
        do HotKeys{[program identifier]}             <=== insert
        activate menu {[program name]}2 pad &option
        dummy = NotKeys()
        option = iif(lastkey() = K_Esc, "Quit", option)
        show menu {[program name]}2 pad &option
      endif
    << else >>
      do HotKeys{[program identifier]}               <=== insert
      activate menu {[program name]}1 pad &option

Also, in the Processing Loop in GENREP.GTL and GENLABEL.GTL, reverse the
following two lines of code:

    do HotKeys{[program identifier]}
    dummy = SetColor(clr_menu)        <=== this line should go first

--------------------------------------------------------------------------


Anomaly Report:  Genifer 3.0 Templates for dBASE IV 1.5

---[16]-------------------------------------------------------------------

PROBLEM:  When you generate an inquiry program, Genifer gives you the
message "Error in << if >> condition".

FIX:  The procedure HotKey, in GENINQ.GTL, contains the line:

<< if [program is-memo-present?] .or. [screen #windows] > 1 .or. Scrolling >>

The last clause should read ".or. _Scrolling", with an underscore.

--------------------------------------------------------------------------


Anomaly Report:  Genifer 3.0 Templates for dBASE IV 1.5

---[17]-------------------------------------------------------------------

PROBLEM:  If you filter on a logical field, and you enter "N" or "T" on
the filter screen, you get the opposite of the expected results.

COMMENT:  This bug was introduced in the Release B templates as part of
the fix for another bug.

FIX:  In the procedure Filter(), in GENMNT.GTL, GENINQ.GTL, GENLABEL.GTL
and GENREP.GTL, change:

          if m->{[field name]} $ 'YN'

to:

          if m->{[field name]} $ 'YT'

Also, change:

          if m->{[field name]} $ 'TF'

to:

          if m->{[field name]} $ 'NF'

--------------------------------------------------------------------------


Anomaly Report:  Genifer 3.0 Templates for dBASE IV 1.5

---[18]-------------------------------------------------------------------

PROBLEM:  The cascading modify feature (in maintenance programs) doesn't
work.

COMMENT:  This problem appears in pure dBASE IV 1.5 code, but not in
programs generated for 1.1 compatibility.

FIX:  In the procedure Z_Mod, in GENMNT.GTL, insert the indicated code:

      if auto_mod
    << if _version11 >>                      <===
        do while found()
    << else >>                               <===
        do while .not. eof()                 <===
    << endif >>                              <===
          do Z_Mod{[program identifier]}
          if RecLock()
    << for all fields in dictionary >>
      << if [field is-link?] >>
            replace {[field alias]}->{[field name]} with m->{[field name]}
      << endif >>
    << endfor >>
            unlock
          endif
    << if _version11 >>                      <===
          seek link_value[{j}]
    << else >>                               <===
          go top                             <===
    << endif >>                              <===
        enddo
      else

--------------------------------------------------------------------------


Anomaly Report:  Genifer 3.0 Templates for dBASE IV 1.5

---[19]-------------------------------------------------------------------

PROBLEM:  When you validate against a field against a field of a
different name, it doesn't work.

COMMENT:  The following fix allows to validate a single field against a
field of any name, or to validate an indefinite number of fields (i.e.,
a compound key) against counterparts with exactly the same name.  It
does not support validation of compound keys where the fields have
different names.

FIX:  Two changes are necessary.  First, in the function InptRec(),
insert the indicated code:

            << case [field val-type] = "F" >>
              << for all databases in program >>
                << if [database name] == [field val-database] >>
===>              << if "+" $ [database ndx-expression] >>
          valid required val_file({[database ndx-expression]},
===>              << else >>
===>      valid required val_file({[field name]},
===>              << endif >>
                << endif >>
              << endfor >>

Second, in the function List(), change:

    << if [database is-validation?] .or. [database is-lookup?] >>
      case table = "{[database alias]}"
      << for all fields in dictionary >>
        << if [field is-link?] >>
        store {[field name]} to m->{[field name]}
        << endif >>
      << endfor >>
    << endif >>

to:

    << if [database is-validation?] .or. [database is-lookup?] >>
      case table = "{[database alias]}"
      << store [database name] to _parent >>
      << for all get-fields in program >>
        << if [field val-type] = "F" .and. [field val-database] == _parent >>
        store {[field val-field]} to m->{[field name]}
        << endif >>
      << endfor >>
    << endif >>

--------------------------------------------------------------------------


Anomaly Report:  Genifer 3.0 Templates for dBASE IV 1.5

---[20]-------------------------------------------------------------------

PROBLEM:  If you put lookup fields in a label, the application crashes
when you try to run the report.

FIX:  In the procedure Print, in GENLABEL.GTL, change:

  newline = newline + trim(transform({[field name]}, '{[field picture]}'))

to:

  newline = newline + ;
     trim(transform({[field alias]}->{[field name]}, '{[field picture]}'))

--------------------------------------------------------------------------


Anomaly Report:  Genifer 3.0 Templates for dBASE IV 1.5

---[21]-------------------------------------------------------------------

PROBLEM:  If you attempt to modify or zoom from a record, you get the
message "Unable to Lock Record" even though no other user on the network
has locked that particular record.

COMMENT:  dBASE is actually attempting to lock a record in a related
lookup database.  If that lookup record is shared by multiple records in
the primary (or zoom) database, the lock fails.

FIX:  To prevent the unwanted cascading record lock, all lookup
databases must be opened in "read only" mode.  To accomplish this,
insert the indicated code in GENMNT.GTL:

* OPEN FILES
  private use_error
<< for all databases in program >>
  on error do ErrorTrap with error(), "{[database name]}"
  use {[database name]} in {j} order tag {[database ndx-name]} ;
    alias {[database alias]}
  << if .not. [database is-zoom?] >>      <===
  ... noupdate                            <===
  << endif >>                             <===
<< endfor >>
  on error
  if UseError()
    return
  endif

Note that if you wish to post new values to a lookup database via the
Posting procedure, this change complicates the matter.  You must first
open the lookup database AGAIN in a new work area, without the NOUPDATE
option, and perform an explicit SEEK to find the appropriate record to
post to.

--------------------------------------------------------------------------

