Loads the .oData
member with a record accessed by PK. This method or a specialized version of it should be used to load with record level objects and return them to the caller.
You can overload this method to allow object nesting and auto-loading of sub objects. For example, an oInvoice object may contain an oCustomer object. From oInvoice.Load()
you can call oInvoice.oCustomer.Load()
to automatically load the related customer record so the client application never has to explicitly load the customer record.
The default behavior of Load is to do a SCATTER NAME
by running a SQL statement to retrieve all the data from a record (SELECT *
) using the PK as the key. If you want you can override this behavior in a variety of ways:
Create a new object and use it for the oData member You can simply override Load to use your own object and populate the data of its members as you see fit. Heck, you can SCATTER from a completely different table if that makes sense.
oInvoice.oData = CREATEOBJECT("cMyCustomData")
oInvoice.oData.Company="westwind"
Just be careful when you save to a SQL datasource - the fields in the object must match the fields in the database if you use the autoupdate features. But if you use a custom object you most likely will handle updates to the datasource manually anyway.
Run a custom SQL statement and do SCATTER NAME of that
FUNCTION Load
LPARAMETER lnPK
THIS.SetError()
IF EMPTY(lnpk)
THIS.SetError("Load failed - no key passed.")
RETURN .F.
ENDIF
IF !THIS.OPEN()
RETURN .F.
ENDIF
DO CASE
CASE THIS.ndatamode = 0
lckey = "PK"
* **OVERRIDDEN SQL STATEMENT
SELECT wwmb_Messages.*,wwmb_Forums.ForumName,wwmb_Boards.Path ;
FROM wwmb_messages, wwmb_forums, wwmb_boards ;
WHERE wwmb_Messages.PK = lnPK AND ;
wwmb_Messages.ForumPk = wwmb_Forums.PK AND ;
wwmb_Messages.BoardPk = wwmb_Boards.pk ;
INTO CURSOR TQuery
IF _TALLY > 0
SCATTER NAME THIS.oData MEMO
THIS.nUpdateMode = 1 && Edit
ELSE
SCATTER NAME THIS.oData BLANK
THIS.SetError("GetRecord - Record not found.")
RETURN .F.
ENDIF
CASE THIS.ndatamode = 2
THIS.oSQL.cSQL = ;
[SELECT wwmb_Messages.*,wwmb_Forums.ForumName,wwmb_Boards.Path] +;
[ FROM wwmb_messages, wwmb_forums, wwmb_boards] +;
[ WHERE wwmb_Messages.PK = ] + TRANSFORM( lnPK ) + [AND] +;
[ wwmb_Messages.ForumPk = wwmb_Forums.PK AND] +;
[ wwmb_Messages.BoardPk = wwmb_Boards.pk]
lnResult = THIS.osql.Execute()
IF lnResult # 1
THIS.SetError(THIS.osql.cErrorMsg)
RETURN .F.
ENDIF
IF RECCOUNT() > 0
SCATTER NAME THIS.oData MEMO
THIS.nUpdateMode = 1 && Edit
ELSE
SCATTER NAME THIS.oData BLANK MEMO
THIS.SetError("No match found.")
RETURN .F.
ENDIF
ENDCASE
As you can see here I'm scattering from a custom SQL statement rather than using the stock that would access only the local table. Note that if you use a SQL backend you should use the cSkipFieldsForUpdates property to filter out the fields that are not part of the primary datasource in order to have the auto-save features work correctly as they generate a SQL UPDATE/INSERT statement from the object property signature.
o.Load(lnpk)
Return Value
.t. or .f.
Parameters
lnpk
PK of the item to retrieve. Special value: 0 - loads an empty oData member called throgh GetBlankRecord().
See also:
Class wwbusinessObject | wwBusinessObject::cskipfieldsforupdates | wwBusinessObject::cpkfield© West Wind Technologies, 2023 • Updated: 03/04/19
Comment or report problem with topic