crash with UDF-Index when ADD new Record

General Help regarding HMG, Compilation, Linking, Samples

Moderator: Rathinagiri

Post Reply
User avatar
AUGE_OHR
Posts: 2093
Joined: Sun Aug 25, 2019 3:12 pm
DBs Used: DBF, PostgreSQL, MySQL, SQLite
Location: Hamburg, Germany

crash with UDF-Index when ADD new Record

Post by AUGE_OHR »

hi,

i use a UDF-Index and it crash when add new Record
Application Internal Error - C:\hmg.3.4.4\1\HBTEL\HBTEL.exe
Terminated at: 2024-09-01 12:17:25
Nicht zu behebender Fehler 9201: hb_cdxPageKeyIntBalance: index corrupted.
Called from ORDFOR(0)
Called from SETDATAGRIDRECNO(2204) in source\h_grid.prg
Called from SETPROPERTY(7969) in source\h_controlmisc.prg
Called from ADDNEWREC(2497) in C:\hmg.3.4.4\1\HBTEL\HBTEL.PRG
Called from (b)MAIN(321) in C:\hmg.3.4.4\1\HBTEL\HBTEL.PRG
Called from _DOCONTROLEVENTPROCEDURE(6033) in source\h_windows.prg
Called from EVENTS(1794) in source\h_windows.prg
Called from DOMESSAGELOOP(0)
Called from _ACTIVATEWINDOW(5694) in source\h_windows.prg
Called from MAIN(404) in C:\hmg.3.4.4\1\HBTEL\HBTEL.PRG

Code: Select all

2482 STATIC PROCEDURE AddNewRec()
2483
2484 LOCAL nRecNo
2485
2486   SELECT 1
2487   ORDSETFOCUS(0)
2488   APPEND BLANK
2489 *  nRecNo := RECNO()
2490
2491   XPPTEL_Store()
2492   nRecNo := RECNO()
2493  
2494   IF SP_Browse() = "BROWSE"
2495      SetProperty( "XPPTEL", "Browse_1", "value", nRecNo )
2496   ELSE
->2497      SetProperty( "XPPTEL", "Browse_1", "RecNo", nRecNo )
2498   ENDIF

Code: Select all

FUNCTION TNR2STR( value )

LOCAL RETVAR := ""
LOCAL nLen   := LEN( value )
LOCAL nSoll  := nLen
LOCAL i, nDiff
LOCAL cStr

   FOR i = 1 TO nLen
      cStr := SUBSTR( value, i, 1 )
      IF cStr == CHR( 32 )
      ELSE
         RETVAR := RETVAR + cStr
      ENDIF
   NEXT

   nDiff := nSoll - LEN( RETVAR )
   FOR i = 1 TO nDiff
      RETVAR := RETVAR + CHR( 32 )
   NEXT

RETURN RETVAR

Code: Select all

PROCEDURE CreateCDX( cCodepage )

LOCAL _tagname, _keyfeld, _cdxname

   USE XPPTEL.DBF VIA "DBFCDX" EXCLUSIVE CODEPAGE (cCodepage)

   _cdxname := "XPPTEL.CDX"                                           // "TELINDEX"

   _tagname := "KDNAME"                                               //zkdname   1
   _KEYFELD := "UPPER(NAME1+NAME2)"
   ORDCREATE( _cdxname, _tagname, _keyfeld )
   CLOSE INDEX

   _tagname := "STADT"                                                //zkdort    2
   _KEYFELD := "UPPER(STADT+STRASSE)"
   ORDCREATE( _cdxname, _tagname, _keyfeld )
   CLOSE INDEX

   _tagname := "STRASSE"                                              //zstrasse  3
   _KEYFELD := "UPPER(STRASSE+STADT)"
   ORDCREATE( _cdxname, _tagname, _keyfeld )
   CLOSE INDEX

   _tagname := "GESCHTEL"                                             //ztelefon  4
   _KEYFELD := "TNR2STR(TELGES)"
   ORDCREATE( _cdxname, _tagname, _keyfeld )
   CLOSE INDEX

   _tagname := "FAX"                                                  //ztelfax   5
   _KEYFELD := "TNR2STR(TELFAX)"
   ORDCREATE( _cdxname, _tagname, _keyfeld )
   CLOSE INDEX

   _tagname := "1_HANDY"                                              //          6
   _KEYFELD := "TNR2STR(HANDY1)"
   ORDCREATE( _cdxname, _tagname, _keyfeld )
   CLOSE INDEX

   _tagname := "2_HANDY"                                              //          7
   _KEYFELD := "TNR2STR(HANDY2)"
   ORDCREATE( _cdxname, _tagname, _keyfeld )
   CLOSE INDEX

   _tagname := "3_HANDY"                                              //          8
   _KEYFELD := "TNR2STR(ANHANDY)"
   ORDCREATE( _cdxname, _tagname, _keyfeld )
   CLOSE INDEX

   _tagname := "4_HANDY"                                              //          9
   _KEYFELD := "TNR2STR(PVHANDY)"
   ORDCREATE( _cdxname, _tagname, _keyfeld )
   CLOSE INDEX

   _tagname := "ANSPVOR"                                              //zansprech 10
   _KEYFELD := "UPPER(ANSPVOR+ANSPNACH)"
   ORDCREATE( _cdxname, _tagname, _keyfeld )
   CLOSE INDEX

   _tagname := "ANSPNACH"                                             //zansprech 11
   _KEYFELD := "UPPER(ANSPNACH+ANSPVOR)"
   ORDCREATE( _cdxname, _tagname, _keyfeld )
   CLOSE INDEX

   _tagname := "BRANCHE"                                              //zbranche  12
   _KEYFELD := "TKSEL+UPPER(NAME1)"
   ORDCREATE( _cdxname, _tagname, _keyfeld )
   CLOSE INDEX

   _tagname := "KUNDENNO"                                             //zkdnr     13
   _keyfeld := "TKDNR"
   ORDCREATE( _cdxname, _tagname, _keyfeld )
   CLOSE INDEX

   _tagname := "ALLETELNO"                                            //zkdnr     14
   _keyfeld := "TNR2STR(VORTELE)+" + ;
               "TNR2STR(TELGES) +" + ;
               "TNR2STR(VORFAX) +" + ;
               "TNR2STR(TELFAX) +" + ;
               "TNR2STR(VORPRIV)+" + ;
               "TNR2STR(TELPRI) +" + ;
               "TNR2STR(HANDY1) +" + ;
               "TNR2STR(HANDY2) +" + ;
               "TNR2STR(ANHANDY)+" + ;
               "TNR2STR(PVVORT1)+" + ;
               "TNR2STR(PVTEL1) +" + ;
               "TNR2STR(PVVORF1)+" + ;
               "TNR2STR(PVFAX1) +" + ;
               "TNR2STR(PVHANDY)"

   ORDCREATE( _cdxname, _tagname, _keyfeld )
   CLOSE INDEX

   CLOSE

RETURN
why it CRASH :?:
i have try to disable CDX-Index using ORDSETFOCUS(0) when ADD new Record but it does now help.
what can i do :?:
have fun
Jimmy
edk
Posts: 999
Joined: Thu Oct 16, 2014 11:35 am
Location: Poland

Re: crash with UDF-Index when ADD new Record

Post by edk »

Maybe try using #translate directive instead of TNR2STR UDF.

Code: Select all

#translate TNR2STR( <cString> ) => Pad( StrTran ( <cString>, " " ), Len( <cString> ) 
If you use a UDF in an index key, other programs that do not contain the used UDF will not be able to retrieve the index key.
User avatar
AUGE_OHR
Posts: 2093
Joined: Sun Aug 25, 2019 3:12 pm
DBs Used: DBF, PostgreSQL, MySQL, SQLite
Location: Hamburg, Germany

Re: crash with UDF-Index when ADD new Record

Post by AUGE_OHR »

hi Edward,
edk wrote: Sun Sep 01, 2024 5:02 pm If you use a UDF in an index key, other programs that do not contain the used UDF will not be able to retrieve the index key.
thx i will try #translate Directive instead of Function.

Yes i know that other programs that do not contain the used UDF will not be able to use it.
it is Part of my Protection like my Crypt Function.
have fun
Jimmy
Post Reply