2004-02 I.Q. David Arturo Macias Corona Modificaciones Clase TMySQLRow --------------------------------------------- - DATA nueva TMySQLRow:aOriValue Almacena los valores originales de aRow, en la creacion del objeto TMySQLRow Tiene la misma funcion de TMySQLTable:aOldValue - TMySQLRow:New() Asignar una copia de TMySQLRow:aRow en TMySQLRow:aOriValue - TMySQLRow:FielPut() Comparar ::aRow[nNum]==NIL en vez de Empty(::aRow[nNum]) Empty() puede ser cadena nula, valor 0, fecha nula, valor .F. - TMySQLRow:FieldPos() Reduccion de codigo con misma funcionalidad para calcular nPos - TMySQLRow:FieldLen() Retornar 0 en vez de cadena nula como valor de excepcion - TMySQLRow:FieldDec() Retornar 0 en vez de cadena nula como valor de excepcion Clase TMySQLQuery ------------------------------------------- - DATA nueva TMySQLQuery:lBof Cambio en la aplicacion de TMySQLQuery:Bof() - DATA nueva TMySQLQuery:lEof Cambio en la aplicacion de TMySQLQuery:Eof() - DATA nueva TMySQLQuery:lFieldAsData Se aplica por compatibilidad Usar nombres de los campos como elementos DATA de TMySQLQuery Los nombres de campos pueden coincidir con nombres de DATA en TMySQLQuery o TMySQLTable, lo cual puede sustituir valores y confundir las operaciones y el funcionamiento de las clases Usando TMySQLQuery:lFieldAsData := .F. se evita este conflicto - DATA nueva TMySQLQuery:aRow Se usa para almacenar los valores de los campos de la fila actual, en sustitucion de los nombres de los campos como elementos DATA de TMySQLQuery Todas las operaciones sobre campos se hacen sobre esta matriz de valores - Metodo TMySQLQuery:Bof() Cambio en la definicion para reproducir el comportamiento con Clipper Bof() verdadero se aplica cuando se intenta ir antes del primer registro logico, y no debe usarse para indicar que el puntero esta en el registro 1 La definicion anterior causa que procesos como: WHILE ! oQuery:Bof() ... oQuery:SKIP( -1 ) ENDD no muestren el registro 1 Con la nueva definicion se corrige este comportamiento - Metodo TMySQLQuery:Eof() Cambio en la definicion para reproducir el comportamiento con Clipper Eof() verdadero se aplica cuando se intenta ir despues del ultimo registro logico, y no debe usarse para indicar que el puntero esta en el ultimo registro La definicion anterior causa que procesos como: WHILE ! oQuery:Eof() ... oQuery:SKIP() ENDDO no muestren el ultimo registro Con la nueva definicion se corrige este comportamiento Con Eof() verdadero, el puntero de registro se ubica en LastRec()+1 - TMySQLQuery:New() Aplicacion de TMySQLQuery:lBof, TMySQLQuery:lEof, TMySQLQuery:lFieldAsData, TMySQLQuery:aRow - TMySQLQuery:Skip() Aplicacion de TMySQLQuery:lBof, TMySQLQuery:lEof para determinar movimientos antes del primer y despues del ultimo registros logicos Solamente el movimiento con SKIP puede establecer Bof() verdadero - TMySQLQuery:Skip() Aplicar NIL para retorno. dbSkip() retorna NIL - TMySQLQuery:GetRow() Aplicacion de TMySQLQuery:lBof, TMySQLQuery:lEof, TMySQLQuery:lFieldAsData, TMySQLQuery:aRow = Se usar TMySQLQuery:aRow en lugar de la variable local aRow = La fila por omision se aplica a TMySQLQuery:nCurRow, en lugar de mover la posicion del puntero = Se determinan TMySQLQuery:lBof, TMySQLQuery:lEof TMySQLQuery:bof(): el puntero queda ubicado en fila 1 TMySQLQuery:eof(): el puntero queda ubicado en TMySQLQuery:lastrec()+1 = En TMySQLQuery:lastrec()+1 se usa el registro fantasma con valores nulos en cada tipo de campo - TMySQLQuery:GetRow() = Correccion de error por tipo de dato en tipos logico y numericos = Supresion de mensajes con Alert() y MsgInfo() que causarian detencion en procesos desatendidos - TMySQLQuery:FieldPos() Reduccion de codigo con misma funcionalidad para calcular nPos - TMySQLQuery:FieldGet() = Se usa TMySQLQuery:aRow[nNum] en lugar de la variable DATA correspondiente al nombre del campo - TMySQLQuery:FieldLen() Retornar 0 en vez de cadena nula como valor de excepcion - TMySQLQuery:FieldDec() Retornar 0 en vez de cadena nula como valor de excepcion Clase TMySQLTable ------------------------------------------- - Metodo TMySQLTable:Update() = Se agregaron los parametros: + lOldRecord: Usar los valores originales del registro para localizarlo + lRefresh: renovar la consulta al servidor MySQL para actualizar la informacion seleccionada para el programa Cliente - Metodo TMySQLTable:Delete() = Se agregaron los parametros: + lOldRecord: Usar los valores originales del registro para localizarlo + lRefresh: renovar la consulta al servidor MySQL para actualizar la informacion seleccionada para el programa Cliente - Metodo TMySQLTable:Append() = Se agregaron los parametros: + lRefresh: renovar la consulta al servidor MySQL para actualizar la informacion seleccionada para el programa Cliente - Metodo TMySQLTable:GetBlankRow() = Se agregaron los parametros: + lSetValues: aplicar valores como si correspondieran a la fila actual - Nuevo Metodo TMySQLTable:SetBlankRow() Aplica TMySQLTable:GetBlankRow( .T. ), con valor de lSetValues verdadero - TMySQLTable:Skip() Aplicar NIL para retorno. dbSkip() retorna NIL - TMySQLTable:Update(oRow, lOldRecord, lRefresh) = Aplicacion de TMySQLRow:aOriValue, TMySQLTable:aRow = Aplicacion de los parametros: + lOldRecord, omision .F. En caso de aplicar lOldRecord: * Usando fila actual: Utiliza los valores TMySQLQuery:aOldValue * Usando fila proporcionada: Utiliza los valores TMySQLRow:aOriValue La localizacion se basa en la coincidencia de valores de TODOS los campos, usando los valores originales de la fila ADVERTENCIA: Si hay mas de una fila que coincida en TODOS los campos, entonces todas estas filas con valores comunes seran cambiadas Se aplico esta aproximacion para auxiliar en la localizacion de filas cuando no existen indices, o la llave primaria es insuficiente para determinar la unicidad del registro. Sin embargo, no se puede garantizar la correspondencia del registro si existen varios iguales Es una alternativa al uso de TMySQLRow/TMySQLTable:MakePrimaryKeyWhere(), ya que esta ultima esta basada en campos que forman parte de una llave primaria + lRefresh, omision .T. Renueva la consulta al servidor MySQL para actualizar la informacion seleccionada para el programa Cliente. Es muy conveniente en caso de modificacion de informacion = Se mantiene el mismo apuntador de registro = Para una fila proporcionada, se actualiza TMySQLRow:aOriValue con los valores actuales de TMySQLRow:aRow - TMySQLTable:Delete(oRow, lOldRecord, lRefresh) = Aplicacion de TMySQLRow:aOriValue, TMySQLTable:aRow = Aplicacion de los parametros: + lOldRecord, omision .F. En caso de aplicar lOldRecord: * Usando fila actual: Utiliza los valores TMySQLQuery:aOldValue * Usando fila proporcionada: Utiliza los valores TMySQLRow:aOriValue La localizacion se basa en la coincidencia de valores de TODOS los campos, usando los valores originales de la fila ADVERTENCIA: Si hay mas de una fila que coincida en TODOS los campos, entonces todas estas filas con valores comunes seran cambiadas Se aplico esta aproximacion para auxiliar en la localizacion de filas cuando no existen indices, o la llave primaria es insuficiente para determinar la unicidad del registro. Sin embargo, no se puede garantizar la correspondencia del registro si existen varios iguales Es una alternativa al uso de TMySQLRow/TMySQLTable:MakePrimaryKeyWhere(), ya que esta ultima esta basada en campos que forman parte de una llave primaria + lRefresh, omision .T. Renueva la consulta al servidor MySQL para actualizar la informacion seleccionada para el programa Cliente. Es muy conveniente en caso de modificacion de informacion = Se mantiene el mismo apuntador de registro = Para una fila proporcionada, se actualiza TMySQLRow:aOriValue con los valores actuales de TMySQLRow:aRow - Metodo TMySQLTable:Append(oRow, lRefresh) = Aplicacion de TMySQLRow:aOriValue, TMySQLTable:aRow = Aplicacion de los parametros: + lRefresh, omision .T. Renueva la consulta al servidor MySQL para actualizar la informacion seleccionada para el programa Cliente. Es muy conveniente en caso de modificacion de informacion = Se ubica el apuntador en TMySQLTable:lastrec()+1, antes de renovar la consulta Observacion: a pesar de reiteradas pruebas, no se pudo determinar en que manera establece el servidor MySQL la posicion de la fila insertada. Sin usar indices, en ocasiones la insertaba adjunta al puntero actual, en tanto que en otras ocasiones la insertaba en posiciones ubicadas a 1200 o 1300 filas con respecto al puntero actual, o al final de la tabla (alrededor de 2880 filas) = Para una fila proporcionada, se actualiza TMySQLRow:aOriValue con los valores actuales de TMySQLRow:aRow Ademas, se inicializan TMySQLRow:aDirty y TMySQLRow:aOldValue - TMySQLTable:GetBlankRow(lSetValues) = Aplicacion de los parametros: + lSetValues, omision .F. Este metodo proporciona un objeto TMySQLRow con valores por omision para el tipo de dato en cada campo. Como la fila generada NO es la fila actual del objeto TMySQLTable, entonces no deben modificarse los valores de TMySQLTable:aRow y TMySQLTable:aOldValue En caso de que se desee hacer esta modificacion, como si la fila vacia fuera la fila actual de la tabla, entonces podra aplicarse con este parametro con valor verdadero o con el nuevo metodo TMySQLTable:SetBlankRow() - TMySQLTable:FielPut() = Comparar ::aRow[nNum]==NIL en vez de Empty(::aRow[nNum]) Empty() puede ser cadena nula, valor 0, fecha nula, .F. = Se aplica TMySQLTable:aRow[nNum] para contener el valor del campo = De acuerdo a TMySQLTable:lFieldAsData, se actualiza el elemento DATA de TMySQLTable correspondiente al nombre del campo - Skipper() Modificacion del control de movimiento para aplicar las nuevas definiciones para TMySQLQuery:Bof() y TMySQLQuery:Eof()