
Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

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

PROBLEM:  Your application crashes with the message "Undefined
Identifier" in the function UseError().

COMMENT:  This was corrected in Release B.

FIX:  In the function UseError in G_UDF.PRG, change:

function UseError (dbf_name)

to:

function UseError (dbfname)

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

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

PROBLEM:  Scrolling windows do not redisplay after the filter is turned
on.

COMMENT:  This was corrected in Release B.

FIX:  Locate the function Filter in GENMNT.GTL and GENINQ.GTL and add
the indicated three lines of code:

    Load{[program identifier]}()
  << if _Scrolling >>                             <===
    win_redraw[WindowNo()] := .T.                 <===
  << endif >>                                     <===
    PaintRec{[program identififer]}(.F.)

  enddo && while setting

return NIL
  
--------------------------------------------------------------------------


Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

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

PROBLEM:  Scrolling windows do not redisplay after a Retrieve.

COMMENT:  This was corrected in Release B.

FIX:  Locate the function Retrieve in GENMNT.GTL and GENINQ.GTL and add
the indicated three lines of code:

  if lastkey() <> K_ESC
  << if _Scrolling >>                             <===
    win_redraw[WindowNo()] := .T.                 <===
  << endif >>                                     <===
    select 0

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

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

PROBLEM:  Pressing F1 from the menu in a maintenance/report/inquiry
program throws you back to the previous menu screen.

COMMENT:  This was corrected in Release B.

FIX:  Add the following two lines of code to the function Hotkey, in
G_UDF.PRG:

    case lastkey() = K_DOWN
      SetKeyName("down")
    case lastkey() = K_F1         <===
      SetKeyName("F1")            <===
  endcase
  keyboard chr(K_ESC)

return .F.

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

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

PROBLEM:  The application refuses to let more than one network user at a
time access a database file.

COMMENT:  One or more of the users does not have a workstation ID, which
is needed by the Clipper NETNAME() function.  The Release B templates do
not use the NETNAME() function.

FIX:  In the file G_SETUP.PRG, change:

  set exclusive (.not. empty(netname()))

to:

  set exclusive off

Then regenerate your main menu program, and recompile.

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

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

PROBLEM:  The application crashes when you attempt to validate a numeric
or date field against another file.

COMMENT:  This was corrected in Release B.

FIX:  First, rewrite the function Val_File(), in G_UDF.PRG, as follows:

function Val_File (value, val_table, val_field, udf_name, val_len, val_dec)
* Determines if the specified value appears in the index key of a designated
* validation file.  If not, it calls a user-defined function or procedure
* (usually containing DBEDIT()) and stuffs the keyboard buffer with a
* selected value for the new field

  local is_valid, dummy, fieldtype := valtype(value)
  local old_area := select()

  select (select(val_table))
  do case
    case fieldtype = "D"
      value := str(year(value),4) + str(month(value),2) + str(day(value),2)
    case fieldtype = "N"
      value := str(value, val_len, val_dec)
  endcase
  seek value
  is_valid := found()
  if .not. is_valid
    if eof()
      go top
    endif
    * call the specified function (usually LIST)
    dummy := &udf_name
    if lastkey() = K_ESC
      * abort data entry
      keyboard chr(K_ESC)
    else
      * stuff the keyboard buffer with the selected value
      do case
        case fieldtype = "C"
          keyboard chr(K_CTRL_Y) + &val_field
        case fieldtype = "N"
          keyboard chr(K_CTRL_Y) + str(&val_field, val_len, val_dec)
        case fieldtype = "D"
          keyboard chr(K_CTRL_Y) + dtoc(&val_field)
      endcase
    endif
  endif
  select (old_area)

return is_valid

---[continued]------------------------------------------------------------



Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

---[continued]------------------------------------------------------------

Second, in the procedure InputRec, in GENMNT.GTL, change:

                ..."List{[program identifier]}('{[field val-alias]}')") ;
            << case [field val-type] = "L" >>

to:

                ..."List{[program identifier]}('{[field val-alias]}')",
                ...{[field #length]},{[field #decimals]}) ;
            << case [field val-type] = "L" >>

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

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

PROBLEM:  If you delete all the zoom records for a particular primary
record, the maintenance program sometimes takes you to a non-related
record instead of bouncing you back to the primary database.

COMMENT:  This was corrected in Release B.

FIX:  Insert the indicated lines of code in the procedure Go_Begin, in
GENMNT.GTL:

<< if _Scrolling >>
  win_redraw[WindowNo()] := .T.
<< endif >>
  set softseek off           <===
  do case
<< for all zoom-databases in program >>
    case table = "{[database alias]}"
  << if [database is-primary?] >>
      go top
  << else >>
      seek link_value[{j}]
  << endif >>
<< endfor >>
  endcase
  set softseek on            <===

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

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

PROBLEM:  In Scrolling windows, variables don't always display the
correct values.

COMMENT:  This was corrected in Release B.

FIX:  In the function UnPaint, in both GENMNT.GTL and GENINQ.GTL,
insert the indicated lines:

      << for all fields >>
        << if [field is-memory-variable?] >>            <===
      store {[field default-value]} to {[field name]}   <===
        << endif >>                                     <===
        << if [field is-display?] >>
      @ row_no,{[field #column]} say

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

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

PROBLEM:  When the "Save Record?" prompt appears while adding new records,
the programs display the last record in the database instead of the
record you have just entered.

COMMENT:  This problem was introduced in Release B.  It is essentially
cosmetic, and doesn't affect the integrity of the data.  It was
corrected in Release C.

FIX:  In the function InputRec(), in GENMNT.GTL, change:

    if .not. aborted
      PaintRec{[program identifier]}(.T.)
      if lastkey = K_PGUP

to:

    if .not. aborted
      PaintSay{[program identifier]}(.T.)
      if lastkey = K_PGUP

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

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

PROBLEM:  When you're Adding new records in a zoom database, the pick
lists don't work correctly.

COMMENT:  This was corrected in Release C.

FIX:  In the function List, in GENMNT.GTL, insert the indicated code:

  << endif >>
  << if .not. [database is-zoom?] >>     <===
    set filter to                        <===
  << endif >>                            <===
<< endfor >>
  endcase
  jump_rec := GenBrowse(@list_obj)

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

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

PROBLEM:  If you call a report from a sub-menu, the windows are not
properly closed after you exit the report and return to the main menu.

COMMENT:  This was corrected in Release C.

FIX:  Remove the indicated code in the procedure Print in GENREP.GTL and
GENLABEL.GTL:

  set console on
  go record_no
  PaintWin{[program identifier]}(.T.)      <===

return

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

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

PROBLEM:  The application allows you to add duplicate records if you are
adding while the filter is on.

COMMENT:  This was corrected in Release D.

FIX:  In the function InputRec(), in GENMNT.GTL, insert the indicated
code:

    * check for duplicate key value
    do case
<< for all zoom-databases in program >>
      case table = "{[database alias]}"
  << if [database is-duplicate-allowed?] >>
        select {[database alias]}
        duplicate := .N.
  << else >>
        key_value := {[database ndx-expression]}
        select {[database alias]}
        filter_str := dbfilter()                       <===
        set filter to                                  <===
    << if [database is-primary?] .and. [database #indexes] > 1 >>
        set order to 1
    << endif >>
        seek key_value
        if input_mode = "Modify"
          duplicate := found() .and. (recno() <> record_no)
        else
          duplicate := found()
        endif
        if filter_on[{j}]                              <===
          set filter to &filter_str                    <===
        endif                                          <===
    << if [database is-primary?] .and. [database #indexes] > 1 >>
        set order to ndx_order
    << endif >>
  << endif >>
<< endfor all zoom-databases >>

Make a second insertion near the end of that same function:

  if record_no > 0 .and. record_no <= reccount()
    go record_no
    if filter_on[select()] .and. .not. &(dbfilter())   <===
      * cancel the filter                              <===
      set filter to                                    <===
      filter_on[select()] := .F.                       <===
      Warning "Filter cancelled"                       <===
    endif                                              <===
  endif

return NIL

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

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

PROBLEM:  The cascading modify features does not update link fields on
the third zoom level in some applications.

COMMENT:  This was corrected in Release D.

FIX:  In the function Z_Modify(), in GENMNT.GTL, insert the indicated
code:

  local new_link
  Load{[program identifier]}()                <===

<< for all zoom-databases in program >>
  << if [database is-child?] >>
  if table = "{[database lnk-alias]}"
    select 0                                  <===
    new_link := {[database lnk-expression]}

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

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

PROBLEM:  If your maintenance/inquiry program has several windows, and
you don't close all of them before Quitting, the first window doesn't
appear the next time you run it.

COMMENT:  This was corrected in Release D.

FIX:  In GENMNT.GTL, change:

* PAINT THE SCREEN
  WSave(old_screen)
  Lower Curtain wallpaper Color clr_backg
  PaintWin{[program identifier]}(1)          <===

to:

* PAINT THE SCREEN
  WSave(old_screen)
  Lower Curtain wallpaper Color clr_backg
  PaintWin{[program identifier]}(window := 1)

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

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

PROBLEM:  The templates don't support validation against a file with
more than one key field.

COMMENT:  This is really an enhancement rather than a bug fix.  This
code was included in Release E.

FIX:  You must make changes in three areas to support validation against
a compound key.  Also, be aware that this system will work only if the
fields being validated have exactly the same names as the fields you're
validating against.

First, rewrite the function Val_File(), in the file G_UDF.PRG, as
follows:

function Val_File (value, val_table, list_block)

  local is_valid
  local old_area := select()
  select select(val_table)
  seek value
  is_valid := found()
  if .not. is_valid
    if eof()
      go top
    endif
    * call the specified function (usually LIST)
    eval(list_block)
    keyboard iif(lastkey() = K_ESC, chr(K_ESC), chr(K_ENTER))
  endif
  select (old_area)

return is_valid


Second, in the procedure InputRec, in GENMNT.GTL, change:

            << case [field val-type] = "F" >>
          valid val_file(m->{[field name]}, "{[field val-alias]}",
                ... "{[field val-field]}",
                ... {[left brace]} || ListTable('{[field val-alias]}')
                ... {[right brace]},
                ...{[field #length]},{[field #decimals]}) ;


---[continued]------------------------------------------------------------


Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

---[continued]------------------------------------------------------------


to:

            << case [field val-type] = "F" >>
              << for all databases in program >>
                << if [database name] == [field val-database] >>
          valid val_file({[database ndx-expression]},
                << endif >>
              << endfor >>
                ..."{[field val-alias]}",
                ... {[left brace]} || ListTable('{[field val-alias]}')
                ... {[right brace]}) ;


Third, insert the indicated code in the function ListTable, in
GENMNT.GTL:

  if .not. jump_rec
    go record_no
<< if [program #databases] > [program #zooms] >>                   <===
  else                                                             <===
    do case                                                        <===
  << for all databases in program >>                               <===
    << 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 >>                                                    <===
  << endfor >>                                                     <===
    endcase                                                        <===
<< endif >>                                                        <===
  endif

NOTE:  This code still leaves one anomaly, if you use the pick list on
any validated field except the first one, the previous validated fields
still show their old values.  In fact, all validated fields get updated,
but the new values aren't displayed until you save the record.  For this
reason, you may wish to designate only one of your validated fields as a
Get, and designate the others as Say fields.  The pick list for this
single Get field will control the values of all the related Say fields.

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

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

PROBLEM:  Pressing [Esc] while a report is being generated causes the
program to lock.

COMMENT:  This was corrected in Release E.

FIX:  In the function Print(), in GENREP.GTL, change:

  * print the body of the report
  done := .F. ; aborted := .F.
  do while .not. done
    RepBody(1)
  enddo  

to:

  * print the body of the report
  done := .F. ; aborted := .F.
  do while .not. (done .or. aborted)
    RepBody(1)
  enddo  

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

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

PROBLEM:  If you print a large ( > 64 kilobytes) report to a file and
then attempt to view it, the application runs out of memory and crashes.

COMMENT:  This was corrected in Release E.

FIX:  Two changes are needed.  First, add the following function to
G_UDF.PRG:

function FileSize (file_name)
* determine the size of a file in kilobytes

  local handle := fopen(file_name)
  local no_bytes := fseek(handle, 0, 2)
  fclose(handle)

return (no_bytes/1024)


Second, in the function Print(), in GENREP.GTL and GENLABEL.GTL, change:

      if .not. aborted
        * check to see if file will fit in memory
        if Confirm("View the report file?", .T.)

to:

      if .not. aborted .and. FileSize(print_file) < min(memory(0),64)
        if Confirm("View the report file?", .T.)

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

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

PROBLEM:  When you exit from one module of your application and then
select another module using the same databases, the application crashes
with the message "Alias does not exist."

COMMENT:  This was corrected in Release E.

FIX:  Insert the following line of code in the function CloseDBFs(), in
G_UDF.PRG:

  local N
  for N = 1 to 15
    select (N)                             <===
    use ; Blank() ; Gather() ; Scatter()
  next N

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

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

PROBLEM:  When you validate a one-character field against a List, the
pick list doesn't behave properly.

COMMENT:  This is due to an anomaly in the Clipper ACHOICE() function.
However, the pick list isn't really appropriate for one-character
character fields anyway.  Instead of validating against a List, validate
against an Expression.

If your field is called FIELD1 and the allowable values are A, B, and C,
the proper expression would be:

                             FIELD1 $ "ABC"

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

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

PROBLEM:  If the application fails to link properly, no message (or an
erroreous message) appears to indicate this.

COMMENT:  This was corrected in Release E.

FIX:  In the files BLINKER.GTL and RTLINK.GTL, change:

if errorlevel 1 goto END

to:

if errorlevel 1 goto LINK_ERR

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

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

PROBLEM:  In an Inquiry program, when you Tally the records in a zoom
database, the application crashes.

COMMENT:  This was corrected in Release E.

FIX:  In the file GENINQ.GTL, in the function Tally, insert the
indicated code:

  << if [database is-primary?] >>
      count to no_records while .not. eof()
  << else >>                                                   <===
      count to no_records while .not. At_eof(link_block[{j}])  <===
  << endif >>

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

---[22]-------------------------------------------------------------------

PROBLEM:  When you Zoom from a scrolling window to another window, and
then Quit back out, the scrolling window isn't restored exactly as it
was before.

COMMENT:  This is a cosmetic problem and doesn't affect data integrity.
This problem was corrected in Release E.

FIX:  In the function Zoom_In(), in GENMNT.GTL and GENINQ.GTL, change:

  if .not. eof()
    Go_Begin()
  endif
  if change_win
    FirstWin()
  endif

to:

  if change_win
    FirstWin()
  endif
  if .not. eof()
    Go_Begin()
  endif


In the function Zoom_Out(), change:

  if change_win
    unlock        <===  this line appears in GENMNT.GTL but not GENINQ.GTL
    FirstWin()
    PaintTxt()
  endif

to:

  if change_win
    unlock        <===  this line appears in GENMNT.GTL but not GENINQ.GTL
    PaintTxt()
    FirstWin()
  endif

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

---[23]-------------------------------------------------------------------

PROBLEM:  When you List within a Label program, then Quit back to the
menu, the menu windows are messed up.

COMMENT:  This is only a problem in Label programs, not in regular
reports.  This problem was corrected in Release E.

FIX:  Remove the indicated line of code in the function Main(), in
GENLABEL.GTL:

      case option = 'List'
        ListTable()
        PaintWin(.T.)      <===

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

---[24]-------------------------------------------------------------------

PROBLEM:  When you change index Order within a report program, the
Retreive option doesn't prompt you for the correct fields.

COMMENT:  This was corrected in Release E.

FIX:  In the function Retreive(), in GENREP.GTL and GENLABEL.GTL, add
the indicated code:

  local record_no := recno(), search_val
  local ndx_expr := lower(indexkey(ndx_order))     <===
  Blank()
  PaintTxt()

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

---[25]-------------------------------------------------------------------

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

COMMENT:  This was corrected in Release E.

FIX:  In the function InputRec(), in GENMNT.GTL, add the indicated code:

  FirstWin()
  unlock                                           <===
  if record_no > 0 .and. record_no <= reccount()
    go record_no
    if deleted()   && record may have been deleted by another user!
      Go_Begin()
    endif
  endif

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

---[26]-------------------------------------------------------------------

PROBLEM:  If you change index Order within a program, Quit back to the
menu, then call the same program again, the index Order is the same as
you left it, instead of being reset to the primary index.

COMMENT:  This was corrected in Release E.

FIX:  In the files GENMNT.GTL, GENINQ.GTL, GENREP.GTL, and GENLABEL.GTL,
immediately after the "LOCAL WORK VARIABLES" section, add the following
line of code:

  ndx_order := 1

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

---[27]-------------------------------------------------------------------

PROBLEM:  If you don't specify your memo fields as the last fields in the
database (i.e., the fields with the highest sequence numbers), you get
weird screen displays and other odd behavior when you Add or Modify
records.

COMMENT:  This was corrected in Release E.

WORKAROUND:  Always declare the memo fields as the last fields in the
screen.

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

---[28]-------------------------------------------------------------------

PROBLEM:  Your application fails to link, referring to "unresolved
externals" like AT_EOF00 or PAINTREC00.

COMMENT:  In Release D, the programs use STATIC FUNCTIONs, which
eliminates the need for program identifiers.  This change was noted in
the file CHANGES.TXT, but the note is easy to miss.

Unfortunately, not all references to {[program identifier]} were removed
from the templates, so if you DO specify an identifier, you get the error
described above.

WORKAROUND:  Ignore the instruction on p. 30 of the template
documentation.  Leave the Identifier field blank when you generate your
programs.

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

---[29]-------------------------------------------------------------------

PROBLEM:  While running the generated application, strange characters
appear in the middle of the bottom row of your screen.

COMMENT:  This occurs only if some, but not all, of your data screens
extend to the last row on the screen.  This problem was corrected in
Release E.

FIX:  First, in the function FiltStatus(), in G_UDF.PRG, remove the
indicated code:

  local oldcolor
  static proc_name, filter_box              <===  delete these lines
  if proc_name <> procname(2)               <===
    proc_name  := procname(2)               <===
    filter_box := savescreen(24,34,24,45)   <===
  endif                                     <===
  if filter_on
    oldcolor := setcolor(clr_backg)
    @ 24,34 say " Filter On "
    setcolor(oldcolor)
  else
    restscreen(24,34,24,45,filter_box)
  endif

Second, add the indicated line of code in the files GENMNT.GTL,
GENINQ.GTL, GENREP.GTL, and GENLABEL.GTL:

* PAINT THE SCREEN
  WSave(old_screen)
  Lower Curtain wallpaper Color clr_backg
  PaintWin(window := 1)
  filter_box := savescreen(24,34,24,45)     <===  add this line

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

---[30]-------------------------------------------------------------------

PROBLEM:  If you pack your databases (using a program generated with
GENPACK.GTL), and try to access the G_FILTER database without first
exiting to DOS, you application crashes with the message "Corruption
detected: G_FILTER.NTX".

FIX:  Near the end of RTLINK.GTL (or BLINKER.GTL, if you're a Blinker
user), insert the indicated code:

  if file("G_FILTER.DBF") .and. .not. file("G_FILTER.NTX")
    use G_FILTER exclusive
    Inform "Creating index G_FILTER"
    index on filt_table + filt_desc to G_FILTER
    use                                          <===
    Close Window
  endif

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

Anomaly Report:  Genifer 3.0 Templates for Clipper 5.01

---[31]-------------------------------------------------------------------

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 E templates as part of
the fix for another bug.

FIX:  In the function 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 Clipper 5.01

---[32]-------------------------------------------------------------------

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

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

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

to:

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

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

