2004-02 I.Q. David Arturo Macias Corona Modifications Class TMySQLRow --------------------------------------------- - DATA new TMySQLRow:aOriValue Store originals values of aRow, during creation of TMySQLRow object Have same function of TMySQLTable:aOldValue - TMySQLRow:New() Assign an copy of TMySQLRow:aRow in TMySQLRow:aOriValue - TMySQLRow:FielPut() Compare ::aRow[nNum]==NIL in place of Empty(::aRow[nNum]) Empty() can be an null string, value 0, null date, value .F. - TMySQLRow:FieldPos() Reduction of code with same functionality for calculate nPos - TMySQLRow:FieldLen() Return 0 in place of null string as exception value - TMySQLRow:FieldDec() Return 0 in place of null string as exception value Class TMySQLQuery ------------------------------------------- - DATA new TMySQLQuery:lBof Change in application of TMySQLQuery:Bof() - DATA new TMySQLQuery:lEof Change in application of TMySQLQuery:Eof() - DATA new TMySQLQuery:lFieldAsData Is applied for compatibility Use field names as DATA elements of TMySQLQuery Field names can match with DATA names in TMySQLQuery or TMySQLTable, which can substitute values and confuse operations and behaviour of classes Using TMySQLQuery:lFieldAsData := .F. can avoid this trouble - DATA new TMySQLQuery:aRow Used to store fields values of current row, in place of fields names as DATA elements of TMySQLQuery All operations on fields are made using this array of values - Method TMySQLQuery:Bof() Change in definition to reproduce Clipper behaviour Bof() true is applied when is tryed an movement before of first logical record, and must not be used to indicate record pointer is placed on record 1 Previous definition cause processes like this: WHILE ! oQuery:Bof() ... oQuery:SKIP( -1 ) ENDD do not show record 1 With new definition this behaviour are corrected - Method TMySQLQuery:Eof() Change in definition to reproduce Clipper behaviour Eof() true is applied when is tryed an movement beyond of last logical record, and must not be used to indicate record pointer is placed on last record Previous definition cause processes like this: WHILE ! oQuery:Eof() ... oQuery:SKIP() ENDDO do not show last record With new definition this behaviour are corrected With Eof() true, record pointer is placed in LastRec()+1 - TMySQLQuery:New() Application of TMySQLQuery:lBof, TMySQLQuery:lEof, TMySQLQuery:lFieldAsData, TMySQLQuery:aRow - TMySQLQuery:Skip() Application of TMySQLQuery:lBof, TMySQLQuery:lEof to determinate movements before of first and beyond of last logical records Only SKIP movement can set Bof() true - TMySQLQuery:Skip() Apply NIL for return. dbSkip() return NIL - TMySQLQuery:GetRow() Application of TMySQLQuery:lBof, TMySQLQuery:lEof, TMySQLQuery:lFieldAsData, TMySQLQuery:aRow = TMySQLQuery:aRow is used in place of local variable aRow = Default row is applied to TMySQLQuery:nCurRow, in place to move record pointer position = TMySQLQuery:lBof, TMySQLQuery:lEof are determinated TMySQLQuery:bof(): pointer is placed in row 1 TMySQLQuery:eof(): pointer is placed in TMySQLQuery:lastrec()+1 = In TMySQLQuery:lastrec()+1 phantom record is used with null values in each field type - TMySQLQuery:GetRow() = Correction of error caused for data type in logical and numerics types = Supresion of messages with Alert() and MsgInfo() which cause halting in batch processes - TMySQLQuery:FieldPos() Reduction of code with same functionality for calculate nPos - TMySQLQuery:FieldGet() = TMySQLQuery:aRow[nNum] is used in place of DATA variable corresponding to field name - TMySQLQuery:FieldLen() Return 0 in place of null string as exception value - TMySQLQuery:FieldDec() Return 0 in place of null string as exception value Class TMySQLTable ------------------------------------------- - Method TMySQLTable:Update() = Parameters added: + lOldRecord: Use original values of record for locate it + lRefresh: refresh query to MySQL server to update information selected for Client program - Method TMySQLTable:Delete() = Parameters added: + lOldRecord: Use original values of record for locate it + lRefresh: refresh query to MySQL server to update information selected for Client program - Method TMySQLTable:Append() = Parameters added: + lRefresh: refresh query to MySQL server to update information selected for Client program - Method TMySQLTable:GetBlankRow() = Parameters added: + lSetValues: apply values as if they belong to current row - New Method TMySQLTable:SetBlankRow() Apply TMySQLTable:GetBlankRow( .T. ), with true value for lSetValues - TMySQLTable:Skip() Apply NIL for return. dbSkip() return NIL - TMySQLTable:Update(oRow, lOldRecord, lRefresh) = Application of TMySQLRow:aOriValue, TMySQLTable:aRow = Application of parameters: + lOldRecord, default .F. In case of lOldRecord application: * Using current row: Use values of TMySQLQuery:aOldValue * Using given row: Use values of TMySQLRow:aOriValue Locating is based in matching of values of ALL fields, using original values of row WARNING: If there are more than one row matching in ALL fields, then all this rows with common values will be changed This approach is applied to help in row locating when there are not indexes, or primary key are not enought to determinate record unicity. But, can not be guaranted record correspondence if there are many equals This is an alternative to use of TMySQLRow/TMySQLTable:MakePrimaryKeyWhere(), because this last is based in fields belonging to an primary key + lRefresh, default .T. Refresh query to MySQL server to update information selected for Client program Is very convenient in case of information changes = Same record pointer is keep = For an given row, TMySQLRow:aOriValue is updated with current values of TMySQLRow:aRow - TMySQLTable:Delete(oRow, lOldRecord, lRefresh) = Application of TMySQLRow:aOriValue, TMySQLTable:aRow = Application of parameters: + lOldRecord, default .F. In case of lOldRecord application: * Using current row: Use values of TMySQLQuery:aOldValue * Using given row: Use values of TMySQLRow:aOriValue Locating is based in matching of values of ALL fields, using original values of row WARNING: If there are more than one row matching in ALL fields, then all this rows with common values will be changed This approach is applied to help in row locating when there are not indexes, or primary key are not enought to determinate record unicity. But, can not be guaranted record correspondence if there are many equals This is an alternative to use of TMySQLRow/TMySQLTable:MakePrimaryKeyWhere(), because this last is based in fields belonging to an primary key + lRefresh, default .T. Refresh query to MySQL server to update information selected for Client program Is very convenient in case of information changes = Same record pointer is keep = For an given row, TMySQLRow:aOriValue is updated with current values of TMySQLRow:aRow - Metodo TMySQLTable:Append(oRow, lRefresh) = Application of TMySQLRow:aOriValue, TMySQLTable:aRow = Application of parameters: + lRefresh, default .T. Refresh query to MySQL server to update information selected for Client program Is very convenient in case of information changes = Record pointer is placed in TMySQLTable:lastrec()+1, before query refresh Observation: even with many tests, I was unable to determinate in which way set MySQL server position of inserted row. Without indexes, in times were inserted behind to current pointer, while in other times were inserted in positions located at 1200 or 1300 rows relative to current pointer, or at end of table (around 2880 rows) = For an given row, TMySQLRow:aOriValue is updated with current values of TMySQLRow:aRow Too, TMySQLRow:aDirty and TMySQLRow:aOldValue are reseted - TMySQLTable:GetBlankRow(lSetValues) = Application of parameters: + lSetValues, default .F. This method give an TMySQLRow object with default values for data type in each field As created row IS NOT current row of TMySQLTable object, then must not be modified values of TMySQLTable:aRow and TMySQLTable:aOldValue In case of need to make this modification, as if empty file is wanted current row of table, then this parameter can be applied with true value or with new method TMySQLTable:SetBlankRow() - TMySQLTable:FielPut() = Comparar ::aRow[nNum]==NIL en vez de Empty(::aRow[nNum]) Compare ::aRow[nNum]==NIL in place of Empty(::aRow[nNum]) Empty() can be an null string, value 0, empty date, value .F. = TMySQLTable:aRow[nNum] is applied to store field value = Based in TMySQLTable:lFieldAsData, is updated DATA element of TMySQLTable corresponding to field name - Skipper() Modification of movement control in order to apply new definitions of TMySQLQuery:Bof() and TMySQLQuery:Eof()