Page 1 of 1

Program techniques : change indexorder or use aliases

Posted: Mon Nov 02, 2020 3:15 pm
by Marc Venken
I wonder what the best technique would be and the advantages of 1 of the 2

Often, I need to use the same database in more than one lookup action or update action.

1. I can change the index order, but than I also have to keep track of resetting it back and at the correct position
2. I can open de database in more aliases and use different browses and lookups with these aliases ?? Can I get issues with the CDX file ?

And we can use Oop (James), smaller parts are converted somethimes in this way.
But just out of interest... witch is used more often here ( 1 or 2) ?

In 1 : The first time, sometimes is with a relation set to ... , and when the database order is changed, the relation is broken. (I believe this is standard in FW)

Re: Program techniques : change indexorder or use aliases

Posted: Mon Nov 02, 2020 5:43 pm
by Enrico Maria Giordano
Marc Venken wrote:But just out of interest... witch is used more often here ( 1 or 2) ?
Personally, I'm using both, depending on the specific situation.
Marc Venken wrote:In 1 : The first time, sometimes is with a relation set to ... , and when the database order is changed, the relation is broken. (I believe this is standard in FW)
No, it is standard in xBase languages.

EMG

Re: Program techniques : change indexorder or use aliases

Posted: Mon Nov 02, 2020 7:31 pm
by James Bott
Marc,

You gave me a laugh when I saw your message directed at me-you knew I would say OOP. Good, at least you remember.

Note that back in Clipper era with 16bit computers without much memory we were limited as to how many files we could have open at one time. This rarely an issue now. so you can open as many files as you need usually. You will, however, run into speed issues when the PC has limited RAM.

OOP databases open a new copy of a database each time they are initiated. So you may have several copies of the same database open at once.

oCustomer1:= TCustomer():new()
oCustomer2:= TCustomer():new()

Without using OOP, if you try to open one database and use it in several routines by passing it around, then you are going to have to save and restore it's state in each routine that changes the state. That means index , index order, current recno, filter, relation, etc. I tried this once but it was way too complicated.

With OOP, it just takes one line of code to open a new copy of a database--and no save and restore needed. Actually, it could be more than one database, for instance with a sales order object. You have a customer, invoice header and invoice line items databases, and two of them are related. Still one line of code to open it:

oSalesOrder:= TSalesOrder():new()

James

Simplicity is the ultimate sophistication. ~Leonardo DaVinci

Re: Program techniques : change indexorder or use aliases

Posted: Tue Nov 03, 2020 12:44 pm
by nageswaragunupudi
This is easy
2. I can open de database in more aliases and use different browses and lookups with these aliases ?? Can I get issues with the CDX file ?
No problems.

Re: Program techniques : change indexorder or use aliases

Posted: Wed Nov 04, 2020 11:30 am
by Marc Venken
* New: function FW_DBFLOOKUP( uVal, [cOrder], bcRetExprn ) --> uResult
uVal : Value / Expression to be lookedup ( seek or locate )
cOrder : OrderName for seek. Or field name for locate. Omit if uVal
is an expression
bcRetExpr: codeblock/string: Expression to evaluate
Examples:
CUSTOMER->( FW_DBFLOOKUP( 108, "ID", "AGE" ) ) --> nAge of ID 108
CUSTOMER->( FW_DBFLOOKUP( 99, "ID", "FIELD->SALARY += 100" ) ) -->
Salary field is incremented and written to table and returns the value
ITEMS->( FW_DBLOOKUP( 101, "ITEMCODE", { || FIELD->QTY -= nOldQty } )
ITEMS->( FW_DBLOOKUP( 103, "ITEMCODE", { || FIELD->QRY += nNewQty } )
STATES->( FW_DBLOOKUP( 10, 0, "FIELD->NAME" ) ) // at recno 10
Original recno() and order are restored and any previous locks are
left intact before returning.
Reurn value NIL indicates failure
source: \fwh\function\dbffuns2.prg
ITEMS->( FW_DBLOOKUP( 101, "ITEMCODE", { || FIELD->QTY -= nOldQty } )
ITEMS->( FW_DBLOOKUP( 103, "ITEMCODE", { || FIELD->QRY += nNewQty } )

This function handles also everything not ?? (no need to extra open the dbf in a new alias)

This sample in use with a bchange function call from Xbrowse should work not ? (will test it later)

ITEMS->( FW_DBLOOKUP( obrw:code:value, "ITEMCODE", { || FIELD->GROEP = oBrw:groep:value } ) )

I suppose that we can also change more than one item with this code ? { || FIELD->GROEP = oBrw:groep:value, FIELD->DATE = date() } or maybe better call a function and change the data insite the function ?

This function supposes that the file is already open... Can we also let it open the dbf when it is not yet open before calling the function ?