Error DBCMD/2001 Workarea not in use: ORDLISTADD

General Help regarding HMG, Compilation, Linking, Samples

Moderator: Rathinagiri

Post Reply
huangchenmin
Posts: 157
Joined: Mon Jun 07, 2010 2:24 am

Error DBCMD/2001 Workarea not in use: ORDLISTADD

Post by huangchenmin »

Hello everyone:
Here is the story. I defined a schedule task with windows, and run my application at 12:20 every mon~Fri.
『Error DBCMD/2001 Workarea not in use: ORDLISTADD』keeps coming out on and off. I pretty sure that casue is no because of using by someone else at same time.
What else going worng?
Please Help!
sincerely chen min


Following are whole message

Date:11/14/11 Time: 12:20:01
Error DBCMD/2001 Workarea not in use: ORDLISTADD
Called from ORDLISTADD(0)
Called from DBSETINDEX(0)
Called from OPENDB(1107)
Called from WHENSTART$(757)

Following are partical source code
init function WhenStart()
set softseek OFF
set delete ON
Local m_driver:=upper(left(GetCurrentFolder(),1))
if m_driver=='J'
OpenDBt()
elseif m_driver=='X'
OpenDB()<-----------line 757
else
MsgInfo('無法開啟資料庫,按確定結束!','WhenStart()')
Form_upload.RELEASE
endif
return

OpenDB() and OpenDBt() are complete same.

OpenDB()
IF file("X:\DM_UPLOAD\ULHI01.ntx") .and. file("X:\DM_UPLOAD\ULHI02.NTX");
.and. file("X:\DM_UPLOAD\ULHI03.NTX") .and. file("X:\DM_UPLOAD\ULHI04.NTX");
.and. file("X:\DM_UPLOAD\ULHI05.NTX")
USE X:\DM_UPLOAD\ULHIS INDEX;
X:\DM_UPLOAD\ULHI01,;
X:\DM_UPLOAD\ULHI02,;
X:\DM_UPLOAD\ULHI03,;
X:\DM_UPLOAD\ULHI04,;
X:\DM_UPLOAD\ULHI05 EXCLUSIVE<------line 1107
if neterr()
msginfo("Fail to open database, someone is using it!")
close
endif
ELSE
ENDIF
......
return
User avatar
l3whmg
Posts: 694
Joined: Mon Feb 23, 2009 8:46 pm
Location: Italy
Contact:

Re: Question about 『Error DBCMD/2001 Workarea not in use: OR

Post by l3whmg »

Hi
first of all I suggest to you to use this function (and related) to open table DBUSEAREA(....)
Little example

Code: Select all

   LOCAL cFileName   := hb_fnameMerge( cSomePath, cTableName, "dbf" )
   LOCAL cAlias := cTableName // as you prefer
   LOCAL lNewArea := .T. // as you prefer
   LOCAL lNotShared := .F. // as you prefer
   LOCAL lReadOnly := .F. // as you prefer
   DBUSEAREA( lNewArea, DBSETDRIVER(), cFileName, cAlias, lNotShared, lReadOnly )
and bout ORDLISTADD, little example

Code: Select all

  LOCAL cFileName
   cFileName   := hb_fnameMerge( cSomePath, "index1", "ntx" )
   ORDLISTADD( cFileName )
   cFileName   := hb_fnameMerge( cSomePath, "index2", "ntx" )
   ORDLISTADD( cFileName )
   etc
   ORDSETFOCUS(1) //  or 2 or 3
As yu can see I always used cSomePath. You can create it as you prefer and then it's the same for table (dbf) and index (ntx). This can be an :idea:

About yor problem: before use OpenDbt() and OpenDb() all table area closed? Do you use the same alias? Are you shure only one time OpenDbt() OR opneDb() are execute......about commands _SET_* ?
Why do you write two functions and they do the same things?

Cheers
Luigi from Italy
www.L3W.it
huangchenmin
Posts: 157
Joined: Mon Jun 07, 2010 2:24 am

Re: Question about 『Error DBCMD/2001 Workarea not in use: OR

Post by huangchenmin »

l3whmg wrote:Hi
first of all I suggest to you to use this function (and related) to open table DBUSEAREA(....)
Little example
...
Cheers
Dear l3whmg:
Sorry for replying so late.
Thanks for you help, and it is reall helpful.
After 'Hunting' for couples of days. Finally I knew the reason why the errors occures!
My boss using the application while I set database exclusived for synchronization.

I coding and testing in usb disk, so I make opendb() and opendbt() for real run and testing.
I let application tell which one to call while run from server or usb disk. Thus I don't have to switch for.
Thanks again for you help.
Sincerely chen min
User avatar
l3whmg
Posts: 694
Joined: Mon Feb 23, 2009 8:46 pm
Location: Italy
Contact:

Re: Question about 『Error DBCMD/2001 Workarea not in use: OR

Post by l3whmg »

Hi Chen Min,
no problem for "late". I'm happy you found the problem and I want add these to help you again

A simple function related with previous example:

Code: Select all

nSecondsToWait := 3 // or 5.....
lOpen := .F.
IF SELECT( cAlias ) <= 0
   DO WHILE .T.
      DBUSEAREA( lNewArea, DBSETDRIVER(), cFileName, cAlias, lNotShared, lReadOnly )
      IF nSecondsToWait <= 0
         EXIT
      ELSEIF NETERR()
         nSecondsToWait -= 1
         INKEY( 1 )
      ELSE
         lOpen := .T.
         EXIT
      ENDIF
   ENDDO
   IF lOpen == .F.
       YourErrorHandler( "Can't open table" )   <====(1)
   ENDIF
ELSE
   YourErrorHandler( "Alias already in use" )
ENDIF

RETURN lOpen  // can be .T. or .F.
(1) here you can intercept errors while opening a table. And this include sharing/exclusive problem.

Cheers
Luigi from Italy
www.L3W.it
huangchenmin
Posts: 157
Joined: Mon Jun 07, 2010 2:24 am

Re: Question about 『Error DBCMD/2001 Workarea not in use: OR

Post by huangchenmin »

l3whmg wrote:Hi Chen Min,
no problem for "late". I'm happy you found the problem and I want add these to help you again

......
Cheers
Dear l3whmg:
Thank you very very much about those samples for me.
I don't figue out how nSecondsToWait got value for it ?
Could you explain it to me? Please.
Sincerely chen min
User avatar
l3whmg
Posts: 694
Joined: Mon Feb 23, 2009 8:46 pm
Location: Italy
Contact:

Re: Question about 『Error DBCMD/2001 Workarea not in use: OR

Post by l3whmg »

Hi Chen Min.
Firts of all: this is one solution, there are many other as you prefer.

First: you are within a loop and you are trying to open a table

Code: Select all

DO WHILE .T.
 DBUSEAREA( lNewArea, DBSETDRIVER(), cFileName, cAlias, lNotShared, lReadOnly )
ENDDO
When it will be ended?
A) when a simple timer is finished

Code: Select all

   IF nSecondsToWait <= 0
         EXIT
B) when table is opened

Code: Select all

ELSE
         lOpen := .T.
         EXIT
      ENDIF
C) about this

Code: Select all

      ELSEIF NETERR()
         nSecondsToWait -= 1
         INKEY( 1 )
There are many reasons to receive an error: ie an index rebuild. So: I wait a while and then I retry to open (3 or 5 secs for example).

I suggest to you to remember: write your programs thinking to be in a network where several users can do more actions based upon your code. For example: I write my programs without using reindex because it requires "exclusive" opening; for me this is a special event and must be done with database closed for end users. But this it is my opinion.

Cheers

p.s. you can use the same concept with RLOCK()......
Luigi from Italy
www.L3W.it
huangchenmin
Posts: 157
Joined: Mon Jun 07, 2010 2:24 am

Re: Question about 『Error DBCMD/2001 Workarea not in use: OR

Post by huangchenmin »

huangchenmin wrote:
l3whmg wrote:Hi Chen Min,
no problem for "late". I'm happy you found the problem and I want add these to help you again
...
Sincerely chen min
Thanks again!
Being very helpful to me.
Sincerely chen min
JosK
Posts: 46
Joined: Tue Nov 08, 2011 11:38 pm

Re: Question about 『Error DBCMD/2001 Workarea not in use: OR

Post by JosK »

i had the same error with virtualgrid

Function MaakBrowseDbf1()
use dbf1.dbf
MaakBrowse()
Function MaakBrowseDbf2()
use dbf2.dbf
MaakBrowse()

Function MaakBrowse()
local o
o:=Virtualgrid:New()
o:workarea:=alias()
This gives the error.
The solution is:
select 1
use dbf1
select 2
use dbf2



huangchenmin wrote:Hello everyone:
Here is the story. I defined a schedule task with windows, and run my application at 12:20 every mon~Fri.
『Error DBCMD/2001 Workarea not in use: ORDLISTADD』keeps coming out on and off. I pretty sure that casue is no because of using by someone else at same time.
What else going worng?
Please Help!
sincerely chen min


Following are whole message

Date:11/14/11 Time: 12:20:01
Error DBCMD/2001 Workarea not in use: ORDLISTADD
Called from ORDLISTADD(0)
Called from DBSETINDEX(0)
Called from OPENDB(1107)
Called from WHENSTART$(757)

Following are partical source code
init function WhenStart()
set softseek OFF
set delete ON
Local m_driver:=upper(left(GetCurrentFolder(),1))
if m_driver=='J'
OpenDBt()
elseif m_driver=='X'
OpenDB()<-----------line 757
else
MsgInfo('無法開啟資料庫,按確定結束!','WhenStart()')
Form_upload.RELEASE
endif
return

OpenDB() and OpenDBt() are complete same.

OpenDB()
IF file("X:\DM_UPLOAD\ULHI01.ntx") .and. file("X:\DM_UPLOAD\ULHI02.NTX");
.and. file("X:\DM_UPLOAD\ULHI03.NTX") .and. file("X:\DM_UPLOAD\ULHI04.NTX");
.and. file("X:\DM_UPLOAD\ULHI05.NTX")
USE X:\DM_UPLOAD\ULHIS INDEX;
X:\DM_UPLOAD\ULHI01,;
X:\DM_UPLOAD\ULHI02,;
X:\DM_UPLOAD\ULHI03,;
X:\DM_UPLOAD\ULHI04,;
X:\DM_UPLOAD\ULHI05 EXCLUSIVE<------line 1107
if neterr()
msginfo("Fail to open database, someone is using it!")
close
endif
ELSE
ENDIF
......
return
Post Reply