I hope this helps.

For read-only use DmQueryRecord()

RecordStruct getRecord ( UInt16 index )
{
MemHandle memH;
MemPtr memP;
RecordStruct record;
memH = (MemHandle) DmQueryRecord (dbP, index);
memP = MemHandleLock (memH);
MemMove (&record, ((RecordStruct*)memP), sizeof(RecordStruct));
MemHandleUnlock (memH);
return record;
}


For read-write or overwrite use DmGetRecord() and DmReleaseRecord().

void setRecord ( RecordStruct record, UInt16 index )
{
MemHandle memH;
MemPtr memP;
memH = DmGetRecord (dbP, indice);
memP = MemHandleLock (memH);
DmWrite (memP, 0, &record, sizeof(RecordStruct));
MemHandleUnlock (memH);
DmReleaseRecord(dbP, index, true);
}


Good Luck.

Eduardo Orea.


"griffariff" <[EMAIL PROTECTED]> escribió en el mensaje 
news:[EMAIL PROTECTED]
> Thanks for that. I did not see any info on WHICH creator ID to use
> in the documentation. I inserted the generic 'STRT' for the sake of
> example, but I did not have 'psys' in my actual code. I switched my
> code to use 'psys' and that seems to work on my TX that I use for
> testing.
>
> I still haven't quite figured out the DmGetRecord DmReleaseRecord
> thing yet. I thought I was on the right track because it was
> working in Simulator 5.4. Yesterday I tried it on my TX and it was
> a crash fest. Here is the code in the original daVinci API:
> extern Err GetRecord(DmOpenRef db, UInt16 recordNum, void *item)
> {
>    void *src;
>    void *recordH;
>                              //Get the record from the database
>    recordH = DmQueryRecord(db, recordNum);
>    src = MemHandleLock(recordH);
>    if (src == NULL) return dmErrIndexOutOfRange;
>                              //Unpack the record
>    UnpackRecord(db, item, src);
>    MemHandleUnlock(recordH);
>    return 0;
> }
>
> I changed it to:
> extern Err GetRecord(DmOpenRef db, UInt16 recordNum, void *item)
> {
>    void *src;
>    void *recordH;
>    UInt32 value = 0;
>    Err error = errNone;
>
>    UInt8 highest;
>    UInt32 count;
>    UInt32 busy;
>
>    //these lines were added
>    error = FtrGet('psys',sysFtrNumDmAutoBackup, &value);
>    if (error == 0)
>    {
> error = DmSyncDatabase(db);
> if (error != errNone)
>     ErrAlert(error);
>    }
>    else if (error == ftrErrNoSuchFeature)
> gBigBadError = error;
>                              //Get the record from the database
>    //recordH = DmQueryRecord(db, recordNum);// - this line was replaced by 
> the following
>    recordH = DmGetRecord(db, recordNum);
>    src = MemHandleLock(recordH);
>    if (src == NULL) return dmErrIndexOutOfRange;
>                              //Unpack the record
>    UnpackRecord(db, item, src);
>    MemHandleUnlock(recordH);
>
>    DmGetDatabaseLockState (db, &highest, &count, &busy);
>    if (busy > 0)
>    {
>    DmReleaseRecord(db, recordNum, true);
>    error = DmSyncDatabase(db);
>    }
>    return 0;
> }
>
> I noticed that calling DmReleaseRecord when a record is not busy causes 
> the TX to crash (reset) hence the DmGetDatabaseLockState call. Am I on the 
> right track? Why does MemHandleUnlock seem to clear the busy count?
> 



-- 
For information on using the ACCESS Developer Forums, or to unsubscribe, please 
see http://www.access-company.com/developers/forums/

Reply via email to